diff --git a/android/src/main/AndroidManifest.xml b/android/src/main/AndroidManifest.xml
index 8dfe5f1..7c4b06b 100644
--- a/android/src/main/AndroidManifest.xml
+++ b/android/src/main/AndroidManifest.xml
@@ -55,6 +55,13 @@
+
+
+
+
+
+
diff --git a/android/src/main/java/com/tailscale/ipn/IPNReceiver.java b/android/src/main/java/com/tailscale/ipn/IPNReceiver.java
new file mode 100644
index 0000000..e694727
--- /dev/null
+++ b/android/src/main/java/com/tailscale/ipn/IPNReceiver.java
@@ -0,0 +1,20 @@
+package com.tailscale.ipn;
+
+import android.content.BroadcastReceiver;
+import android.content.Context;
+import android.content.Intent;
+
+public class IPNReceiver extends BroadcastReceiver {
+
+ @Override
+ public void onReceive(Context context, Intent intent) {
+ if (intent.getAction() == "com.tailscale.ipn.CONNECT_VPN") {
+ connect();
+ } else if (intent.getAction() == "com.tailscale.ipn.DISCONNECT_VPN") {
+ disconnect();
+ }
+ }
+
+ private native void connect();
+ private native void disconnect();
+}
diff --git a/cmd/tailscale/callbacks.go b/cmd/tailscale/callbacks.go
index 0895a99..1666c3f 100644
--- a/cmd/tailscale/callbacks.go
+++ b/cmd/tailscale/callbacks.go
@@ -102,6 +102,16 @@ func Java_com_tailscale_ipn_IPNService_disconnect(env *C.JNIEnv, this C.jobject)
onDisconnect <- jni.NewGlobalRef(jenv, jni.Object(this))
}
+//export Java_com_tailscale_ipn_IPNReceiver_connect
+func Java_com_tailscale_ipn_IPNReceiver_connect(env *C.JNIEnv, this C.jobject) {
+ requestBackend(ConnectEvent{Enable: true})
+}
+
+//export Java_com_tailscale_ipn_IPNReceiver_disconnect
+func Java_com_tailscale_ipn_IPNReceiver_disconnect(env *C.JNIEnv, this C.jobject) {
+ requestBackend(ConnectEvent{Enable: false})
+}
+
//export Java_com_tailscale_ipn_App_onConnectivityChanged
func Java_com_tailscale_ipn_App_onConnectivityChanged(env *C.JNIEnv, cls C.jclass, connected C.jboolean) {
select {