From 416d3adda740337432255f7a8425be7da4c84a74 Mon Sep 17 00:00:00 2001 From: Samuel Holland Date: Thu, 17 Aug 2017 05:45:40 -0500 Subject: QuickTileService: Implement and update from VpnService Signed-off-by: Jason A. Donenfeld --- .../com/wireguard/android/QuickTileService.java | 81 ++++++++++++++++++++++ 1 file changed, 81 insertions(+) create mode 100644 app/src/main/java/com/wireguard/android/QuickTileService.java (limited to 'app/src/main/java/com/wireguard/android/QuickTileService.java') diff --git a/app/src/main/java/com/wireguard/android/QuickTileService.java b/app/src/main/java/com/wireguard/android/QuickTileService.java new file mode 100644 index 00000000..dcd51b66 --- /dev/null +++ b/app/src/main/java/com/wireguard/android/QuickTileService.java @@ -0,0 +1,81 @@ +package com.wireguard.android; + +import android.annotation.TargetApi; +import android.content.ComponentName; +import android.content.Context; +import android.content.Intent; +import android.content.ServiceConnection; +import android.content.SharedPreferences; +import android.graphics.drawable.Icon; +import android.os.Build; +import android.os.IBinder; +import android.preference.PreferenceManager; +import android.service.quicksettings.Tile; +import android.service.quicksettings.TileService; + +import com.wireguard.config.Config; + +@TargetApi(Build.VERSION_CODES.N) +public class QuickTileService extends TileService { + private Config config; + private SharedPreferences preferences; + private VpnService service; + + @Override + public void onClick() { + if (service != null && config != null) { + if (config.isEnabled()) + service.disable(config.getName()); + else + service.enable(config.getName()); + } + } + + @Override + public void onCreate() { + preferences = PreferenceManager.getDefaultSharedPreferences(this); + service = VpnService.getInstance(); + if (service == null) + bindService(new Intent(this, VpnService.class), new ServiceConnectionCallbacks(), + Context.BIND_AUTO_CREATE); + } + + @Override + public void onStartListening() { + // Since this is an active tile, this only gets called when we want to update the tile. + final Tile tile = getQsTile(); + final String configName = preferences.getString(VpnService.KEY_PRIMARY_CONFIG, null); + config = configName != null && service != null ? service.get(configName) : null; + if (config != null) { + tile.setLabel(config.getName()); + final int state = config.isEnabled() ? Tile.STATE_ACTIVE : Tile.STATE_INACTIVE; + if (tile.getState() != state) { + // The icon must be changed every time the state changes, or the color won't change. + final Integer iconResource = (state == Tile.STATE_ACTIVE) ? + R.drawable.ic_tile : R.drawable.ic_tile_disabled; + tile.setIcon(Icon.createWithResource(this, iconResource)); + tile.setState(state); + } + } else { + tile.setIcon(Icon.createWithResource(this, R.drawable.ic_tile_disabled)); + tile.setLabel(getString(R.string.loading)); + tile.setState(Tile.STATE_UNAVAILABLE); + } + tile.updateTile(); + } + + private class ServiceConnectionCallbacks implements ServiceConnection { + @Override + public void onServiceConnected(final ComponentName component, final IBinder binder) { + // We don't actually need a binding, only notification that the service is started. + unbindService(this); + service = VpnService.getInstance(); + } + + @Override + public void onServiceDisconnected(final ComponentName component) { + // This can never happen; the service runs in the same thread as this service. + throw new IllegalStateException(); + } + } +} -- cgit v1.2.3-59-g8ed1b