|
@@ -3,23 +3,48 @@ package im.angry.openeuicc.ui
|
|
|
import android.content.Intent
|
|
import android.content.Intent
|
|
|
import android.net.Uri
|
|
import android.net.Uri
|
|
|
import android.os.Bundle
|
|
import android.os.Bundle
|
|
|
|
|
+import android.widget.Toast
|
|
|
import androidx.datastore.preferences.core.Preferences
|
|
import androidx.datastore.preferences.core.Preferences
|
|
|
import androidx.lifecycle.lifecycleScope
|
|
import androidx.lifecycle.lifecycleScope
|
|
|
import androidx.preference.CheckBoxPreference
|
|
import androidx.preference.CheckBoxPreference
|
|
|
import androidx.preference.Preference
|
|
import androidx.preference.Preference
|
|
|
|
|
+import androidx.preference.PreferenceCategory
|
|
|
import androidx.preference.PreferenceFragmentCompat
|
|
import androidx.preference.PreferenceFragmentCompat
|
|
|
import im.angry.openeuicc.common.R
|
|
import im.angry.openeuicc.common.R
|
|
|
import im.angry.openeuicc.util.*
|
|
import im.angry.openeuicc.util.*
|
|
|
import kotlinx.coroutines.flow.Flow
|
|
import kotlinx.coroutines.flow.Flow
|
|
|
|
|
+import kotlinx.coroutines.flow.collect
|
|
|
|
|
+import kotlinx.coroutines.flow.onEach
|
|
|
import kotlinx.coroutines.launch
|
|
import kotlinx.coroutines.launch
|
|
|
import kotlinx.coroutines.runBlocking
|
|
import kotlinx.coroutines.runBlocking
|
|
|
|
|
|
|
|
class SettingsFragment: PreferenceFragmentCompat() {
|
|
class SettingsFragment: PreferenceFragmentCompat() {
|
|
|
|
|
+ private lateinit var developerPref: PreferenceCategory
|
|
|
|
|
+
|
|
|
|
|
+ // Hidden developer options switch
|
|
|
|
|
+ private var numClicks = 0
|
|
|
|
|
+ private var lastClickTimestamp = -1L
|
|
|
|
|
+ private var lastToast: Toast? = null
|
|
|
|
|
+
|
|
|
override fun onCreatePreferences(savedInstanceState: Bundle?, rootKey: String?) {
|
|
override fun onCreatePreferences(savedInstanceState: Bundle?, rootKey: String?) {
|
|
|
setPreferencesFromResource(R.xml.pref_settings, rootKey)
|
|
setPreferencesFromResource(R.xml.pref_settings, rootKey)
|
|
|
|
|
|
|
|
|
|
+ developerPref = findPreference("pref_developer")!!
|
|
|
|
|
+
|
|
|
|
|
+ // Show / hide developer preference based on whether it is enabled
|
|
|
|
|
+ lifecycleScope.launch {
|
|
|
|
|
+ preferenceRepository.developerOptionsEnabledFlow.onEach {
|
|
|
|
|
+ developerPref.isVisible = it
|
|
|
|
|
+ }.collect()
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
findPreference<Preference>("pref_info_app_version")
|
|
findPreference<Preference>("pref_info_app_version")
|
|
|
- ?.summary = requireContext().selfAppVersion
|
|
|
|
|
|
|
+ ?.apply {
|
|
|
|
|
+ summary = requireContext().selfAppVersion
|
|
|
|
|
+
|
|
|
|
|
+ // Enable developer options when this is clicked for 7 times
|
|
|
|
|
+ setOnPreferenceClickListener(this@SettingsFragment::onAppVersionClicked)
|
|
|
|
|
+ }
|
|
|
|
|
|
|
|
findPreference<Preference>("pref_info_source_code")
|
|
findPreference<Preference>("pref_info_source_code")
|
|
|
?.setOnPreferenceClickListener {
|
|
?.setOnPreferenceClickListener {
|
|
@@ -48,7 +73,7 @@ class SettingsFragment: PreferenceFragmentCompat() {
|
|
|
findPreference<CheckBoxPreference>("pref_advanced_verbose_logging")
|
|
findPreference<CheckBoxPreference>("pref_advanced_verbose_logging")
|
|
|
?.bindBooleanFlow(preferenceRepository.verboseLoggingFlow, PreferenceKeys.VERBOSE_LOGGING)
|
|
?.bindBooleanFlow(preferenceRepository.verboseLoggingFlow, PreferenceKeys.VERBOSE_LOGGING)
|
|
|
|
|
|
|
|
- findPreference<CheckBoxPreference>("pref_advanced_experimental_download_wizard")
|
|
|
|
|
|
|
+ findPreference<CheckBoxPreference>("pref_developer_experimental_download_wizard")
|
|
|
?.bindBooleanFlow(preferenceRepository.experimentalDownloadWizardFlow, PreferenceKeys.EXPERIMENTAL_DOWNLOAD_WIZARD)
|
|
?.bindBooleanFlow(preferenceRepository.experimentalDownloadWizardFlow, PreferenceKeys.EXPERIMENTAL_DOWNLOAD_WIZARD)
|
|
|
}
|
|
}
|
|
|
|
|
|
|
@@ -57,6 +82,44 @@ class SettingsFragment: PreferenceFragmentCompat() {
|
|
|
setupRootViewInsets(requireView().requireViewById(androidx.preference.R.id.recycler_view))
|
|
setupRootViewInsets(requireView().requireViewById(androidx.preference.R.id.recycler_view))
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
|
|
+ @Suppress("UNUSED_PARAMETER")
|
|
|
|
|
+ private fun onAppVersionClicked(pref: Preference): Boolean {
|
|
|
|
|
+ if (developerPref.isVisible) return false
|
|
|
|
|
+ val now = System.currentTimeMillis()
|
|
|
|
|
+ if (now - lastClickTimestamp >= 1000) {
|
|
|
|
|
+ numClicks = 1
|
|
|
|
|
+ } else {
|
|
|
|
|
+ numClicks++
|
|
|
|
|
+ }
|
|
|
|
|
+ lastClickTimestamp = now
|
|
|
|
|
+
|
|
|
|
|
+ if (numClicks == 7) {
|
|
|
|
|
+ lifecycleScope.launch {
|
|
|
|
|
+ preferenceRepository.updatePreference(
|
|
|
|
|
+ PreferenceKeys.DEVELOPER_OPTIONS_ENABLED,
|
|
|
|
|
+ true
|
|
|
|
|
+ )
|
|
|
|
|
+
|
|
|
|
|
+ lastToast?.cancel()
|
|
|
|
|
+ Toast.makeText(
|
|
|
|
|
+ requireContext(),
|
|
|
|
|
+ R.string.developer_options_enabled,
|
|
|
|
|
+ Toast.LENGTH_SHORT
|
|
|
|
|
+ ).show()
|
|
|
|
|
+ }
|
|
|
|
|
+ } else if (numClicks > 1) {
|
|
|
|
|
+ lastToast?.cancel()
|
|
|
|
|
+ lastToast = Toast.makeText(
|
|
|
|
|
+ requireContext(),
|
|
|
|
|
+ getString(R.string.developer_options_steps, 7 - numClicks),
|
|
|
|
|
+ Toast.LENGTH_SHORT
|
|
|
|
|
+ )
|
|
|
|
|
+ lastToast!!.show()
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ return true
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
private fun CheckBoxPreference.bindBooleanFlow(flow: Flow<Boolean>, key: Preferences.Key<Boolean>) {
|
|
private fun CheckBoxPreference.bindBooleanFlow(flow: Flow<Boolean>, key: Preferences.Key<Boolean>) {
|
|
|
lifecycleScope.launch {
|
|
lifecycleScope.launch {
|
|
|
flow.collect { isChecked = it }
|
|
flow.collect { isChecked = it }
|