From e3408565dcc15cd97548b664773bc684dca4edeb Mon Sep 17 00:00:00 2001 From: saqura Date: Sun, 3 Apr 2016 20:22:03 +0200 Subject: [PATCH] Update compact notification buttons dialog The preference dialog to select which buttons are shown in compact notifications now provides feedback via a snackbar. The internal preference storage handling has been cleaned up. A testcase for the dialog has been added. --- .../test/antennapod/ui/PreferencesTest.java | 24 +++++++ .../preferences/PreferenceController.java | 62 +++++++++---------- app/src/main/res/xml/preferences.xml | 6 +- .../core/preferences/UserPreferences.java | 56 ++++++++++++----- .../service/playback/PlaybackService.java | 26 +++----- core/src/main/res/values/arrays.xml | 11 +--- core/src/main/res/values/strings.xml | 8 +-- 7 files changed, 109 insertions(+), 84 deletions(-) diff --git a/app/src/androidTest/java/de/test/antennapod/ui/PreferencesTest.java b/app/src/androidTest/java/de/test/antennapod/ui/PreferencesTest.java index 54741502c..040f4150b 100644 --- a/app/src/androidTest/java/de/test/antennapod/ui/PreferencesTest.java +++ b/app/src/androidTest/java/de/test/antennapod/ui/PreferencesTest.java @@ -90,6 +90,30 @@ public class PreferencesTest extends ActivityInstrumentationTestCase2 persistNotify == UserPreferences.isPersistNotify(), Timeout.getLargeTimeout())); } + public void testSetLockscreenButtons() { + String[] buttons = res.getStringArray(R.array.compact_notification_buttons_options); + solo.clickOnText(solo.getString(R.string.pref_compact_notification_buttons_title)); + solo.waitForDialogToOpen(1000); + // First uncheck every checkbox + for (int i=0; i UserPreferences.showRewindOnCompactNotification(), Timeout.getLargeTimeout())); + assertTrue(solo.waitForCondition(() -> UserPreferences.showFastForwardOnCompactNotification(), Timeout.getLargeTimeout())); + assertTrue(solo.waitForCondition(() -> !UserPreferences.showSkipOnCompactNotification(), Timeout.getLargeTimeout())); + } + public void testEnqueueAtFront() { final boolean enqueueAtFront = UserPreferences.enqueueAtFront(); solo.clickOnText(solo.getString(R.string.pref_queueAddToFront_title)); diff --git a/app/src/main/java/de/danoeh/antennapod/preferences/PreferenceController.java b/app/src/main/java/de/danoeh/antennapod/preferences/PreferenceController.java index 0e79b46ea..23534e4f8 100644 --- a/app/src/main/java/de/danoeh/antennapod/preferences/PreferenceController.java +++ b/app/src/main/java/de/danoeh/antennapod/preferences/PreferenceController.java @@ -6,7 +6,6 @@ import android.app.Activity; import android.app.TimePickerDialog; import android.content.ActivityNotFoundException; import android.content.Context; -import android.content.DialogInterface; import android.content.Intent; import android.content.SharedPreferences; import android.content.pm.PackageManager; @@ -21,6 +20,7 @@ import android.preference.ListPreference; import android.preference.Preference; import android.preference.PreferenceManager; import android.preference.PreferenceScreen; +import android.support.design.widget.Snackbar; import android.support.v4.app.ActivityCompat; import android.support.v4.content.ContextCompat; import android.support.v7.app.AlertDialog; @@ -31,6 +31,7 @@ import android.text.format.DateFormat; import android.util.Log; import android.widget.EditText; import android.widget.Toast; +import android.widget.ListView; import com.afollestad.materialdialogs.MaterialDialog; @@ -222,7 +223,7 @@ public class PreferenceController implements SharedPreferences.OnSharedPreferenc return true; }); - ui.findPreference(UserPreferences.PREF_NOTIFICATION_BUTTONS) + ui.findPreference(UserPreferences.PREF_COMPACT_NOTIFICATION_BUTTONS) .setOnPreferenceClickListener(preference -> { showNotificationButtonsDialog(); return true; @@ -744,52 +745,45 @@ public class PreferenceController implements SharedPreferences.OnSharedPreferenc private void showNotificationButtonsDialog() { final Context context = ui.getActivity(); - final List preferredButtons = UserPreferences.getNotificationButtons(); + final List preferredButtons = UserPreferences.getCompactNotificationButtons(); final String[] allButtonNames = context.getResources().getStringArray( - R.array.notification_buttons_options); - final String[] allButtonIDs = context.getResources().getStringArray( - R.array.notification_buttons_values); - boolean[] checked = new boolean[allButtonIDs.length]; // booleans default to false in java + R.array.compact_notification_buttons_options); + boolean[] checked = new boolean[allButtonNames.length]; // booleans default to false in java - for(int i=0; i < allButtonIDs.length; i++) { - String id = allButtonIDs[i]; - if(preferredButtons.contains(id)) { + for(int i=0; i < checked.length; i++) { + if(preferredButtons.contains(i)) { checked[i] = true; } } AlertDialog.Builder builder = new AlertDialog.Builder(context); builder.setTitle(String.format(context.getResources().getString( - R.string.pref_notification_buttons_dialog_title), 2)); - builder.setMultiChoiceItems(allButtonNames, checked,new DialogInterface.OnMultiChoiceClickListener() { - int count = preferredButtons.size(); + R.string.pref_compact_notification_buttons_dialog_title), 2)); + builder.setMultiChoiceItems(allButtonNames, checked, (dialog, which, isChecked) -> { + checked[which] = isChecked; - public void onClick(DialogInterface dialog, int which, boolean isChecked) { - checked[which] = isChecked; - if (isChecked) { - if (count < 2) { - preferredButtons.add(allButtonIDs[which]); - count++; - } else { - // Only allow a maximum of two selections. This is because the notification - // on the lock screen can only display 3 buttons, and the play/pause button - // is always included. - checked[which] = false; - ((AlertDialog) dialog).getListView().setItemChecked(which, false); - Toast.makeText( - context, - String.format(context.getResources().getString( - R.string.pref_notification_buttons_dialog_error), 2), - Toast.LENGTH_SHORT).show(); - } + if (isChecked) { + if (preferredButtons.size() < 2) { + preferredButtons.add(which); } else { - preferredButtons.remove(allButtonIDs[which]); - count--; + // Only allow a maximum of two selections. This is because the notification + // on the lock screen can only display 3 buttons, and the play/pause button + // is always included. + checked[which] = false; + ListView selectionView = ((AlertDialog) dialog).getListView(); + selectionView.setItemChecked(which, false); + Snackbar.make( + selectionView, + String.format(context.getResources().getString( + R.string.pref_compact_notification_buttons_dialog_error), 2), + Snackbar.LENGTH_SHORT).show(); } + } else { + preferredButtons.remove((Integer) which); } }); builder.setPositiveButton(R.string.confirm_label, (dialog, which) -> { - UserPreferences.setNotificationButtons(preferredButtons); + UserPreferences.setCompactNotificationButtons(preferredButtons); }); builder.setNegativeButton(R.string.cancel_label, null); builder.create().show(); diff --git a/app/src/main/res/xml/preferences.xml b/app/src/main/res/xml/preferences.xml index b3707f023..5861db186 100644 --- a/app/src/main/res/xml/preferences.xml +++ b/app/src/main/res/xml/preferences.xml @@ -56,9 +56,9 @@ android:summary="@string/pref_persistNotify_sum" android:title="@string/pref_persistNotify_title"/> + android:key="prefCompactNotificationButtons" + android:summary="@string/pref_compact_notification_buttons_sum" + android:title="@string/pref_compact_notification_buttons_title"/> (Arrays.asList(TextUtils.split(hiddenItems, ","))); } - public static List getNotificationButtons() { - String hiddenItems = prefs.getString(PREF_NOTIFICATION_BUTTONS, "skip"); - return new ArrayList<>(Arrays.asList(TextUtils.split(hiddenItems, ","))); + public static List getCompactNotificationButtons() { + String[] buttons = TextUtils.split( + prefs.getString(PREF_COMPACT_NOTIFICATION_BUTTONS, + String.valueOf(NOTIFICATION_BUTTON_SKIP)), + ","); + List notificationButtons = new ArrayList<>(); + for (int i=0; i items) { + public static void setCompactNotificationButtons(List items) { String str = TextUtils.join(",", items); prefs.edit() - .putString(PREF_NOTIFICATION_BUTTONS, str) + .putString(PREF_COMPACT_NOTIFICATION_BUTTONS, str) .apply(); } diff --git a/core/src/main/java/de/danoeh/antennapod/core/service/playback/PlaybackService.java b/core/src/main/java/de/danoeh/antennapod/core/service/playback/PlaybackService.java index 39dc35535..edea3962f 100644 --- a/core/src/main/java/de/danoeh/antennapod/core/service/playback/PlaybackService.java +++ b/core/src/main/java/de/danoeh/antennapod/core/service/playback/PlaybackService.java @@ -858,7 +858,6 @@ public class PlaybackService extends Service { .setPriority(UserPreferences.getNotifyPriority()); // set notification priority IntList compactActionList = new IntList(); - final List notificationButtons = UserPreferences.getNotificationButtons(); int numActions = 0; // we start and 0 and then increment by 1 for each call to addAction // always let them rewind @@ -867,13 +866,10 @@ public class PlaybackService extends Service { notificationBuilder.addAction(android.R.drawable.ic_media_rew, getString(R.string.rewind_label), rewindButtonPendingIntent); - if(notificationButtons.contains("rewind")) { - // show the rewind button even on the lock screen - compactActionList.add(numActions++); - } else { - numActions++; + if(UserPreferences.showRewindOnCompactNotification()) { + compactActionList.add(numActions); } - + numActions++; if (playerStatus == PlayerStatus.PLAYING) { PendingIntent pauseButtonPendingIntent = getPendingIntentForMediaAction( @@ -897,12 +893,10 @@ public class PlaybackService extends Service { notificationBuilder.addAction(android.R.drawable.ic_media_ff, getString(R.string.fast_forward_label), ffButtonPendingIntent); - if(notificationButtons.contains("fastforward")) { - // show the fast forward button even on the lock screen - compactActionList.add(numActions++); - } else { - numActions++; + if(UserPreferences.showFastForwardOnCompactNotification()) { + compactActionList.add(numActions); } + numActions++; if (UserPreferences.isFollowQueue()) { PendingIntent skipButtonPendingIntent = getPendingIntentForMediaAction( @@ -910,12 +904,10 @@ public class PlaybackService extends Service { notificationBuilder.addAction(android.R.drawable.ic_media_next, getString(R.string.skip_episode_label), skipButtonPendingIntent); - if(notificationButtons.contains("skip")) { - // show the skip button even on the lock screen - compactActionList.add(numActions++); - } else { - numActions++; + if(UserPreferences.showSkipOnCompactNotification()) { + compactActionList.add(numActions); } + numActions++; } PendingIntent stopButtonPendingIntent = getPendingIntentForMediaAction( diff --git a/core/src/main/res/values/arrays.xml b/core/src/main/res/values/arrays.xml index 04e0d97cd..66a033b57 100644 --- a/core/src/main/res/values/arrays.xml +++ b/core/src/main/res/values/arrays.xml @@ -212,18 +212,9 @@ 500 - + @string/rewind_label @string/fast_forward_label @string/skip_episode_label - - rewind - fastforward - skip - - - skip - - diff --git a/core/src/main/res/values/strings.xml b/core/src/main/res/values/strings.xml index 6edc8b32b..4d9f5d26e 100644 --- a/core/src/main/res/values/strings.xml +++ b/core/src/main/res/values/strings.xml @@ -384,10 +384,10 @@ Always expand the notification to show playback buttons. Persistent Playback Controls Keep notification and lockscreen controls when playback is paused. - Select Notification Buttons - Change the playback buttons on the lock screen notification. The play/pause button is always included. - Select a maximum of %1$d items - You can only select a maximum of %1$d items. + Set Lockscreen Buttons + Change the playback buttons on the lockscreen. The play/pause button is always included. + Select a maximum of %1$d items + You can only select a maximum of %1$d items. Show Subscriptions Show subscription list directly in navigation drawer Set Lockscreen Background