summaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
-rw-r--r--mullvad-jni/src/jni_event_listener.rs47
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")
+ );
}
}