diff options
| -rw-r--r-- | mullvad-jni/src/jni_event_listener.rs | 47 |
1 files changed, 41 insertions, 6 deletions
diff --git a/mullvad-jni/src/jni_event_listener.rs b/mullvad-jni/src/jni_event_listener.rs index e24d3885c5..3b82cc5b9b 100644 --- a/mullvad-jni/src/jni_event_listener.rs +++ b/mullvad-jni/src/jni_event_listener.rs @@ -21,8 +21,13 @@ pub enum Error { GetJvmInstance(#[error(cause)] jni::errors::Error), } +enum Event { + RelayList(RelayList), + Tunnel(TunnelStateTransition), +} + #[derive(Clone, Debug)] -pub struct JniEventListener(mpsc::Sender<TunnelStateTransition>); +pub struct JniEventListener(mpsc::Sender<Event>); impl JniEventListener { pub fn spawn(env: &JNIEnv, mullvad_daemon: &JObject) -> Result<Self, Error> { @@ -32,18 +37,22 @@ impl JniEventListener { impl EventListener for JniEventListener { fn notify_new_state(&self, state: TunnelStateTransition) { - let _ = self.0.send(state); + let _ = self.0.send(Event::Tunnel(state)); } fn notify_settings(&self, _: Settings) {} - fn notify_relay_list(&self, _: RelayList) {} + + fn notify_relay_list(&self, relay_list: RelayList) { + let _ = self.0.send(Event::RelayList(relay_list)); + } } struct JniEventHandler<'env> { env: AttachGuard<'env>, mullvad_ipc_client: JObject<'env>, + notify_relay_list_event: JMethodID<'env>, notify_tunnel_event: JMethodID<'env>, - events: mpsc::Receiver<TunnelStateTransition>, + events: mpsc::Receiver<Event>, } impl JniEventHandler<'_> { @@ -80,9 +89,15 @@ impl<'env> JniEventHandler<'env> { fn new( env: AttachGuard<'env>, mullvad_ipc_client: JObject<'env>, - events: mpsc::Receiver<TunnelStateTransition>, + events: mpsc::Receiver<Event>, ) -> Result<Self, Error> { let class = get_class("net/mullvad/mullvadvpn/MullvadDaemon"); + let notify_relay_list_event = Self::get_method_id( + &env, + &class, + "notifyRelayListEvent", + "(Lnet/mullvad/mullvadvpn/model/RelayList;)V", + )?; let notify_tunnel_event = Self::get_method_id( &env, &class, @@ -93,6 +108,7 @@ impl<'env> JniEventHandler<'env> { Ok(JniEventHandler { env, mullvad_ipc_client, + notify_relay_list_event, notify_tunnel_event, events, }) @@ -110,7 +126,26 @@ impl<'env> JniEventHandler<'env> { fn run(&mut self) { while let Ok(event) = self.events.recv() { - self.handle_tunnel_event(event); + match event { + Event::RelayList(relay_list) => self.handle_relay_list_event(relay_list), + Event::Tunnel(tunnel_event) => self.handle_tunnel_event(tunnel_event), + } + } + } + + fn handle_relay_list_event(&self, relay_list: RelayList) { + let result = self.env.call_method_unchecked( + self.mullvad_ipc_client, + self.notify_relay_list_event, + JavaType::Primitive(Primitive::Void), + &[JValue::Object(relay_list.into_java(&self.env))], + ); + + if let Err(error) = result { + log::error!( + "{}", + error.display_chain_with_msg("Failed to call MullvadDaemon.notifyRelayListEvent") + ); } } |
