From c7d6cd358cb9c7c14a92dc3b35eabf8695d35999 Mon Sep 17 00:00:00 2001 From: Tony Tam <149837+tonytamsf@users.noreply.github.com> Date: Fri, 17 Nov 2023 13:33:16 -0800 Subject: Honor sort in episode list view in Android Auto (#6756) --- .../antennapod/fragment/AllEpisodesFragment.java | 27 ++++++++-------------- 1 file changed, 10 insertions(+), 17 deletions(-) (limited to 'app/src/main/java/de/danoeh/antennapod/fragment') diff --git a/app/src/main/java/de/danoeh/antennapod/fragment/AllEpisodesFragment.java b/app/src/main/java/de/danoeh/antennapod/fragment/AllEpisodesFragment.java index 7061a69f3..65693965b 100644 --- a/app/src/main/java/de/danoeh/antennapod/fragment/AllEpisodesFragment.java +++ b/app/src/main/java/de/danoeh/antennapod/fragment/AllEpisodesFragment.java @@ -1,7 +1,5 @@ package de.danoeh.antennapod.fragment; -import android.content.Context; -import android.content.SharedPreferences; import android.os.Bundle; import android.view.LayoutInflater; import android.view.MenuItem; @@ -14,6 +12,8 @@ import de.danoeh.antennapod.dialog.AllEpisodesFilterDialog; import de.danoeh.antennapod.model.feed.FeedItem; import de.danoeh.antennapod.model.feed.FeedItemFilter; import de.danoeh.antennapod.model.feed.SortOrder; +import de.danoeh.antennapod.storage.preferences.UserPreferences; + import org.apache.commons.lang3.StringUtils; import org.greenrobot.eventbus.Subscribe; @@ -26,10 +26,7 @@ import java.util.List; */ public class AllEpisodesFragment extends EpisodesListFragment { public static final String TAG = "EpisodesFragment"; - private static final String PREF_NAME = "PrefAllEpisodesFragment"; - private static final String PREF_FILTER = "filter"; - public static final String PREF_SORT = "prefEpisodesSort"; - private SharedPreferences prefs; + public static final String PREF_NAME = "PrefAllEpisodesFragment"; @NonNull @Override @@ -40,7 +37,6 @@ public class AllEpisodesFragment extends EpisodesListFragment { toolbar.setTitle(R.string.episodes_label); updateToolbar(); updateFilterUi(); - prefs = getActivity().getSharedPreferences(PREF_NAME, Context.MODE_PRIVATE); txtvInformation.setOnClickListener( v -> AllEpisodesFilterDialog.newInstance(getFilter()).show(getChildFragmentManager(), null)); return root; @@ -61,13 +57,15 @@ public class AllEpisodesFragment extends EpisodesListFragment { @NonNull @Override protected List loadData() { - return DBReader.getEpisodes(0, page * EPISODES_PER_PAGE, getFilter(), getSortOrder()); + return DBReader.getEpisodes(0, page * EPISODES_PER_PAGE, getFilter(), + UserPreferences.getAllEpisodesSortOrder()); } @NonNull @Override protected List loadMoreData(int page) { - return DBReader.getEpisodes((page - 1) * EPISODES_PER_PAGE, EPISODES_PER_PAGE, getFilter(), getSortOrder()); + return DBReader.getEpisodes((page - 1) * EPISODES_PER_PAGE, EPISODES_PER_PAGE, getFilter(), + UserPreferences.getAllEpisodesSortOrder()); } @Override @@ -77,8 +75,7 @@ public class AllEpisodesFragment extends EpisodesListFragment { @Override protected FeedItemFilter getFilter() { - SharedPreferences prefs = getActivity().getSharedPreferences(PREF_NAME, Context.MODE_PRIVATE); - return new FeedItemFilter(prefs.getString(PREF_FILTER, "")); + return new FeedItemFilter(UserPreferences.getPrefFilterAllEpisodes()); } @Override @@ -119,13 +116,13 @@ public class AllEpisodesFragment extends EpisodesListFragment { } private void saveSortOrderAndRefresh(SortOrder type) { - prefs.edit().putString(PREF_SORT, "" + type.code).apply(); + UserPreferences.setAllEpisodesSortOrder(type); loadItems(); } @Subscribe public void onFilterChanged(AllEpisodesFilterDialog.AllEpisodesFilterChangedEvent event) { - prefs.edit().putString(PREF_FILTER, StringUtils.join(event.filterValues, ",")).apply(); + UserPreferences.setPrefFilterAllEpisodes(StringUtils.join(event.filterValues, ",")); updateFilterUi(); page = 1; loadItems(); @@ -143,8 +140,4 @@ public class AllEpisodesFragment extends EpisodesListFragment { toolbar.getMenu().findItem(R.id.action_favorites).setIcon( getFilter().showIsFavorite ? R.drawable.ic_star : R.drawable.ic_star_border); } - - private SortOrder getSortOrder() { - return SortOrder.fromCodeString(prefs.getString(PREF_SORT, "" + SortOrder.DATE_NEW_OLD.code)); - } } -- cgit v1.2.3 From 95f431fec940380055ff2a44aeca6a94191a5962 Mon Sep 17 00:00:00 2001 From: caoilTe O'Connor <1500358+caoilte@users.noreply.github.com> Date: Wed, 22 Nov 2023 19:29:58 +0000 Subject: Remove Iconify from FeedInfoFragment (#6655) --- .../java/de/danoeh/antennapod/fragment/FeedInfoFragment.java | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) (limited to 'app/src/main/java/de/danoeh/antennapod/fragment') diff --git a/app/src/main/java/de/danoeh/antennapod/fragment/FeedInfoFragment.java b/app/src/main/java/de/danoeh/antennapod/fragment/FeedInfoFragment.java index b4fa77c75..bbb48b9d2 100644 --- a/app/src/main/java/de/danoeh/antennapod/fragment/FeedInfoFragment.java +++ b/app/src/main/java/de/danoeh/antennapod/fragment/FeedInfoFragment.java @@ -32,7 +32,6 @@ import com.bumptech.glide.request.RequestOptions; import com.google.android.material.appbar.AppBarLayout; import com.google.android.material.appbar.CollapsingToolbarLayout; import com.google.android.material.snackbar.Snackbar; -import com.joanzapata.iconify.Iconify; import de.danoeh.antennapod.R; import de.danoeh.antennapod.activity.MainActivity; import de.danoeh.antennapod.core.storage.DBReader; @@ -228,7 +227,8 @@ public class FeedInfoFragment extends Fragment implements MaterialToolbar.OnMenu txtvAuthorHeader.setText(feed.getAuthor()); } - txtvUrl.setText(feed.getDownload_url() + " {fa-paperclip}"); + txtvUrl.setText(feed.getDownload_url()); + txtvUrl.setCompoundDrawablesRelativeWithIntrinsicBounds(0, 0, R.drawable.ic_paperclip, 0); if (feed.getPaymentLinks() == null || feed.getPaymentLinks().size() == 0) { lblSupport.setVisibility(View.GONE); @@ -263,7 +263,6 @@ public class FeedInfoFragment extends Fragment implements MaterialToolbar.OnMenu txtvFundingUrl.setText(str.toString()); } - Iconify.addIcons(txtvUrl); refreshToolbarState(); } @@ -312,8 +311,8 @@ public class FeedInfoFragment extends Fragment implements MaterialToolbar.OnMenu @Override protected void setUrl(String url) { feed.setDownload_url(url); - txtvUrl.setText(feed.getDownload_url() + " {fa-paperclip}"); - Iconify.addIcons(txtvUrl); + txtvUrl.setText(feed.getDownload_url()); + txtvUrl.setCompoundDrawablesRelativeWithIntrinsicBounds(0, 0, R.drawable.ic_paperclip, 0); } }.show(); -- cgit v1.2.3 From 2e76dc8d0c950090acd95d1e8c9d6c7be314d9a6 Mon Sep 17 00:00:00 2001 From: ByteHamster Date: Sun, 3 Dec 2023 16:36:28 +0100 Subject: New sort dialog (#6789) --- .../antennapod/fragment/AllEpisodesFragment.java | 54 ++++++------ .../fragment/CompletedDownloadsFragment.java | 58 +++++++------ .../antennapod/fragment/FeedInfoFragment.java | 26 +++--- .../antennapod/fragment/FeedItemlistFragment.java | 97 ++++++++++++++++++---- .../danoeh/antennapod/fragment/InboxFragment.java | 57 ++++++------- .../fragment/MenuItemToSortOrderConverter.java | 44 ---------- .../danoeh/antennapod/fragment/QueueFragment.java | 77 +++++++++-------- 7 files changed, 220 insertions(+), 193 deletions(-) delete mode 100644 app/src/main/java/de/danoeh/antennapod/fragment/MenuItemToSortOrderConverter.java (limited to 'app/src/main/java/de/danoeh/antennapod/fragment') diff --git a/app/src/main/java/de/danoeh/antennapod/fragment/AllEpisodesFragment.java b/app/src/main/java/de/danoeh/antennapod/fragment/AllEpisodesFragment.java index 65693965b..ab5039ec2 100644 --- a/app/src/main/java/de/danoeh/antennapod/fragment/AllEpisodesFragment.java +++ b/app/src/main/java/de/danoeh/antennapod/fragment/AllEpisodesFragment.java @@ -6,15 +6,18 @@ import android.view.MenuItem; import android.view.View; import android.view.ViewGroup; import androidx.annotation.NonNull; +import androidx.annotation.Nullable; import de.danoeh.antennapod.R; import de.danoeh.antennapod.core.storage.DBReader; import de.danoeh.antennapod.dialog.AllEpisodesFilterDialog; +import de.danoeh.antennapod.dialog.ItemSortDialog; +import de.danoeh.antennapod.event.FeedListUpdateEvent; import de.danoeh.antennapod.model.feed.FeedItem; import de.danoeh.antennapod.model.feed.FeedItemFilter; import de.danoeh.antennapod.model.feed.SortOrder; import de.danoeh.antennapod.storage.preferences.UserPreferences; - import org.apache.commons.lang3.StringUtils; +import org.greenrobot.eventbus.EventBus; import org.greenrobot.eventbus.Subscribe; import java.util.ArrayList; @@ -33,7 +36,6 @@ public class AllEpisodesFragment extends EpisodesListFragment { public View onCreateView(@NonNull LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { final View root = super.onCreateView(inflater, container, savedInstanceState); toolbar.inflateMenu(R.menu.episodes); - inflateSortMenu(); toolbar.setTitle(R.string.episodes_label); updateToolbar(); updateFilterUi(); @@ -42,18 +44,6 @@ public class AllEpisodesFragment extends EpisodesListFragment { return root; } - private void inflateSortMenu() { - MenuItem sortItem = toolbar.getMenu().findItem(R.id.episodes_sort); - getActivity().getMenuInflater().inflate(R.menu.sort_menu, sortItem.getSubMenu()); - - // Remove the sorting options that are not needed in this fragment - toolbar.getMenu().findItem(R.id.sort_episode_title).setVisible(false); - toolbar.getMenu().findItem(R.id.sort_feed_title).setVisible(false); - toolbar.getMenu().findItem(R.id.sort_random).setVisible(false); - toolbar.getMenu().findItem(R.id.sort_smart_shuffle).setVisible(false); - toolbar.getMenu().findItem(R.id.keep_sorted).setVisible(false); - } - @NonNull @Override protected List loadData() { @@ -105,21 +95,13 @@ public class AllEpisodesFragment extends EpisodesListFragment { } onFilterChanged(new AllEpisodesFilterDialog.AllEpisodesFilterChangedEvent(new HashSet<>(filter))); return true; - } else { - SortOrder sortOrder = MenuItemToSortOrderConverter.convert(item); - if (sortOrder != null) { - saveSortOrderAndRefresh(sortOrder); - return true; - } + } else if (item.getItemId() == R.id.episodes_sort) { + new AllEpisodesSortDialog().show(getChildFragmentManager().beginTransaction(), "SortDialog"); + return true; } return false; } - private void saveSortOrderAndRefresh(SortOrder type) { - UserPreferences.setAllEpisodesSortOrder(type); - loadItems(); - } - @Subscribe public void onFilterChanged(AllEpisodesFilterDialog.AllEpisodesFilterChangedEvent event) { UserPreferences.setPrefFilterAllEpisodes(StringUtils.join(event.filterValues, ",")); @@ -140,4 +122,26 @@ public class AllEpisodesFragment extends EpisodesListFragment { toolbar.getMenu().findItem(R.id.action_favorites).setIcon( getFilter().showIsFavorite ? R.drawable.ic_star : R.drawable.ic_star_border); } + + public static class AllEpisodesSortDialog extends ItemSortDialog { + @Override + public void onCreate(@Nullable Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + sortOrder = UserPreferences.getAllEpisodesSortOrder(); + } + + @Override + protected void onAddItem(int title, SortOrder ascending, SortOrder descending, boolean ascendingIsDefault) { + if (ascending == SortOrder.DATE_OLD_NEW || ascending == SortOrder.DURATION_SHORT_LONG) { + super.onAddItem(title, ascending, descending, ascendingIsDefault); + } + } + + @Override + protected void onSelectionChanged() { + super.onSelectionChanged(); + UserPreferences.setAllEpisodesSortOrder(sortOrder); + EventBus.getDefault().post(new FeedListUpdateEvent(0)); + } + } } diff --git a/app/src/main/java/de/danoeh/antennapod/fragment/CompletedDownloadsFragment.java b/app/src/main/java/de/danoeh/antennapod/fragment/CompletedDownloadsFragment.java index 730a39189..ec7a35466 100644 --- a/app/src/main/java/de/danoeh/antennapod/fragment/CompletedDownloadsFragment.java +++ b/app/src/main/java/de/danoeh/antennapod/fragment/CompletedDownloadsFragment.java @@ -4,16 +4,14 @@ import android.os.Bundle; import android.util.Log; import android.view.ContextMenu; import android.view.LayoutInflater; -import android.view.Menu; -import android.view.MenuInflater; import android.view.MenuItem; import android.view.View; import android.view.ViewGroup; import android.widget.ProgressBar; import androidx.annotation.NonNull; import androidx.annotation.Nullable; -import com.google.android.material.appbar.MaterialToolbar; import androidx.fragment.app.Fragment; +import com.google.android.material.appbar.MaterialToolbar; import com.google.android.material.snackbar.Snackbar; import com.leinardi.android.speeddial.SpeedDialView; import de.danoeh.antennapod.R; @@ -25,6 +23,7 @@ import de.danoeh.antennapod.core.menuhandler.MenuItemUtils; import de.danoeh.antennapod.core.storage.DBReader; import de.danoeh.antennapod.core.util.FeedItemUtil; import de.danoeh.antennapod.core.util.download.FeedUpdateManager; +import de.danoeh.antennapod.dialog.ItemSortDialog; import de.danoeh.antennapod.event.EpisodeDownloadEvent; import de.danoeh.antennapod.event.FeedItemEvent; import de.danoeh.antennapod.event.PlayerStatusEvent; @@ -84,8 +83,6 @@ public class CompletedDownloadsFragment extends Fragment toolbar = root.findViewById(R.id.toolbar); toolbar.setTitle(R.string.downloads_label); toolbar.inflateMenu(R.menu.downloads_completed); - inflateSortMenu(toolbar); - toolbar.setOnMenuItemClickListener(this); toolbar.setOnLongClickListener(v -> { recyclerView.scrollToPosition(5); @@ -148,20 +145,6 @@ public class CompletedDownloadsFragment extends Fragment return root; } - private void inflateSortMenu(MaterialToolbar toolbar) { - Menu menu = toolbar.getMenu(); - MenuItem downloadsItem = menu.findItem(R.id.downloads_sort); - MenuInflater menuInflater = getActivity().getMenuInflater(); - menuInflater.inflate(R.menu.sort_menu, downloadsItem.getSubMenu()); - - // Remove the sorting options that are not needed in this fragment - menu.findItem(R.id.sort_feed_title).setVisible(false); - menu.findItem(R.id.sort_random).setVisible(false); - menu.findItem(R.id.sort_smart_shuffle).setVisible(false); - menu.findItem(R.id.keep_sorted).setVisible(false); - menu.findItem(R.id.sort_size).setVisible(true); - } - @Override public void onSaveInstanceState(@NonNull Bundle outState) { outState.putBoolean(KEY_UP_ARROW, displayUpArrow); @@ -204,21 +187,13 @@ public class CompletedDownloadsFragment extends Fragment } else if (item.getItemId() == R.id.action_search) { ((MainActivity) getActivity()).loadChildFragment(SearchFragment.newInstance()); return true; - } else { - SortOrder sortOrder = MenuItemToSortOrderConverter.convert(item); - if (sortOrder != null) { - setSortOrder(sortOrder); - return true; - } + } else if (item.getItemId() == R.id.downloads_sort) { + new DownloadsSortDialog().show(getChildFragmentManager(), "SortDialog"); + return true; } return false; } - private void setSortOrder(SortOrder sortOrder) { - UserPreferences.setDownloadsSortedOrder(sortOrder); - loadItems(); - } - @Subscribe(sticky = true, threadMode = ThreadMode.MAIN) public void onEventMainThread(EpisodeDownloadEvent event) { Set newRunningDownloads = new HashSet<>(); @@ -391,4 +366,27 @@ public class CompletedDownloadsFragment extends Fragment MenuItemUtils.setOnClickListeners(menu, CompletedDownloadsFragment.this::onContextItemSelected); } } + + public static class DownloadsSortDialog extends ItemSortDialog { + @Override + public void onCreate(@Nullable Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + sortOrder = UserPreferences.getDownloadsSortedOrder(); + } + + @Override + protected void onAddItem(int title, SortOrder ascending, SortOrder descending, boolean ascendingIsDefault) { + if (ascending == SortOrder.DATE_OLD_NEW || ascending == SortOrder.DURATION_SHORT_LONG + || ascending == SortOrder.EPISODE_TITLE_A_Z || ascending == SortOrder.SIZE_SMALL_LARGE) { + super.onAddItem(title, ascending, descending, ascendingIsDefault); + } + } + + @Override + protected void onSelectionChanged() { + super.onSelectionChanged(); + UserPreferences.setDownloadsSortedOrder(sortOrder); + EventBus.getDefault().post(DownloadLogEvent.listUpdated()); + } + } } diff --git a/app/src/main/java/de/danoeh/antennapod/fragment/FeedInfoFragment.java b/app/src/main/java/de/danoeh/antennapod/fragment/FeedInfoFragment.java index bbb48b9d2..f62bdaf84 100644 --- a/app/src/main/java/de/danoeh/antennapod/fragment/FeedInfoFragment.java +++ b/app/src/main/java/de/danoeh/antennapod/fragment/FeedInfoFragment.java @@ -22,24 +22,24 @@ import androidx.activity.result.ActivityResultLauncher; import androidx.activity.result.contract.ActivityResultContracts; import androidx.annotation.NonNull; import androidx.annotation.Nullable; -import com.google.android.material.dialog.MaterialAlertDialogBuilder; import androidx.appcompat.content.res.AppCompatResources; -import com.google.android.material.appbar.MaterialToolbar; import androidx.documentfile.provider.DocumentFile; import androidx.fragment.app.Fragment; import com.bumptech.glide.Glide; import com.bumptech.glide.request.RequestOptions; import com.google.android.material.appbar.AppBarLayout; import com.google.android.material.appbar.CollapsingToolbarLayout; +import com.google.android.material.appbar.MaterialToolbar; +import com.google.android.material.dialog.MaterialAlertDialogBuilder; import com.google.android.material.snackbar.Snackbar; import de.danoeh.antennapod.R; import de.danoeh.antennapod.activity.MainActivity; import de.danoeh.antennapod.core.storage.DBReader; import de.danoeh.antennapod.core.storage.DBTasks; import de.danoeh.antennapod.core.util.IntentUtils; +import de.danoeh.antennapod.core.util.ShareUtils; import de.danoeh.antennapod.core.util.syndication.HtmlToPlainText; import de.danoeh.antennapod.dialog.EditUrlSettingsDialog; -import de.danoeh.antennapod.menuhandler.FeedMenuHandler; import de.danoeh.antennapod.model.feed.Feed; import de.danoeh.antennapod.model.feed.FeedFunding; import de.danoeh.antennapod.ui.glide.FastBlurTransformation; @@ -289,9 +289,11 @@ public class FeedInfoFragment extends Fragment implements MaterialToolbar.OnMenu R.string.please_wait_for_data, Toast.LENGTH_LONG); return false; } - boolean handled = FeedMenuHandler.onOptionsItemClicked(getContext(), item, feed); - - if (item.getItemId() == R.id.reconnect_local_folder) { + if (item.getItemId() == R.id.visit_website_item) { + IntentUtils.openInBrowser(getContext(), feed.getLink()); + } else if (item.getItemId() == R.id.share_item) { + ShareUtils.shareFeedLink(getContext(), feed); + } else if (item.getItemId() == R.id.reconnect_local_folder) { MaterialAlertDialogBuilder alert = new MaterialAlertDialogBuilder(getContext()); alert.setMessage(R.string.reconnect_local_folder_warning); alert.setPositiveButton(android.R.string.ok, (dialog, which) -> { @@ -303,10 +305,7 @@ public class FeedInfoFragment extends Fragment implements MaterialToolbar.OnMenu }); alert.setNegativeButton(android.R.string.cancel, null); alert.show(); - return true; - } - - if (item.getItemId() == R.id.edit_feed_url_item) { + } else if (item.getItemId() == R.id.edit_feed_url_item) { new EditUrlSettingsDialog(getActivity(), feed) { @Override protected void setUrl(String url) { @@ -315,11 +314,10 @@ public class FeedInfoFragment extends Fragment implements MaterialToolbar.OnMenu txtvUrl.setCompoundDrawablesRelativeWithIntrinsicBounds(0, 0, R.drawable.ic_paperclip, 0); } }.show(); - - return true; + } else { + return false; } - - return handled; + return true; } private void addLocalFolderResult(final Uri uri) { diff --git a/app/src/main/java/de/danoeh/antennapod/fragment/FeedItemlistFragment.java b/app/src/main/java/de/danoeh/antennapod/fragment/FeedItemlistFragment.java index 1c949218a..4853c3dae 100644 --- a/app/src/main/java/de/danoeh/antennapod/fragment/FeedItemlistFragment.java +++ b/app/src/main/java/de/danoeh/antennapod/fragment/FeedItemlistFragment.java @@ -18,11 +18,11 @@ import android.widget.Toast; import androidx.annotation.NonNull; import androidx.annotation.Nullable; import androidx.appcompat.content.res.AppCompatResources; -import com.google.android.material.appbar.MaterialToolbar; import androidx.fragment.app.Fragment; import androidx.recyclerview.widget.RecyclerView; import com.bumptech.glide.Glide; import com.bumptech.glide.request.RequestOptions; +import com.google.android.material.appbar.MaterialToolbar; import com.google.android.material.snackbar.Snackbar; import com.joanzapata.iconify.Iconify; import com.leinardi.android.speeddial.SpeedDialView; @@ -32,14 +32,18 @@ import de.danoeh.antennapod.adapter.EpisodeItemListAdapter; import de.danoeh.antennapod.core.feed.FeedEvent; import de.danoeh.antennapod.core.menuhandler.MenuItemUtils; import de.danoeh.antennapod.core.storage.DBReader; +import de.danoeh.antennapod.core.storage.DBWriter; import de.danoeh.antennapod.core.util.FeedItemPermutors; import de.danoeh.antennapod.core.util.FeedItemUtil; +import de.danoeh.antennapod.core.util.IntentUtils; +import de.danoeh.antennapod.core.util.ShareUtils; import de.danoeh.antennapod.core.util.download.FeedUpdateManager; import de.danoeh.antennapod.core.util.gui.MoreContentListFooterUtil; import de.danoeh.antennapod.databinding.FeedItemListFragmentBinding; import de.danoeh.antennapod.databinding.MultiSelectSpeedDialBinding; import de.danoeh.antennapod.dialog.DownloadLogDetailsDialog; import de.danoeh.antennapod.dialog.FeedItemFilterDialog; +import de.danoeh.antennapod.dialog.ItemSortDialog; import de.danoeh.antennapod.dialog.RemoveFeedDialog; import de.danoeh.antennapod.dialog.RenameItemDialog; import de.danoeh.antennapod.event.EpisodeDownloadEvent; @@ -54,11 +58,11 @@ import de.danoeh.antennapod.event.playback.PlaybackPositionEvent; import de.danoeh.antennapod.fragment.actions.EpisodeMultiSelectActionHandler; import de.danoeh.antennapod.fragment.swipeactions.SwipeActions; import de.danoeh.antennapod.menuhandler.FeedItemMenuHandler; -import de.danoeh.antennapod.menuhandler.FeedMenuHandler; import de.danoeh.antennapod.model.download.DownloadResult; import de.danoeh.antennapod.model.feed.Feed; import de.danoeh.antennapod.model.feed.FeedItem; import de.danoeh.antennapod.model.feed.FeedItemFilter; +import de.danoeh.antennapod.model.feed.SortOrder; import de.danoeh.antennapod.storage.preferences.UserPreferences; import de.danoeh.antennapod.ui.glide.FastBlurTransformation; import de.danoeh.antennapod.view.ToolbarIconTintManager; @@ -68,6 +72,7 @@ import io.reactivex.Observable; import io.reactivex.android.schedulers.AndroidSchedulers; import io.reactivex.disposables.Disposable; import io.reactivex.schedulers.Schedulers; +import org.apache.commons.lang3.StringUtils; import org.apache.commons.lang3.Validate; import org.greenrobot.eventbus.EventBus; import org.greenrobot.eventbus.Subscribe; @@ -75,6 +80,7 @@ import org.greenrobot.eventbus.ThreadMode; import java.util.Collections; import java.util.List; +import java.util.concurrent.ExecutionException; /** * Displays a list of FeedItems. @@ -240,8 +246,13 @@ public class FeedItemlistFragment extends Fragment implements AdapterView.OnItem return; } viewBinding.toolbar.getMenu().findItem(R.id.visit_website_item).setVisible(feed.getLink() != null); - - FeedMenuHandler.onPrepareOptionsMenu(viewBinding.toolbar.getMenu(), feed); + viewBinding.toolbar.getMenu().findItem(R.id.refresh_complete_item).setVisible(feed.isPaged()); + if (StringUtils.isBlank(feed.getLink())) { + viewBinding.toolbar.getMenu().findItem(R.id.visit_website_item).setVisible(false); + } + if (feed.isLocalFeed()) { + viewBinding.toolbar.getMenu().findItem(R.id.share_item).setVisible(false); + } } @Override @@ -260,26 +271,39 @@ public class FeedItemlistFragment extends Fragment implements AdapterView.OnItem R.string.please_wait_for_data, Toast.LENGTH_LONG); return true; } - boolean feedMenuHandled = FeedMenuHandler.onOptionsItemClicked(getActivity(), item, feed); - if (feedMenuHandled) { - return true; - } - final int itemId = item.getItemId(); - if (itemId == R.id.rename_item) { + if (item.getItemId() == R.id.visit_website_item) { + IntentUtils.openInBrowser(getContext(), feed.getLink()); + } else if (item.getItemId() == R.id.share_item) { + ShareUtils.shareFeedLink(getContext(), feed); + } else if (item.getItemId() == R.id.refresh_item) { + FeedUpdateManager.runOnceOrAsk(getContext(), feed); + } else if (item.getItemId() == R.id.refresh_complete_item) { + new Thread(() -> { + feed.setNextPageLink(feed.getDownload_url()); + feed.setPageNr(0); + try { + DBWriter.resetPagedFeedPage(feed).get(); + FeedUpdateManager.runOnce(getContext(), feed); + } catch (ExecutionException | InterruptedException e) { + throw new RuntimeException(e); + } + }).start(); + } else if (item.getItemId() == R.id.sort_items) { + SingleFeedSortDialog.newInstance(feed).show(getChildFragmentManager(), "SortDialog"); + } else if (item.getItemId() == R.id.rename_item) { new RenameItemDialog(getActivity(), feed).show(); - return true; - } else if (itemId == R.id.remove_feed) { + } else if (item.getItemId() == R.id.remove_feed) { RemoveFeedDialog.show(getContext(), feed, () -> { ((MainActivity) getActivity()).loadFragment(UserPreferences.getDefaultPage(), null); // Make sure fragment is hidden before actually starting to delete getActivity().getSupportFragmentManager().executePendingTransactions(); }); - return true; - } else if (itemId == R.id.action_search) { + } else if (item.getItemId() == R.id.action_search) { ((MainActivity) getActivity()).loadChildFragment(SearchFragment.newInstance(feed.getId(), feed.getTitle())); - return true; + } else { + return false; } - return false; + return true; } @Override @@ -592,4 +616,45 @@ public class FeedItemlistFragment extends Fragment implements AdapterView.OnItem MenuItemUtils.setOnClickListeners(menu, FeedItemlistFragment.this::onContextItemSelected); } } + + public static class SingleFeedSortDialog extends ItemSortDialog { + private static final String ARG_FEED_ID = "feedId"; + private static final String ARG_FEED_IS_LOCAL = "isLocal"; + private static final String ARG_SORT_ORDER = "sortOrder"; + + private static SingleFeedSortDialog newInstance(Feed feed) { + Bundle bundle = new Bundle(); + bundle.putLong(ARG_FEED_ID, feed.getId()); + bundle.putBoolean(ARG_FEED_IS_LOCAL, feed.isLocalFeed()); + if (feed.getSortOrder() == null) { + bundle.putString(ARG_SORT_ORDER, String.valueOf(SortOrder.DATE_NEW_OLD.code)); + } else { + bundle.putString(ARG_SORT_ORDER, String.valueOf(feed.getSortOrder().code)); + } + SingleFeedSortDialog dialog = new SingleFeedSortDialog(); + dialog.setArguments(bundle); + return dialog; + } + + @Override + public void onCreate(@Nullable Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + sortOrder = SortOrder.fromCodeString(getArguments().getString(ARG_SORT_ORDER)); + } + + @Override + protected void onAddItem(int title, SortOrder ascending, SortOrder descending, boolean ascendingIsDefault) { + if (ascending == SortOrder.DATE_OLD_NEW || ascending == SortOrder.DURATION_SHORT_LONG + || ascending == SortOrder.EPISODE_TITLE_A_Z + || (getArguments().getBoolean(ARG_FEED_IS_LOCAL) && ascending == SortOrder.EPISODE_FILENAME_A_Z)) { + super.onAddItem(title, ascending, descending, ascendingIsDefault); + } + } + + @Override + protected void onSelectionChanged() { + super.onSelectionChanged(); + DBWriter.setFeedItemSortOrder(getArguments().getLong(ARG_FEED_ID), sortOrder); + } + } } diff --git a/app/src/main/java/de/danoeh/antennapod/fragment/InboxFragment.java b/app/src/main/java/de/danoeh/antennapod/fragment/InboxFragment.java index f8bcbb532..497409e70 100644 --- a/app/src/main/java/de/danoeh/antennapod/fragment/InboxFragment.java +++ b/app/src/main/java/de/danoeh/antennapod/fragment/InboxFragment.java @@ -4,26 +4,25 @@ import android.content.Context; import android.content.SharedPreferences; import android.os.Bundle; import android.view.LayoutInflater; -import android.view.Menu; -import android.view.MenuInflater; import android.view.MenuItem; import android.view.View; import android.view.ViewGroup; import android.widget.CheckBox; import android.widget.Toast; - import androidx.annotation.NonNull; - +import androidx.annotation.Nullable; import com.google.android.material.dialog.MaterialAlertDialogBuilder; - import de.danoeh.antennapod.R; import de.danoeh.antennapod.activity.MainActivity; import de.danoeh.antennapod.core.storage.DBReader; import de.danoeh.antennapod.core.storage.DBWriter; +import de.danoeh.antennapod.dialog.ItemSortDialog; +import de.danoeh.antennapod.event.FeedListUpdateEvent; import de.danoeh.antennapod.model.feed.FeedItem; import de.danoeh.antennapod.model.feed.FeedItemFilter; import de.danoeh.antennapod.model.feed.SortOrder; import de.danoeh.antennapod.storage.preferences.UserPreferences; +import org.greenrobot.eventbus.EventBus; import java.util.List; @@ -42,8 +41,6 @@ public class InboxFragment extends EpisodesListFragment { public View onCreateView(@NonNull LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { final View root = super.onCreateView(inflater, container, savedInstanceState); toolbar.inflateMenu(R.menu.inbox); - inflateSortMenu(); - toolbar.setTitle(R.string.inbox_label); prefs = getActivity().getSharedPreferences(PREF_NAME, Context.MODE_PRIVATE); updateToolbar(); @@ -83,13 +80,9 @@ public class InboxFragment extends EpisodesListFragment { showRemoveAllDialog(); } return true; - } else { - SortOrder sortOrder = MenuItemToSortOrderConverter.convert(item); - if (sortOrder != null) { - UserPreferences.setInboxSortedOrder(sortOrder); - loadItems(); - return true; - } + } else if (item.getItemId() == R.id.inbox_sort) { + new InboxSortDialog().show(getChildFragmentManager(), "SortDialog"); + return true; } return false; } @@ -118,20 +111,6 @@ public class InboxFragment extends EpisodesListFragment { ((MainActivity) getActivity()).showSnackbarAbovePlayer(R.string.removed_all_inbox_msg, Toast.LENGTH_SHORT); } - private void inflateSortMenu() { - Menu menu = toolbar.getMenu(); - MenuItem downloadsItem = menu.findItem(R.id.inbox_sort); - MenuInflater menuInflater = getActivity().getMenuInflater(); - menuInflater.inflate(R.menu.sort_menu, downloadsItem.getSubMenu()); - - // Remove the sorting options that are not needed in this fragment - toolbar.getMenu().findItem(R.id.sort_episode_title).setVisible(false); - toolbar.getMenu().findItem(R.id.sort_feed_title).setVisible(false); - toolbar.getMenu().findItem(R.id.sort_random).setVisible(false); - toolbar.getMenu().findItem(R.id.sort_smart_shuffle).setVisible(false); - toolbar.getMenu().findItem(R.id.keep_sorted).setVisible(false); - } - private void showRemoveAllDialog() { MaterialAlertDialogBuilder builder = new MaterialAlertDialogBuilder(getContext()); builder.setTitle(R.string.remove_all_inbox_label); @@ -149,4 +128,26 @@ public class InboxFragment extends EpisodesListFragment { builder.setNegativeButton(R.string.cancel_label, null); builder.show(); } + + public static class InboxSortDialog extends ItemSortDialog { + @Override + public void onCreate(@Nullable Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + sortOrder = UserPreferences.getInboxSortedOrder(); + } + + @Override + protected void onAddItem(int title, SortOrder ascending, SortOrder descending, boolean ascendingIsDefault) { + if (ascending == SortOrder.DATE_OLD_NEW || ascending == SortOrder.DURATION_SHORT_LONG) { + super.onAddItem(title, ascending, descending, ascendingIsDefault); + } + } + + @Override + protected void onSelectionChanged() { + super.onSelectionChanged(); + UserPreferences.setInboxSortedOrder(sortOrder); + EventBus.getDefault().post(new FeedListUpdateEvent(0)); + } + } } diff --git a/app/src/main/java/de/danoeh/antennapod/fragment/MenuItemToSortOrderConverter.java b/app/src/main/java/de/danoeh/antennapod/fragment/MenuItemToSortOrderConverter.java deleted file mode 100644 index d4150fbdb..000000000 --- a/app/src/main/java/de/danoeh/antennapod/fragment/MenuItemToSortOrderConverter.java +++ /dev/null @@ -1,44 +0,0 @@ -package de.danoeh.antennapod.fragment; - -import android.view.MenuItem; - -import de.danoeh.antennapod.R; -import de.danoeh.antennapod.model.feed.SortOrder; - -public class MenuItemToSortOrderConverter { - - public static SortOrder convert(MenuItem item) { - final int itemId = item.getItemId(); - - if (itemId == R.id.sort_episode_title_asc) { - return SortOrder.EPISODE_TITLE_A_Z; - } else if (itemId == R.id.sort_episode_title_desc) { - return SortOrder.EPISODE_TITLE_Z_A; - } else if (itemId == R.id.sort_date_asc) { - return SortOrder.DATE_OLD_NEW; - } else if (itemId == R.id.sort_date_desc) { - return SortOrder.DATE_NEW_OLD; - } else if (itemId == R.id.sort_duration_asc) { - return SortOrder.DURATION_SHORT_LONG; - } else if (itemId == R.id.sort_duration_desc) { - return SortOrder.DURATION_LONG_SHORT; - } else if (itemId == R.id.sort_feed_title_asc) { - return SortOrder.FEED_TITLE_A_Z; - } else if (itemId == R.id.sort_feed_title_desc) { - return SortOrder.FEED_TITLE_Z_A; - } else if (itemId == R.id.sort_random) { - return SortOrder.RANDOM; - } else if (itemId == R.id.sort_smart_shuffle_asc) { - return SortOrder.SMART_SHUFFLE_OLD_NEW; - } else if (itemId == R.id.sort_smart_shuffle_desc) { - return SortOrder.SMART_SHUFFLE_NEW_OLD; - } else if (itemId == R.id.sort_size_small_large) { - return SortOrder.SIZE_SMALL_LARGE; - } else if (itemId == R.id.sort_size_large_small) { - return SortOrder.SIZE_LARGE_SMALL; - } - - return null; - } - -} diff --git a/app/src/main/java/de/danoeh/antennapod/fragment/QueueFragment.java b/app/src/main/java/de/danoeh/antennapod/fragment/QueueFragment.java index a1aa7226d..dbaeb836c 100644 --- a/app/src/main/java/de/danoeh/antennapod/fragment/QueueFragment.java +++ b/app/src/main/java/de/danoeh/antennapod/fragment/QueueFragment.java @@ -10,7 +10,6 @@ import android.util.Log; import android.view.ContextMenu; import android.view.KeyEvent; import android.view.LayoutInflater; -import android.view.MenuInflater; import android.view.MenuItem; import android.view.View; import android.view.ViewGroup; @@ -18,6 +17,7 @@ import android.widget.CheckBox; import android.widget.ProgressBar; import android.widget.TextView; import androidx.annotation.NonNull; +import androidx.annotation.Nullable; import androidx.fragment.app.Fragment; import androidx.recyclerview.widget.ItemTouchHelper; import androidx.recyclerview.widget.RecyclerView; @@ -39,6 +39,7 @@ import de.danoeh.antennapod.core.storage.DBWriter; import de.danoeh.antennapod.core.util.Converter; import de.danoeh.antennapod.core.util.FeedItemUtil; import de.danoeh.antennapod.core.util.download.FeedUpdateManager; +import de.danoeh.antennapod.dialog.ItemSortDialog; import de.danoeh.antennapod.event.EpisodeDownloadEvent; import de.danoeh.antennapod.event.FeedItemEvent; import de.danoeh.antennapod.event.FeedUpdateRunningEvent; @@ -159,6 +160,8 @@ public class QueueFragment extends Fragment implements MaterialToolbar.OnMenuIte case MOVED: return; } + recyclerAdapter.updateDragDropEnabled(); + refreshToolbarState(); recyclerView.saveScrollPosition(QueueFragment.TAG); refreshInfoBar(); } @@ -258,8 +261,6 @@ public class QueueFragment extends Fragment implements MaterialToolbar.OnMenuIte boolean keepSorted = UserPreferences.isQueueKeepSorted(); toolbar.getMenu().findItem(R.id.queue_lock).setChecked(UserPreferences.isQueueLocked()); toolbar.getMenu().findItem(R.id.queue_lock).setVisible(!keepSorted); - toolbar.getMenu().findItem(R.id.sort_random).setVisible(!keepSorted); - toolbar.getMenu().findItem(R.id.keep_sorted).setChecked(keepSorted); } @Subscribe(sticky = true, threadMode = ThreadMode.MAIN) @@ -273,6 +274,9 @@ public class QueueFragment extends Fragment implements MaterialToolbar.OnMenuIte if (itemId == R.id.queue_lock) { toggleQueueLock(); return true; + } else if (itemId == R.id.queue_sort) { + new QueueSortDialog().show(getChildFragmentManager().beginTransaction(), "SortDialog"); + return true; } else if (itemId == R.id.refresh_item) { FeedUpdateManager.runOnceOrAsk(requireContext()); return true; @@ -291,28 +295,9 @@ public class QueueFragment extends Fragment implements MaterialToolbar.OnMenuIte }; conDialog.createNewDialog().show(); return true; - } else if (itemId == R.id.keep_sorted) { - boolean keepSortedOld = UserPreferences.isQueueKeepSorted(); - boolean keepSortedNew = !keepSortedOld; - UserPreferences.setQueueKeepSorted(keepSortedNew); - if (keepSortedNew) { - SortOrder sortOrder = UserPreferences.getQueueKeepSortedOrder(); - DBWriter.reorderQueue(sortOrder, true); - } - if (recyclerAdapter != null) { - recyclerAdapter.updateDragDropEnabled(); - } - refreshToolbarState(); - return true; } else if (itemId == R.id.action_search) { ((MainActivity) getActivity()).loadChildFragment(SearchFragment.newInstance()); return true; - } else { - SortOrder sortOrder = MenuItemToSortOrderConverter.convert(item); - if (sortOrder != null) { - setSortOrder(sortOrder); - return true; - } } return false; } @@ -359,16 +344,6 @@ public class QueueFragment extends Fragment implements MaterialToolbar.OnMenuIte } } - /** - * This method is called if the user clicks on a sort order menu item. - * - * @param sortOrder New sort order. - */ - private void setSortOrder(SortOrder sortOrder) { - UserPreferences.setQueueKeepSortedOrder(sortOrder); - DBWriter.reorderQueue(sortOrder, true); - } - @Override public boolean onContextItemSelected(MenuItem item) { Log.d(TAG, "onContextItemSelected() called with: " + "item = [" + item + "]"); @@ -422,10 +397,6 @@ public class QueueFragment extends Fragment implements MaterialToolbar.OnMenuIte } ((MainActivity) getActivity()).setupToolbarToggle(toolbar, displayUpArrow); toolbar.inflateMenu(R.menu.queue); - - MenuItem queueItem = toolbar.getMenu().findItem(R.id.queue_sort); - MenuInflater menuInflater = getActivity().getMenuInflater(); - menuInflater.inflate(R.menu.sort_menu, queueItem.getSubMenu()); refreshToolbarState(); progressBar = root.findViewById(R.id.progressBar); progressBar.setVisibility(View.VISIBLE); @@ -567,6 +538,40 @@ public class QueueFragment extends Fragment implements MaterialToolbar.OnMenuIte swipeActions.attachTo(recyclerView); } + public static class QueueSortDialog extends ItemSortDialog { + @Nullable + @Override + public View onCreateView(@NonNull LayoutInflater inflater, + @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) { + if (UserPreferences.isQueueKeepSorted()) { + sortOrder = UserPreferences.getQueueKeepSortedOrder(); + } + View view = super.onCreateView(inflater, container, savedInstanceState); + viewBinding.keepSortedCheckbox.setVisibility(View.VISIBLE); + viewBinding.keepSortedCheckbox.setChecked(UserPreferences.isQueueKeepSorted()); + return view; + } + + @Override + protected void onAddItem(int title, SortOrder ascending, SortOrder descending, boolean ascendingIsDefault) { + if (ascending != SortOrder.EPISODE_FILENAME_A_Z && ascending != SortOrder.SIZE_SMALL_LARGE) { + super.onAddItem(title, ascending, descending, ascendingIsDefault); + } + } + + @Override + protected void onSelectionChanged() { + super.onSelectionChanged(); + viewBinding.keepSortedCheckbox.setEnabled(sortOrder != SortOrder.RANDOM); + if (sortOrder == SortOrder.RANDOM) { + viewBinding.keepSortedCheckbox.setChecked(false); + } + UserPreferences.setQueueKeepSorted(viewBinding.keepSortedCheckbox.isChecked()); + UserPreferences.setQueueKeepSortedOrder(sortOrder); + DBWriter.reorderQueue(sortOrder, true); + } + } + private class QueueSwipeActions extends SwipeActions { // Position tracking whilst dragging -- cgit v1.2.3 From 8c7d567a0cb1e6f52ed1256aff2326da58199fe9 Mon Sep 17 00:00:00 2001 From: ByteHamster Date: Sun, 31 Dec 2023 11:09:12 +0100 Subject: If feed url was typed manually, show edit url button on error (#6833) --- app/src/main/java/de/danoeh/antennapod/fragment/AddFeedFragment.java | 1 + 1 file changed, 1 insertion(+) (limited to 'app/src/main/java/de/danoeh/antennapod/fragment') diff --git a/app/src/main/java/de/danoeh/antennapod/fragment/AddFeedFragment.java b/app/src/main/java/de/danoeh/antennapod/fragment/AddFeedFragment.java index 29be41727..20cdd2718 100644 --- a/app/src/main/java/de/danoeh/antennapod/fragment/AddFeedFragment.java +++ b/app/src/main/java/de/danoeh/antennapod/fragment/AddFeedFragment.java @@ -147,6 +147,7 @@ public class AddFeedFragment extends Fragment { private void addUrl(String url) { Intent intent = new Intent(getActivity(), OnlineFeedViewActivity.class); intent.putExtra(OnlineFeedViewActivity.ARG_FEEDURL, url); + intent.putExtra(OnlineFeedViewActivity.ARG_WAS_MANUAL_URL, true); startActivity(intent); } -- cgit v1.2.3 From f1e91f9d8b152fb022d227d866e8666d73171a9f Mon Sep 17 00:00:00 2001 From: ueen Date: Tue, 2 Jan 2024 19:56:57 +0100 Subject: Migrate subscriptions filter dialog to DialogFragment (#6846) Co-authored-by: ByteHamster --- .../main/java/de/danoeh/antennapod/fragment/NavDrawerFragment.java | 2 +- .../java/de/danoeh/antennapod/fragment/SubscriptionFragment.java | 5 +++-- .../fragment/preferences/UserInterfacePreferencesFragment.java | 2 +- 3 files changed, 5 insertions(+), 4 deletions(-) (limited to 'app/src/main/java/de/danoeh/antennapod/fragment') diff --git a/app/src/main/java/de/danoeh/antennapod/fragment/NavDrawerFragment.java b/app/src/main/java/de/danoeh/antennapod/fragment/NavDrawerFragment.java index eeca181cf..636c0245b 100644 --- a/app/src/main/java/de/danoeh/antennapod/fragment/NavDrawerFragment.java +++ b/app/src/main/java/de/danoeh/antennapod/fragment/NavDrawerFragment.java @@ -382,7 +382,7 @@ public class NavDrawerFragment extends Fragment implements SharedPreferences.OnS } } else if (UserPreferences.getSubscriptionsFilter().isEnabled() && navAdapter.showSubscriptionList) { - SubscriptionsFilterDialog.showDialog(requireContext()); + new SubscriptionsFilterDialog().show(getChildFragmentManager(), "filter"); } } diff --git a/app/src/main/java/de/danoeh/antennapod/fragment/SubscriptionFragment.java b/app/src/main/java/de/danoeh/antennapod/fragment/SubscriptionFragment.java index 93ed4c2c9..7006edca9 100644 --- a/app/src/main/java/de/danoeh/antennapod/fragment/SubscriptionFragment.java +++ b/app/src/main/java/de/danoeh/antennapod/fragment/SubscriptionFragment.java @@ -166,7 +166,8 @@ public class SubscriptionFragment extends Fragment }); feedsFilteredMsg = root.findViewById(R.id.feeds_filtered_message); - feedsFilteredMsg.setOnClickListener((l) -> SubscriptionsFilterDialog.showDialog(requireContext())); + feedsFilteredMsg.setOnClickListener((l) -> + new SubscriptionsFilterDialog().show(getChildFragmentManager(), "filter")); SwipeRefreshLayout swipeRefreshLayout = root.findViewById(R.id.swipeRefresh); swipeRefreshLayout.setDistanceToTriggerSync(getResources().getInteger(R.integer.swipe_refresh_distance)); @@ -221,7 +222,7 @@ public class SubscriptionFragment extends Fragment FeedUpdateManager.runOnceOrAsk(requireContext()); return true; } else if (itemId == R.id.subscriptions_filter) { - SubscriptionsFilterDialog.showDialog(requireContext()); + new SubscriptionsFilterDialog().show(getChildFragmentManager(), "filter"); return true; } else if (itemId == R.id.subscriptions_sort) { FeedSortDialog.showDialog(requireContext()); 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 66f592af2..c8521caab 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 @@ -71,7 +71,7 @@ public class UserInterfacePreferencesFragment extends PreferenceFragmentCompat { }); findPreference(UserPreferences.PREF_FILTER_FEED) .setOnPreferenceClickListener((preference -> { - SubscriptionsFilterDialog.showDialog(requireContext()); + new SubscriptionsFilterDialog().show(getChildFragmentManager(), "filter"); return true; })); -- cgit v1.2.3 From c5093c9ff92c1ffba3b886f52541631fd9b554f8 Mon Sep 17 00:00:00 2001 From: quails4Eva Date: Tue, 2 Jan 2024 19:17:29 +0000 Subject: Move 'skip silence' checkbox to playback speed dialog (#6834) --- .../antennapod/fragment/AudioPlayerFragment.java | 41 ++++++++++------------ 1 file changed, 18 insertions(+), 23 deletions(-) (limited to 'app/src/main/java/de/danoeh/antennapod/fragment') diff --git a/app/src/main/java/de/danoeh/antennapod/fragment/AudioPlayerFragment.java b/app/src/main/java/de/danoeh/antennapod/fragment/AudioPlayerFragment.java index f2a53ab7e..8b25c0e6a 100644 --- a/app/src/main/java/de/danoeh/antennapod/fragment/AudioPlayerFragment.java +++ b/app/src/main/java/de/danoeh/antennapod/fragment/AudioPlayerFragment.java @@ -15,25 +15,16 @@ import android.widget.TextView; import androidx.annotation.NonNull; import androidx.annotation.Nullable; -import com.google.android.material.appbar.MaterialToolbar; import androidx.cardview.widget.CardView; import androidx.fragment.app.Fragment; import androidx.interpolator.view.animation.FastOutSlowInInterpolator; import androidx.viewpager2.adapter.FragmentStateAdapter; import androidx.viewpager2.widget.ViewPager2; +import com.google.android.material.appbar.MaterialToolbar; import com.google.android.material.bottomsheet.BottomSheetBehavior; import com.google.android.material.elevation.SurfaceColors; -import de.danoeh.antennapod.core.receiver.MediaButtonReceiver; -import de.danoeh.antennapod.core.util.playback.PlaybackController; -import de.danoeh.antennapod.dialog.MediaPlayerErrorDialog; -import de.danoeh.antennapod.event.playback.BufferUpdateEvent; -import de.danoeh.antennapod.event.playback.PlaybackServiceEvent; -import de.danoeh.antennapod.event.PlayerErrorEvent; -import de.danoeh.antennapod.event.playback.SleepTimerUpdatedEvent; -import de.danoeh.antennapod.event.playback.SpeedChangedEvent; -import de.danoeh.antennapod.playback.cast.CastEnabledActivity; import org.greenrobot.eventbus.EventBus; import org.greenrobot.eventbus.Subscribe; import org.greenrobot.eventbus.ThreadMode; @@ -44,23 +35,31 @@ import java.util.List; import de.danoeh.antennapod.R; import de.danoeh.antennapod.activity.MainActivity; -import de.danoeh.antennapod.event.FavoritesEvent; -import de.danoeh.antennapod.event.playback.PlaybackPositionEvent; -import de.danoeh.antennapod.model.feed.Chapter; -import de.danoeh.antennapod.event.UnreadItemsUpdateEvent; -import de.danoeh.antennapod.model.feed.FeedItem; -import de.danoeh.antennapod.model.feed.FeedMedia; import de.danoeh.antennapod.core.feed.util.PlaybackSpeedUtils; -import de.danoeh.antennapod.storage.preferences.UserPreferences; +import de.danoeh.antennapod.core.receiver.MediaButtonReceiver; import de.danoeh.antennapod.core.util.ChapterUtils; import de.danoeh.antennapod.core.util.Converter; import de.danoeh.antennapod.core.util.TimeSpeedConverter; -import de.danoeh.antennapod.model.playback.Playable; -import de.danoeh.antennapod.dialog.PlaybackControlsDialog; +import de.danoeh.antennapod.core.util.playback.PlaybackController; +import de.danoeh.antennapod.dialog.MediaPlayerErrorDialog; import de.danoeh.antennapod.dialog.SkipPreferenceDialog; import de.danoeh.antennapod.dialog.SleepTimerDialog; import de.danoeh.antennapod.dialog.VariableSpeedDialog; +import de.danoeh.antennapod.event.FavoritesEvent; +import de.danoeh.antennapod.event.PlayerErrorEvent; +import de.danoeh.antennapod.event.UnreadItemsUpdateEvent; +import de.danoeh.antennapod.event.playback.BufferUpdateEvent; +import de.danoeh.antennapod.event.playback.PlaybackPositionEvent; +import de.danoeh.antennapod.event.playback.PlaybackServiceEvent; +import de.danoeh.antennapod.event.playback.SleepTimerUpdatedEvent; +import de.danoeh.antennapod.event.playback.SpeedChangedEvent; import de.danoeh.antennapod.menuhandler.FeedItemMenuHandler; +import de.danoeh.antennapod.model.feed.Chapter; +import de.danoeh.antennapod.model.feed.FeedItem; +import de.danoeh.antennapod.model.feed.FeedMedia; +import de.danoeh.antennapod.model.playback.Playable; +import de.danoeh.antennapod.playback.cast.CastEnabledActivity; +import de.danoeh.antennapod.storage.preferences.UserPreferences; import de.danoeh.antennapod.ui.common.PlaybackSpeedIndicatorView; import de.danoeh.antennapod.view.ChapterSeekBar; import de.danoeh.antennapod.view.PlayButton; @@ -503,10 +502,6 @@ public class AudioPlayerFragment extends Fragment implements if (itemId == R.id.disable_sleeptimer_item || itemId == R.id.set_sleeptimer_item) { new SleepTimerDialog().show(getChildFragmentManager(), "SleepTimerDialog"); return true; - } else if (itemId == R.id.audio_controls) { - PlaybackControlsDialog dialog = PlaybackControlsDialog.newInstance(); - dialog.show(getChildFragmentManager(), "playback_controls"); - return true; } else if (itemId == R.id.open_feed_item) { if (feedItem != null) { Intent intent = MainActivity.getIntentToOpenFeed(getContext(), feedItem.getFeedId()); -- cgit v1.2.3 From 4a782e457ccde553d82f4627514c060d9083a94c Mon Sep 17 00:00:00 2001 From: ByteHamster Date: Tue, 2 Jan 2024 20:18:20 +0100 Subject: Update queue list when toggling 'keep sorted' (#6853) --- app/src/main/java/de/danoeh/antennapod/fragment/QueueFragment.java | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) (limited to 'app/src/main/java/de/danoeh/antennapod/fragment') diff --git a/app/src/main/java/de/danoeh/antennapod/fragment/QueueFragment.java b/app/src/main/java/de/danoeh/antennapod/fragment/QueueFragment.java index dbaeb836c..1e32ee465 100644 --- a/app/src/main/java/de/danoeh/antennapod/fragment/QueueFragment.java +++ b/app/src/main/java/de/danoeh/antennapod/fragment/QueueFragment.java @@ -546,9 +546,11 @@ public class QueueFragment extends Fragment implements MaterialToolbar.OnMenuIte if (UserPreferences.isQueueKeepSorted()) { sortOrder = UserPreferences.getQueueKeepSortedOrder(); } - View view = super.onCreateView(inflater, container, savedInstanceState); + final View view = super.onCreateView(inflater, container, savedInstanceState); viewBinding.keepSortedCheckbox.setVisibility(View.VISIBLE); viewBinding.keepSortedCheckbox.setChecked(UserPreferences.isQueueKeepSorted()); + // Disable until something gets selected + viewBinding.keepSortedCheckbox.setEnabled(UserPreferences.isQueueKeepSorted()); return view; } -- cgit v1.2.3 From 34fb2050b257d81438374bd39d4625be4b580325 Mon Sep 17 00:00:00 2001 From: ueen Date: Sat, 20 Jan 2024 17:31:16 +0100 Subject: Hide refresh from toolbar (#6850) --- .../antennapod/fragment/EpisodesListFragment.java | 33 ++++++++++------------ .../antennapod/fragment/FeedItemlistFragment.java | 33 ++++++++++------------ .../danoeh/antennapod/fragment/QueueFragment.java | 29 +++++++++---------- .../antennapod/fragment/SubscriptionFragment.java | 13 +++------ 4 files changed, 48 insertions(+), 60 deletions(-) (limited to 'app/src/main/java/de/danoeh/antennapod/fragment') diff --git a/app/src/main/java/de/danoeh/antennapod/fragment/EpisodesListFragment.java b/app/src/main/java/de/danoeh/antennapod/fragment/EpisodesListFragment.java index 00d671d36..0cbc23a56 100644 --- a/app/src/main/java/de/danoeh/antennapod/fragment/EpisodesListFragment.java +++ b/app/src/main/java/de/danoeh/antennapod/fragment/EpisodesListFragment.java @@ -2,8 +2,6 @@ package de.danoeh.antennapod.fragment; import android.content.DialogInterface; import android.os.Bundle; -import android.os.Handler; -import android.os.Looper; import android.util.Log; import android.view.ContextMenu; import android.view.KeyEvent; @@ -13,6 +11,7 @@ import android.view.View; import android.view.ViewGroup; import android.widget.ProgressBar; import android.widget.TextView; + import androidx.annotation.NonNull; import androidx.appcompat.widget.Toolbar; import androidx.core.util.Pair; @@ -20,9 +19,19 @@ import androidx.fragment.app.Fragment; import androidx.recyclerview.widget.RecyclerView; import androidx.recyclerview.widget.SimpleItemAnimator; import androidx.swiperefreshlayout.widget.SwipeRefreshLayout; + import com.google.android.material.appbar.MaterialToolbar; import com.google.android.material.snackbar.Snackbar; import com.leinardi.android.speeddial.SpeedDialView; + +import org.greenrobot.eventbus.EventBus; +import org.greenrobot.eventbus.Subscribe; +import org.greenrobot.eventbus.ThreadMode; + +import java.util.ArrayList; +import java.util.Collections; +import java.util.List; + import de.danoeh.antennapod.R; import de.danoeh.antennapod.activity.MainActivity; import de.danoeh.antennapod.adapter.EpisodeItemListAdapter; @@ -51,13 +60,6 @@ import io.reactivex.Observable; import io.reactivex.android.schedulers.AndroidSchedulers; import io.reactivex.disposables.Disposable; import io.reactivex.schedulers.Schedulers; -import org.greenrobot.eventbus.EventBus; -import org.greenrobot.eventbus.Subscribe; -import org.greenrobot.eventbus.ThreadMode; - -import java.util.ArrayList; -import java.util.Collections; -import java.util.List; /** * Shows unread or recently published episodes @@ -77,6 +79,7 @@ public abstract class EpisodesListFragment extends Fragment EmptyViewHandler emptyView; SpeedDialView speedDialView; MaterialToolbar toolbar; + SwipeRefreshLayout swipeRefreshLayout; SwipeActions swipeActions; private ProgressBar progressBar; @@ -180,13 +183,9 @@ public abstract class EpisodesListFragment extends Fragment ((SimpleItemAnimator) animator).setSupportsChangeAnimations(false); } - SwipeRefreshLayout swipeRefreshLayout = root.findViewById(R.id.swipeRefresh); + swipeRefreshLayout = root.findViewById(R.id.swipeRefresh); swipeRefreshLayout.setDistanceToTriggerSync(getResources().getInteger(R.integer.swipe_refresh_distance)); - swipeRefreshLayout.setOnRefreshListener(() -> { - FeedUpdateManager.runOnceOrAsk(requireContext()); - new Handler(Looper.getMainLooper()).postDelayed(() -> swipeRefreshLayout.setRefreshing(false), - getResources().getInteger(R.integer.swipe_to_refresh_duration_in_ms)); - }); + swipeRefreshLayout.setOnRefreshListener(() -> FeedUpdateManager.runOnceOrAsk(requireContext())); listAdapter = new EpisodeItemListAdapter((MainActivity) getActivity()) { @Override @@ -456,9 +455,7 @@ public abstract class EpisodesListFragment extends Fragment @Subscribe(sticky = true, threadMode = ThreadMode.MAIN) public void onEventMainThread(FeedUpdateRunningEvent event) { - if (toolbar.getMenu().findItem(R.id.refresh_item) != null) { - MenuItemUtils.updateRefreshMenuItem(toolbar.getMenu(), R.id.refresh_item, event.isFeedUpdateRunning); - } + swipeRefreshLayout.setRefreshing(event.isFeedUpdateRunning); } @Override diff --git a/app/src/main/java/de/danoeh/antennapod/fragment/FeedItemlistFragment.java b/app/src/main/java/de/danoeh/antennapod/fragment/FeedItemlistFragment.java index 4853c3dae..8020235b9 100644 --- a/app/src/main/java/de/danoeh/antennapod/fragment/FeedItemlistFragment.java +++ b/app/src/main/java/de/danoeh/antennapod/fragment/FeedItemlistFragment.java @@ -4,8 +4,6 @@ import android.content.Context; import android.content.res.Configuration; import android.graphics.LightingColorFilter; import android.os.Bundle; -import android.os.Handler; -import android.os.Looper; import android.util.Log; import android.view.ContextMenu; import android.view.KeyEvent; @@ -15,17 +13,30 @@ import android.view.View; import android.view.ViewGroup; import android.widget.AdapterView; import android.widget.Toast; + import androidx.annotation.NonNull; import androidx.annotation.Nullable; import androidx.appcompat.content.res.AppCompatResources; import androidx.fragment.app.Fragment; import androidx.recyclerview.widget.RecyclerView; + import com.bumptech.glide.Glide; import com.bumptech.glide.request.RequestOptions; import com.google.android.material.appbar.MaterialToolbar; import com.google.android.material.snackbar.Snackbar; import com.joanzapata.iconify.Iconify; import com.leinardi.android.speeddial.SpeedDialView; + +import org.apache.commons.lang3.StringUtils; +import org.apache.commons.lang3.Validate; +import org.greenrobot.eventbus.EventBus; +import org.greenrobot.eventbus.Subscribe; +import org.greenrobot.eventbus.ThreadMode; + +import java.util.Collections; +import java.util.List; +import java.util.concurrent.ExecutionException; + import de.danoeh.antennapod.R; import de.danoeh.antennapod.activity.MainActivity; import de.danoeh.antennapod.adapter.EpisodeItemListAdapter; @@ -72,15 +83,6 @@ import io.reactivex.Observable; import io.reactivex.android.schedulers.AndroidSchedulers; import io.reactivex.disposables.Disposable; import io.reactivex.schedulers.Schedulers; -import org.apache.commons.lang3.StringUtils; -import org.apache.commons.lang3.Validate; -import org.greenrobot.eventbus.EventBus; -import org.greenrobot.eventbus.Subscribe; -import org.greenrobot.eventbus.ThreadMode; - -import java.util.Collections; -import java.util.List; -import java.util.concurrent.ExecutionException; /** * Displays a list of FeedItems. @@ -189,11 +191,7 @@ public class FeedItemlistFragment extends Fragment implements AdapterView.OnItem EventBus.getDefault().register(this); viewBinding.swipeRefresh.setDistanceToTriggerSync(getResources().getInteger(R.integer.swipe_refresh_distance)); - viewBinding.swipeRefresh.setOnRefreshListener(() -> { - FeedUpdateManager.runOnceOrAsk(requireContext(), feed); - new Handler(Looper.getMainLooper()).postDelayed(() -> viewBinding.swipeRefresh.setRefreshing(false), - getResources().getInteger(R.integer.swipe_to_refresh_duration_in_ms)); - }); + viewBinding.swipeRefresh.setOnRefreshListener(() -> FeedUpdateManager.runOnceOrAsk(requireContext(), feed)); loadItems(); @@ -431,8 +429,7 @@ public class FeedItemlistFragment extends Fragment implements AdapterView.OnItem if (!event.isFeedUpdateRunning) { nextPageLoader.getRoot().setVisibility(View.GONE); } - MenuItemUtils.updateRefreshMenuItem(viewBinding.toolbar.getMenu(), - R.id.refresh_item, event.isFeedUpdateRunning); + viewBinding.swipeRefresh.setRefreshing(event.isFeedUpdateRunning); } private void refreshHeaderView() { diff --git a/app/src/main/java/de/danoeh/antennapod/fragment/QueueFragment.java b/app/src/main/java/de/danoeh/antennapod/fragment/QueueFragment.java index 1e32ee465..aacd05fcd 100644 --- a/app/src/main/java/de/danoeh/antennapod/fragment/QueueFragment.java +++ b/app/src/main/java/de/danoeh/antennapod/fragment/QueueFragment.java @@ -4,8 +4,6 @@ import android.content.Context; import android.content.DialogInterface; import android.content.SharedPreferences; import android.os.Bundle; -import android.os.Handler; -import android.os.Looper; import android.util.Log; import android.view.ContextMenu; import android.view.KeyEvent; @@ -16,6 +14,7 @@ import android.view.ViewGroup; import android.widget.CheckBox; import android.widget.ProgressBar; import android.widget.TextView; + import androidx.annotation.NonNull; import androidx.annotation.Nullable; import androidx.fragment.app.Fragment; @@ -23,10 +22,19 @@ import androidx.recyclerview.widget.ItemTouchHelper; import androidx.recyclerview.widget.RecyclerView; import androidx.recyclerview.widget.SimpleItemAnimator; import androidx.swiperefreshlayout.widget.SwipeRefreshLayout; + import com.google.android.material.appbar.MaterialToolbar; import com.google.android.material.dialog.MaterialAlertDialogBuilder; import com.google.android.material.snackbar.Snackbar; import com.leinardi.android.speeddial.SpeedDialView; + +import org.greenrobot.eventbus.EventBus; +import org.greenrobot.eventbus.Subscribe; +import org.greenrobot.eventbus.ThreadMode; + +import java.util.List; +import java.util.Locale; + import de.danoeh.antennapod.R; import de.danoeh.antennapod.activity.MainActivity; import de.danoeh.antennapod.adapter.EpisodeItemListAdapter; @@ -62,12 +70,6 @@ import io.reactivex.Observable; import io.reactivex.android.schedulers.AndroidSchedulers; import io.reactivex.disposables.Disposable; import io.reactivex.schedulers.Schedulers; -import org.greenrobot.eventbus.EventBus; -import org.greenrobot.eventbus.Subscribe; -import org.greenrobot.eventbus.ThreadMode; - -import java.util.List; -import java.util.Locale; /** * Shows all items in the queue. @@ -82,6 +84,7 @@ public class QueueFragment extends Fragment implements MaterialToolbar.OnMenuIte private QueueRecyclerAdapter recyclerAdapter; private EmptyViewHandler emptyView; private MaterialToolbar toolbar; + private SwipeRefreshLayout swipeRefreshLayout; private boolean displayUpArrow; private List queue; @@ -265,7 +268,7 @@ public class QueueFragment extends Fragment implements MaterialToolbar.OnMenuIte @Subscribe(sticky = true, threadMode = ThreadMode.MAIN) public void onEventMainThread(FeedUpdateRunningEvent event) { - MenuItemUtils.updateRefreshMenuItem(toolbar.getMenu(), R.id.refresh_item, event.isFeedUpdateRunning); + swipeRefreshLayout.setRefreshing(event.isFeedUpdateRunning); } @Override @@ -425,13 +428,9 @@ public class QueueFragment extends Fragment implements MaterialToolbar.OnMenuIte recyclerAdapter.setOnSelectModeListener(this); recyclerView.setAdapter(recyclerAdapter); - SwipeRefreshLayout swipeRefreshLayout = root.findViewById(R.id.swipeRefresh); + swipeRefreshLayout = root.findViewById(R.id.swipeRefresh); swipeRefreshLayout.setDistanceToTriggerSync(getResources().getInteger(R.integer.swipe_refresh_distance)); - swipeRefreshLayout.setOnRefreshListener(() -> { - FeedUpdateManager.runOnceOrAsk(requireContext()); - new Handler(Looper.getMainLooper()).postDelayed(() -> swipeRefreshLayout.setRefreshing(false), - getResources().getInteger(R.integer.swipe_to_refresh_duration_in_ms)); - }); + swipeRefreshLayout.setOnRefreshListener(() -> FeedUpdateManager.runOnceOrAsk(requireContext())); emptyView = new EmptyViewHandler(getContext()); emptyView.attachToRecyclerView(recyclerView); diff --git a/app/src/main/java/de/danoeh/antennapod/fragment/SubscriptionFragment.java b/app/src/main/java/de/danoeh/antennapod/fragment/SubscriptionFragment.java index 7006edca9..e86cd58b9 100644 --- a/app/src/main/java/de/danoeh/antennapod/fragment/SubscriptionFragment.java +++ b/app/src/main/java/de/danoeh/antennapod/fragment/SubscriptionFragment.java @@ -3,8 +3,6 @@ package de.danoeh.antennapod.fragment; import android.content.Context; import android.content.SharedPreferences; import android.os.Bundle; -import android.os.Handler; -import android.os.Looper; import android.util.Log; import android.view.ContextMenu; import android.view.LayoutInflater; @@ -81,6 +79,7 @@ public class SubscriptionFragment extends Fragment private EmptyViewHandler emptyView; private LinearLayout feedsFilteredMsg; private MaterialToolbar toolbar; + private SwipeRefreshLayout swipeRefreshLayout; private ProgressBar progressBar; private String displayedFolder = null; private boolean displayUpArrow; @@ -169,13 +168,9 @@ public class SubscriptionFragment extends Fragment feedsFilteredMsg.setOnClickListener((l) -> new SubscriptionsFilterDialog().show(getChildFragmentManager(), "filter")); - SwipeRefreshLayout swipeRefreshLayout = root.findViewById(R.id.swipeRefresh); + swipeRefreshLayout = root.findViewById(R.id.swipeRefresh); swipeRefreshLayout.setDistanceToTriggerSync(getResources().getInteger(R.integer.swipe_refresh_distance)); - swipeRefreshLayout.setOnRefreshListener(() -> { - FeedUpdateManager.runOnceOrAsk(requireContext()); - new Handler(Looper.getMainLooper()).postDelayed(() -> swipeRefreshLayout.setRefreshing(false), - getResources().getInteger(R.integer.swipe_to_refresh_duration_in_ms)); - }); + swipeRefreshLayout.setOnRefreshListener(() -> FeedUpdateManager.runOnceOrAsk(requireContext())); speedDialView = root.findViewById(R.id.fabSD); speedDialView.setOverlayLayout(root.findViewById(R.id.fabSDOverlay)); @@ -212,7 +207,7 @@ public class SubscriptionFragment extends Fragment @Subscribe(sticky = true, threadMode = ThreadMode.MAIN) public void onEventMainThread(FeedUpdateRunningEvent event) { - MenuItemUtils.updateRefreshMenuItem(toolbar.getMenu(), R.id.refresh_item, event.isFeedUpdateRunning); + swipeRefreshLayout.setRefreshing(event.isFeedUpdateRunning); } @Override -- cgit v1.2.3 From 0f5600932d5894d5653993d48d925df437fe6d00 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Matej=20Drobni=C4=8D?= Date: Sun, 4 Feb 2024 19:54:46 +0100 Subject: Add next chapter button to notification (#6276) --- .../UserInterfacePreferencesFragment.java | 93 +++++++++++++++------- 1 file changed, 66 insertions(+), 27 deletions(-) (limited to 'app/src/main/java/de/danoeh/antennapod/fragment') 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 preferredButtons = UserPreferences.getCompactNotificationButtons(); + + final List 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 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(); + } + } + ); } } -- cgit v1.2.3 From c7c5ab567b2681a946ec756cdd17bd99128f9f54 Mon Sep 17 00:00:00 2001 From: ByteHamster Date: Fri, 16 Feb 2024 23:50:12 +0100 Subject: Use proper plurals when showing number of episodes (#6922) --- app/src/main/java/de/danoeh/antennapod/fragment/QueueFragment.java | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) (limited to 'app/src/main/java/de/danoeh/antennapod/fragment') diff --git a/app/src/main/java/de/danoeh/antennapod/fragment/QueueFragment.java b/app/src/main/java/de/danoeh/antennapod/fragment/QueueFragment.java index aacd05fcd..1a2b6438f 100644 --- a/app/src/main/java/de/danoeh/antennapod/fragment/QueueFragment.java +++ b/app/src/main/java/de/danoeh/antennapod/fragment/QueueFragment.java @@ -33,7 +33,6 @@ import org.greenrobot.eventbus.Subscribe; import org.greenrobot.eventbus.ThreadMode; import java.util.List; -import java.util.Locale; import de.danoeh.antennapod.R; import de.danoeh.antennapod.activity.MainActivity; @@ -477,9 +476,8 @@ public class QueueFragment extends Fragment implements MaterialToolbar.OnMenuIte } private void refreshInfoBar() { - String info = String.format(Locale.getDefault(), "%d%s", - queue.size(), getString(R.string.episodes_suffix)); - if (queue.size() > 0) { + String info = getResources().getQuantityString(R.plurals.num_episodes, queue.size(), queue.size()); + if (!queue.isEmpty()) { long timeLeft = 0; for (FeedItem item : queue) { float playbackSpeed = 1; -- cgit v1.2.3