diff options
Diffstat (limited to 'android/src')
| -rw-r--r-- | android/src/main/AndroidManifest.xml | 9 | ||||
| -rw-r--r-- | android/src/main/kotlin/net/mullvad/mullvadvpn/service/MullvadTileService.kt | 76 |
2 files changed, 85 insertions, 0 deletions
diff --git a/android/src/main/AndroidManifest.xml b/android/src/main/AndroidManifest.xml index 8f472d7f5b..cbd48f152e 100644 --- a/android/src/main/AndroidManifest.xml +++ b/android/src/main/AndroidManifest.xml @@ -27,5 +27,14 @@ <action android:name="android.net.VpnService" /> </intent-filter> </service> + <service android:name="net.mullvad.mullvadvpn.service.MullvadTileService" + android:label="@string/app_name" + android:icon="@drawable/small_logo_black" + android:permission="android.permission.BIND_QUICK_SETTINGS_TILE"> + + <intent-filter> + <action android:name="android.service.quicksettings.action.QS_TILE" /> + </intent-filter> + </service> </application> </manifest> diff --git a/android/src/main/kotlin/net/mullvad/mullvadvpn/service/MullvadTileService.kt b/android/src/main/kotlin/net/mullvad/mullvadvpn/service/MullvadTileService.kt new file mode 100644 index 0000000000..01a14db174 --- /dev/null +++ b/android/src/main/kotlin/net/mullvad/mullvadvpn/service/MullvadTileService.kt @@ -0,0 +1,76 @@ +package net.mullvad.mullvadvpn.service + +import android.content.Intent +import android.service.quicksettings.Tile +import android.service.quicksettings.TileService +import net.mullvad.mullvadvpn.model.TunnelState +import net.mullvad.mullvadvpn.service.tunnelstate.TunnelStateListener +import net.mullvad.talpid.tunnel.ActionAfterDisconnect + +class MullvadTileService : TileService() { + private var secured = false + set(value) { + if (field != value) { + field = value + updateTileState() + } + } + + private lateinit var listener: TunnelStateListener + + override fun onCreate() { + super.onCreate() + + listener = TunnelStateListener(this) + } + + override fun onStartListening() { + super.onStartListening() + + listener.onStateChange = { state -> + secured = when (state) { + is TunnelState.Disconnected -> false + is TunnelState.Connecting -> true + is TunnelState.Connected -> true + is TunnelState.Disconnecting -> { + state.actionAfterDisconnect == ActionAfterDisconnect.Reconnect + } + is TunnelState.Error -> { + state.errorState.isBlocking + } + } + } + } + + override fun onClick() { + super.onClick() + + val tunnelActionKey = if (secured) { + KEY_DISCONNECT_ACTION + } else { + KEY_CONNECT_ACTION + } + + val intent = Intent(tunnelActionKey).setPackage("net.mullvad.mullvadvpn") + + sendBroadcast(intent) + } + + override fun onStopListening() { + super.onStartListening() + + listener.onStateChange = null + } + + private fun updateTileState() { + qsTile.apply { + if (secured) { + state = Tile.STATE_ACTIVE + } else { + state = Tile.STATE_INACTIVE + } + + updateTile() + } + } +} |
