From 26adf47d5f25758c70881039c329ec709b619068 Mon Sep 17 00:00:00 2001 From: Arne Schwabe Date: Mon, 14 Jun 2021 17:08:54 +0200 Subject: Convert General Settings to Kotlin --- .../de/blinkt/openvpn/fragments/GeneralSettings.kt | 160 +++++++++++++++++++++ 1 file changed, 160 insertions(+) create mode 100644 main/src/ui/java/de/blinkt/openvpn/fragments/GeneralSettings.kt (limited to 'main/src/ui/java/de/blinkt/openvpn/fragments/GeneralSettings.kt') diff --git a/main/src/ui/java/de/blinkt/openvpn/fragments/GeneralSettings.kt b/main/src/ui/java/de/blinkt/openvpn/fragments/GeneralSettings.kt new file mode 100644 index 00000000..710adad1 --- /dev/null +++ b/main/src/ui/java/de/blinkt/openvpn/fragments/GeneralSettings.kt @@ -0,0 +1,160 @@ +/* + * Copyright (c) 2012-2016 Arne Schwabe + * Distributed under the GNU GPL v2 with additional terms. For full terms see the file doc/LICENSE.txt + */ +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.os.Build +import android.os.Bundle +import android.widget.Toast +import androidx.preference.* +import de.blinkt.openvpn.BuildConfig +import de.blinkt.openvpn.R +import de.blinkt.openvpn.activities.OpenSSLSpeed +import de.blinkt.openvpn.api.ExternalAppDatabase +import de.blinkt.openvpn.core.ProfileManager +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) { + + + // 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") + if (!isTunModuleAvailable) { + 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 useInternalFS = + findPreference("useInternalFileSelector") as CheckBoxPreference? + if (Build.VERSION.SDK_INT <= Build.VERSION_CODES.KITKAT) { + 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) + } + mExtapp = ExternalAppDatabase(activity) + val clearapi = findPreference("clearapi") + clearapi!!.onPreferenceClickListener = this + findPreference("osslspeed")!!.onPreferenceClickListener = this + 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 + ovpn3.isChecked = false + } + (findPreference("restartvpnonboot") as CheckBoxPreference?)!!.onPreferenceChangeListener = + Preference.OnPreferenceChangeListener { pref: Preference?, newValue: Any -> + if (newValue == true) { + val vpn = ProfileManager.getAlwaysOnVPN(requireActivity()) + if (vpn == null) { + Toast.makeText( + requireContext(), + R.string.no_default_vpn_set, + Toast.LENGTH_LONG + ).show() + return@setOnPreferenceChangeListener false + } + } + true + } + setClearApiSummary() + } + + override fun onResume() { + super.onResume() + val vpn = ProfileManager.getAlwaysOnVPN(activity) + val sb = StringBuffer(getString(R.string.defaultvpnsummary)) + sb.append('\n') + if (vpn == null) sb.append(getString(R.string.novpn_selected)) else sb.append( + getString( + R.string.vpnselected, + vpn.name + ) + ) + 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 + } + return true + } + + private fun setClearApiSummary() { + val clearapi = findPreference("clearapi") + if (mExtapp!!.extAppList.isEmpty()) { + clearapi!!.isEnabled = false + clearapi.setSummary(R.string.no_external_app_allowed) + } else { + 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 applist = StringBuilder() + 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) + } + } + return applist.toString() + } + + // 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 + File("/system/lib/modules/tun.ko").length() > 10 + + override fun onPreferenceClick(preference: Preference): Boolean { + if (preference.key == "clearapi") { + val builder = AlertDialog.Builder( + activity + ) + builder.setPositiveButton(R.string.clear, this) + builder.setNegativeButton(android.R.string.cancel, null) + builder.setMessage(getString(R.string.clearappsdialog, getExtAppList("\n"))) + builder.show() + } else if (preference.key == "osslspeed") { + startActivity(Intent(activity, OpenSSLSpeed::class.java)) + } + return true + } + + override fun onClick(dialog: DialogInterface, which: Int) { + if (which == Dialog.BUTTON_POSITIVE) { + mExtapp!!.clearAllApiApps() + setClearApiSummary() + } + } +} \ No newline at end of file -- cgit v1.2.3