aboutsummaryrefslogtreecommitdiffstatshomepage
path: root/ui/src/main/java/com/wireguard/android/preference/KernelModuleDisablerPreference.kt
diff options
context:
space:
mode:
Diffstat (limited to 'ui/src/main/java/com/wireguard/android/preference/KernelModuleDisablerPreference.kt')
-rw-r--r--ui/src/main/java/com/wireguard/android/preference/KernelModuleDisablerPreference.kt63
1 files changed, 63 insertions, 0 deletions
diff --git a/ui/src/main/java/com/wireguard/android/preference/KernelModuleDisablerPreference.kt b/ui/src/main/java/com/wireguard/android/preference/KernelModuleDisablerPreference.kt
new file mode 100644
index 00000000..0bb728df
--- /dev/null
+++ b/ui/src/main/java/com/wireguard/android/preference/KernelModuleDisablerPreference.kt
@@ -0,0 +1,63 @@
+/*
+ * Copyright © 2020 WireGuard LLC. All Rights Reserved.
+ * SPDX-License-Identifier: Apache-2.0
+ */
+package com.wireguard.android.preference
+
+import android.annotation.SuppressLint
+import android.content.Context
+import android.content.Intent
+import android.util.AttributeSet
+import androidx.preference.Preference
+import com.wireguard.android.Application
+import com.wireguard.android.R
+import com.wireguard.android.activity.SettingsActivity
+import com.wireguard.android.backend.Tunnel
+import com.wireguard.android.backend.WgQuickBackend
+import java9.util.concurrent.CompletableFuture
+import kotlin.system.exitProcess
+
+class KernelModuleDisablerPreference(context: Context, attrs: AttributeSet?) : Preference(context, attrs) {
+ private var state = if (Application.getBackend() is WgQuickBackend) State.ENABLED else State.DISABLED
+
+ override fun getSummary() = context.getString(state.summaryResourceId)
+
+ override fun getTitle() = context.getString(state.titleResourceId)
+
+ @SuppressLint("ApplySharedPref")
+ override fun onClick() {
+ if (state == State.DISABLED) {
+ setState(State.ENABLING)
+ Application.getSharedPreferences().edit().putBoolean("disable_kernel_module", false).commit()
+ } else if (state == State.ENABLED) {
+ setState(State.DISABLING)
+ Application.getSharedPreferences().edit().putBoolean("disable_kernel_module", true).commit()
+ }
+ Application.getAsyncWorker().runAsync {
+ Application.getTunnelManager().tunnels.thenApply { observableTunnels ->
+ val downings = observableTunnels.values().map { it.setState(Tunnel.State.DOWN).toCompletableFuture() }.toTypedArray()
+ CompletableFuture.allOf(*downings).thenRun {
+ val restartIntent = Intent(context, SettingsActivity::class.java)
+ restartIntent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP)
+ restartIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK)
+ Application.get().startActivity(restartIntent)
+ exitProcess(0)
+ }
+ }.join()
+ }
+ }
+
+ private fun setState(state: State) {
+ if (this.state == state) return
+ this.state = state
+ if (isEnabled != state.shouldEnableView) isEnabled = state.shouldEnableView
+ notifyChanged()
+ }
+
+ private enum class State(val titleResourceId: Int, val summaryResourceId: Int, val shouldEnableView: Boolean) {
+ ENABLED(R.string.module_disabler_enabled_title, R.string.module_disabler_enabled_summary, true),
+ DISABLED(R.string.module_disabler_disabled_title, R.string.module_disabler_disabled_summary, true),
+ ENABLING(R.string.module_disabler_disabled_title, R.string.success_application_will_restart, false),
+ DISABLING(R.string.module_disabler_enabled_title, R.string.success_application_will_restart, false);
+ }
+}