summaryrefslogtreecommitdiff
path: root/app
diff options
context:
space:
mode:
authorMatej Drobnič <matej@matejdro.com>2024-02-04 19:54:46 +0100
committerGitHub <noreply@github.com>2024-02-04 19:54:46 +0100
commit0f5600932d5894d5653993d48d925df437fe6d00 (patch)
treeee34151ac28bbe55dcec9c45de1cb5dbe92ad299 /app
parentf0e96a269233e85a452eabcbfe09899157024ab3 (diff)
downloadAntennaPod-0f5600932d5894d5653993d48d925df437fe6d00.zip
Add next chapter button to notification (#6276)
Diffstat (limited to 'app')
-rw-r--r--app/src/androidTest/java/de/test/antennapod/ui/PreferencesTest.java32
-rw-r--r--app/src/main/java/de/danoeh/antennapod/fragment/preferences/UserInterfacePreferencesFragment.java93
-rw-r--r--app/src/main/res/xml/preferences_user_interface.xml6
3 files changed, 76 insertions, 55 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 24c20242a..9ba4276be 100644
--- a/app/src/androidTest/java/de/test/antennapod/ui/PreferencesTest.java
+++ b/app/src/androidTest/java/de/test/antennapod/ui/PreferencesTest.java
@@ -3,6 +3,7 @@ package de.test.antennapod.ui;
import android.content.Intent;
import android.content.SharedPreferences;
import android.content.res.Resources;
+
import androidx.annotation.StringRes;
import androidx.preference.PreferenceManager;
import androidx.test.filters.LargeTest;
@@ -30,9 +31,7 @@ import static androidx.test.espresso.action.ViewActions.click;
import static androidx.test.espresso.action.ViewActions.scrollTo;
import static androidx.test.espresso.action.ViewActions.swipeDown;
import static androidx.test.espresso.action.ViewActions.swipeUp;
-import static androidx.test.espresso.assertion.ViewAssertions.doesNotExist;
import static androidx.test.espresso.assertion.ViewAssertions.matches;
-import static androidx.test.espresso.matcher.ViewMatchers.isChecked;
import static androidx.test.espresso.matcher.ViewMatchers.isDisplayed;
import static androidx.test.espresso.matcher.ViewMatchers.isRoot;
import static androidx.test.espresso.matcher.ViewMatchers.withId;
@@ -40,7 +39,6 @@ import static androidx.test.espresso.matcher.ViewMatchers.withText;
import static de.test.antennapod.EspressoTestUtils.clickPreference;
import static de.test.antennapod.EspressoTestUtils.waitForView;
import static java.util.concurrent.TimeUnit.MILLISECONDS;
-import static org.hamcrest.Matchers.not;
import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertTrue;
@@ -80,38 +78,22 @@ public class PreferencesTest {
}
@Test
- public void testSetLockscreenButtons() {
+ public void testSetNotificationButtons() {
clickPreference(R.string.user_interface_label);
- String[] buttons = res.getStringArray(R.array.compact_notification_buttons_options);
- clickPreference(R.string.pref_compact_notification_buttons_title);
+ String[] buttons = res.getStringArray(R.array.full_notification_buttons_options);
+ clickPreference(R.string.pref_full_notification_buttons_title);
// First uncheck checkboxes
- onView(withText(buttons[0])).perform(click());
- onView(withText(buttons[1])).perform(click());
-
- // Now try to check all checkboxes
- onView(withText(buttons[0])).perform(click());
onView(withText(buttons[1])).perform(click());
onView(withText(buttons[2])).perform(click());
- // Make sure that the third checkbox is unchecked
- onView(withText(buttons[2])).check(matches(not(isChecked())));
-
- String snackBarText = String.format(res.getString(
- R.string.pref_compact_notification_buttons_dialog_error), 2);
- Awaitility.await().ignoreExceptions().atMost(4000, MILLISECONDS)
- .until(() -> {
- onView(withText(snackBarText)).check(doesNotExist());
- return true;
- });
-
onView(withText(R.string.confirm_label)).perform(click());
Awaitility.await().atMost(1000, MILLISECONDS)
- .until(UserPreferences::showRewindOnCompactNotification);
+ .until(() -> UserPreferences.showSkipOnFullNotification());
Awaitility.await().atMost(1000, MILLISECONDS)
- .until(UserPreferences::showFastForwardOnCompactNotification);
+ .until(() -> UserPreferences.showNextChapterOnFullNotification());
Awaitility.await().atMost(1000, MILLISECONDS)
- .until(() -> !UserPreferences.showSkipOnCompactNotification());
+ .until(() -> !UserPreferences.showPlaybackSpeedOnFullNotification());
}
@Test
diff --git a/app/src/main/java/de/danoeh/antennapod/fragment/preferences/UserInterfacePreferencesFragment.java b/app/src/main/java/de/danoeh/antennapod/fragment/preferences/UserInterfacePreferencesFragment.java
index c8521caab..0f3320e98 100644
--- a/app/src/main/java/de/danoeh/antennapod/fragment/preferences/UserInterfacePreferencesFragment.java
+++ b/app/src/main/java/de/danoeh/antennapod/fragment/preferences/UserInterfacePreferencesFragment.java
@@ -1,8 +1,10 @@
package de.danoeh.antennapod.fragment.preferences;
import android.content.Context;
+import android.content.DialogInterface;
import android.os.Build;
import android.os.Bundle;
+import android.widget.Button;
import android.widget.ListView;
import androidx.appcompat.app.AlertDialog;
import androidx.core.app.ActivityCompat;
@@ -64,9 +66,9 @@ public class UserInterfacePreferencesFragment extends PreferenceFragmentCompat {
return true;
});
- findPreference(UserPreferences.PREF_COMPACT_NOTIFICATION_BUTTONS)
+ findPreference(UserPreferences.PREF_FULL_NOTIFICATION_BUTTONS)
.setOnPreferenceClickListener(preference -> {
- showNotificationButtonsDialog();
+ showFullNotificationButtonsDialog();
return true;
});
findPreference(UserPreferences.PREF_FILTER_FEED)
@@ -91,48 +93,85 @@ public class UserInterfacePreferencesFragment extends PreferenceFragmentCompat {
}
}
- private void showNotificationButtonsDialog() {
+
+ private void showFullNotificationButtonsDialog() {
final Context context = getActivity();
- final List<Integer> preferredButtons = UserPreferences.getCompactNotificationButtons();
+
+ final List<Integer> preferredButtons = UserPreferences.getFullNotificationButtons();
final String[] allButtonNames = context.getResources().getStringArray(
- R.array.compact_notification_buttons_options);
+ R.array.full_notification_buttons_options);
+ final int[] buttonIDs = {2, 3, 4};
+ final int exactItems = 2;
+ final DialogInterface.OnClickListener completeListener = (dialog, which) ->
+ UserPreferences.setFullNotificationButtons(preferredButtons);
+ final String title = context.getResources().getString(
+ R.string.pref_full_notification_buttons_title);
+
+ showNotificationButtonsDialog(preferredButtons, allButtonNames, buttonIDs, title,
+ exactItems, completeListener
+ );
+ }
+
+ private void showNotificationButtonsDialog(List<Integer> preferredButtons,
+ String[] allButtonNames, int[] buttonIds, String title,
+ int exactItems, DialogInterface.OnClickListener completeListener) {
boolean[] checked = new boolean[allButtonNames.length]; // booleans default to false in java
+ final Context context = getActivity();
+
+ // Clear buttons that are not part of the setting anymore
+ for (int i = preferredButtons.size() - 1; i >= 0; i--) {
+ boolean isValid = false;
+ for (int j = 0; j < checked.length; j++) {
+ if (buttonIds[j] == preferredButtons.get(i)) {
+ isValid = true;
+ }
+ }
+
+ if (!isValid) {
+ preferredButtons.remove(i);
+ }
+ }
+
for(int i=0; i < checked.length; i++) {
- if(preferredButtons.contains(i)) {
+ if (preferredButtons.contains(buttonIds[i])) {
checked[i] = true;
}
}
MaterialAlertDialogBuilder builder = new MaterialAlertDialogBuilder(context);
- builder.setTitle(String.format(context.getResources().getString(
- R.string.pref_compact_notification_buttons_dialog_title), 2));
+ builder.setTitle(title);
builder.setMultiChoiceItems(allButtonNames, checked, (dialog, which, isChecked) -> {
checked[which] = isChecked;
if (isChecked) {
- if (preferredButtons.size() < 2) {
- preferredButtons.add(which);
- } 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;
- 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();
- }
+ preferredButtons.add(buttonIds[which]);
} else {
- preferredButtons.remove((Integer) which);
+ preferredButtons.remove((Integer) buttonIds[which]);
}
});
- builder.setPositiveButton(R.string.confirm_label, (dialog, which) ->
- UserPreferences.setCompactNotificationButtons(preferredButtons));
+ builder.setPositiveButton(R.string.confirm_label, null);
builder.setNegativeButton(R.string.cancel_label, null);
- builder.create().show();
+ final AlertDialog dialog = builder.create();
+
+ dialog.show();
+
+ Button positiveButton = dialog.getButton(AlertDialog.BUTTON_POSITIVE);
+
+ positiveButton.setOnClickListener(v -> {
+ if (preferredButtons.size() != exactItems) {
+ ListView selectionView = dialog.getListView();
+ Snackbar.make(
+ selectionView,
+ String.format(context.getResources().getString(
+ R.string.pref_compact_notification_buttons_dialog_error_exact), exactItems),
+ Snackbar.LENGTH_SHORT).show();
+
+ } else {
+ completeListener.onClick(dialog, AlertDialog.BUTTON_POSITIVE);
+ dialog.cancel();
+ }
+ }
+ );
}
}
diff --git a/app/src/main/res/xml/preferences_user_interface.xml b/app/src/main/res/xml/preferences_user_interface.xml
index 733649ce1..5cd25d59f 100644
--- a/app/src/main/res/xml/preferences_user_interface.xml
+++ b/app/src/main/res/xml/preferences_user_interface.xml
@@ -70,9 +70,9 @@
android:summary="@string/pref_persistNotify_sum"
android:title="@string/pref_persistNotify_title"/>
<Preference
- android:key="prefCompactNotificationButtons"
- android:summary="@string/pref_compact_notification_buttons_sum"
- android:title="@string/pref_compact_notification_buttons_title"/>
+ android:key="prefFullNotificationButtons"
+ android:summary="@string/pref_full_notification_buttons_sum"
+ android:title="@string/pref_full_notification_buttons_title"/>
</PreferenceCategory>
<PreferenceCategory android:title="@string/behavior">
<de.danoeh.antennapod.preferences.MaterialListPreference