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 <mail@eliasnaur.com>
pull/7/head
Elias Naur 4 years ago
parent f19c0c057e
commit 71a9bd537c

@ -37,9 +37,6 @@
<intent-filter> <intent-filter>
<action android:name="android.service.quicksettings.action.QS_TILE"/> <action android:name="android.service.quicksettings.action.QS_TILE"/>
</intent-filter> </intent-filter>
<meta-data
android:name="android.service.quicksettings.ACTIVE_TILE"
android:value="true"/>
</service> </service>
</application> </application>
</manifest> </manifest>

@ -9,22 +9,38 @@ import android.content.ComponentName;
import android.service.quicksettings.Tile; import android.service.quicksettings.Tile;
import android.service.quicksettings.TileService; import android.service.quicksettings.TileService;
import java.util.concurrent.atomic.AtomicReference;
import java.util.concurrent.atomic.AtomicBoolean;
public class QuickToggleService extends TileService { public class QuickToggleService extends TileService {
private static boolean active; private static AtomicBoolean active = new AtomicBoolean();
private static AtomicReference<Tile> currentTile = new AtomicReference<Tile>();
@Override public void onStartListening() { @Override public void onStartListening() {
Tile t = getQsTile(); currentTile.set(getQsTile());
t.setState(active ? Tile.STATE_ACTIVE : Tile.STATE_INACTIVE); updateTile();
t.updateTile(); }
@Override public void onStopListening() {
currentTile.set(null);
} }
@Override public void onClick() { @Override public void onClick() {
onTileClick(); 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) { static void setStatus(Context ctx, boolean wantRunning) {
active = wantRunning; active.set(wantRunning);
requestListeningState(ctx, new ComponentName(ctx, QuickToggleService.class)); updateTile();
} }
private static native void onTileClick(); private static native void onTileClick();

Loading…
Cancel
Save