From 71a9bd537c8376ce7b98b6e3330459343dc7d9c5 Mon Sep 17 00:00:00 2001 From: Elias Naur Date: Sat, 30 Jan 2021 16:01:31 +0100 Subject: [PATCH] com/tailscale/ipn,AndroidManifest.xml: make quick tile service passive Active mode is more efficient, but otherwise equivalent to passive mode. However, some Android versions don't implement active mode reliably. See also https://stackoverflow.com/questions/58035971/tileservice-requestlisteningstate-not-working-on-android-q-couldnt-find-tile-f https://issuetracker.google.com/issues?q=requestListeningState I can reproduce issue 1225 on an Android 10 emulator, but no longer with this change applied. For tailscale/tailscale#1225 Signed-off-by: Elias Naur --- android/src/main/AndroidManifest.xml | 3 -- .../com/tailscale/ipn/QuickToggleService.java | 28 +++++++++++++++---- 2 files changed, 22 insertions(+), 9 deletions(-) diff --git a/android/src/main/AndroidManifest.xml b/android/src/main/AndroidManifest.xml index f9fdc1a..c5af1d1 100644 --- a/android/src/main/AndroidManifest.xml +++ b/android/src/main/AndroidManifest.xml @@ -37,9 +37,6 @@ - diff --git a/android/src/main/java/com/tailscale/ipn/QuickToggleService.java b/android/src/main/java/com/tailscale/ipn/QuickToggleService.java index f866866..64bbf0b 100644 --- a/android/src/main/java/com/tailscale/ipn/QuickToggleService.java +++ b/android/src/main/java/com/tailscale/ipn/QuickToggleService.java @@ -9,22 +9,38 @@ import android.content.ComponentName; import android.service.quicksettings.Tile; import android.service.quicksettings.TileService; +import java.util.concurrent.atomic.AtomicReference; +import java.util.concurrent.atomic.AtomicBoolean; + public class QuickToggleService extends TileService { - private static boolean active; + private static AtomicBoolean active = new AtomicBoolean(); + private static AtomicReference currentTile = new AtomicReference(); @Override public void onStartListening() { - Tile t = getQsTile(); - t.setState(active ? Tile.STATE_ACTIVE : Tile.STATE_INACTIVE); - t.updateTile(); + currentTile.set(getQsTile()); + updateTile(); + } + + @Override public void onStopListening() { + currentTile.set(null); } @Override public void onClick() { onTileClick(); } + private static void updateTile() { + Tile t = currentTile.get(); + if (t == null) { + return; + } + t.setState(active.get() ? Tile.STATE_ACTIVE : Tile.STATE_INACTIVE); + t.updateTile(); + } + static void setStatus(Context ctx, boolean wantRunning) { - active = wantRunning; - requestListeningState(ctx, new ComponentName(ctx, QuickToggleService.class)); + active.set(wantRunning); + updateTile(); } private static native void onTileClick();