diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml
index 95baddf5..34b257b8 100644
--- a/app/src/main/AndroidManifest.xml
+++ b/app/src/main/AndroidManifest.xml
@@ -86,7 +86,12 @@
-
+
+
+
+
+
+
= Build.VERSION_CODES.O)
createNotificationChannel()
-
- if (prefs.allowTaskerIntegration && canStartService()) {
- startService(Intent(this, TaskerIntegrationService::class.java))
- }
- }
-
- private fun canStartService(): Boolean {
- if (Build.VERSION.SDK_INT < Build.VERSION_CODES.O) return true
- val appProcessInfo = ActivityManager.RunningAppProcessInfo()
- ActivityManager.getMyMemoryState(appProcessInfo)
- return (appProcessInfo.importance == IMPORTANCE_FOREGROUND || appProcessInfo.importance == IMPORTANCE_VISIBLE)
}
companion object {
diff --git a/app/src/main/java/com/wireguard/android/activity/SettingsActivity.kt b/app/src/main/java/com/wireguard/android/activity/SettingsActivity.kt
index 01d0b70d..deb0c39f 100644
--- a/app/src/main/java/com/wireguard/android/activity/SettingsActivity.kt
+++ b/app/src/main/java/com/wireguard/android/activity/SettingsActivity.kt
@@ -28,7 +28,6 @@ import com.wireguard.android.di.ext.getBackendAsync
import com.wireguard.android.di.ext.getPrefs
import com.wireguard.android.di.ext.getTunnelManager
import com.wireguard.android.fragment.AppListDialogFragment
-import com.wireguard.android.services.TaskerIntegrationService
import com.wireguard.android.util.ExceptionLoggers
import com.wireguard.android.util.ZipExporter
import com.wireguard.android.util.asString
@@ -68,7 +67,6 @@ class SettingsActivity : AppCompatActivity() {
}
class SettingsFragment : PreferenceFragmentCompat(), AppListDialogFragment.AppExclusionListener {
-
private val prefs = getPrefs()
override fun onCreatePreferences(savedInstanceState: Bundle?, key: String?) {
@@ -127,10 +125,7 @@ class SettingsActivity : AppCompatActivity() {
}
taskerPref?.onPreferenceChangeListener = ChangeListener { _, newValue ->
- val isEnabled = newValue as Boolean
- integrationSecretPref?.isVisible = isEnabled
- val intent = Intent(ctx, TaskerIntegrationService::class.java)
- ctx.apply { if (isEnabled) startService(intent) else stopService(intent) }
+ integrationSecretPref?.isVisible = (newValue as Boolean)
true
}
diff --git a/app/src/main/java/com/wireguard/android/services/TaskerIntegrationReceiver.kt b/app/src/main/java/com/wireguard/android/services/TaskerIntegrationReceiver.kt
new file mode 100644
index 00000000..23cb7f69
--- /dev/null
+++ b/app/src/main/java/com/wireguard/android/services/TaskerIntegrationReceiver.kt
@@ -0,0 +1,72 @@
+/*
+ * Copyright © 2017-2019 WireGuard LLC.
+ * Copyright © 2018-2019 Harsh Shandilya . All Rights Reserved.
+ * SPDX-License-Identifier: Apache-2.0
+ */
+package com.wireguard.android.services
+
+import android.content.BroadcastReceiver
+import android.content.Context
+import android.content.Intent
+import com.wireguard.android.BuildConfig
+import com.wireguard.android.di.ext.getPrefs
+import com.wireguard.android.di.ext.getTunnelManager
+import com.wireguard.android.model.Tunnel
+import com.wireguard.android.model.TunnelManager
+import org.koin.core.KoinComponent
+import timber.log.Timber
+
+class TaskerIntegrationReceiver : BroadcastReceiver(), KoinComponent {
+ val manager = getTunnelManager()
+ val prefs = getPrefs()
+
+ override fun onReceive(context: Context?, intent: Intent?) {
+ if (intent == null || intent.action == null)
+ return
+
+ val isSelfPackage = intent.`package` == BuildConfig.APPLICATION_ID
+ val taskerEnabled = !prefs.allowTaskerIntegration || prefs.taskerIntegrationSecret.isEmpty()
+ val tunnelName: String? = intent.getStringExtra(TunnelManager.TUNNEL_NAME_INTENT_EXTRA)
+ val integrationSecret: String? = intent.getStringExtra(TunnelManager.INTENT_INTEGRATION_SECRET_EXTRA)
+
+ var state: Tunnel.State? = null
+ Timber.tag("IntentReceiver")
+ when (intent.action) {
+ "${BuildConfig.APPLICATION_ID}.SET_TUNNEL_UP" -> {
+ state = Tunnel.State.UP
+ }
+ "${BuildConfig.APPLICATION_ID}.SET_TUNNEL_DOWN" -> {
+ state = Tunnel.State.DOWN
+ }
+ else -> Timber.d("Invalid intent action: ${intent.action}")
+ }
+
+ if (taskerEnabled && !isSelfPackage) {
+ Timber.e("Tasker integration is disabled! Not allowing tunnel state change to pass through.")
+ return
+ }
+
+ if (tunnelName != null && state != null) {
+ if (isSelfPackage) {
+ toggleTunnelState(tunnelName, state, manager)
+ return
+ }
+ when (integrationSecret) {
+ prefs.taskerIntegrationSecret -> toggleTunnelState(tunnelName, state, manager)
+ else -> Timber.e("Intent integration secret mis-match! Exiting...")
+ }
+ } else if (tunnelName == null) {
+ Timber.d("Intent parameter ${TunnelManager.TUNNEL_NAME_INTENT_EXTRA} not set!")
+ }
+ }
+
+ private fun toggleTunnelState(tunnelName: String, state: Tunnel.State, manager: TunnelManager) {
+ Timber.d("Setting $tunnelName's state to $state")
+ manager.getTunnels().thenAccept { tunnels ->
+ val tunnel = tunnels[tunnelName]
+ tunnel?.let {
+ manager.setTunnelState(it, state)
+ }
+ }
+ }
+}
diff --git a/app/src/main/java/com/wireguard/android/services/TaskerIntegrationService.kt b/app/src/main/java/com/wireguard/android/services/TaskerIntegrationService.kt
deleted file mode 100644
index c805538c..00000000
--- a/app/src/main/java/com/wireguard/android/services/TaskerIntegrationService.kt
+++ /dev/null
@@ -1,104 +0,0 @@
-/*
- * Copyright © 2017-2019 WireGuard LLC.
- * Copyright © 2018-2019 Harsh Shandilya . All Rights Reserved.
- * SPDX-License-Identifier: Apache-2.0
- */
-package com.wireguard.android.services
-
-import android.app.Service
-import android.content.BroadcastReceiver
-import android.content.Context
-import android.content.Intent
-import android.content.IntentFilter
-import android.os.IBinder
-import com.wireguard.android.BuildConfig
-import com.wireguard.android.di.ext.getPrefs
-import com.wireguard.android.di.ext.getTunnelManager
-import com.wireguard.android.model.Tunnel
-import com.wireguard.android.model.TunnelManager
-import timber.log.Timber
-
-class TaskerIntegrationService : Service() {
-
- private var receiver: IntentReceiver? = null
-
- override fun onBind(intent: Intent?): IBinder? {
- return null
- }
-
- override fun onCreate() {
- super.onCreate()
- val filter = IntentFilter()
- filter.addAction("${BuildConfig.APPLICATION_ID}.SET_TUNNEL_UP")
- filter.addAction("${BuildConfig.APPLICATION_ID}.SET_TUNNEL_DOWN")
- filter.priority = 100
-
- receiver = IntentReceiver()
-
- registerReceiver(receiver, filter)
- }
-
- override fun onDestroy() {
- super.onDestroy()
-
- if (receiver != null) {
- unregisterReceiver(receiver)
- receiver = null
- }
- }
-
- inner class IntentReceiver : BroadcastReceiver() {
- val manager = getTunnelManager()
- val prefs = getPrefs()
-
- override fun onReceive(context: Context?, intent: Intent?) {
- if (intent == null || intent.action == null)
- return
-
- val isSelfPackage = intent.`package` == BuildConfig.APPLICATION_ID || BuildConfig.DEBUG
- val taskerEnabled = !prefs.allowTaskerIntegration || prefs.taskerIntegrationSecret.isEmpty()
- val tunnelName: String? = intent.getStringExtra(TunnelManager.TUNNEL_NAME_INTENT_EXTRA)
- val integrationSecret: String? = intent.getStringExtra(TunnelManager.INTENT_INTEGRATION_SECRET_EXTRA)
-
- var state: Tunnel.State? = null
- Timber.tag("IntentReceiver")
- when (intent.action) {
- "${BuildConfig.APPLICATION_ID}.SET_TUNNEL_UP" -> {
- state = Tunnel.State.UP
- }
- "${BuildConfig.APPLICATION_ID}.SET_TUNNEL_DOWN" -> {
- state = Tunnel.State.DOWN
- }
- else -> Timber.d("Invalid intent action: ${intent.action}")
- }
-
- if (taskerEnabled && !isSelfPackage) {
- Timber.e("Tasker integration is disabled! Not allowing tunnel state change to pass through.")
- return
- }
-
- if (tunnelName != null && state != null) {
- if (isSelfPackage) {
- toggleTunnelState(tunnelName, state, manager)
- return
- }
- when (integrationSecret) {
- prefs.taskerIntegrationSecret -> toggleTunnelState(tunnelName, state, manager)
- else -> Timber.e("Intent integration secret mis-match! Exiting...")
- }
- } else if (tunnelName == null) {
- Timber.d("Intent parameter ${TunnelManager.TUNNEL_NAME_INTENT_EXTRA} not set!")
- }
- }
-
- private fun toggleTunnelState(tunnelName: String, state: Tunnel.State, manager: TunnelManager) {
- Timber.d("Setting $tunnelName's state to $state")
- manager.getTunnels().thenAccept { tunnels ->
- val tunnel = tunnels[tunnelName]
- tunnel?.let {
- manager.setTunnelState(it, state)
- }
- }
- }
- }
-}