You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
MagiskModuleManager/app/src/main/kotlin/com/fox2code/mmm/settings/AppearanceFragment.kt

222 lines
12 KiB
Kotlin

package com.fox2code.mmm.settings
import android.content.ClipData
import android.content.ClipboardManager
import android.content.Context
import android.content.DialogInterface
import android.content.Intent
import android.content.SharedPreferences
import android.net.Uri
import android.os.Build
import android.os.Bundle
import android.widget.Toast
import androidx.preference.ListPreference
import androidx.preference.Preference
import androidx.preference.PreferenceFragmentCompat
import androidx.preference.TwoStatePreference
import androidx.security.crypto.EncryptedSharedPreferences
import androidx.security.crypto.MasterKey
import com.fox2code.foxcompat.app.FoxActivity
import com.fox2code.mmm.BuildConfig
import com.fox2code.mmm.MainApplication
import com.fox2code.mmm.R
import com.fox2code.rosettax.LanguageSwitcher
import com.google.android.material.dialog.MaterialAlertDialogBuilder
import com.topjohnwu.superuser.internal.UiThreadHandler
import timber.log.Timber
class AppearanceFragment : PreferenceFragmentCompat() {
override fun onCreatePreferences(savedInstanceState: Bundle?, rootKey: String?) {
val name = "mmmx"
val context: Context? = MainApplication.INSTANCE
val masterKey: MasterKey
val preferenceManager = preferenceManager
val dataStore: SharedPreferenceDataStore
val editor: SharedPreferences.Editor
try {
masterKey =
MasterKey.Builder(context!!).setKeyScheme(MasterKey.KeyScheme.AES256_GCM)
.build()
dataStore = SharedPreferenceDataStore(
EncryptedSharedPreferences.create(
context,
name,
masterKey,
EncryptedSharedPreferences.PrefKeyEncryptionScheme.AES256_SIV,
EncryptedSharedPreferences.PrefValueEncryptionScheme.AES256_GCM
)
)
preferenceManager!!.preferenceDataStore = dataStore
preferenceManager.sharedPreferencesName = "mmm"
editor = dataStore.sharedPreferences.edit()
} catch (e: Exception) {
Timber.e(e, "Failed to create encrypted shared preferences")
throw RuntimeException(getString(R.string.error_encrypted_shared_preferences))
}
setPreferencesFromResource(R.xml.theme_preferences, rootKey)
SettingsActivity.applyMaterial3(preferenceScreen)
val themePreference = findPreference<ListPreference>("pref_theme")
// If transparent theme(s) are set, disable monet
if (themePreference!!.value == "transparent_light") {
if (BuildConfig.DEBUG) Timber.d("disabling monet")
findPreference<Preference>("pref_enable_monet")!!.isEnabled = false
// Toggle monet off
(findPreference<Preference>("pref_enable_monet") as TwoStatePreference?)!!.isChecked =
false
editor.putBoolean("pref_enable_monet", false).apply()
// Set summary
findPreference<Preference>("pref_enable_monet")!!.setSummary(R.string.monet_disabled_summary)
// Same for blur
findPreference<Preference>("pref_enable_blur")!!.isEnabled = false
(findPreference<Preference>("pref_enable_blur") as TwoStatePreference?)!!.isChecked =
false
editor.putBoolean("pref_enable_blur", false).apply()
findPreference<Preference>("pref_enable_blur")!!.setSummary(R.string.blur_disabled_summary)
}
themePreference.summaryProvider =
Preference.SummaryProvider { _: Preference? -> themePreference.entry }
themePreference.onPreferenceChangeListener =
Preference.OnPreferenceChangeListener { _: Preference?, newValue: Any ->
if (BuildConfig.DEBUG) Timber.d("refreshing activity. New value: %s", newValue)
editor.putString("pref_theme", newValue as String).apply()
// If theme contains "transparent" then disable monet
if (newValue.toString().contains("transparent")) {
if (BuildConfig.DEBUG) Timber.d("disabling monet")
// Show a dialogue warning the user about issues with transparent themes and
// that blur/monet will be disabled
MaterialAlertDialogBuilder(requireContext()).setTitle(R.string.transparent_theme_dialogue_title)
.setMessage(
R.string.transparent_theme_dialogue_message
).setPositiveButton(R.string.ok) { _: DialogInterface?, _: Int ->
// Toggle monet off
(findPreference<Preference>("pref_enable_monet") as TwoStatePreference?)!!.isChecked =
false
editor.putBoolean("pref_enable_monet", false).apply()
// Set summary
findPreference<Preference>("pref_enable_monet")!!.setSummary(R.string.monet_disabled_summary)
// Same for blur
(findPreference<Preference>("pref_enable_blur") as TwoStatePreference?)!!.isChecked =
false
editor.putBoolean("pref_enable_blur", false).apply()
findPreference<Preference>("pref_enable_blur")!!.setSummary(R.string.blur_disabled_summary)
// Refresh activity
UiThreadHandler.handler.postDelayed({
MainApplication.INSTANCE!!.updateTheme()
FoxActivity.getFoxActivity(this)
.setThemeRecreate(MainApplication.INSTANCE!!.getManagerThemeResId())
}, 1)
val intent = Intent(requireContext(), SettingsActivity::class.java)
intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP)
startActivity(intent)
}.setNegativeButton(R.string.cancel) { _: DialogInterface?, _: Int ->
// Revert to system theme
(findPreference<Preference>("pref_theme") as ListPreference?)!!.value =
"system"
// Refresh activity
}.show()
} else {
findPreference<Preference>("pref_enable_monet")!!.isEnabled = true
findPreference<Preference>("pref_enable_monet")?.summary = ""
findPreference<Preference>("pref_enable_blur")!!.isEnabled = true
findPreference<Preference>("pref_enable_blur")?.summary = ""
}
UiThreadHandler.handler.postDelayed({
MainApplication.INSTANCE!!.updateTheme()
FoxActivity.getFoxActivity(this).setThemeRecreate(MainApplication.INSTANCE!!.getManagerThemeResId())
}, 1)
true
}
val disableMonet = findPreference<Preference>("pref_enable_monet")
if (Build.VERSION.SDK_INT < Build.VERSION_CODES.S) {
disableMonet!!.setSummary(R.string.require_android_12)
disableMonet.isEnabled = false
}
disableMonet!!.onPreferenceClickListener = Preference.OnPreferenceClickListener {
UiThreadHandler.handler.postDelayed({
MainApplication.INSTANCE!!.updateTheme()
(requireActivity() as FoxActivity).setThemeRecreate(MainApplication.INSTANCE!!.getManagerThemeResId())
}, 1)
true
}
val enableBlur = findPreference<Preference>("pref_enable_blur")
// Disable blur on low performance devices
if (SettingsActivity.devicePerformanceClass < SettingsActivity.PERFORMANCE_CLASS_AVERAGE) {
// Show a warning
enableBlur!!.onPreferenceChangeListener =
Preference.OnPreferenceChangeListener { _: Preference?, newValue: Any ->
if (newValue == true) {
MaterialAlertDialogBuilder(requireContext()).setTitle(R.string.low_performance_device_dialogue_title)
.setMessage(
R.string.low_performance_device_dialogue_message
).setPositiveButton(R.string.ok) { _: DialogInterface?, _: Int ->
// Toggle blur on
(findPreference<Preference>("pref_enable_blur") as TwoStatePreference?)!!.isChecked =
true
editor.putBoolean("pref_enable_blur", true).apply()
// Set summary
findPreference<Preference>("pref_enable_blur")!!.setSummary(R.string.blur_disabled_summary)
}
.setNegativeButton(R.string.cancel) { _: DialogInterface?, _: Int ->
// Revert to blur on
(findPreference<Preference>("pref_enable_blur") as TwoStatePreference?)!!.isChecked =
false
editor.putBoolean("pref_enable_blur", false).apply()
// Set summary
findPreference<Preference>("pref_enable_blur")?.summary =
getString(R.string.blur_performance_warning_summary)
}.show()
}
true
}
}
// Handle pref_language_selector_cta by taking user to https://translate.nift4.org/engage/foxmmm/
val languageSelectorCta =
findPreference<LongClickablePreference>("pref_language_selector_cta")
languageSelectorCta!!.onPreferenceClickListener =
Preference.OnPreferenceClickListener { _: Preference? ->
val browserIntent = Intent(
Intent.ACTION_VIEW, Uri.parse("https://translate.nift4.org/engage/foxmmm/")
)
startActivity(browserIntent)
true
}
val languageSelector = findPreference<Preference>("pref_language_selector")
languageSelector!!.onPreferenceClickListener =
Preference.OnPreferenceClickListener { _: Preference? ->
val ls = LanguageSwitcher(
requireActivity()
)
ls.setSupportedStringLocales(MainApplication.supportedLocales)
ls.showChangeLanguageDialog(activity)
true
}
// Long click to copy url
languageSelectorCta.onPreferenceLongClickListener =
LongClickablePreference.OnPreferenceLongClickListener { _: Preference? ->
val clipboard =
requireContext().getSystemService(FoxActivity.CLIPBOARD_SERVICE) as ClipboardManager
val clip =
ClipData.newPlainText("URL", "https://translate.nift4.org/engage/foxmmm/")
clipboard.setPrimaryClip(clip)
Toast.makeText(requireContext(), R.string.link_copied, Toast.LENGTH_SHORT)
.show()
true
}
val translatedBy = this.getString(R.string.language_translated_by)
// I don't "translate" english
if (!("Translated by Fox2Code (Put your name here)" == translatedBy || "Translated by Fox2Code" == translatedBy)) {
languageSelector.setSummary(R.string.language_translated_by)
} else {
languageSelector.summary = null
}
}
}