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 3 years ago
parent f19c0c057e
commit 71a9bd537c

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

@ -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<Tile> currentTile = new AtomicReference<Tile>();
@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();

Loading…
Cancel
Save