summaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
-rw-r--r--mullvad-jni/src/jni_event_listener.rs35
1 files changed, 32 insertions, 3 deletions
diff --git a/mullvad-jni/src/jni_event_listener.rs b/mullvad-jni/src/jni_event_listener.rs
index 8fa2456d5b..cb0e14fb40 100644
--- a/mullvad-jni/src/jni_event_listener.rs
+++ b/mullvad-jni/src/jni_event_listener.rs
@@ -24,6 +24,7 @@ pub enum Error {
}
enum Event {
+ KeygenEvent(KeygenEvent),
RelayList(RelayList),
Settings(Settings),
Tunnel(TunnelState),
@@ -39,6 +40,10 @@ impl JniEventListener {
}
impl EventListener for JniEventListener {
+ fn notify_key_event(&self, key_event: KeygenEvent) {
+ let _ = self.0.send(Event::KeygenEvent(key_event));
+ }
+
fn notify_new_state(&self, state: TunnelState) {
let _ = self.0.send(Event::Tunnel(state));
}
@@ -50,14 +55,12 @@ impl EventListener for JniEventListener {
fn notify_relay_list(&self, relay_list: RelayList) {
let _ = self.0.send(Event::RelayList(relay_list));
}
-
- // TODO: manage key events properly
- fn notify_key_event(&self, _key_event: KeygenEvent) {}
}
struct JniEventHandler<'env> {
env: AttachGuard<'env>,
mullvad_ipc_client: JObject<'env>,
+ notify_keygen_event: JMethodID<'env>,
notify_relay_list_event: JMethodID<'env>,
notify_settings_event: JMethodID<'env>,
notify_tunnel_event: JMethodID<'env>,
@@ -101,6 +104,12 @@ impl<'env> JniEventHandler<'env> {
events: mpsc::Receiver<Event>,
) -> Result<Self, Error> {
let class = get_class("net/mullvad/mullvadvpn/MullvadDaemon");
+ let notify_keygen_event = Self::get_method_id(
+ &env,
+ &class,
+ "notifyKeygenEvent",
+ "(Lnet/mullvad/mullvadvpn/model/KeygenEvent;)V",
+ )?;
let notify_relay_list_event = Self::get_method_id(
&env,
&class,
@@ -123,6 +132,7 @@ impl<'env> JniEventHandler<'env> {
Ok(JniEventHandler {
env,
mullvad_ipc_client,
+ notify_keygen_event,
notify_relay_list_event,
notify_settings_event,
notify_tunnel_event,
@@ -143,6 +153,7 @@ impl<'env> JniEventHandler<'env> {
fn run(&mut self) {
while let Ok(event) = self.events.recv() {
match event {
+ Event::KeygenEvent(keygen_event) => self.handle_keygen_event(keygen_event),
Event::RelayList(relay_list) => self.handle_relay_list_event(relay_list),
Event::Settings(settings) => self.handle_settings(settings),
Event::Tunnel(tunnel_event) => self.handle_tunnel_event(tunnel_event),
@@ -150,6 +161,24 @@ impl<'env> JniEventHandler<'env> {
}
}
+ fn handle_keygen_event(&self, event: KeygenEvent) {
+ let java_keygen_event = self.env.auto_local(event.into_java(&self.env));
+
+ let result = self.env.call_method_unchecked(
+ self.mullvad_ipc_client,
+ self.notify_keygen_event,
+ JavaType::Primitive(Primitive::Void),
+ &[JValue::Object(java_keygen_event.as_obj())],
+ );
+
+ if let Err(error) = result {
+ log::error!(
+ "{}",
+ error.display_chain_with_msg("Failed to call MullvadDaemon.notifyKeygenEvent")
+ );
+ }
+ }
+
fn handle_relay_list_event(&self, relay_list: RelayList) {
let java_relay_list = self.env.auto_local(relay_list.into_java(&self.env));