android_legacy: Fixes tailscale/tailscale#10104 (#178)

Fixes persistent VPN status bar notification in the legacy gio code base.

Signed-off-by: Jonathan Nobels <jonathan@tailscale.com>
pull/334/head
Praneet Loke 2 weeks ago committed by GitHub
parent 253c116f9b
commit 6197cb9576
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194

@ -6,6 +6,7 @@
<uses-permission android:name="android.permission.FOREGROUND_SERVICE" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" android:maxSdkVersion="28"/>
<uses-permission android:name="android.permission.CHANGE_NETWORK_STATE" />
<uses-permission android:name="android.permission.POST_NOTIFICATIONS"/>
<!-- Disable input emulation on ChromeOS -->
<uses-feature android:name="android.hardware.type.pc" android:required="false"/>

@ -284,6 +284,17 @@ public class App extends Application {
return null;
}
void requestNotificationPermission(Activity act) {
if (Build.VERSION.SDK_INT < Build.VERSION_CODES.TIRAMISU) {
// We can send notifications without explicit notifications permission.
return;
}
if (ContextCompat.checkSelfPermission(act, Manifest.permission.POST_NOTIFICATIONS) == PackageManager.PERMISSION_GRANTED) {
return;
}
act.requestPermissions(new String[]{Manifest.permission.POST_NOTIFICATIONS}, IPNActivity.NOTIFICATIONS_PERMISSION_RESULT);
}
void requestWriteStoragePermission(Activity act) {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q || Build.VERSION.SDK_INT < Build.VERSION_CODES.M) {
// We can write files without permission.

@ -20,6 +20,7 @@ import org.gioui.GioView;
public final class IPNActivity extends Activity {
final static int WRITE_STORAGE_RESULT = 1000;
final static int NOTIFICATIONS_PERMISSION_RESULT = 1001;
private GioView view;
@ -97,6 +98,13 @@ public final class IPNActivity extends Activity {
if (grants.length > 0 && grants[0] == PackageManager.PERMISSION_GRANTED) {
App.onWriteStorageGranted();
}
break;
case NOTIFICATIONS_PERMISSION_RESULT:
// Start the VPN regardless of the notifications permission being granted.
// It's not a blocker for running the VPN.
App app = ((App)getApplicationContext());
app.startVPN();
break;
}
}

@ -1148,10 +1148,17 @@ func (a *App) runUI() error {
}
case <-onVPNPrepared:
if state.backend.State > ipn.Stopped {
if err := a.callVoidMethod(a.appCtx, "startVPN", "()V"); err != nil {
return err
}
if activity != 0 {
// If there isn't a foreground activity start the VPN right away.
if activity == 0 {
if err := a.callVoidMethod(a.appCtx, "startVPN", "()V"); err != nil {
return err
}
} else {
// Otherwise, check for notification permission and let the result
// of that start the VPN service.
if err := a.callVoidMethod(a.appCtx, "requestNotificationPermission", "(Landroid/app/Activity;)V", jni.Value(activity)); err != nil {
return err
}
if err := a.callVoidMethod(a.appCtx, "requestWriteStoragePermission", "(Landroid/app/Activity;)V", jni.Value(activity)); err != nil {
return err
}

Loading…
Cancel
Save