From 97db1fe4e63796af897a71fe81f81f8b275eb69b Mon Sep 17 00:00:00 2001 From: ThomasSession Date: Tue, 3 Sep 2024 13:37:36 +1000 Subject: [PATCH] Reworked preferences Making sure the summary was displaye properly for drop down preferences --- .../preferences/ChatsPreferenceFragment.java | 2 +- .../ListSummaryPreferenceFragment.java | 29 ------ .../NotificationsPreferenceFragment.kt | 99 ++++++++++--------- .../PrivacySettingsPreferenceFragment.kt | 2 +- .../preferences/widgets/DropDownPreference.kt | 70 +++++++++++++ .../widgets/SignalListPreference.java | 70 ------------- .../preferences/widgets/SignalPreference.java | 60 ----------- ...ry_widget.xml => preference_drop_down.xml} | 13 +-- .../res/xml/preferences_notifications.xml | 8 +- 9 files changed, 134 insertions(+), 219 deletions(-) delete mode 100644 app/src/main/java/org/thoughtcrime/securesms/preferences/ListSummaryPreferenceFragment.java create mode 100644 app/src/main/java/org/thoughtcrime/securesms/preferences/widgets/DropDownPreference.kt delete mode 100644 app/src/main/java/org/thoughtcrime/securesms/preferences/widgets/SignalListPreference.java delete mode 100644 app/src/main/java/org/thoughtcrime/securesms/preferences/widgets/SignalPreference.java rename app/src/main/res/layout/{preference_right_summary_widget.xml => preference_drop_down.xml} (71%) diff --git a/app/src/main/java/org/thoughtcrime/securesms/preferences/ChatsPreferenceFragment.java b/app/src/main/java/org/thoughtcrime/securesms/preferences/ChatsPreferenceFragment.java index 25d21bbf6d..2c23188429 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/preferences/ChatsPreferenceFragment.java +++ b/app/src/main/java/org/thoughtcrime/securesms/preferences/ChatsPreferenceFragment.java @@ -9,7 +9,7 @@ import org.thoughtcrime.securesms.permissions.Permissions; import network.loki.messenger.R; -public class ChatsPreferenceFragment extends ListSummaryPreferenceFragment { +public class ChatsPreferenceFragment extends CorrectedPreferenceFragment { private static final String TAG = ChatsPreferenceFragment.class.getSimpleName(); @Override diff --git a/app/src/main/java/org/thoughtcrime/securesms/preferences/ListSummaryPreferenceFragment.java b/app/src/main/java/org/thoughtcrime/securesms/preferences/ListSummaryPreferenceFragment.java deleted file mode 100644 index a57c0ad728..0000000000 --- a/app/src/main/java/org/thoughtcrime/securesms/preferences/ListSummaryPreferenceFragment.java +++ /dev/null @@ -1,29 +0,0 @@ -package org.thoughtcrime.securesms.preferences; - - -import androidx.preference.ListPreference; -import androidx.preference.Preference; - -import java.util.Arrays; - -import network.loki.messenger.R; - -public abstract class ListSummaryPreferenceFragment extends CorrectedPreferenceFragment { - - protected class ListSummaryListener implements Preference.OnPreferenceChangeListener { - @Override - public boolean onPreferenceChange(Preference preference, Object value) { - ListPreference listPref = (ListPreference) preference; - int entryIndex = Arrays.asList(listPref.getEntryValues()).indexOf(value); - - listPref.setSummary(entryIndex >= 0 && entryIndex < listPref.getEntries().length - ? listPref.getEntries()[entryIndex] - : getString(R.string.unknown)); - return true; - } - } - - protected void initializeListSummary(ListPreference pref) { - pref.setSummary(pref.getEntry()); - } -} diff --git a/app/src/main/java/org/thoughtcrime/securesms/preferences/NotificationsPreferenceFragment.kt b/app/src/main/java/org/thoughtcrime/securesms/preferences/NotificationsPreferenceFragment.kt index 5614091473..af282d4972 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/preferences/NotificationsPreferenceFragment.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/preferences/NotificationsPreferenceFragment.kt @@ -2,7 +2,6 @@ package org.thoughtcrime.securesms.preferences import android.annotation.SuppressLint import android.app.Activity -import android.content.Context import android.content.Intent import android.media.RingtoneManager import android.net.Uri @@ -11,7 +10,6 @@ import android.os.Bundle import android.provider.Settings import android.text.TextUtils import androidx.lifecycle.lifecycleScope -import androidx.preference.ListPreference import androidx.preference.Preference import dagger.hilt.android.AndroidEntryPoint import kotlinx.coroutines.Dispatchers @@ -19,17 +17,19 @@ import kotlinx.coroutines.launch import kotlinx.coroutines.withContext import network.loki.messenger.R import org.session.libsession.utilities.TextSecurePreferences -import org.session.libsession.utilities.TextSecurePreferences.Companion.isNotificationsEnabled import org.thoughtcrime.securesms.ApplicationContext import org.thoughtcrime.securesms.components.SwitchPreferenceCompat import org.thoughtcrime.securesms.notifications.NotificationChannels import org.thoughtcrime.securesms.notifications.PushRegistry +import org.thoughtcrime.securesms.preferences.widgets.DropDownPreference +import java.util.Arrays import javax.inject.Inject @AndroidEntryPoint -class NotificationsPreferenceFragment : ListSummaryPreferenceFragment() { +class NotificationsPreferenceFragment : CorrectedPreferenceFragment() { @Inject lateinit var pushRegistry: PushRegistry + @Inject lateinit var prefs: TextSecurePreferences @@ -41,22 +41,22 @@ class NotificationsPreferenceFragment : ListSummaryPreferenceFragment() { val fcmPreference: SwitchPreferenceCompat = findPreference(fcmKey)!! fcmPreference.isChecked = prefs.isPushEnabled() fcmPreference.setOnPreferenceChangeListener { _: Preference, newValue: Any -> - prefs.setPushEnabled(newValue as Boolean) - val job = pushRegistry.refresh(true) + prefs.setPushEnabled(newValue as Boolean) + val job = pushRegistry.refresh(true) - fcmPreference.isEnabled = false + fcmPreference.isEnabled = false - lifecycleScope.launch(Dispatchers.IO) { - job.join() + lifecycleScope.launch(Dispatchers.IO) { + job.join() - withContext(Dispatchers.Main) { - fcmPreference.isEnabled = true - } + withContext(Dispatchers.Main) { + fcmPreference.isEnabled = true } - - true } + true + } + prefs.setNotificationRingtone( NotificationChannels.getMessageRingtone(requireContext()).toString() ) @@ -64,8 +64,16 @@ class NotificationsPreferenceFragment : ListSummaryPreferenceFragment() { NotificationChannels.getMessageVibrate(requireContext()) ) - findPreference(TextSecurePreferences.RINGTONE_PREF)!!.onPreferenceChangeListener = RingtoneSummaryListener() - findPreference(TextSecurePreferences.NOTIFICATION_PRIVACY_PREF)!!.onPreferenceChangeListener = NotificationPrivacyListener() + findPreference(TextSecurePreferences.RINGTONE_PREF)?.apply { + setOnViewReady { updateRingtonePref() } + onPreferenceChangeListener = RingtoneSummaryListener() + } + + findPreference(TextSecurePreferences.NOTIFICATION_PRIVACY_PREF)?.apply { + setOnViewReady { setDropDownLabel(entry) } + onPreferenceChangeListener = NotificationPrivacyListener() + } + findPreference(TextSecurePreferences.VIBRATE_PREF)!!.onPreferenceChangeListener = Preference.OnPreferenceChangeListener { _: Preference?, newValue: Any -> NotificationChannels.updateMessageVibrate(requireContext(), newValue as Boolean) @@ -91,28 +99,18 @@ class NotificationsPreferenceFragment : ListSummaryPreferenceFragment() { true } - findPreference(TextSecurePreferences.NOTIFICATION_PRIVACY_PREF)!!.onPreferenceClickListener = - Preference.OnPreferenceClickListener { preference: Preference -> - val listPreference = preference as ListPreference - listPreferenceDialog(requireContext(), listPreference) { - initializeListSummary(findPreference(TextSecurePreferences.NOTIFICATION_PRIVACY_PREF)) - } - true - } - initializeListSummary(findPreference(TextSecurePreferences.NOTIFICATION_PRIVACY_PREF) as ListPreference?) - findPreference(TextSecurePreferences.NOTIFICATION_PRIORITY_PREF)!!.onPreferenceClickListener = Preference.OnPreferenceClickListener { val intent = Intent(Settings.ACTION_CHANNEL_NOTIFICATION_SETTINGS) intent.putExtra( - Settings.EXTRA_CHANNEL_ID, NotificationChannels.getMessagesChannel(requireContext()) + Settings.EXTRA_CHANNEL_ID, + NotificationChannels.getMessagesChannel(requireContext()) ) intent.putExtra(Settings.EXTRA_APP_PACKAGE, requireContext().packageName) startActivity(intent) true } - initializeRingtoneSummary(findPreference(TextSecurePreferences.RINGTONE_PREF)) initializeMessageVibrateSummary(findPreference(TextSecurePreferences.VIBRATE_PREF) as SwitchPreferenceCompat?) } @@ -131,54 +129,63 @@ class NotificationsPreferenceFragment : ListSummaryPreferenceFragment() { NotificationChannels.updateMessageRingtone(requireContext(), uri) prefs.setNotificationRingtone(uri.toString()) } - initializeRingtoneSummary(findPreference(TextSecurePreferences.RINGTONE_PREF)) + updateRingtonePref() } } private inner class RingtoneSummaryListener : Preference.OnPreferenceChangeListener { override fun onPreferenceChange(preference: Preference, newValue: Any): Boolean { + val pref = preference as? DropDownPreference ?: return false val value = newValue as? Uri if (value == null || TextUtils.isEmpty(value.toString())) { - preference.setSummary(R.string.none) + pref.setDropDownLabel(context?.getString(R.string.none)) } else { RingtoneManager.getRingtone(activity, value) ?.getTitle(activity) - ?.let { preference.summary = it } + ?.let { pref.setDropDownLabel(it) } } return true } } - private fun initializeRingtoneSummary(pref: Preference?) { - val listener = pref!!.onPreferenceChangeListener as RingtoneSummaryListener? + private fun updateRingtonePref() { + val pref = findPreference(TextSecurePreferences.RINGTONE_PREF) + val listener: RingtoneSummaryListener = + (pref?.onPreferenceChangeListener) as? RingtoneSummaryListener + ?: return + val uri = prefs.getNotificationRingtone() - listener!!.onPreferenceChange(pref, uri) + listener.onPreferenceChange(pref, uri) } private fun initializeMessageVibrateSummary(pref: SwitchPreferenceCompat?) { pref!!.isChecked = prefs.isNotificationVibrateEnabled() } - private inner class NotificationPrivacyListener : ListSummaryListener() { + private inner class NotificationPrivacyListener : Preference.OnPreferenceChangeListener { @SuppressLint("StaticFieldLeak") override fun onPreferenceChange(preference: Preference, value: Any): Boolean { + // update drop down + val pref = preference as? DropDownPreference ?: return false + val entryIndex = Arrays.asList(*pref.entryValues).indexOf(value) + + pref.setDropDownLabel( + if (entryIndex >= 0 && entryIndex < pref.entries.size + ) pref.entries[entryIndex] + else getString(R.string.unknown) + ) + + // update notification object : AsyncTask() { override fun doInBackground(vararg params: Void?): Void? { - ApplicationContext.getInstance(activity).messageNotifier.updateNotification(activity!!) + ApplicationContext.getInstance(activity).messageNotifier.updateNotification( + activity!! + ) return null } }.executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR) - return super.onPreferenceChange(preference, value) + return true } } - - companion object { - @Suppress("unused") - private val TAG = NotificationsPreferenceFragment::class.java.simpleName - fun getSummary(context: Context): CharSequence = when (isNotificationsEnabled(context)) { - true -> R.string.on - false -> R.string.off - }.let(context::getString) - } } diff --git a/app/src/main/java/org/thoughtcrime/securesms/preferences/PrivacySettingsPreferenceFragment.kt b/app/src/main/java/org/thoughtcrime/securesms/preferences/PrivacySettingsPreferenceFragment.kt index 361f7b5fd5..a2170e2cf7 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/preferences/PrivacySettingsPreferenceFragment.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/preferences/PrivacySettingsPreferenceFragment.kt @@ -25,7 +25,7 @@ import org.thoughtcrime.securesms.util.CallNotificationBuilder.Companion.areNoti import org.thoughtcrime.securesms.util.IntentUtils @AndroidEntryPoint -class PrivacySettingsPreferenceFragment : ListSummaryPreferenceFragment() { +class PrivacySettingsPreferenceFragment : CorrectedPreferenceFragment() { @Inject lateinit var configFactory: ConfigFactory diff --git a/app/src/main/java/org/thoughtcrime/securesms/preferences/widgets/DropDownPreference.kt b/app/src/main/java/org/thoughtcrime/securesms/preferences/widgets/DropDownPreference.kt new file mode 100644 index 0000000000..73eeb7d194 --- /dev/null +++ b/app/src/main/java/org/thoughtcrime/securesms/preferences/widgets/DropDownPreference.kt @@ -0,0 +1,70 @@ +package org.thoughtcrime.securesms.preferences.widgets + +import android.content.Context +import android.util.AttributeSet +import android.widget.TextView +import androidx.preference.ListPreference +import androidx.preference.PreferenceViewHolder +import network.loki.messenger.R + +class DropDownPreference : ListPreference { + private var dropDownLabel: TextView? = null + private var clickListener: OnPreferenceClickListener? = null + private var onViewReady: (()->Unit)? = null + + constructor( + context: Context?, + attrs: AttributeSet?, + defStyleAttr: Int, + defStyleRes: Int + ) : super( + context!!, attrs, defStyleAttr, defStyleRes + ) { + initialize() + } + + constructor(context: Context?, attrs: AttributeSet?, defStyleAttr: Int) : super( + context!!, attrs, defStyleAttr + ) { + initialize() + } + + constructor(context: Context?, attrs: AttributeSet?) : super( + context!!, attrs + ) { + initialize() + } + + constructor(context: Context?) : super(context!!) { + initialize() + } + + private fun initialize() { + widgetLayoutResource = R.layout.preference_drop_down + } + + override fun onBindViewHolder(view: PreferenceViewHolder) { + super.onBindViewHolder(view) + this.dropDownLabel = view.findViewById(R.id.drop_down_label) as TextView + + onViewReady?.invoke() + } + + override fun setOnPreferenceClickListener(onPreferenceClickListener: OnPreferenceClickListener?) { + this.clickListener = onPreferenceClickListener + } + + fun setOnViewReady(init: (()->Unit)){ + this.onViewReady = init + } + + override fun onClick() { + if (clickListener == null || !clickListener!!.onPreferenceClick(this)) { + super.onClick() + } + } + + fun setDropDownLabel(label: CharSequence?){ + dropDownLabel?.text = label + } +} diff --git a/app/src/main/java/org/thoughtcrime/securesms/preferences/widgets/SignalListPreference.java b/app/src/main/java/org/thoughtcrime/securesms/preferences/widgets/SignalListPreference.java deleted file mode 100644 index 1c483a43e7..0000000000 --- a/app/src/main/java/org/thoughtcrime/securesms/preferences/widgets/SignalListPreference.java +++ /dev/null @@ -1,70 +0,0 @@ -package org.thoughtcrime.securesms.preferences.widgets; - -import android.content.Context; -import android.util.AttributeSet; -import android.widget.TextView; -import androidx.preference.ListPreference; -import androidx.preference.PreferenceViewHolder; -import network.loki.messenger.R; - -public class SignalListPreference extends ListPreference { - - private TextView rightSummary; - private CharSequence summary; - private OnPreferenceClickListener clickListener; - - public SignalListPreference(Context context, AttributeSet attrs, int defStyleAttr, int defStyleRes) { - super(context, attrs, defStyleAttr, defStyleRes); - initialize(); - } - - public SignalListPreference(Context context, AttributeSet attrs, int defStyleAttr) { - super(context, attrs, defStyleAttr); - initialize(); - } - - public SignalListPreference(Context context, AttributeSet attrs) { - super(context, attrs); - initialize(); - } - - public SignalListPreference(Context context) { - super(context); - initialize(); - } - - private void initialize() { - setWidgetLayoutResource(R.layout.preference_right_summary_widget); - } - - @Override - public void onBindViewHolder(PreferenceViewHolder view) { - super.onBindViewHolder(view); - - this.rightSummary = (TextView)view.findViewById(R.id.right_summary); - setSummary(this.summary); - } - - @Override - public void setSummary(CharSequence summary) { - super.setSummary(null); - - this.summary = summary; - - if (this.rightSummary != null) { - this.rightSummary.setText(summary); - } - } - - @Override - public void setOnPreferenceClickListener(OnPreferenceClickListener onPreferenceClickListener) { - this.clickListener = onPreferenceClickListener; - } - - @Override - protected void onClick() { - if (clickListener == null || !clickListener.onPreferenceClick(this)) { - super.onClick(); - } - } -} diff --git a/app/src/main/java/org/thoughtcrime/securesms/preferences/widgets/SignalPreference.java b/app/src/main/java/org/thoughtcrime/securesms/preferences/widgets/SignalPreference.java deleted file mode 100644 index 90635d6d5b..0000000000 --- a/app/src/main/java/org/thoughtcrime/securesms/preferences/widgets/SignalPreference.java +++ /dev/null @@ -1,60 +0,0 @@ -package org.thoughtcrime.securesms.preferences.widgets; - - -import android.content.Context; -import androidx.preference.Preference; -import androidx.preference.PreferenceViewHolder; -import android.util.AttributeSet; -import android.widget.TextView; - -import network.loki.messenger.R; - -public class SignalPreference extends Preference { - - private TextView rightSummary; - private CharSequence summary; - - public SignalPreference(Context context, AttributeSet attrs, int defStyleAttr, int defStyleRes) { - super(context, attrs, defStyleAttr, defStyleRes); - initialize(); - } - - public SignalPreference(Context context, AttributeSet attrs, int defStyleAttr) { - super(context, attrs, defStyleAttr); - initialize(); - } - - public SignalPreference(Context context, AttributeSet attrs) { - super(context, attrs); - initialize(); - } - - public SignalPreference(Context context) { - super(context); - initialize(); - } - - private void initialize() { - setWidgetLayoutResource(R.layout.preference_right_summary_widget); - } - - @Override - public void onBindViewHolder(PreferenceViewHolder view) { - super.onBindViewHolder(view); - - this.rightSummary = (TextView)view.findViewById(R.id.right_summary); - setSummary(this.summary); - } - - @Override - public void setSummary(CharSequence summary) { - super.setSummary(null); - - this.summary = summary; - - if (this.rightSummary != null) { - this.rightSummary.setText(summary); - } - } - -} diff --git a/app/src/main/res/layout/preference_right_summary_widget.xml b/app/src/main/res/layout/preference_drop_down.xml similarity index 71% rename from app/src/main/res/layout/preference_right_summary_widget.xml rename to app/src/main/res/layout/preference_drop_down.xml index b8471a9e3d..4ec450bc8b 100644 --- a/app/src/main/res/layout/preference_right_summary_widget.xml +++ b/app/src/main/res/layout/preference_drop_down.xml @@ -2,11 +2,12 @@ + android:layout_height="match_parent" + xmlns:app="http://schemas.android.com/apk/res-auto"> - - - - - -