From d7d752f45e688134407372a83533c68e36bb9e8c Mon Sep 17 00:00:00 2001 From: Arne Schwabe Date: Tue, 15 Jun 2021 16:52:14 +0200 Subject: Cleanup kotlin migration and message to use Always on VPN --- main/src/main/res/values/strings.xml | 2 + .../de/blinkt/openvpn/fragments/GeneralSettings.kt | 97 +++++++++++++--------- 2 files changed, 62 insertions(+), 37 deletions(-) (limited to 'main/src') diff --git a/main/src/main/res/values/strings.xml b/main/src/main/res/values/strings.xml index 9a8e5958..8b21deb9 100755 --- a/main/src/main/res/values/strings.xml +++ b/main/src/main/res/values/strings.xml @@ -503,5 +503,7 @@ Check peer certificate fingerprint (Enter the SHA256 fingerprint of the server certificate(s)) HTTP Proxy: %1$s %2$d + Please you the Always-On Feature of Android to enable VPN at boot time. + Open VPN Settings diff --git a/main/src/ui/java/de/blinkt/openvpn/fragments/GeneralSettings.kt b/main/src/ui/java/de/blinkt/openvpn/fragments/GeneralSettings.kt index 710adad1..811210d3 100644 --- a/main/src/ui/java/de/blinkt/openvpn/fragments/GeneralSettings.kt +++ b/main/src/ui/java/de/blinkt/openvpn/fragments/GeneralSettings.kt @@ -4,15 +4,17 @@ */ package de.blinkt.openvpn.fragments -import android.app.AlertDialog import android.app.Dialog import android.content.DialogInterface import android.content.Intent import android.content.pm.ApplicationInfo import android.content.pm.PackageManager +import android.net.VpnService import android.os.Build import android.os.Bundle +import android.provider.Settings import android.widget.Toast +import androidx.appcompat.app.AlertDialog import androidx.preference.* import de.blinkt.openvpn.BuildConfig import de.blinkt.openvpn.R @@ -23,47 +25,55 @@ import java.io.File class GeneralSettings : PreferenceFragmentCompat(), Preference.OnPreferenceClickListener, DialogInterface.OnClickListener, Preference.OnPreferenceChangeListener { - private var mExtapp: ExternalAppDatabase? = null - private var mAlwaysOnVPN: ListPreference? = null - override fun onCreatePreferences(savedInstanceState: Bundle, rootKey: String) { - + private lateinit var mExtapp: ExternalAppDatabase + private lateinit var mAlwaysOnVPN: ListPreference + override fun onCreatePreferences(savedInstanceState: Bundle?, rootKey: String?) { // Load the preferences from an XML resource addPreferencesFromResource(R.xml.general_settings) - val devHacks = findPreference("device_hacks") - mAlwaysOnVPN = findPreference("alwaysOnVpn") - mAlwaysOnVPN!!.onPreferenceChangeListener = this - val loadtun = findPreference("loadTunModule") + val devHacks = findPreference("device_hacks") as PreferenceCategory + mAlwaysOnVPN = findPreference("alwaysOnVpn")!! + mAlwaysOnVPN.onPreferenceChangeListener = this + val loadtun = findPreference("loadTunModule")!! if (!isTunModuleAvailable) { - loadtun!!.isEnabled = false - devHacks!!.removePreference(loadtun) + loadtun.isEnabled = false + devHacks.removePreference(loadtun) } - val cm9hack = findPreference("useCM9Fix") as CheckBoxPreference? - if (!cm9hack!!.isChecked && Build.VERSION.SDK_INT > Build.VERSION_CODES.JELLY_BEAN_MR1) { - devHacks!!.removePreference(cm9hack) + val cm9hack = findPreference("useCM9Fix") as CheckBoxPreference + if (!cm9hack.isChecked && Build.VERSION.SDK_INT > Build.VERSION_CODES.JELLY_BEAN_MR1) { + devHacks.removePreference(cm9hack) } val useInternalFS = - findPreference("useInternalFileSelector") as CheckBoxPreference? + findPreference("useInternalFileSelector") as CheckBoxPreference if (Build.VERSION.SDK_INT <= Build.VERSION_CODES.KITKAT) { - devHacks!!.removePreference(useInternalFS) + devHacks.removePreference(useInternalFS) } /* Android P does not allow access to the file storage anymore */if (Build.VERSION.SDK_INT > Build.VERSION_CODES.P) { val useInternalFileSelector = findPreference("useInternalFileSelector") - devHacks!!.removePreference(useInternalFileSelector) + devHacks.removePreference(useInternalFileSelector) } mExtapp = ExternalAppDatabase(activity) - val clearapi = findPreference("clearapi") - clearapi!!.onPreferenceClickListener = this + val clearapi = findPreference("clearapi") as Preference + clearapi.onPreferenceClickListener = this findPreference("osslspeed")!!.onPreferenceClickListener = this - if (devHacks!!.preferenceCount == 0) preferenceScreen.removePreference(devHacks) + if (devHacks.preferenceCount == 0) preferenceScreen.removePreference(devHacks) if (!BuildConfig.openvpn3) { - val appBehaviour = findPreference("app_behaviour") as PreferenceCategory? - val ovpn3 = findPreference("ovpn3") as CheckBoxPreference? - ovpn3!!.isEnabled = false + val appBehaviour = findPreference("app_behaviour") as PreferenceCategory + val ovpn3 = findPreference("ovpn3") as CheckBoxPreference + ovpn3.isEnabled = false ovpn3.isChecked = false } - (findPreference("restartvpnonboot") as CheckBoxPreference?)!!.onPreferenceChangeListener = + + val startOnBoot = + findPreference("restartvpnonboot") as CheckBoxPreference + + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) { + val vpn:VpnService = VpnService() + startOnBoot.isChecked = vpn.isAlwaysOn + } + + startOnBoot.onPreferenceChangeListener = Preference.OnPreferenceChangeListener { pref: Preference?, newValue: Any -> if (newValue == true) { val vpn = ProfileManager.getAlwaysOnVPN(requireActivity()) @@ -73,11 +83,24 @@ class GeneralSettings : PreferenceFragmentCompat(), Preference.OnPreferenceClick R.string.no_default_vpn_set, Toast.LENGTH_LONG ).show() - return@setOnPreferenceChangeListener false + return@OnPreferenceChangeListener false } } + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N && newValue == true) + { + val builder = AlertDialog.Builder( + requireContext() + ) + builder.setMessage(R.string.use_alwayson_vpn) + builder.setNeutralButton(R.string.open_vpn_settings, { dialog, which -> + startActivity(Intent(Settings.ACTION_VPN_SETTINGS)) + }) + builder.setPositiveButton(android.R.string.ok, null) + builder.show() + } true } + setClearApiSummary() } @@ -92,40 +115,40 @@ class GeneralSettings : PreferenceFragmentCompat(), Preference.OnPreferenceClick vpn.name ) ) - mAlwaysOnVPN!!.summary = sb.toString() + mAlwaysOnVPN.summary = sb.toString() } override fun onPreferenceChange(preference: Preference, newValue: Any): Boolean { if (preference === mAlwaysOnVPN) { val vpn = ProfileManager.get(activity, newValue as String) - mAlwaysOnVPN!!.summary = vpn.name + mAlwaysOnVPN.summary = vpn.name } return true } private fun setClearApiSummary() { - val clearapi = findPreference("clearapi") - if (mExtapp!!.extAppList.isEmpty()) { - clearapi!!.isEnabled = false + val clearapi = findPreference("clearapi") as Preference + if (mExtapp.extAppList.isEmpty()) { + clearapi.isEnabled = false clearapi.setSummary(R.string.no_external_app_allowed) } else { - clearapi!!.isEnabled = true + clearapi.isEnabled = true clearapi.summary = getString(R.string.allowed_apps, getExtAppList(", ")) } } private fun getExtAppList(delim: String): String { var app: ApplicationInfo - val pm = activity!!.packageManager + val pm = requireActivity().packageManager val applist = StringBuilder() - for (packagename in mExtapp!!.extAppList) { + for (packagename in mExtapp.extAppList) { try { app = pm.getApplicationInfo(packagename, 0) if (applist.length != 0) applist.append(delim) applist.append(app.loadLabel(pm)) } catch (e: PackageManager.NameNotFoundException) { // App not found. Remove it from the list - mExtapp!!.removeApp(packagename) + mExtapp.removeApp(packagename) } } return applist.toString() @@ -133,13 +156,13 @@ class GeneralSettings : PreferenceFragmentCompat(), Preference.OnPreferenceClick // Check if the tun module exists on the file system private val isTunModuleAvailable: Boolean - private get() =// Check if the tun module exists on the file system + get() =// Check if the tun module exists on the file system File("/system/lib/modules/tun.ko").length() > 10 override fun onPreferenceClick(preference: Preference): Boolean { if (preference.key == "clearapi") { val builder = AlertDialog.Builder( - activity + requireContext() ) builder.setPositiveButton(R.string.clear, this) builder.setNegativeButton(android.R.string.cancel, null) @@ -153,7 +176,7 @@ class GeneralSettings : PreferenceFragmentCompat(), Preference.OnPreferenceClick override fun onClick(dialog: DialogInterface, which: Int) { if (which == Dialog.BUTTON_POSITIVE) { - mExtapp!!.clearAllApiApps() + mExtapp.clearAllApiApps() setClearApiSummary() } } -- cgit v1.2.3