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) - } - } - } - } -}