88import android .provider .Settings ;
99import android .util .Pair ;
1010
11+ import androidx .annotation .Nullable ;
1112import androidx .preference .CheckBoxPreference ;
13+ import androidx .preference .DropDownPreference ;
1214import androidx .preference .MultiSelectListPreference ;
1315import androidx .preference .Preference ;
1416import androidx .preference .PreferenceFragmentCompat ;
2224import java .util .HashSet ;
2325import java .util .Set ;
2426import java .util .stream .Collectors ;
27+ import java .util .stream .Stream ;
2528
2629public class SettingsFragment extends PreferenceFragmentCompat {
2730 private static final String ACTION_NOTIFICATION_LISTENER_SETTINGS = "android.settings.ACTION_NOTIFICATION_LISTENER_SETTINGS" ;
@@ -37,12 +40,22 @@ public class SettingsFragment extends PreferenceFragmentCompat {
3740 "com.facebook.orca" , // Facebook Messenger
3841 "com.instagram.android" , // Instagram
3942 "com.google.android.apps.messaging" , // Messages (by Google)
40- "com.discord" )); // Discord
43+ "com.discord" , // Discord
44+ "org.thoughtcrime.securesms" )); // Signal
4145
4246 private SwitchPreferenceCompat m_hasNotificationAccessSwitch ;
4347 private MultiSelectListPreference m_selectedAppsPreference ;
4448 private CheckBoxPreference m_clearNotificationsOnUnlockCheckBox ;
4549 private Preference m_openGarminConnectPreference ;
50+ private DropDownPreference m_modePreference ;
51+
52+ private AlertDialog m_batteryOptimizationDialog ;
53+
54+ @ Override
55+ public void onCreate (@ Nullable Bundle savedInstanceState ) {
56+ m_batteryOptimizationDialog = buildBatteryOptimizationAlertDialog ();
57+ super .onCreate (savedInstanceState );
58+ }
4659
4760 @ Override
4861 public void onCreatePreferences (Bundle savedInstanceState , String rootKey ) {
@@ -52,11 +65,13 @@ public void onCreatePreferences(Bundle savedInstanceState, String rootKey) {
5265 m_selectedAppsPreference = findPreference ("selected_apps" );
5366 m_clearNotificationsOnUnlockCheckBox = findPreference ("clear_notifications_on_unlock" );
5467 m_openGarminConnectPreference = findPreference ("open_garmin_connect" );
68+ m_modePreference = findPreference ("mode" );
5569
5670 assert null != m_hasNotificationAccessSwitch ;
5771 assert null != m_selectedAppsPreference ;
5872 assert null != m_clearNotificationsOnUnlockCheckBox ;
5973 assert null != m_openGarminConnectPreference ;
74+ assert null != m_modePreference ;
6075
6176 populateAppListPreference (m_selectedAppsPreference );
6277 pruneUninstalledAppsFromPreference (m_selectedAppsPreference );
@@ -88,6 +103,29 @@ public void onCreatePreferences(Bundle savedInstanceState, String rootKey) {
88103 m_openGarminConnectPreference .setSummary (R .string .garmin_connect_tutorial );
89104 }
90105
106+ populateModePreference (m_modePreference );
107+ m_modePreference .setSummaryProvider (
108+ (Preference .SummaryProvider <DropDownPreference >) preference -> {
109+ EchoingMode mode ;
110+ try {
111+ mode = EchoingMode .valueOf (preference .getValue ());
112+ } catch (IllegalArgumentException e ) {
113+ mode = EchoingMode .ALL ;
114+ }
115+
116+ int resource = R .string .mode_all_notifications_description ;
117+ switch (mode ) {
118+ case GROUPS_ONLY :
119+ resource = R .string .mode_groups_only_description ;
120+ break ;
121+ case DIRECT_MESSAGES_ONLY :
122+ resource = R .string .mode_direct_only_description ;
123+ break ;
124+ }
125+
126+ return getString (resource );
127+ });
128+
91129 syncPreferencesToSystemState ();
92130 }
93131
@@ -104,7 +142,7 @@ private void syncPreferencesToSystemState() {
104142 String packageName = requireContext ().getPackageName ();
105143 PowerManager powerManager = (PowerManager ) requireContext ().getSystemService (Context .POWER_SERVICE );
106144 if (!powerManager .isIgnoringBatteryOptimizations (packageName )) {
107- buildBatteryOptimizationAlertDialog () .show ();
145+ m_batteryOptimizationDialog .show ();
108146 }
109147 }
110148
@@ -189,4 +227,17 @@ private void pruneUninstalledAppsFromPreference(MultiSelectListPreference prefer
189227 Set <String > filteredValues = preference .getValues ().stream ().filter (installedApps ::contains ).collect (Collectors .toSet ());
190228 preference .setValues (filteredValues );
191229 }
230+
231+ private void populateModePreference (DropDownPreference preference ) {
232+ CharSequence [] entries = new CharSequence [3 ];
233+ entries [0 ] = getString (R .string .mode_all_notifications );
234+ entries [1 ] = getString (R .string .mode_groups_only );
235+ entries [2 ] = getString (R .string .mode_direct_only );
236+ preference .setEntryValues (Stream .of (EchoingMode .values ()).map (EchoingMode ::name ).toArray (CharSequence []::new ));
237+ preference .setEntries (entries );
238+
239+ if (preference .getValue () == null ) {
240+ preference .setValue (EchoingMode .ALL .name ());
241+ }
242+ }
192243}
0 commit comments