Loading app/src/main/java/io/heckel/ntfy/ui/BasePreferenceFragment.kt 0 → 100644 +50 −0 Original line number Diff line number Diff line package io.heckel.ntfy.ui import androidx.preference.EditTextPreference import androidx.preference.ListPreference import androidx.preference.Preference import androidx.preference.PreferenceFragmentCompat import com.google.android.material.dialog.MaterialAlertDialogBuilder import com.google.android.material.textfield.TextInputEditText import io.heckel.ntfy.R abstract class BasePreferenceFragment : PreferenceFragmentCompat() { /** * Show [ListPreference] and [EditTextPreference] dialog by [MaterialAlertDialogBuilder] */ override fun onDisplayPreferenceDialog(preference: Preference) { when (preference) { is ListPreference -> { val prefIndex = preference.entryValues.indexOf(preference.value) MaterialAlertDialogBuilder(requireContext()) .setTitle(preference.title) .setSingleChoiceItems(preference.entries, prefIndex) { dialog, index -> val newValue = preference.entryValues[index].toString() if (preference.callChangeListener(newValue)) { preference.value = newValue } dialog.dismiss() } .setNegativeButton(android.R.string.cancel, null) .show() } is EditTextPreference -> { val view = layoutInflater.inflate(R.layout.dialog_edit_text_preference, null) val editText = view.findViewById<TextInputEditText>(R.id.editText) editText.setText(preference.text.toString()) MaterialAlertDialogBuilder(requireContext()) .setTitle(preference.title) .setView(view) .setPositiveButton(android.R.string.ok) { _, _ -> val newValue = editText.text.toString() if (preference.callChangeListener(newValue)) { preference.text = newValue } } .setNegativeButton(android.R.string.cancel, null) .show() } else -> super.onDisplayPreferenceDialog(preference) } } } app/src/main/java/io/heckel/ntfy/ui/DetailSettingsActivity.kt +4 −4 Original line number Diff line number Diff line Loading @@ -137,7 +137,7 @@ class DetailSettingsActivity : AppCompatActivity() { private fun loadInstantPref() { val appBaseUrl = getString(R.string.app_base_url) val prefId = context?.getString(R.string.detail_settings_notifications_instant_key) ?: return val pref: SwitchPreference? = findPreference(prefId) val pref: SwitchPreferenceCompat? = findPreference(prefId) pref?.isVisible = BuildConfig.FIREBASE_AVAILABLE && subscription.baseUrl == appBaseUrl pref?.isChecked = subscription.instant pref?.preferenceDataStore = object : PreferenceDataStore() { Loading @@ -148,7 +148,7 @@ class DetailSettingsActivity : AppCompatActivity() { return subscription.instant } } pref?.summaryProvider = Preference.SummaryProvider<SwitchPreference> { preference -> pref?.summaryProvider = Preference.SummaryProvider<SwitchPreferenceCompat> { preference -> if (preference.isChecked) { getString(R.string.detail_settings_notifications_instant_summary_on) } else { Loading @@ -159,7 +159,7 @@ class DetailSettingsActivity : AppCompatActivity() { private fun loadDedicatedChannelsPrefs() { val prefId = context?.getString(R.string.detail_settings_notifications_dedicated_channels_key) ?: return val pref: SwitchPreference? = findPreference(prefId) val pref: SwitchPreferenceCompat? = findPreference(prefId) pref?.isVisible = true pref?.isChecked = subscription.dedicatedChannels pref?.preferenceDataStore = object : PreferenceDataStore() { Loading @@ -176,7 +176,7 @@ class DetailSettingsActivity : AppCompatActivity() { return subscription.dedicatedChannels } } pref?.summaryProvider = Preference.SummaryProvider<SwitchPreference> { preference -> pref?.summaryProvider = Preference.SummaryProvider<SwitchPreferenceCompat> { preference -> if (preference.isChecked) { getString(R.string.detail_settings_notifications_dedicated_channels_summary_on) } else { Loading app/src/main/java/io/heckel/ntfy/ui/SettingsActivity.kt +10 −10 Original line number Diff line number Diff line Loading @@ -120,7 +120,7 @@ class SettingsActivity : AppCompatActivity(), PreferenceFragmentCompat.OnPrefere return true } class SettingsFragment : PreferenceFragmentCompat() { class SettingsFragment : BasePreferenceFragment() { private lateinit var repository: Repository private lateinit var serviceManager: SubscriberServiceManager private var autoDownloadSelection = AUTO_DOWNLOAD_SELECTION_NOT_SET Loading Loading @@ -203,7 +203,7 @@ class SettingsActivity : AppCompatActivity(), PreferenceFragmentCompat.OnPrefere // Keep alerting for max priority val insistentMaxPriorityPrefId = context?.getString(R.string.settings_notifications_insistent_max_priority_key) ?: return val insistentMaxPriority: SwitchPreference? = findPreference(insistentMaxPriorityPrefId) val insistentMaxPriority: SwitchPreferenceCompat? = findPreference(insistentMaxPriorityPrefId) insistentMaxPriority?.isChecked = repository.getInsistentMaxPriorityEnabled() insistentMaxPriority?.preferenceDataStore = object : PreferenceDataStore() { override fun putBoolean(key: String?, value: Boolean) { Loading @@ -213,7 +213,7 @@ class SettingsActivity : AppCompatActivity(), PreferenceFragmentCompat.OnPrefere return repository.getInsistentMaxPriorityEnabled() } } insistentMaxPriority?.summaryProvider = Preference.SummaryProvider<SwitchPreference> { pref -> insistentMaxPriority?.summaryProvider = Preference.SummaryProvider<SwitchPreferenceCompat> { pref -> if (pref.isChecked) { getString(R.string.settings_notifications_insistent_max_priority_summary_enabled) } else { Loading Loading @@ -347,7 +347,7 @@ class SettingsActivity : AppCompatActivity(), PreferenceFragmentCompat.OnPrefere // Broadcast enabled val broadcastEnabledPrefId = context?.getString(R.string.settings_advanced_broadcast_key) ?: return val broadcastEnabled: SwitchPreference? = findPreference(broadcastEnabledPrefId) val broadcastEnabled: SwitchPreferenceCompat? = findPreference(broadcastEnabledPrefId) broadcastEnabled?.isChecked = repository.getBroadcastEnabled() broadcastEnabled?.preferenceDataStore = object : PreferenceDataStore() { override fun putBoolean(key: String?, value: Boolean) { Loading @@ -357,7 +357,7 @@ class SettingsActivity : AppCompatActivity(), PreferenceFragmentCompat.OnPrefere return repository.getBroadcastEnabled() } } broadcastEnabled?.summaryProvider = Preference.SummaryProvider<SwitchPreference> { pref -> broadcastEnabled?.summaryProvider = Preference.SummaryProvider<SwitchPreferenceCompat> { pref -> if (pref.isChecked) { getString(R.string.settings_advanced_broadcast_summary_enabled) } else { Loading @@ -367,7 +367,7 @@ class SettingsActivity : AppCompatActivity(), PreferenceFragmentCompat.OnPrefere // Enable UnifiedPush val unifiedPushEnabledPrefId = context?.getString(R.string.settings_advanced_unifiedpush_key) ?: return val unifiedPushEnabled: SwitchPreference? = findPreference(unifiedPushEnabledPrefId) val unifiedPushEnabled: SwitchPreferenceCompat? = findPreference(unifiedPushEnabledPrefId) unifiedPushEnabled?.isChecked = repository.getUnifiedPushEnabled() unifiedPushEnabled?.preferenceDataStore = object : PreferenceDataStore() { override fun putBoolean(key: String?, value: Boolean) { Loading @@ -377,7 +377,7 @@ class SettingsActivity : AppCompatActivity(), PreferenceFragmentCompat.OnPrefere return repository.getUnifiedPushEnabled() } } unifiedPushEnabled?.summaryProvider = Preference.SummaryProvider<SwitchPreference> { pref -> unifiedPushEnabled?.summaryProvider = Preference.SummaryProvider<SwitchPreferenceCompat> { pref -> if (pref.isChecked) { getString(R.string.settings_advanced_unifiedpush_summary_enabled) } else { Loading Loading @@ -412,7 +412,7 @@ class SettingsActivity : AppCompatActivity(), PreferenceFragmentCompat.OnPrefere // Record logs val recordLogsPrefId = context?.getString(R.string.settings_advanced_record_logs_key) ?: return val recordLogsEnabled: SwitchPreference? = findPreference(recordLogsPrefId) val recordLogsEnabled: SwitchPreferenceCompat? = findPreference(recordLogsPrefId) recordLogsEnabled?.isChecked = Log.getRecord() recordLogsEnabled?.preferenceDataStore = object : PreferenceDataStore() { override fun putBoolean(key: String?, value: Boolean) { Loading @@ -425,7 +425,7 @@ class SettingsActivity : AppCompatActivity(), PreferenceFragmentCompat.OnPrefere return Log.getRecord() } } recordLogsEnabled?.summaryProvider = Preference.SummaryProvider<SwitchPreference> { pref -> recordLogsEnabled?.summaryProvider = Preference.SummaryProvider<SwitchPreferenceCompat> { pref -> if (pref.isChecked) { getString(R.string.settings_advanced_record_logs_summary_enabled) } else { Loading Loading @@ -683,7 +683,7 @@ class SettingsActivity : AppCompatActivity(), PreferenceFragmentCompat.OnPrefere data class NopasteResponse(val url: String) } class UserSettingsFragment : PreferenceFragmentCompat() { class UserSettingsFragment : BasePreferenceFragment() { private lateinit var repository: Repository override fun onCreatePreferences(savedInstanceState: Bundle?, rootKey: String?) { Loading app/src/main/res/layout/dialog_edit_text_preference.xml 0 → 100644 +19 −0 Original line number Diff line number Diff line <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:paddingTop="?dialogPreferredPadding"> <com.google.android.material.textfield.TextInputLayout android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_marginHorizontal="?dialogPreferredPadding"> <com.google.android.material.textfield.TextInputEditText android:id="@+id/editText" android:layout_width="match_parent" android:layout_height="wrap_content" /> </com.google.android.material.textfield.TextInputLayout> </LinearLayout> No newline at end of file app/src/main/res/layout/fragment_user_dialog.xml +1 −0 Original line number Diff line number Diff line Loading @@ -50,6 +50,7 @@ android:layout_width="match_parent" android:layout_height="wrap_content" android:hint="@string/user_dialog_password_hint_add" android:importantForAutofill="no" android:backgroundTint="?attr/colorPrimary" android:maxLines="1" android:inputType="textPassword" app:layout_constraintStart_toStartOf="parent" app:layout_constraintEnd_toEndOf="parent" android:layout_marginTop="6dp" app:layout_constraintTop_toBottomOf="@id/user_dialog_username"/> Loading Loading
app/src/main/java/io/heckel/ntfy/ui/BasePreferenceFragment.kt 0 → 100644 +50 −0 Original line number Diff line number Diff line package io.heckel.ntfy.ui import androidx.preference.EditTextPreference import androidx.preference.ListPreference import androidx.preference.Preference import androidx.preference.PreferenceFragmentCompat import com.google.android.material.dialog.MaterialAlertDialogBuilder import com.google.android.material.textfield.TextInputEditText import io.heckel.ntfy.R abstract class BasePreferenceFragment : PreferenceFragmentCompat() { /** * Show [ListPreference] and [EditTextPreference] dialog by [MaterialAlertDialogBuilder] */ override fun onDisplayPreferenceDialog(preference: Preference) { when (preference) { is ListPreference -> { val prefIndex = preference.entryValues.indexOf(preference.value) MaterialAlertDialogBuilder(requireContext()) .setTitle(preference.title) .setSingleChoiceItems(preference.entries, prefIndex) { dialog, index -> val newValue = preference.entryValues[index].toString() if (preference.callChangeListener(newValue)) { preference.value = newValue } dialog.dismiss() } .setNegativeButton(android.R.string.cancel, null) .show() } is EditTextPreference -> { val view = layoutInflater.inflate(R.layout.dialog_edit_text_preference, null) val editText = view.findViewById<TextInputEditText>(R.id.editText) editText.setText(preference.text.toString()) MaterialAlertDialogBuilder(requireContext()) .setTitle(preference.title) .setView(view) .setPositiveButton(android.R.string.ok) { _, _ -> val newValue = editText.text.toString() if (preference.callChangeListener(newValue)) { preference.text = newValue } } .setNegativeButton(android.R.string.cancel, null) .show() } else -> super.onDisplayPreferenceDialog(preference) } } }
app/src/main/java/io/heckel/ntfy/ui/DetailSettingsActivity.kt +4 −4 Original line number Diff line number Diff line Loading @@ -137,7 +137,7 @@ class DetailSettingsActivity : AppCompatActivity() { private fun loadInstantPref() { val appBaseUrl = getString(R.string.app_base_url) val prefId = context?.getString(R.string.detail_settings_notifications_instant_key) ?: return val pref: SwitchPreference? = findPreference(prefId) val pref: SwitchPreferenceCompat? = findPreference(prefId) pref?.isVisible = BuildConfig.FIREBASE_AVAILABLE && subscription.baseUrl == appBaseUrl pref?.isChecked = subscription.instant pref?.preferenceDataStore = object : PreferenceDataStore() { Loading @@ -148,7 +148,7 @@ class DetailSettingsActivity : AppCompatActivity() { return subscription.instant } } pref?.summaryProvider = Preference.SummaryProvider<SwitchPreference> { preference -> pref?.summaryProvider = Preference.SummaryProvider<SwitchPreferenceCompat> { preference -> if (preference.isChecked) { getString(R.string.detail_settings_notifications_instant_summary_on) } else { Loading @@ -159,7 +159,7 @@ class DetailSettingsActivity : AppCompatActivity() { private fun loadDedicatedChannelsPrefs() { val prefId = context?.getString(R.string.detail_settings_notifications_dedicated_channels_key) ?: return val pref: SwitchPreference? = findPreference(prefId) val pref: SwitchPreferenceCompat? = findPreference(prefId) pref?.isVisible = true pref?.isChecked = subscription.dedicatedChannels pref?.preferenceDataStore = object : PreferenceDataStore() { Loading @@ -176,7 +176,7 @@ class DetailSettingsActivity : AppCompatActivity() { return subscription.dedicatedChannels } } pref?.summaryProvider = Preference.SummaryProvider<SwitchPreference> { preference -> pref?.summaryProvider = Preference.SummaryProvider<SwitchPreferenceCompat> { preference -> if (preference.isChecked) { getString(R.string.detail_settings_notifications_dedicated_channels_summary_on) } else { Loading
app/src/main/java/io/heckel/ntfy/ui/SettingsActivity.kt +10 −10 Original line number Diff line number Diff line Loading @@ -120,7 +120,7 @@ class SettingsActivity : AppCompatActivity(), PreferenceFragmentCompat.OnPrefere return true } class SettingsFragment : PreferenceFragmentCompat() { class SettingsFragment : BasePreferenceFragment() { private lateinit var repository: Repository private lateinit var serviceManager: SubscriberServiceManager private var autoDownloadSelection = AUTO_DOWNLOAD_SELECTION_NOT_SET Loading Loading @@ -203,7 +203,7 @@ class SettingsActivity : AppCompatActivity(), PreferenceFragmentCompat.OnPrefere // Keep alerting for max priority val insistentMaxPriorityPrefId = context?.getString(R.string.settings_notifications_insistent_max_priority_key) ?: return val insistentMaxPriority: SwitchPreference? = findPreference(insistentMaxPriorityPrefId) val insistentMaxPriority: SwitchPreferenceCompat? = findPreference(insistentMaxPriorityPrefId) insistentMaxPriority?.isChecked = repository.getInsistentMaxPriorityEnabled() insistentMaxPriority?.preferenceDataStore = object : PreferenceDataStore() { override fun putBoolean(key: String?, value: Boolean) { Loading @@ -213,7 +213,7 @@ class SettingsActivity : AppCompatActivity(), PreferenceFragmentCompat.OnPrefere return repository.getInsistentMaxPriorityEnabled() } } insistentMaxPriority?.summaryProvider = Preference.SummaryProvider<SwitchPreference> { pref -> insistentMaxPriority?.summaryProvider = Preference.SummaryProvider<SwitchPreferenceCompat> { pref -> if (pref.isChecked) { getString(R.string.settings_notifications_insistent_max_priority_summary_enabled) } else { Loading Loading @@ -347,7 +347,7 @@ class SettingsActivity : AppCompatActivity(), PreferenceFragmentCompat.OnPrefere // Broadcast enabled val broadcastEnabledPrefId = context?.getString(R.string.settings_advanced_broadcast_key) ?: return val broadcastEnabled: SwitchPreference? = findPreference(broadcastEnabledPrefId) val broadcastEnabled: SwitchPreferenceCompat? = findPreference(broadcastEnabledPrefId) broadcastEnabled?.isChecked = repository.getBroadcastEnabled() broadcastEnabled?.preferenceDataStore = object : PreferenceDataStore() { override fun putBoolean(key: String?, value: Boolean) { Loading @@ -357,7 +357,7 @@ class SettingsActivity : AppCompatActivity(), PreferenceFragmentCompat.OnPrefere return repository.getBroadcastEnabled() } } broadcastEnabled?.summaryProvider = Preference.SummaryProvider<SwitchPreference> { pref -> broadcastEnabled?.summaryProvider = Preference.SummaryProvider<SwitchPreferenceCompat> { pref -> if (pref.isChecked) { getString(R.string.settings_advanced_broadcast_summary_enabled) } else { Loading @@ -367,7 +367,7 @@ class SettingsActivity : AppCompatActivity(), PreferenceFragmentCompat.OnPrefere // Enable UnifiedPush val unifiedPushEnabledPrefId = context?.getString(R.string.settings_advanced_unifiedpush_key) ?: return val unifiedPushEnabled: SwitchPreference? = findPreference(unifiedPushEnabledPrefId) val unifiedPushEnabled: SwitchPreferenceCompat? = findPreference(unifiedPushEnabledPrefId) unifiedPushEnabled?.isChecked = repository.getUnifiedPushEnabled() unifiedPushEnabled?.preferenceDataStore = object : PreferenceDataStore() { override fun putBoolean(key: String?, value: Boolean) { Loading @@ -377,7 +377,7 @@ class SettingsActivity : AppCompatActivity(), PreferenceFragmentCompat.OnPrefere return repository.getUnifiedPushEnabled() } } unifiedPushEnabled?.summaryProvider = Preference.SummaryProvider<SwitchPreference> { pref -> unifiedPushEnabled?.summaryProvider = Preference.SummaryProvider<SwitchPreferenceCompat> { pref -> if (pref.isChecked) { getString(R.string.settings_advanced_unifiedpush_summary_enabled) } else { Loading Loading @@ -412,7 +412,7 @@ class SettingsActivity : AppCompatActivity(), PreferenceFragmentCompat.OnPrefere // Record logs val recordLogsPrefId = context?.getString(R.string.settings_advanced_record_logs_key) ?: return val recordLogsEnabled: SwitchPreference? = findPreference(recordLogsPrefId) val recordLogsEnabled: SwitchPreferenceCompat? = findPreference(recordLogsPrefId) recordLogsEnabled?.isChecked = Log.getRecord() recordLogsEnabled?.preferenceDataStore = object : PreferenceDataStore() { override fun putBoolean(key: String?, value: Boolean) { Loading @@ -425,7 +425,7 @@ class SettingsActivity : AppCompatActivity(), PreferenceFragmentCompat.OnPrefere return Log.getRecord() } } recordLogsEnabled?.summaryProvider = Preference.SummaryProvider<SwitchPreference> { pref -> recordLogsEnabled?.summaryProvider = Preference.SummaryProvider<SwitchPreferenceCompat> { pref -> if (pref.isChecked) { getString(R.string.settings_advanced_record_logs_summary_enabled) } else { Loading Loading @@ -683,7 +683,7 @@ class SettingsActivity : AppCompatActivity(), PreferenceFragmentCompat.OnPrefere data class NopasteResponse(val url: String) } class UserSettingsFragment : PreferenceFragmentCompat() { class UserSettingsFragment : BasePreferenceFragment() { private lateinit var repository: Repository override fun onCreatePreferences(savedInstanceState: Bundle?, rootKey: String?) { Loading
app/src/main/res/layout/dialog_edit_text_preference.xml 0 → 100644 +19 −0 Original line number Diff line number Diff line <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:paddingTop="?dialogPreferredPadding"> <com.google.android.material.textfield.TextInputLayout android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_marginHorizontal="?dialogPreferredPadding"> <com.google.android.material.textfield.TextInputEditText android:id="@+id/editText" android:layout_width="match_parent" android:layout_height="wrap_content" /> </com.google.android.material.textfield.TextInputLayout> </LinearLayout> No newline at end of file
app/src/main/res/layout/fragment_user_dialog.xml +1 −0 Original line number Diff line number Diff line Loading @@ -50,6 +50,7 @@ android:layout_width="match_parent" android:layout_height="wrap_content" android:hint="@string/user_dialog_password_hint_add" android:importantForAutofill="no" android:backgroundTint="?attr/colorPrimary" android:maxLines="1" android:inputType="textPassword" app:layout_constraintStart_toStartOf="parent" app:layout_constraintEnd_toEndOf="parent" android:layout_marginTop="6dp" app:layout_constraintTop_toBottomOf="@id/user_dialog_username"/> Loading