summaryrefslogtreecommitdiffhomepage
path: root/android/src
diff options
context:
space:
mode:
authorJanito Vaqueiro Ferreira Filho <janito@mullvad.net>2020-02-28 22:21:52 +0000
committerJanito Vaqueiro Ferreira Filho <janito@mullvad.net>2020-03-18 13:31:35 +0000
commit636e89cc44ea2837ca6385d54fabaa24a1d40584 (patch)
tree8c77288e5abed164f663c8207d06fc70d1ad1b7a /android/src
parent2f5dd32f9386ac4657a5dd9e4eee3b1e9c3b0db5 (diff)
downloadmullvadvpn-636e89cc44ea2837ca6385d54fabaa24a1d40584.tar.xz
mullvadvpn-636e89cc44ea2837ca6385d54fabaa24a1d40584.zip
Create a quick settings tile
Diffstat (limited to 'android/src')
-rw-r--r--android/src/main/AndroidManifest.xml9
-rw-r--r--android/src/main/kotlin/net/mullvad/mullvadvpn/service/MullvadTileService.kt76
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()
+ }
+ }
+}