/* * Copyright © 2017-2019 WireGuard LLC. All Rights Reserved. * SPDX-License-Identifier: Apache-2.0 */ package com.wireguard.android.activity import android.content.Intent import android.os.Build import android.os.Bundle import android.view.MenuItem import androidx.lifecycle.lifecycleScope import androidx.preference.Preference import androidx.preference.PreferenceFragmentCompat import com.wireguard.android.Application import com.wireguard.android.R import com.wireguard.android.backend.WgQuickBackend import com.wireguard.android.util.AdminKnobs import com.wireguard.android.util.ModuleLoader import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.launch import kotlinx.coroutines.withContext /** * Interface for changing application-global persistent settings. */ class SettingsActivity : ThemeChangeAwareActivity() { override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) if (supportFragmentManager.findFragmentById(android.R.id.content) == null) { supportFragmentManager.beginTransaction() .add(android.R.id.content, SettingsFragment()) .commit() } } override fun onOptionsItemSelected(item: MenuItem): Boolean { if (item.itemId == android.R.id.home) { finish() return true } return super.onOptionsItemSelected(item) } class SettingsFragment : PreferenceFragmentCompat() { override fun onCreatePreferences(savedInstanceState: Bundle?, key: String?) { addPreferencesFromResource(R.xml.preferences) preferenceScreen.initialExpandedChildrenCount = 4 if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) { val darkTheme = preferenceManager.findPreference("dark_theme") darkTheme?.parent?.removePreference(darkTheme) --preferenceScreen.initialExpandedChildrenCount } if (Build.VERSION.SDK_INT < Build.VERSION_CODES.M) { val remoteApps = preferenceManager.findPreference("allow_remote_control_intents") remoteApps?.parent?.removePreference(remoteApps) } if (AdminKnobs.disableConfigExport) { val zipExporter = preferenceManager.findPreference("zip_exporter") zipExporter?.parent?.removePreference(zipExporter) } val wgQuickOnlyPrefs = arrayOf( preferenceManager.findPreference("tools_installer"), preferenceManager.findPreference("restore_on_boot"), preferenceManager.findPreference("multiple_tunnels") ).filterNotNull() wgQuickOnlyPrefs.forEach { it.isVisible = false } lifecycleScope.launch { if (Application.getBackend() is WgQuickBackend) { ++preferenceScreen.initialExpandedChildrenCount wgQuickOnlyPrefs.forEach { it.isVisible = true } } else { wgQuickOnlyPrefs.forEach { it.parent?.removePreference(it) } } } preferenceManager.findPreference("log_viewer")?.setOnPreferenceClickListener { startActivity(Intent(requireContext(), LogViewerActivity::class.java)) true } val moduleInstaller = preferenceManager.findPreference("module_downloader") val kernelModuleDisabler = preferenceManager.findPreference("kernel_module_disabler") moduleInstaller?.isVisible = false if (ModuleLoader.isModuleLoaded()) { moduleInstaller?.parent?.removePreference(moduleInstaller) } else { kernelModuleDisabler?.parent?.removePreference(kernelModuleDisabler) lifecycleScope.launch { try { withContext(Dispatchers.IO) { Application.getRootShell().start() } moduleInstaller?.isVisible = true } catch (_: Throwable) { moduleInstaller?.parent?.removePreference(moduleInstaller) } } } } } }