summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--app/src/androidTest/java/de/test/antennapod/ui/MainActivityTest.java12
-rw-r--r--app/src/main/java/de/danoeh/antennapod/activity/MainActivity.java17
-rw-r--r--app/src/main/java/de/danoeh/antennapod/activity/OnlineFeedViewActivity.java11
-rw-r--r--app/src/main/java/de/danoeh/antennapod/dialog/EpisodesApplyActionFragment.java73
-rw-r--r--app/src/main/java/de/danoeh/antennapod/dialog/ShareDialog.java63
-rw-r--r--app/src/main/java/de/danoeh/antennapod/fragment/AddFeedFragment.java59
-rw-r--r--app/src/main/java/de/danoeh/antennapod/fragment/AllEpisodesFragment.java5
-rw-r--r--app/src/main/java/de/danoeh/antennapod/fragment/CompletedDownloadsFragment.java15
-rw-r--r--app/src/main/java/de/danoeh/antennapod/fragment/DiscoveryFragment.java7
-rw-r--r--app/src/main/java/de/danoeh/antennapod/fragment/DownloadLogFragment.java25
-rw-r--r--app/src/main/java/de/danoeh/antennapod/fragment/DownloadsFragment.java10
-rw-r--r--app/src/main/java/de/danoeh/antennapod/fragment/EpisodesFragment.java20
-rw-r--r--app/src/main/java/de/danoeh/antennapod/fragment/EpisodesListFragment.java30
-rw-r--r--app/src/main/java/de/danoeh/antennapod/fragment/FavoriteEpisodesFragment.java9
-rw-r--r--app/src/main/java/de/danoeh/antennapod/fragment/FeedInfoFragment.java51
-rw-r--r--app/src/main/java/de/danoeh/antennapod/fragment/FeedItemlistFragment.java176
-rw-r--r--app/src/main/java/de/danoeh/antennapod/fragment/FeedSettingsFragment.java3
-rw-r--r--app/src/main/java/de/danoeh/antennapod/fragment/ItemPagerFragment.java35
-rw-r--r--app/src/main/java/de/danoeh/antennapod/fragment/NewEpisodesFragment.java5
-rw-r--r--app/src/main/java/de/danoeh/antennapod/fragment/OnlineSearchFragment.java19
-rw-r--r--app/src/main/java/de/danoeh/antennapod/fragment/PagedToolbarFragment.java47
-rw-r--r--app/src/main/java/de/danoeh/antennapod/fragment/PlaybackHistoryFragment.java57
-rw-r--r--app/src/main/java/de/danoeh/antennapod/fragment/QueueFragment.java212
-rw-r--r--app/src/main/java/de/danoeh/antennapod/fragment/RunningDownloadsFragment.java14
-rw-r--r--app/src/main/java/de/danoeh/antennapod/fragment/SearchFragment.java18
-rw-r--r--app/src/main/java/de/danoeh/antennapod/fragment/SubscriptionFragment.java49
-rw-r--r--app/src/main/java/de/danoeh/antennapod/fragment/gpodnet/GpodnetMainFragment.java3
-rw-r--r--app/src/main/java/de/danoeh/antennapod/fragment/gpodnet/PodcastListFragment.java62
-rw-r--r--app/src/main/java/de/danoeh/antennapod/menuhandler/FeedItemMenuHandler.java2
-rw-r--r--app/src/main/java/de/danoeh/antennapod/menuhandler/FeedMenuHandler.java5
-rw-r--r--app/src/main/java/de/danoeh/antennapod/menuhandler/MenuItemUtils.java56
-rw-r--r--app/src/main/java/de/danoeh/antennapod/view/EmptyViewHandler.java13
-rw-r--r--app/src/main/res/layout/onlinefeedview_activity.xml72
-rw-r--r--app/src/main/res/layout/share_episode_dialog.xml17
-rw-r--r--app/src/main/res/menu/downloads.xml (renamed from app/src/main/res/menu/downloads_completed.xml)8
-rw-r--r--app/src/main/res/menu/downloads_log.xml16
-rw-r--r--app/src/main/res/menu/downloads_running.xml10
-rw-r--r--app/src/main/res/menu/feeditemlist_context.xml25
-rw-r--r--app/src/main/res/menu/playback_history.xml9
-rw-r--r--app/src/main/res/menu/subscriptions.xml31
-rw-r--r--core/src/main/java/de/danoeh/antennapod/core/service/download/DownloadService.java3
-rw-r--r--core/src/main/java/de/danoeh/antennapod/core/service/download/DownloadServiceNotification.java1
-rw-r--r--core/src/main/java/de/danoeh/antennapod/core/storage/PodDBAdapter.java4
-rw-r--r--core/src/main/res/values/strings.xml12
44 files changed, 662 insertions, 729 deletions
diff --git a/app/src/androidTest/java/de/test/antennapod/ui/MainActivityTest.java b/app/src/androidTest/java/de/test/antennapod/ui/MainActivityTest.java
index c7520a2e6..be1ed6cc2 100644
--- a/app/src/androidTest/java/de/test/antennapod/ui/MainActivityTest.java
+++ b/app/src/androidTest/java/de/test/antennapod/ui/MainActivityTest.java
@@ -24,7 +24,10 @@ import static androidx.test.espresso.Espresso.onView;
import static androidx.test.espresso.action.ViewActions.click;
import static androidx.test.espresso.action.ViewActions.replaceText;
import static androidx.test.espresso.action.ViewActions.scrollTo;
+import static androidx.test.espresso.assertion.ViewAssertions.matches;
import static androidx.test.espresso.contrib.ActivityResultMatchers.hasResultCode;
+import static androidx.test.espresso.matcher.ViewMatchers.hasDescendant;
+import static androidx.test.espresso.matcher.ViewMatchers.isDisplayed;
import static androidx.test.espresso.matcher.ViewMatchers.isRoot;
import static androidx.test.espresso.matcher.ViewMatchers.withId;
import static androidx.test.espresso.matcher.ViewMatchers.withText;
@@ -32,7 +35,7 @@ import static de.test.antennapod.EspressoTestUtils.clickPreference;
import static de.test.antennapod.EspressoTestUtils.openNavDrawer;
import static de.test.antennapod.EspressoTestUtils.waitForView;
import static junit.framework.TestCase.assertTrue;
-import static org.junit.Assert.assertEquals;
+import static org.hamcrest.Matchers.allOf;
import static org.junit.Assert.assertThat;
/**
@@ -80,10 +83,6 @@ public class MainActivityTest {
onView(isRoot()).perform(waitForView(withId(R.id.butShowSettings), 5000));
}
- private String getActionbarTitle() {
- return ((MainActivity) solo.getCurrentActivity()).getSupportActionBar().getTitle().toString();
- }
-
@Test
public void testBackButtonBehaviorGoToPage() {
openNavDrawer();
@@ -98,7 +97,8 @@ public class MainActivityTest {
solo.goBackToActivity(MainActivity.class.getSimpleName());
solo.goBack();
solo.goBack();
- assertEquals(solo.getString(R.string.subscriptions_label), getActionbarTitle());
+ onView(allOf(withId(R.id.toolbar), isDisplayed())).check(
+ matches(hasDescendant(withText(R.string.subscriptions_label))));
solo.goBack();
assertThat(mActivityRule.getActivityResult(), hasResultCode(Activity.RESULT_CANCELED));
}
diff --git a/app/src/main/java/de/danoeh/antennapod/activity/MainActivity.java b/app/src/main/java/de/danoeh/antennapod/activity/MainActivity.java
index a398a5e94..d39edb9b2 100644
--- a/app/src/main/java/de/danoeh/antennapod/activity/MainActivity.java
+++ b/app/src/main/java/de/danoeh/antennapod/activity/MainActivity.java
@@ -5,7 +5,6 @@ import android.content.Context;
import android.content.Intent;
import android.content.SharedPreferences;
import android.content.res.Configuration;
-import android.content.res.Resources;
import android.media.AudioManager;
import android.os.Build;
import android.os.Bundle;
@@ -13,7 +12,6 @@ import android.os.Handler;
import android.os.Looper;
import android.util.DisplayMetrics;
import android.util.Log;
-import android.util.TypedValue;
import android.view.KeyEvent;
import android.view.MenuItem;
import android.view.View;
@@ -114,15 +112,6 @@ public class MainActivity extends CastEnabledActivity {
setNavDrawerSize();
final FragmentManager fm = getSupportFragmentManager();
- fm.addOnBackStackChangedListener(() -> {
- boolean showArrow = fm.getBackStackEntryCount() != 0;
- if (drawerToggle != null) { // Tablet layout does not have a drawer
- drawerToggle.setDrawerIndicatorEnabled(!showArrow);
- } else if (getActionBar() != null) {
- getActionBar().setDisplayHomeAsUpEnabled(showArrow);
- }
- });
-
if (fm.findFragmentByTag(MAIN_FRAGMENT_TAG) == null) {
String lastFragment = NavDrawerFragment.getLastNavFragment(this);
if (ArrayUtils.contains(NavDrawerFragment.NAV_DRAWER_TAGS, lastFragment)) {
@@ -194,8 +183,7 @@ public class MainActivity extends CastEnabledActivity {
}
};
- @Override
- public void setSupportActionBar(@Nullable Toolbar toolbar) {
+ public void setupToolbarToggle(@Nullable Toolbar toolbar) {
if (drawerLayout != null) { // Tablet layout does not have a drawer
drawerLayout.removeDrawerListener(drawerToggle);
drawerToggle = new ActionBarDrawerToggle(this, drawerLayout, toolbar,
@@ -203,12 +191,13 @@ public class MainActivity extends CastEnabledActivity {
drawerLayout.addDrawerListener(drawerToggle);
drawerToggle.syncState();
drawerToggle.setDrawerIndicatorEnabled(getSupportFragmentManager().getBackStackEntryCount() == 0);
+ drawerToggle.setToolbarNavigationClickListener(v -> getSupportFragmentManager().popBackStack());
} else if (getSupportFragmentManager().getBackStackEntryCount() == 0) {
toolbar.setNavigationIcon(null);
} else {
toolbar.setNavigationIcon(ThemeUtils.getDrawableFromAttr(this, R.attr.homeAsUpIndicator));
+ toolbar.setNavigationOnClickListener(v -> getSupportFragmentManager().popBackStack());
}
- super.setSupportActionBar(toolbar);
}
private void checkFirstLaunch() {
diff --git a/app/src/main/java/de/danoeh/antennapod/activity/OnlineFeedViewActivity.java b/app/src/main/java/de/danoeh/antennapod/activity/OnlineFeedViewActivity.java
index 3f58e4a92..2fd537159 100644
--- a/app/src/main/java/de/danoeh/antennapod/activity/OnlineFeedViewActivity.java
+++ b/app/src/main/java/de/danoeh/antennapod/activity/OnlineFeedViewActivity.java
@@ -13,6 +13,7 @@ import android.view.MenuItem;
import android.view.View;
import android.widget.AdapterView;
import android.widget.ArrayAdapter;
+import android.widget.LinearLayout;
import android.widget.TextView;
import androidx.annotation.NonNull;
import androidx.annotation.UiThread;
@@ -509,11 +510,21 @@ public class OnlineFeedViewActivity extends AppCompatActivity {
viewBinding.subscribeButton.setEnabled(true);
viewBinding.subscribeButton.setText(R.string.open_podcast);
if (didPressSubscribe) {
+ didPressSubscribe = false;
+ if (UserPreferences.isEnableAutodownload()) {
+ Feed feed1 = DBReader.getFeed(getFeedId(feed));
+ FeedPreferences feedPreferences = feed1.getPreferences();
+ feedPreferences.setAutoDownload(viewBinding.autoDownloadCheckBox.isChecked());
+ feed1.savePreferences();
+ }
openFeed();
}
} else {
viewBinding.subscribeButton.setEnabled(true);
viewBinding.subscribeButton.setText(R.string.subscribe_label);
+ if (UserPreferences.isEnableAutodownload()) {
+ viewBinding.autoDownloadCheckBox.setVisibility(View.VISIBLE);
+ }
}
}
}
diff --git a/app/src/main/java/de/danoeh/antennapod/dialog/EpisodesApplyActionFragment.java b/app/src/main/java/de/danoeh/antennapod/dialog/EpisodesApplyActionFragment.java
index f2524c40c..5aee3f2be 100644
--- a/app/src/main/java/de/danoeh/antennapod/dialog/EpisodesApplyActionFragment.java
+++ b/app/src/main/java/de/danoeh/antennapod/dialog/EpisodesApplyActionFragment.java
@@ -1,12 +1,8 @@
package de.danoeh.antennapod.dialog;
-import android.content.res.TypedArray;
-import android.graphics.drawable.Drawable;
import android.os.Bundle;
import android.util.Log;
import android.view.LayoutInflater;
-import android.view.Menu;
-import android.view.MenuInflater;
import android.view.MenuItem;
import android.view.View;
import android.view.ViewGroup;
@@ -17,10 +13,8 @@ import androidx.annotation.NonNull;
import androidx.annotation.PluralsRes;
import androidx.annotation.StringRes;
import androidx.appcompat.app.AlertDialog;
-import androidx.appcompat.app.AppCompatActivity;
import androidx.appcompat.widget.Toolbar;
import androidx.collection.ArrayMap;
-import androidx.core.app.ActivityCompat;
import androidx.fragment.app.Fragment;
import com.google.android.material.snackbar.Snackbar;
import com.leinardi.android.speeddial.SpeedDialView;
@@ -34,6 +28,7 @@ import de.danoeh.antennapod.core.storage.DownloadRequester;
import de.danoeh.antennapod.core.util.FeedItemPermutors;
import de.danoeh.antennapod.core.util.LongList;
import de.danoeh.antennapod.core.util.SortOrder;
+import de.danoeh.antennapod.core.util.ThemeUtils;
import java.util.ArrayList;
import java.util.Arrays;
@@ -41,7 +36,7 @@ import java.util.Collections;
import java.util.List;
import java.util.Map;
-public class EpisodesApplyActionFragment extends Fragment {
+public class EpisodesApplyActionFragment extends Fragment implements Toolbar.OnMenuItemClickListener {
public static final String TAG = "EpisodeActionFragment";
@@ -53,7 +48,6 @@ public class EpisodesApplyActionFragment extends Fragment {
public static final int ACTION_DELETE = 32;
public static final int ACTION_ALL = ACTION_ADD_TO_QUEUE | ACTION_REMOVE_FROM_QUEUE
| ACTION_MARK_PLAYED | ACTION_MARK_UNPLAYED | ACTION_DOWNLOAD | ACTION_DELETE;
- private Toolbar toolbar;
/**
* Specify an action (defined by #flag) 's UI bindings.
@@ -84,7 +78,7 @@ public class EpisodesApplyActionFragment extends Fragment {
private ListView mListView;
private ArrayAdapter<String> mAdapter;
private SpeedDialView mSpeedDialView;
- private MenuItem mSelectToggle;
+ private Toolbar toolbar;
public EpisodesApplyActionFragment() {
actionBindings = Arrays.asList(
@@ -117,7 +111,6 @@ public class EpisodesApplyActionFragment extends Fragment {
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setRetainInstance(true);
- setHasOptionsMenu(true);
}
@Override
@@ -125,6 +118,12 @@ public class EpisodesApplyActionFragment extends Fragment {
Bundle savedInstanceState) {
View view = inflater.inflate(R.layout.episodes_apply_action_fragment, container, false);
+ toolbar = view.findViewById(R.id.toolbar);
+ toolbar.inflateMenu(R.menu.episodes_apply_action_options);
+ toolbar.setNavigationOnClickListener(v -> getParentFragmentManager().popBackStack());
+ toolbar.setOnMenuItemClickListener(this);
+ refreshToolbarState();
+
mListView = view.findViewById(android.R.id.list);
mListView.setChoiceMode(ListView.CHOICE_MODE_MULTIPLE);
mListView.setOnItemClickListener((listView, view1, position, rowId) -> {
@@ -167,8 +166,6 @@ public class EpisodesApplyActionFragment extends Fragment {
mAdapter = new ArrayAdapter<>(getActivity(),
R.layout.simple_list_item_multiple_choice_on_start, titles);
mListView.setAdapter(mAdapter);
- toolbar = view.findViewById(R.id.toolbar);
- ((AppCompatActivity) getActivity()).setSupportActionBar(toolbar);
// Init action UI (via a FAB Speed Dial)
mSpeedDialView = view.findViewById(R.id.fabSD);
@@ -215,42 +212,15 @@ public class EpisodesApplyActionFragment extends Fragment {
return view;
}
- @Override
- public void onCreateOptionsMenu(@NonNull Menu menu, @NonNull MenuInflater inflater) {
- super.onCreateOptionsMenu(menu, inflater);
- inflater.inflate(R.menu.episodes_apply_action_options, menu);
-
- mSelectToggle = menu.findItem(R.id.select_toggle);
- mSelectToggle.setOnMenuItemClickListener(item -> {
- if (checkedIds.size() == episodes.size()) {
- checkNone();
- } else {
- checkAll();
- }
- return true;
- });
- }
-
- @Override
- public void onPrepareOptionsMenu(@NonNull Menu menu) {
- // Prepare icon for select toggle button
-
- int[] icon = new int[1];
- @StringRes int titleResId;
+ public void refreshToolbarState() {
+ MenuItem selectAllItem = toolbar.getMenu().findItem(R.id.select_toggle);
if (checkedIds.size() == episodes.size()) {
- icon[0] = R.attr.ic_select_none;
- titleResId = R.string.deselect_all_label;
+ selectAllItem.setIcon(ThemeUtils.getDrawableFromAttr(getContext(), R.attr.ic_select_none));
+ selectAllItem.setTitle(R.string.deselect_all_label);
} else {
- icon[0] = R.attr.ic_select_all;
- titleResId = R.string.select_all_label;
+ selectAllItem.setIcon(ThemeUtils.getDrawableFromAttr(getContext(), R.attr.ic_select_all));
+ selectAllItem.setTitle(R.string.select_all_label);
}
-
- TypedArray a = getActivity().obtainStyledAttributes(icon);
- Drawable iconDrawable = a.getDrawable(0);
- a.recycle();
-
- mSelectToggle.setIcon(iconDrawable);
- mSelectToggle.setTitle(titleResId);
}
private static final Map<Integer, SortOrder> menuItemIdToSortOrder;
@@ -266,11 +236,18 @@ public class EpisodesApplyActionFragment extends Fragment {
}
@Override
- public boolean onOptionsItemSelected(MenuItem item) {
+ public boolean onMenuItemClick(MenuItem item) {
@StringRes int resId = 0;
- switch(item.getItemId()) {
+ switch (item.getItemId()) {
case R.id.select_options:
return true;
+ case R.id.select_toggle:
+ if (checkedIds.size() == episodes.size()) {
+ checkNone();
+ } else {
+ checkAll();
+ }
+ return true;
case R.id.check_all:
checkAll();
resId = R.string.selected_all_label;
@@ -409,7 +386,7 @@ public class EpisodesApplyActionFragment extends Fragment {
boolean checked = checkedIds.contains(episode.getId());
mListView.setItemChecked(i, checked);
}
- getActivity().invalidateOptionsMenu();
+ refreshToolbarState();
toolbar.setTitle(getResources().getQuantityString(R.plurals.num_selected_label,
checkedIds.size(), checkedIds.size()));
}
diff --git a/app/src/main/java/de/danoeh/antennapod/dialog/ShareDialog.java b/app/src/main/java/de/danoeh/antennapod/dialog/ShareDialog.java
index 8104d3539..614cc1e71 100644
--- a/app/src/main/java/de/danoeh/antennapod/dialog/ShareDialog.java
+++ b/app/src/main/java/de/danoeh/antennapod/dialog/ShareDialog.java
@@ -18,21 +18,21 @@ import de.danoeh.antennapod.core.feed.FeedItem;
import de.danoeh.antennapod.core.util.ShareUtils;
public class ShareDialog extends DialogFragment {
-
private static final String ARGUMENT_FEED_ITEM = "feedItem";
+ private static final String PREF_NAME = "ShareDialog";
+ private static final String PREF_SHARE_DIALOG_OPTION = "prefShareDialogOption";
+ private static final String PREF_SHARE_EPISODE_START_AT = "prefShareEpisodeStartAt";
+ private static final String PREF_VALUE_WEBSITE = "website";
+ private static final String PREF_VALUE_MEDIA_URL = "media";
- private static final String TAG = "ShareDialog";
private Context ctx;
private FeedItem item;
+ private SharedPreferences prefs;
- private static final String PREF_SHARE_DIALOG_OPTION = "prefShareDialogOption";
- private static final String PREF_SHARE_EPISODE_START_AT = "prefShareEpisodeStartAt";
-
- private RadioGroup radioGroup;
private RadioButton radioEpisodeWebsite;
+ private RadioButton radioMediaFileUrl;
private RadioButton radioMediaFile;
private CheckBox checkBoxStartAt;
- private SharedPreferences prefs;
public ShareDialog() {
// Empty constructor required for DialogFragment
@@ -52,7 +52,7 @@ public class ShareDialog extends DialogFragment {
if (getArguments() != null) {
ctx = getActivity();
item = (FeedItem) getArguments().getSerializable(ARGUMENT_FEED_ITEM);
- prefs = getActivity().getSharedPreferences("ShareDialog", Context.MODE_PRIVATE);
+ prefs = getActivity().getSharedPreferences(PREF_NAME, Context.MODE_PRIVATE);
}
View content = View.inflate(ctx, R.layout.share_episode_dialog, null);
@@ -60,8 +60,12 @@ public class ShareDialog extends DialogFragment {
builder.setTitle(R.string.share_label);
builder.setView(content);
- radioGroup = content.findViewById(R.id.share_dialog_radio_group);
+ RadioGroup radioGroup = content.findViewById(R.id.share_dialog_radio_group);
+ radioGroup.setOnCheckedChangeListener((group, checkedId) ->
+ checkBoxStartAt.setEnabled(checkedId != R.id.share_media_file_radio));
+
radioEpisodeWebsite = content.findViewById(R.id.share_episode_website_radio);
+ radioMediaFileUrl = content.findViewById(R.id.share_media_file_url_radio);
radioMediaFile = content.findViewById(R.id.share_media_file_radio);
checkBoxStartAt = content.findViewById(R.id.share_start_at_timer_dialog);
@@ -71,10 +75,14 @@ public class ShareDialog extends DialogFragment {
boolean includePlaybackPosition = checkBoxStartAt.isChecked();
if (radioEpisodeWebsite.isChecked()) {
ShareUtils.shareFeedItemLink(ctx, item, includePlaybackPosition);
- prefs.edit().putString(PREF_SHARE_DIALOG_OPTION, "website").apply();
- } else {
+ prefs.edit().putString(PREF_SHARE_DIALOG_OPTION, PREF_VALUE_WEBSITE).apply();
+ } else if (radioMediaFileUrl.isChecked()) {
ShareUtils.shareFeedItemDownloadLink(ctx, item, includePlaybackPosition);
- prefs.edit().putString(PREF_SHARE_DIALOG_OPTION, "media").apply();
+ prefs.edit().putString(PREF_SHARE_DIALOG_OPTION, PREF_VALUE_MEDIA_URL).apply();
+ } else if (radioMediaFile.isChecked()) {
+ ShareUtils.shareFeedItemFile(ctx, item.getMedia());
+ } else {
+ throw new IllegalStateException("Unknown share method");
}
prefs.edit().putBoolean(PREF_SHARE_EPISODE_START_AT, includePlaybackPosition).apply();
}).setNegativeButton(R.string.cancel_label, (dialog, id) -> dialog.dismiss());
@@ -85,26 +93,23 @@ public class ShareDialog extends DialogFragment {
private void setupOptions() {
final boolean hasMedia = item.getMedia() != null;
- if (!ShareUtils.hasLinkToShare(item)) {
- radioEpisodeWebsite.setVisibility(View.GONE);
- radioMediaFile.setChecked(true);
- }
+ boolean downloaded = hasMedia && item.getMedia().isDownloaded();
+ radioMediaFile.setVisibility(downloaded ? View.VISIBLE : View.GONE);
- if (!hasMedia || item.getMedia().getDownload_url() == null) {
- radioMediaFile.setVisibility(View.GONE);
- radioEpisodeWebsite.setChecked(true);
- }
+ radioEpisodeWebsite.setVisibility(ShareUtils.hasLinkToShare(item) ? View.VISIBLE : View.GONE);
- if (radioEpisodeWebsite.getVisibility() == View.VISIBLE && radioMediaFile.getVisibility() == View.VISIBLE) {
- String option = prefs.getString(PREF_SHARE_DIALOG_OPTION, "website");
- if (option.equals("website")) {
- radioEpisodeWebsite.setChecked(true);
- radioMediaFile.setChecked(false);
- } else {
- radioEpisodeWebsite.setChecked(false);
- radioMediaFile.setChecked(true);
- }
+ boolean hasDownloadUrl = hasMedia && item.getMedia().getDownload_url() != null;
+ radioMediaFileUrl.setVisibility(hasDownloadUrl ? View.VISIBLE : View.GONE);
+
+ String option = prefs.getString(PREF_SHARE_DIALOG_OPTION, PREF_VALUE_WEBSITE);
+ if (option.equals(PREF_VALUE_WEBSITE)) {
+ radioEpisodeWebsite.setChecked(true);
+ radioMediaFileUrl.setChecked(false);
+ } else {
+ radioEpisodeWebsite.setChecked(false);
+ radioMediaFileUrl.setChecked(true);
}
+ radioMediaFile.setChecked(false);
boolean switchIsChecked = prefs.getBoolean(PREF_SHARE_EPISODE_START_AT, false);
checkBoxStartAt.setChecked(switchIsChecked);
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 fa0df9abb..caf489569 100644
--- a/app/src/main/java/de/danoeh/antennapod/fragment/AddFeedFragment.java
+++ b/app/src/main/java/de/danoeh/antennapod/fragment/AddFeedFragment.java
@@ -17,7 +17,7 @@ import android.widget.EditText;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.appcompat.app.AlertDialog;
-import androidx.appcompat.app.AppCompatActivity;
+import androidx.appcompat.widget.Toolbar;
import androidx.documentfile.provider.DocumentFile;
import androidx.fragment.app.Fragment;
import com.google.android.material.snackbar.Snackbar;
@@ -35,6 +35,9 @@ import de.danoeh.antennapod.discovery.FyydPodcastSearcher;
import de.danoeh.antennapod.discovery.ItunesPodcastSearcher;
import de.danoeh.antennapod.discovery.PodcastIndexPodcastSearcher;
import de.danoeh.antennapod.fragment.gpodnet.GpodnetMainFragment;
+import io.reactivex.Observable;
+import io.reactivex.android.schedulers.AndroidSchedulers;
+import io.reactivex.schedulers.Schedulers;
import java.util.Collections;
@@ -58,7 +61,8 @@ public class AddFeedFragment extends Fragment {
super.onCreateView(inflater, container, savedInstanceState);
View root = inflater.inflate(R.layout.addfeed, container, false);
activity = (MainActivity) getActivity();
- ((AppCompatActivity) getActivity()).setSupportActionBar(root.findViewById(R.id.toolbar));
+ Toolbar toolbar = root.findViewById(R.id.toolbar);
+ ((MainActivity) getActivity()).setupToolbarToggle(toolbar);
root.findViewById(R.id.btn_search_itunes).setOnClickListener(v
-> activity.loadChildFragment(OnlineSearchFragment.newInstance(ItunesPodcastSearcher.class)));
@@ -143,11 +147,6 @@ public class AddFeedFragment extends Fragment {
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setRetainInstance(true);
-
- // So, we certainly *don't* have an options menu,
- // but unless we say we do, old options menus sometimes
- // persist. mfietz thinks this causes the ActionBar to be invalidated
- setHasOptionsMenu(true);
}
@Override
@@ -162,31 +161,37 @@ public class AddFeedFragment extends Fragment {
intent.setData(uri);
startActivity(intent);
} else if (requestCode == REQUEST_CODE_ADD_LOCAL_FOLDER) {
- addLocalFolder(uri);
+ Observable.fromCallable(() -> addLocalFolder(uri))
+ .subscribeOn(Schedulers.io())
+ .observeOn(AndroidSchedulers.mainThread())
+ .subscribe(
+ feed -> {
+ Fragment fragment = FeedItemlistFragment.newInstance(feed.getId());
+ ((MainActivity) getActivity()).loadChildFragment(fragment);
+ }, error -> {
+ Log.e(TAG, Log.getStackTraceString(error));
+ ((MainActivity) getActivity())
+ .showSnackbarAbovePlayer(error.getLocalizedMessage(), Snackbar.LENGTH_LONG);
+ });
}
}
- private void addLocalFolder(Uri uri) {
+ private Feed addLocalFolder(Uri uri) throws DownloadRequestException {
if (Build.VERSION.SDK_INT < 21) {
- return;
+ return null;
}
- try {
- getActivity().getContentResolver()
- .takePersistableUriPermission(uri, Intent.FLAG_GRANT_READ_URI_PERMISSION);
- DocumentFile documentFile = DocumentFile.fromTreeUri(getContext(), uri);
- if (documentFile == null) {
- throw new IllegalArgumentException("Unable to retrieve document tree");
- }
- Feed dirFeed = new Feed(Feed.PREFIX_LOCAL_FOLDER + uri.toString(), null, documentFile.getName());
- dirFeed.setDescription(getString(R.string.local_feed_description));
- dirFeed.setItems(Collections.emptyList());
- dirFeed.setSortOrder(SortOrder.EPISODE_TITLE_A_Z);
- DBTasks.forceRefreshFeed(getContext(), dirFeed, true);
- ((MainActivity) getActivity())
- .showSnackbarAbovePlayer(R.string.add_local_folder_success, Snackbar.LENGTH_SHORT);
- } catch (DownloadRequestException | IllegalArgumentException e) {
- Log.e(TAG, Log.getStackTraceString(e));
- ((MainActivity) getActivity()).showSnackbarAbovePlayer(e.getLocalizedMessage(), Snackbar.LENGTH_LONG);
+ getActivity().getContentResolver()
+ .takePersistableUriPermission(uri, Intent.FLAG_GRANT_READ_URI_PERMISSION);
+ DocumentFile documentFile = DocumentFile.fromTreeUri(getContext(), uri);
+ if (documentFile == null) {
+ throw new IllegalArgumentException("Unable to retrieve document tree");
}
+ Feed dirFeed = new Feed(Feed.PREFIX_LOCAL_FOLDER + uri.toString(), null, documentFile.getName());
+ dirFeed.setDescription(getString(R.string.local_feed_description));
+ dirFeed.setItems(Collections.emptyList());
+ dirFeed.setSortOrder(SortOrder.EPISODE_TITLE_A_Z);
+ Feed fromDatabase = DBTasks.updateFeed(getContext(), dirFeed, false);
+ DBTasks.forceRefreshFeed(getContext(), fromDatabase, true);
+ return fromDatabase;
}
}
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 0c75b7eea..ae3ba3a54 100644
--- a/app/src/main/java/de/danoeh/antennapod/fragment/AllEpisodesFragment.java
+++ b/app/src/main/java/de/danoeh/antennapod/fragment/AllEpisodesFragment.java
@@ -56,10 +56,11 @@ public class AllEpisodesFragment extends EpisodesListFragment {
}
@Override
- public void onCreateOptionsMenu(@NonNull Menu menu, @NonNull MenuInflater inflater) {
- super.onCreateOptionsMenu(menu, inflater);
+ public void onPrepareOptionsMenu(@NonNull Menu menu) {
+ super.onPrepareOptionsMenu(menu);
menu.findItem(R.id.filter_items).setVisible(true);
menu.findItem(R.id.mark_all_read_item).setVisible(true);
+ menu.findItem(R.id.remove_all_new_flags_item).setVisible(false);
}
@Override
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 55a5d744e..59b2cd234 100644
--- a/app/src/main/java/de/danoeh/antennapod/fragment/CompletedDownloadsFragment.java
+++ b/app/src/main/java/de/danoeh/antennapod/fragment/CompletedDownloadsFragment.java
@@ -97,12 +97,6 @@ public class CompletedDownloadsFragment extends Fragment {
}
@Override
- public void onResume() {
- super.onResume();
- setHasOptionsMenu(true);
- }
-
- @Override
public void onStop() {
super.onStop();
if (disposable != null) {
@@ -111,9 +105,8 @@ public class CompletedDownloadsFragment extends Fragment {
}
@Override
- public void onCreateOptionsMenu(@NonNull Menu menu, @NonNull MenuInflater inflater) {
- super.onCreateOptionsMenu(menu, inflater);
- inflater.inflate(R.menu.downloads_completed, menu);
+ public void onPrepareOptionsMenu(@NonNull Menu menu) {
+ menu.findItem(R.id.clear_logs_item).setVisible(false);
menu.findItem(R.id.episode_actions).setVisible(items.size() > 0);
isUpdatingFeeds = MenuItemUtils.updateRefreshMenuItem(menu, R.id.refresh_item, updateRefreshMenuItemChecker);
}
@@ -135,7 +128,7 @@ public class CompletedDownloadsFragment extends Fragment {
public void onEventMainThread(DownloadEvent event) {
Log.d(TAG, "onEventMainThread() called with: " + "event = [" + event + "]");
if (event.hasChangedFeedUpdateStatus(isUpdatingFeeds)) {
- getActivity().invalidateOptionsMenu();
+ ((PagedToolbarFragment) getParentFragment()).invalidateOptionsMenuIfActive(this);
}
}
@@ -225,7 +218,7 @@ public class CompletedDownloadsFragment extends Fragment {
.subscribe(result -> {
items = result;
adapter.updateItems(result);
- requireActivity().invalidateOptionsMenu();
+ ((PagedToolbarFragment) getParentFragment()).invalidateOptionsMenuIfActive(this);
progressBar.setVisibility(View.GONE);
}, error -> Log.e(TAG, Log.getStackTraceString(error)));
}
diff --git a/app/src/main/java/de/danoeh/antennapod/fragment/DiscoveryFragment.java b/app/src/main/java/de/danoeh/antennapod/fragment/DiscoveryFragment.java
index 5bc950d50..034b111e1 100644
--- a/app/src/main/java/de/danoeh/antennapod/fragment/DiscoveryFragment.java
+++ b/app/src/main/java/de/danoeh/antennapod/fragment/DiscoveryFragment.java
@@ -15,7 +15,7 @@ import android.widget.ProgressBar;
import android.widget.Spinner;
import android.widget.TextView;
import androidx.annotation.NonNull;
-import androidx.appcompat.app.AppCompatActivity;
+import androidx.appcompat.widget.Toolbar;
import androidx.fragment.app.Fragment;
import org.greenrobot.eventbus.EventBus;
@@ -90,7 +90,6 @@ public class DiscoveryFragment extends Fragment {
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
- setHasOptionsMenu(true);
prefs = getActivity().getSharedPreferences(ItunesTopListLoader.PREFS, MODE_PRIVATE);
countryCode = prefs.getString(ItunesTopListLoader.PREF_KEY_COUNTRY_CODE, Locale.getDefault().getCountry());
}
@@ -100,11 +99,13 @@ public class DiscoveryFragment extends Fragment {
Bundle savedInstanceState) {
// Inflate the layout for this fragment
View root = inflater.inflate(R.layout.fragment_itunes_search, container, false);
- ((AppCompatActivity) getActivity()).setSupportActionBar(root.findViewById(R.id.toolbar));
gridView = root.findViewById(R.id.gridView);
adapter = new ItunesAdapter(getActivity(), new ArrayList<>());
gridView.setAdapter(adapter);
+ Toolbar toolbar = root.findViewById(R.id.toolbar);
+ toolbar.setNavigationOnClickListener(v -> getParentFragmentManager().popBackStack());
+
//Show information about the podcast when the list item is clicked
gridView.setOnItemClickListener((parent, view1, position, id) -> {
PodcastSearchResult podcast = searchResults.get(position);
diff --git a/app/src/main/java/de/danoeh/antennapod/fragment/DownloadLogFragment.java b/app/src/main/java/de/danoeh/antennapod/fragment/DownloadLogFragment.java
index 055d88285..98d6a946b 100644
--- a/app/src/main/java/de/danoeh/antennapod/fragment/DownloadLogFragment.java
+++ b/app/src/main/java/de/danoeh/antennapod/fragment/DownloadLogFragment.java
@@ -66,12 +66,6 @@ public class DownloadLogFragment extends ListFragment {
}
@Override
- public void onResume() {
- super.onResume();
- setHasOptionsMenu(true);
- }
-
- @Override
public void onStop() {
super.onStop();
if (disposable != null) {
@@ -108,7 +102,7 @@ public class DownloadLogFragment extends ListFragment {
private void onFragmentLoaded() {
setListShown(true);
adapter.notifyDataSetChanged();
- getActivity().invalidateOptionsMenu();
+ ((PagedToolbarFragment) getParentFragment()).invalidateOptionsMenuIfActive(this);
}
@Override
@@ -172,19 +166,10 @@ public class DownloadLogFragment extends ListFragment {
}
@Override
- public void onCreateOptionsMenu(@NonNull Menu menu, @NonNull MenuInflater inflater) {
- super.onCreateOptionsMenu(menu, inflater);
- inflater.inflate(R.menu.downloads_log, menu);
- isUpdatingFeeds = MenuItemUtils.updateRefreshMenuItem(menu, R.id.refresh_item, updateRefreshMenuItemChecker);
- }
-
- @Override
public void onPrepareOptionsMenu(@NonNull Menu menu) {
- super.onPrepareOptionsMenu(menu);
- MenuItem menuItem = menu.findItem(R.id.clear_history_item);
- if (menuItem != null) {
- menuItem.setVisible(!downloadLog.isEmpty());
- }
+ menu.findItem(R.id.episode_actions).setVisible(false);
+ menu.findItem(R.id.clear_logs_item).setVisible(!downloadLog.isEmpty());
+ isUpdatingFeeds = MenuItemUtils.updateRefreshMenuItem(menu, R.id.refresh_item, updateRefreshMenuItemChecker);
}
@Override
@@ -209,7 +194,7 @@ public class DownloadLogFragment extends ListFragment {
public void onEventMainThread(DownloadEvent event) {
Log.d(TAG, "onEventMainThread() called with: " + "event = [" + event + "]");
if (event.hasChangedFeedUpdateStatus(isUpdatingFeeds)) {
- getActivity().invalidateOptionsMenu();
+ ((PagedToolbarFragment) getParentFragment()).invalidateOptionsMenuIfActive(this);
}
}
diff --git a/app/src/main/java/de/danoeh/antennapod/fragment/DownloadsFragment.java b/app/src/main/java/de/danoeh/antennapod/fragment/DownloadsFragment.java
index bc2d85452..ffb3e71fa 100644
--- a/app/src/main/java/de/danoeh/antennapod/fragment/DownloadsFragment.java
+++ b/app/src/main/java/de/danoeh/antennapod/fragment/DownloadsFragment.java
@@ -9,7 +9,6 @@ import android.view.ViewGroup;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
-import androidx.appcompat.app.AppCompatActivity;
import androidx.appcompat.widget.Toolbar;
import androidx.fragment.app.Fragment;
import androidx.viewpager2.adapter.FragmentStateAdapter;
@@ -19,11 +18,12 @@ import com.google.android.material.tabs.TabLayout;
import com.google.android.material.tabs.TabLayoutMediator;
import de.danoeh.antennapod.R;
+import de.danoeh.antennapod.activity.MainActivity;
/**
- * Shows the CompletedDownloadsFragment and the RunningDownloadsFragment
+ * Shows the CompletedDownloadsFragment and the RunningDownloadsFragment.
*/
-public class DownloadsFragment extends Fragment {
+public class DownloadsFragment extends PagedToolbarFragment {
public static final String TAG = "DownloadsFragment";
@@ -47,11 +47,13 @@ public class DownloadsFragment extends Fragment {
View root = inflater.inflate(R.layout.pager_fragment, container, false);
Toolbar toolbar = root.findViewById(R.id.toolbar);
toolbar.setTitle(R.string.downloads_label);
- ((AppCompatActivity) getActivity()).setSupportActionBar(toolbar);
+ toolbar.inflateMenu(R.menu.downloads);
+ ((MainActivity) getActivity()).setupToolbarToggle(toolbar);
viewPager = root.findViewById(R.id.viewpager);
viewPager.setAdapter(new DownloadsPagerAdapter(this));
viewPager.setOffscreenPageLimit(2);
+ super.setupPagedToolbar(toolbar, viewPager);
// Give the TabLayout the ViewPager
tabLayout = root.findViewById(R.id.sliding_tabs);
diff --git a/app/src/main/java/de/danoeh/antennapod/fragment/EpisodesFragment.java b/app/src/main/java/de/danoeh/antennapod/fragment/EpisodesFragment.java
index afd027b3a..eff23f7a3 100644
--- a/app/src/main/java/de/danoeh/antennapod/fragment/EpisodesFragment.java
+++ b/app/src/main/java/de/danoeh/antennapod/fragment/EpisodesFragment.java
@@ -8,7 +8,6 @@ import android.view.View;
import android.view.ViewGroup;
import androidx.annotation.NonNull;
-import androidx.appcompat.app.AppCompatActivity;
import androidx.appcompat.widget.Toolbar;
import androidx.fragment.app.Fragment;
import androidx.viewpager2.adapter.FragmentStateAdapter;
@@ -18,8 +17,10 @@ import com.google.android.material.tabs.TabLayout;
import com.google.android.material.tabs.TabLayoutMediator;
import de.danoeh.antennapod.R;
+import de.danoeh.antennapod.activity.MainActivity;
+import de.danoeh.antennapod.menuhandler.MenuItemUtils;
-public class EpisodesFragment extends Fragment {
+public class EpisodesFragment extends PagedToolbarFragment {
public static final String TAG = "EpisodesFragment";
private static final String PREF_LAST_TAB_POSITION = "tab_position";
@@ -29,18 +30,11 @@ public class EpisodesFragment extends Fragment {
private static final int POS_FAV_EPISODES = 2;
private static final int TOTAL_COUNT = 3;
-
private TabLayout tabLayout;
- private ViewPager2 viewPager;
-
- //Mandatory Constructor
- public EpisodesFragment() {
- }
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setRetainInstance(true);
- setHasOptionsMenu(true);
}
public View onCreateView(@NonNull LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
@@ -48,10 +42,14 @@ public class EpisodesFragment extends Fragment {
View rootView = inflater.inflate(R.layout.pager_fragment, container, false);
Toolbar toolbar = rootView.findViewById(R.id.toolbar);
toolbar.setTitle(R.string.episodes_label);
- ((AppCompatActivity) getActivity()).setSupportActionBar(toolbar);
- viewPager = rootView.findViewById(R.id.viewpager);
+ toolbar.inflateMenu(R.menu.episodes);
+ MenuItemUtils.setupSearchItem(toolbar.getMenu(), (MainActivity) getActivity(), 0, "");
+ ((MainActivity) getActivity()).setupToolbarToggle(toolbar);
+
+ ViewPager2 viewPager = rootView.findViewById(R.id.viewpager);
viewPager.setAdapter(new EpisodesPagerAdapter(this));
viewPager.setOffscreenPageLimit(2);
+ super.setupPagedToolbar(toolbar, viewPager);
// Give the TabLayout the ViewPager
tabLayout = rootView.findViewById(R.id.sliding_tabs);
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 62400d81d..8dae310ba 100644
--- a/app/src/main/java/de/danoeh/antennapod/fragment/EpisodesListFragment.java
+++ b/app/src/main/java/de/danoeh/antennapod/fragment/EpisodesListFragment.java
@@ -13,7 +13,6 @@ import android.os.Looper;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.Menu;
-import android.view.MenuInflater;
import android.view.MenuItem;
import android.view.View;
import android.view.ViewGroup;
@@ -76,7 +75,6 @@ public abstract class EpisodesListFragment extends Fragment {
List<FeedItem> episodes = new ArrayList<>();
private volatile boolean isUpdatingFeeds;
- private boolean isMenuVisible = true;
protected Disposable disposable;
protected TextView txtvInformation;
@@ -94,7 +92,6 @@ public abstract class EpisodesListFragment extends Fragment {
@Override
public void onResume() {
super.onResume();
- setHasOptionsMenu(true);
registerForContextMenu(recyclerView);
}
@@ -118,19 +115,7 @@ public abstract class EpisodesListFragment extends Fragment {
() -> DownloadService.isRunning && DownloadRequester.getInstance().isDownloadingFeeds();
@Override
- public void setMenuVisibility(final boolean visible) {
- super.setMenuVisibility(visible);
- isMenuVisible = visible;
- }
-
- @Override
- public void onCreateOptionsMenu(@NonNull Menu menu, @NonNull MenuInflater inflater) {
- if (!isAdded()) {
- return;
- }
- super.onCreateOptionsMenu(menu, inflater);
- inflater.inflate(R.menu.episodes, menu);
- MenuItemUtils.setupSearchItem(menu, (MainActivity) getActivity(), 0, "");
+ public void onPrepareOptionsMenu(@NonNull Menu menu) {
isUpdatingFeeds = MenuItemUtils.updateRefreshMenuItem(menu, R.id.refresh_item, updateRefreshMenuItemChecker);
}
@@ -289,8 +274,8 @@ public abstract class EpisodesListFragment extends Fragment {
if (restoreScrollPosition) {
recyclerView.restoreScrollPosition(getPrefName());
}
- if (isMenuVisible && isUpdatingFeeds != updateRefreshMenuItemChecker.isRefreshing()) {
- requireActivity().invalidateOptionsMenu();
+ if (isUpdatingFeeds != updateRefreshMenuItemChecker.isRefreshing()) {
+ ((PagedToolbarFragment) getParentFragment()).invalidateOptionsMenuIfActive(this);
}
}
@@ -344,8 +329,8 @@ public abstract class EpisodesListFragment extends Fragment {
public void onEventMainThread(DownloadEvent event) {
Log.d(TAG, "onEventMainThread() called with: " + "event = [" + event + "]");
DownloaderUpdate update = event.update;
- if (isMenuVisible && event.hasChangedFeedUpdateStatus(isUpdatingFeeds)) {
- requireActivity().invalidateOptionsMenu();
+ if (event.hasChangedFeedUpdateStatus(isUpdatingFeeds)) {
+ ((PagedToolbarFragment) getParentFragment()).invalidateOptionsMenuIfActive(this);
}
if (update.mediaIds.length > 0) {
for (long mediaId : update.mediaIds) {
@@ -359,8 +344,8 @@ public abstract class EpisodesListFragment extends Fragment {
private void updateUi() {
loadItems();
- if (isMenuVisible && isUpdatingFeeds != updateRefreshMenuItemChecker.isRefreshing()) {
- requireActivity().invalidateOptionsMenu();
+ if (isUpdatingFeeds != updateRefreshMenuItemChecker.isRefreshing()) {
+ ((PagedToolbarFragment) getParentFragment()).invalidateOptionsMenuIfActive(this);
}
}
@@ -391,6 +376,7 @@ public abstract class EpisodesListFragment extends Fragment {
hasMoreItems = true;
episodes = data;
onFragmentLoaded(episodes);
+ ((PagedToolbarFragment) getParentFragment()).invalidateOptionsMenuIfActive(this);
}, error -> Log.e(TAG, Log.getStackTraceString(error)));
}
diff --git a/app/src/main/java/de/danoeh/antennapod/fragment/FavoriteEpisodesFragment.java b/app/src/main/java/de/danoeh/antennapod/fragment/FavoriteEpisodesFragment.java
index d50be88c5..e1fd36731 100644
--- a/app/src/main/java/de/danoeh/antennapod/fragment/FavoriteEpisodesFragment.java
+++ b/app/src/main/java/de/danoeh/antennapod/fragment/FavoriteEpisodesFragment.java
@@ -1,6 +1,7 @@
package de.danoeh.antennapod.fragment;
import android.os.Bundle;
+import android.view.Menu;
import androidx.annotation.NonNull;
import com.google.android.material.snackbar.Snackbar;
import androidx.recyclerview.widget.RecyclerView;
@@ -42,6 +43,14 @@ public class FavoriteEpisodesFragment extends EpisodesListFragment {
loadItems();
}
+ @Override
+ public void onPrepareOptionsMenu(@NonNull Menu menu) {
+ super.onPrepareOptionsMenu(menu);
+ menu.findItem(R.id.filter_items).setVisible(false);
+ menu.findItem(R.id.mark_all_read_item).setVisible(false);
+ menu.findItem(R.id.remove_all_new_flags_item).setVisible(false);
+ }
+
@NonNull
@Override
public View onCreateView(@NonNull LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
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 5fd2c3c8d..4ca08cbdd 100644
--- a/app/src/main/java/de/danoeh/antennapod/fragment/FeedInfoFragment.java
+++ b/app/src/main/java/de/danoeh/antennapod/fragment/FeedInfoFragment.java
@@ -13,7 +13,6 @@ import android.os.Bundle;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.appcompat.app.AlertDialog;
-import androidx.appcompat.app.AppCompatActivity;
import androidx.appcompat.widget.Toolbar;
import androidx.documentfile.provider.DocumentFile;
import androidx.fragment.app.Fragment;
@@ -21,8 +20,6 @@ import android.text.TextUtils;
import android.text.format.Formatter;
import android.util.Log;
import android.view.LayoutInflater;
-import android.view.Menu;
-import android.view.MenuInflater;
import android.view.MenuItem;
import android.view.View;
import android.view.ViewGroup;
@@ -67,7 +64,7 @@ import java.util.Locale;
/**
* Displays information about a feed.
*/
-public class FeedInfoFragment extends Fragment {
+public class FeedInfoFragment extends Fragment implements Toolbar.OnMenuItemClickListener {
private static final String EXTRA_FEED_ID = "de.danoeh.antennapod.extra.feedId";
private static final String TAG = "FeedInfoActivity";
@@ -89,7 +86,7 @@ public class FeedInfoFragment extends Fragment {
private ImageView imgvBackground;
private View infoContainer;
private View header;
- private Menu optionsMenu;
+ private Toolbar toolbar;
private ToolbarIconTintManager iconTintManager;
public static FeedInfoFragment newInstance(Feed feed) {
@@ -119,25 +116,25 @@ public class FeedInfoFragment extends Fragment {
public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container,
@Nullable Bundle savedInstanceState) {
View root = inflater.inflate(R.layout.feedinfo, null);
- Toolbar toolbar = root.findViewById(R.id.toolbar);
+ toolbar = root.findViewById(R.id.toolbar);
toolbar.setTitle("");
- ((AppCompatActivity) getActivity()).setSupportActionBar(toolbar);
+ toolbar.inflateMenu(R.menu.feedinfo);
+ toolbar.setNavigationOnClickListener(v -> getParentFragmentManager().popBackStack());
+ toolbar.setOnMenuItemClickListener(this);
+ refreshToolbarState();
+
AppBarLayout appBar = root.findViewById(R.id.appBar);
CollapsingToolbarLayout collapsingToolbar = root.findViewById(R.id.collapsing_toolbar);
iconTintManager = new ToolbarIconTintManager(getContext(), toolbar, collapsingToolbar) {
@Override
protected void doTint(Context themedContext) {
- if (optionsMenu == null) {
- return;
- }
- optionsMenu.findItem(R.id.visit_website_item)
+ toolbar.getMenu().findItem(R.id.visit_website_item)
.setIcon(ThemeUtils.getDrawableFromAttr(themedContext, R.attr.location_web_site));
}
};
+ iconTintManager.updateTint();
appBar.addOnOffsetChangedListener(iconTintManager);
- setHasOptionsMenu(true);
-
imgvCover = root.findViewById(R.id.imgvCover);
txtvTitle = root.findViewById(R.id.txtvTitle);
txtvAuthorHeader = root.findViewById(R.id.txtvAuthor);
@@ -234,7 +231,7 @@ public class FeedInfoFragment extends Fragment {
txtvUrl.setText(feed.getDownload_url() + " {fa-paperclip}");
Iconify.addIcons(txtvUrl);
- getActivity().invalidateOptionsMenu();
+ refreshToolbarState();
}
private void loadStatistics() {
@@ -286,29 +283,19 @@ public class FeedInfoFragment extends Fragment {
}
}
- @Override
- public void onCreateOptionsMenu(@NonNull Menu menu, @NonNull MenuInflater inflater) {
- super.onCreateOptionsMenu(menu, inflater);
- inflater.inflate(R.menu.feedinfo, menu);
- optionsMenu = menu;
- iconTintManager.updateTint();
- }
-
- @Override
- public void onPrepareOptionsMenu(@NonNull Menu menu) {
- super.onPrepareOptionsMenu(menu);
- menu.findItem(R.id.reconnect_local_folder).setVisible(feed != null && feed.isLocalFeed());
- menu.findItem(R.id.share_link_item).setVisible(feed != null && feed.getLink() != null);
- menu.findItem(R.id.visit_website_item).setVisible(feed != null && feed.getLink() != null
+ private void refreshToolbarState() {
+ toolbar.getMenu().findItem(R.id.reconnect_local_folder).setVisible(feed != null && feed.isLocalFeed());
+ toolbar.getMenu().findItem(R.id.share_link_item).setVisible(feed != null && feed.getLink() != null);
+ toolbar.getMenu().findItem(R.id.visit_website_item).setVisible(feed != null && feed.getLink() != null
&& IntentUtils.isCallable(getContext(), new Intent(Intent.ACTION_VIEW, Uri.parse(feed.getLink()))));
}
@Override
- public boolean onOptionsItemSelected(@NonNull MenuItem item) {
+ public boolean onMenuItemClick(MenuItem item) {
if (feed == null) {
((MainActivity) getActivity()).showSnackbarAbovePlayer(
R.string.please_wait_for_data, Toast.LENGTH_LONG);
- return super.onOptionsItemSelected(item);
+ return false;
}
boolean handled = false;
try {
@@ -335,7 +322,7 @@ public class FeedInfoFragment extends Fragment {
return true;
}
- return handled || super.onOptionsItemSelected(item);
+ return handled;
}
@Override
@@ -369,7 +356,7 @@ public class FeedInfoFragment extends Fragment {
.observeOn(AndroidSchedulers.mainThread())
.subscribe(
() -> ((MainActivity) getActivity())
- .showSnackbarAbovePlayer(R.string.add_local_folder_success, Snackbar.LENGTH_SHORT),
+ .showSnackbarAbovePlayer(android.R.string.ok, Snackbar.LENGTH_SHORT),
error -> ((MainActivity) getActivity())
.showSnackbarAbovePlayer(error.getLocalizedMessage(), Snackbar.LENGTH_LONG));
}
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 b66f15c7e..681d3a88e 100644
--- a/app/src/main/java/de/danoeh/antennapod/fragment/FeedItemlistFragment.java
+++ b/app/src/main/java/de/danoeh/antennapod/fragment/FeedItemlistFragment.java
@@ -10,8 +10,6 @@ import android.os.Handler;
import android.os.Looper;
import android.util.Log;
import android.view.LayoutInflater;
-import android.view.Menu;
-import android.view.MenuInflater;
import android.view.MenuItem;
import android.view.View;
import android.view.ViewGroup;
@@ -24,7 +22,6 @@ import android.widget.TextView;
import android.widget.Toast;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
-import androidx.appcompat.app.AppCompatActivity;
import androidx.appcompat.widget.Toolbar;
import androidx.fragment.app.Fragment;
import androidx.recyclerview.widget.RecyclerView;
@@ -90,7 +87,8 @@ import java.util.Set;
/**
* Displays a list of FeedItems.
*/
-public class FeedItemlistFragment extends Fragment implements AdapterView.OnItemClickListener {
+public class FeedItemlistFragment extends Fragment implements AdapterView.OnItemClickListener,
+ Toolbar.OnMenuItemClickListener {
private static final String TAG = "ItemlistFragment";
private static final String ARGUMENT_FEED_ID = "argument.de.danoeh.antennapod.feed_id";
@@ -108,7 +106,7 @@ public class FeedItemlistFragment extends Fragment implements AdapterView.OnItem
private ImageButton butShowInfo;
private ImageButton butShowSettings;
private View header;
- private Menu optionsMenu;
+ private Toolbar toolbar;
private ToolbarIconTintManager iconTintManager;
private long feedID;
@@ -136,7 +134,6 @@ public class FeedItemlistFragment extends Fragment implements AdapterView.OnItem
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setRetainInstance(true);
- setHasOptionsMenu(true);
Bundle args = getArguments();
Validate.notNull(args);
@@ -148,9 +145,11 @@ public class FeedItemlistFragment extends Fragment implements AdapterView.OnItem
public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container,
@Nullable Bundle savedInstanceState) {
View root = inflater.inflate(R.layout.feed_item_list_fragment, container, false);
- Toolbar toolbar = root.findViewById(R.id.toolbar);
- toolbar.setTitle("");
- ((AppCompatActivity) getActivity()).setSupportActionBar(toolbar);
+ toolbar = root.findViewById(R.id.toolbar);
+ toolbar.inflateMenu(R.menu.feedlist);
+ toolbar.setOnMenuItemClickListener(this);
+ ((MainActivity) getActivity()).setupToolbarToggle(toolbar);
+ refreshToolbarState();
recyclerView = root.findViewById(R.id.recyclerView);
recyclerView.setRecycledViewPool(((MainActivity) getActivity()).getRecycledViewPool());
@@ -172,19 +171,17 @@ public class FeedItemlistFragment extends Fragment implements AdapterView.OnItem
iconTintManager = new ToolbarIconTintManager(getContext(), toolbar, collapsingToolbar) {
@Override
protected void doTint(Context themedContext) {
- if (optionsMenu == null) {
- return;
- }
- optionsMenu.findItem(R.id.sort_items)
+ toolbar.getMenu().findItem(R.id.sort_items)
.setIcon(ThemeUtils.getDrawableFromAttr(themedContext, R.attr.ic_sort));
- optionsMenu.findItem(R.id.filter_items)
+ toolbar.getMenu().findItem(R.id.filter_items)
.setIcon(ThemeUtils.getDrawableFromAttr(themedContext, R.attr.ic_filter));
- optionsMenu.findItem(R.id.refresh_item)
+ toolbar.getMenu().findItem(R.id.refresh_item)
.setIcon(ThemeUtils.getDrawableFromAttr(themedContext, R.attr.navigation_refresh));
- optionsMenu.findItem(R.id.action_search)
+ toolbar.getMenu().findItem(R.id.action_search)
.setIcon(ThemeUtils.getDrawableFromAttr(themedContext, R.attr.action_search));
}
};
+ iconTintManager.updateTint();
appBar.addOnOffsetChangedListener(iconTintManager);
nextPageLoader = new MoreContentListFooterUtil(root.findViewById(R.id.more_content_list_footer));
@@ -243,33 +240,18 @@ public class FeedItemlistFragment extends Fragment implements AdapterView.OnItem
}
};
- @Override
- public void onCreateOptionsMenu(@NonNull Menu menu, @NonNull MenuInflater inflater) {
- if (!isAdded()) {
+ private void refreshToolbarState() {
+ if (feed == null) {
return;
}
- super.onCreateOptionsMenu(menu, inflater);
- optionsMenu = menu;
- FeedMenuHandler.onCreateOptionsMenu(inflater, menu);
- iconTintManager.updateTint();
- if (feed != null) {
- MenuItemUtils.setupSearchItem(menu, (MainActivity) getActivity(), feedID, feed.getTitle());
- } else {
- MenuItemUtils.setupSearchItem(menu, (MainActivity) getActivity(), feedID, "");
- }
- if (feed == null || feed.getLink() == null) {
- menu.findItem(R.id.share_link_item).setVisible(false);
- menu.findItem(R.id.visit_website_item).setVisible(false);
- }
+ MenuItemUtils.setupSearchItem(toolbar.getMenu(), (MainActivity) getActivity(), feedID, feed.getTitle());
- isUpdatingFeed = MenuItemUtils.updateRefreshMenuItem(menu, R.id.refresh_item, updateRefreshMenuItemChecker);
- }
+ toolbar.getMenu().findItem(R.id.share_link_item).setVisible(feed.getLink() != null);
+ toolbar.getMenu().findItem(R.id.visit_website_item).setVisible(feed.getLink() != null);
- @Override
- public void onPrepareOptionsMenu(@NonNull Menu menu) {
- if (feed != null) {
- FeedMenuHandler.onPrepareOptionsMenu(menu, feed);
- }
+ isUpdatingFeed = MenuItemUtils.updateRefreshMenuItem(toolbar.getMenu(),
+ R.id.refresh_item, updateRefreshMenuItemChecker);
+ FeedMenuHandler.onPrepareOptionsMenu(toolbar.getMenu(), feed);
}
@Override
@@ -280,71 +262,67 @@ public class FeedItemlistFragment extends Fragment implements AdapterView.OnItem
}
@Override
- public boolean onOptionsItemSelected(@NonNull MenuItem item) {
+ public boolean onMenuItemClick(MenuItem item) {
if (item.getItemId() == R.id.action_search) {
item.getActionView().post(() -> iconTintManager.updateTint());
}
- if (super.onOptionsItemSelected(item)) {
+ if (feed == null) {
+ ((MainActivity) getActivity()).showSnackbarAbovePlayer(
+ R.string.please_wait_for_data, Toast.LENGTH_LONG);
return true;
- } else {
- if (feed == null) {
- ((MainActivity) getActivity()).showSnackbarAbovePlayer(
- R.string.please_wait_for_data, Toast.LENGTH_LONG);
+ }
+ boolean feedMenuHandled;
+ try {
+ feedMenuHandled = FeedMenuHandler.onOptionsItemClicked(getActivity(), item, feed);
+ } catch (DownloadRequestException e) {
+ e.printStackTrace();
+ DownloadRequestErrorDialogCreator.newRequestErrorDialog(getActivity(), e.getMessage());
+ return true;
+ }
+ if (feedMenuHandled) {
+ return true;
+ }
+ switch (item.getItemId()) {
+ case R.id.episode_actions:
+ int actions = EpisodesApplyActionFragment.ACTION_ALL;
+ if (feed.isLocalFeed()) {
+ // turn off download and delete actions for local feed
+ actions ^= EpisodesApplyActionFragment.ACTION_DOWNLOAD;
+ actions ^= EpisodesApplyActionFragment.ACTION_DELETE;
+ }
+ EpisodesApplyActionFragment fragment = EpisodesApplyActionFragment
+ .newInstance(feed.getItems(), actions);
+ ((MainActivity) getActivity()).loadChildFragment(fragment);
return true;
- }
- try {
- if (!FeedMenuHandler.onOptionsItemClicked(getActivity(), item, feed)) {
- switch (item.getItemId()) {
- case R.id.episode_actions:
- int actions = EpisodesApplyActionFragment.ACTION_ALL;
- if (feed.isLocalFeed()) {
- // turn off download and delete actions for local feed
- actions ^= EpisodesApplyActionFragment.ACTION_DOWNLOAD;
- actions ^= EpisodesApplyActionFragment.ACTION_DELETE;
- }
- EpisodesApplyActionFragment fragment = EpisodesApplyActionFragment
- .newInstance(feed.getItems(), actions);
- ((MainActivity)getActivity()).loadChildFragment(fragment);
- return true;
- case R.id.rename_item:
- new RenameFeedDialog(getActivity(), feed).show();
- return true;
- case R.id.remove_item:
- final FeedRemover remover = new FeedRemover(
- getActivity(), feed) {
- @Override
- protected void onPostExecute(Void result) {
- super.onPostExecute(result);
- ((MainActivity) getActivity()).loadFragment(EpisodesFragment.TAG, null);
- }
- };
- int messageId = feed.isLocalFeed() ? R.string.feed_delete_confirmation_local_msg
- : R.string.feed_delete_confirmation_msg;
- ConfirmationDialog conDialog = new ConfirmationDialog(getActivity(),
- R.string.remove_feed_label,
- getString(messageId, feed.getTitle())) {
-
- @Override
- public void onConfirmButtonPressed(
- DialogInterface dialog) {
- dialog.dismiss();
- remover.executeAsync();
- }
- };
- conDialog.createNewDialog().show();
- return true;
- default:
- return false;
-
+ case R.id.rename_item:
+ new RenameFeedDialog(getActivity(), feed).show();
+ return true;
+ case R.id.remove_item:
+ final FeedRemover remover = new FeedRemover(
+ getActivity(), feed) {
+ @Override
+ protected void onPostExecute(Void result) {
+ super.onPostExecute(result);
+ ((MainActivity) getActivity()).loadFragment(EpisodesFragment.TAG, null);
}
- } else {
- return true;
- }
- } catch (DownloadRequestException e) {
- e.printStackTrace();
- DownloadRequestErrorDialogCreator.newRequestErrorDialog(getActivity(), e.getMessage());
+ };
+ int messageId = feed.isLocalFeed() ? R.string.feed_delete_confirmation_local_msg
+ : R.string.feed_delete_confirmation_msg;
+ ConfirmationDialog conDialog = new ConfirmationDialog(getActivity(),
+ R.string.remove_feed_label,
+ getString(messageId, feed.getTitle())) {
+
+ @Override
+ public void onConfirmButtonPressed(
+ DialogInterface dialog) {
+ dialog.dismiss();
+ remover.executeAsync();
+ }
+ };
+ conDialog.createNewDialog().show();
return true;
- }
+ default:
+ return false;
}
}
@@ -450,7 +428,7 @@ public class FeedItemlistFragment extends Fragment implements AdapterView.OnItem
private void updateSyncProgressBarVisibility() {
if (isUpdatingFeed != updateRefreshMenuItemChecker.isRefreshing()) {
- getActivity().invalidateOptionsMenu();
+ refreshToolbarState();
}
if (!DownloadRequester.getInstance().isDownloadingFeeds()) {
nextPageLoader.getRoot().setVisibility(View.GONE);
@@ -474,7 +452,7 @@ public class FeedItemlistFragment extends Fragment implements AdapterView.OnItem
adapter.updateItems(feed.getItems());
}
- getActivity().invalidateOptionsMenu();
+ refreshToolbarState();
updateSyncProgressBarVisibility();
}
diff --git a/app/src/main/java/de/danoeh/antennapod/fragment/FeedSettingsFragment.java b/app/src/main/java/de/danoeh/antennapod/fragment/FeedSettingsFragment.java
index 21280896a..568b56304 100644
--- a/app/src/main/java/de/danoeh/antennapod/fragment/FeedSettingsFragment.java
+++ b/app/src/main/java/de/danoeh/antennapod/fragment/FeedSettingsFragment.java
@@ -9,7 +9,6 @@ import android.view.View;
import android.view.ViewGroup;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
-import androidx.appcompat.app.AppCompatActivity;
import androidx.appcompat.widget.Toolbar;
import androidx.fragment.app.Fragment;
import androidx.preference.ListPreference;
@@ -65,7 +64,7 @@ public class FeedSettingsFragment extends Fragment {
long feedId = getArguments().getLong(EXTRA_FEED_ID);
Toolbar toolbar = root.findViewById(R.id.toolbar);
- ((AppCompatActivity) getActivity()).setSupportActionBar(toolbar);
+ toolbar.setNavigationOnClickListener(v -> getParentFragmentManager().popBackStack());
getParentFragmentManager().beginTransaction()
.replace(R.id.settings_fragment_container,
diff --git a/app/src/main/java/de/danoeh/antennapod/fragment/ItemPagerFragment.java b/app/src/main/java/de/danoeh/antennapod/fragment/ItemPagerFragment.java
index 2425a174e..7b7a09082 100644
--- a/app/src/main/java/de/danoeh/antennapod/fragment/ItemPagerFragment.java
+++ b/app/src/main/java/de/danoeh/antennapod/fragment/ItemPagerFragment.java
@@ -2,15 +2,12 @@ package de.danoeh.antennapod.fragment;
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 androidx.annotation.NonNull;
import androidx.annotation.Nullable;
-import androidx.appcompat.app.AppCompatActivity;
import androidx.appcompat.widget.Toolbar;
import androidx.core.view.ViewCompat;
import androidx.fragment.app.Fragment;
@@ -35,7 +32,7 @@ import io.reactivex.schedulers.Schedulers;
/**
* Displays information about a list of FeedItems.
*/
-public class ItemPagerFragment extends Fragment {
+public class ItemPagerFragment extends Fragment implements Toolbar.OnMenuItemClickListener {
private static final String ARG_FEEDITEMS = "feeditems";
private static final String ARG_FEEDITEM_POS = "feeditem_pos";
private static final String KEY_PAGER_ID = "pager_id";
@@ -60,21 +57,18 @@ public class ItemPagerFragment extends Fragment {
private long[] feedItems;
private FeedItem item;
private Disposable disposable;
-
- @Override
- public void onCreate(Bundle savedInstanceState) {
- super.onCreate(savedInstanceState);
- setHasOptionsMenu(true);
- }
+ private Toolbar toolbar;
@Override
public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container,
@Nullable Bundle savedInstanceState) {
super.onCreateView(inflater, container, savedInstanceState);
View layout = inflater.inflate(R.layout.feeditem_pager_fragment, container, false);
- Toolbar toolbar = layout.findViewById(R.id.toolbar);
+ toolbar = layout.findViewById(R.id.toolbar);
toolbar.setTitle("");
- ((AppCompatActivity) getActivity()).setSupportActionBar(toolbar);
+ toolbar.inflateMenu(R.menu.feeditem_options);
+ toolbar.setNavigationOnClickListener(v -> getParentFragmentManager().popBackStack());
+ toolbar.setOnMenuItemClickListener(this);
feedItems = getArguments().getLongArray(ARG_FEEDITEMS);
int feedItemPos = getArguments().getInt(ARG_FEEDITEM_POS);
@@ -130,28 +124,25 @@ public class ItemPagerFragment extends Fragment {
.observeOn(AndroidSchedulers.mainThread())
.subscribe(result -> {
item = result;
- getActivity().invalidateOptionsMenu();
+ refreshToolbarState();
}, Throwable::printStackTrace);
}
- @Override
- public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
- if (!isAdded() || item == null) {
+ public void refreshToolbarState() {
+ if (item == null) {
return;
}
- super.onCreateOptionsMenu(menu, inflater);
- inflater.inflate(R.menu.feeditem_options, menu);
if (item.hasMedia()) {
- FeedItemMenuHandler.onPrepareMenu(menu, item);
+ FeedItemMenuHandler.onPrepareMenu(toolbar.getMenu(), item);
} else {
// these are already available via button1 and button2
- FeedItemMenuHandler.onPrepareMenu(menu, item,
+ FeedItemMenuHandler.onPrepareMenu(toolbar.getMenu(), item,
R.id.mark_read_item, R.id.visit_website_item);
}
}
@Override
- public boolean onOptionsItemSelected(MenuItem menuItem) {
+ public boolean onMenuItemClick(MenuItem menuItem) {
if (menuItem.getItemId() == R.id.open_podcast) {
openPodcast();
return true;
@@ -164,7 +155,7 @@ public class ItemPagerFragment extends Fragment {
for (FeedItem item : event.items) {
if (this.item != null && this.item.getId() == item.getId()) {
this.item = item;
- getActivity().invalidateOptionsMenu();
+ refreshToolbarState();
return;
}
}
diff --git a/app/src/main/java/de/danoeh/antennapod/fragment/NewEpisodesFragment.java b/app/src/main/java/de/danoeh/antennapod/fragment/NewEpisodesFragment.java
index 4577aed23..d748d14c9 100644
--- a/app/src/main/java/de/danoeh/antennapod/fragment/NewEpisodesFragment.java
+++ b/app/src/main/java/de/danoeh/antennapod/fragment/NewEpisodesFragment.java
@@ -1,6 +1,7 @@
package de.danoeh.antennapod.fragment;
import android.os.Bundle;
+import android.view.MenuInflater;
import androidx.annotation.NonNull;
import androidx.recyclerview.widget.RecyclerView;
import androidx.recyclerview.widget.ItemTouchHelper;
@@ -37,8 +38,10 @@ public class NewEpisodesFragment extends EpisodesListFragment {
}
@Override
- public void onPrepareOptionsMenu(Menu menu) {
+ public void onPrepareOptionsMenu(@NonNull Menu menu) {
super.onPrepareOptionsMenu(menu);
+ menu.findItem(R.id.filter_items).setVisible(false);
+ menu.findItem(R.id.mark_all_read_item).setVisible(false);
menu.findItem(R.id.remove_all_new_flags_item).setVisible(true);
}
diff --git a/app/src/main/java/de/danoeh/antennapod/fragment/OnlineSearchFragment.java b/app/src/main/java/de/danoeh/antennapod/fragment/OnlineSearchFragment.java
index 435590a0c..ba817650b 100644
--- a/app/src/main/java/de/danoeh/antennapod/fragment/OnlineSearchFragment.java
+++ b/app/src/main/java/de/danoeh/antennapod/fragment/OnlineSearchFragment.java
@@ -2,14 +2,11 @@ package de.danoeh.antennapod.fragment;
import android.content.Intent;
import android.os.Bundle;
-import androidx.appcompat.app.AppCompatActivity;
+import androidx.appcompat.widget.Toolbar;
import androidx.fragment.app.Fragment;
-import androidx.core.view.MenuItemCompat;
import androidx.appcompat.widget.SearchView;
import android.util.Log;
import android.view.LayoutInflater;
-import android.view.Menu;
-import android.view.MenuInflater;
import android.view.MenuItem;
import android.view.View;
import android.view.ViewGroup;
@@ -77,7 +74,6 @@ public class OnlineSearchFragment extends Fragment {
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
- setHasOptionsMenu(true);
for (PodcastSearcherRegistry.SearcherInfo info : PodcastSearcherRegistry.getSearchProviders()) {
if (info.searcher.getClass().getName().equals(getArguments().getString(ARG_SEARCHER))) {
@@ -94,7 +90,7 @@ public class OnlineSearchFragment extends Fragment {
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
// Inflate the layout for this fragment
View root = inflater.inflate(R.layout.fragment_itunes_search, container, false);
- ((AppCompatActivity) getActivity()).setSupportActionBar(root.findViewById(R.id.toolbar));
+ setupToolbar(root.findViewById(R.id.toolbar));
root.findViewById(R.id.spinner_country).setVisibility(INVISIBLE);
gridView = root.findViewById(R.id.gridView);
adapter = new ItunesAdapter(getActivity(), new ArrayList<>());
@@ -126,11 +122,11 @@ public class OnlineSearchFragment extends Fragment {
adapter = null;
}
- @Override
- public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
- super.onCreateOptionsMenu(menu, inflater);
- inflater.inflate(R.menu.online_search, menu);
- MenuItem searchItem = menu.findItem(R.id.action_search);
+ private void setupToolbar(Toolbar toolbar) {
+ toolbar.inflateMenu(R.menu.online_search);
+ toolbar.setNavigationOnClickListener(v -> getParentFragmentManager().popBackStack());
+
+ MenuItem searchItem = toolbar.getMenu().findItem(R.id.action_search);
final SearchView sv = (SearchView) searchItem.getActionView();
sv.setQueryHint(getString(R.string.search_podcast_hint));
sv.setOnQueryTextListener(new SearchView.OnQueryTextListener() {
@@ -163,7 +159,6 @@ public class OnlineSearchFragment extends Fragment {
if (getArguments().getString(ARG_QUERY, null) != null) {
sv.setQuery(getArguments().getString(ARG_QUERY, null), true);
}
-
}
private void search(String query) {
diff --git a/app/src/main/java/de/danoeh/antennapod/fragment/PagedToolbarFragment.java b/app/src/main/java/de/danoeh/antennapod/fragment/PagedToolbarFragment.java
new file mode 100644
index 000000000..2ed26b1c0
--- /dev/null
+++ b/app/src/main/java/de/danoeh/antennapod/fragment/PagedToolbarFragment.java
@@ -0,0 +1,47 @@
+package de.danoeh.antennapod.fragment;
+
+import androidx.appcompat.widget.Toolbar;
+import androidx.fragment.app.Fragment;
+import androidx.viewpager2.widget.ViewPager2;
+
+/**
+ * Fragment with a ViewPager where the displayed items influence the top toolbar's menu.
+ * All items share the same general menu items and are just allowed to show/hide them.
+ */
+public abstract class PagedToolbarFragment extends Fragment {
+ private Toolbar toolbar;
+ private ViewPager2 viewPager;
+
+ /**
+ * Invalidate the toolbar menu if the current child fragment is visible.
+ * @param child The fragment, or null to force-refresh whatever the active fragment is.
+ */
+ void invalidateOptionsMenuIfActive(Fragment child) {
+ Fragment visibleChild = getChildFragmentManager().findFragmentByTag("f" + viewPager.getCurrentItem());
+ if (visibleChild == child || child == null) {
+ child.onPrepareOptionsMenu(toolbar.getMenu());
+ }
+ }
+
+ protected void setupPagedToolbar(Toolbar toolbar, ViewPager2 viewPager) {
+ this.toolbar = toolbar;
+ this.viewPager = viewPager;
+
+ toolbar.setOnMenuItemClickListener(item -> {
+ Fragment child = getChildFragmentManager().findFragmentByTag("f" + viewPager.getCurrentItem());
+ if (child != null) {
+ return child.onOptionsItemSelected(item);
+ }
+ return false;
+ });
+ viewPager.registerOnPageChangeCallback(new ViewPager2.OnPageChangeCallback() {
+ @Override
+ public void onPageSelected(int position) {
+ Fragment child = getChildFragmentManager().findFragmentByTag("f" + position);
+ if (child != null) {
+ child.onPrepareOptionsMenu(toolbar.getMenu());
+ }
+ }
+ });
+ }
+}
diff --git a/app/src/main/java/de/danoeh/antennapod/fragment/PlaybackHistoryFragment.java b/app/src/main/java/de/danoeh/antennapod/fragment/PlaybackHistoryFragment.java
index db4bda1f5..4549e2a09 100644
--- a/app/src/main/java/de/danoeh/antennapod/fragment/PlaybackHistoryFragment.java
+++ b/app/src/main/java/de/danoeh/antennapod/fragment/PlaybackHistoryFragment.java
@@ -1,20 +1,15 @@
package de.danoeh.antennapod.fragment;
-import android.content.res.TypedArray;
import android.os.Bundle;
import android.util.Log;
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 androidx.appcompat.app.AppCompatActivity;
import androidx.appcompat.widget.Toolbar;
-import androidx.core.view.MenuItemCompat;
import androidx.fragment.app.Fragment;
import de.danoeh.antennapod.R;
import de.danoeh.antennapod.activity.MainActivity;
@@ -43,7 +38,7 @@ import org.greenrobot.eventbus.ThreadMode;
import java.util.List;
-public class PlaybackHistoryFragment extends Fragment {
+public class PlaybackHistoryFragment extends Fragment implements Toolbar.OnMenuItemClickListener {
public static final String TAG = "PlaybackHistoryFragment";
private List<FeedItem> playbackHistory;
@@ -52,21 +47,24 @@ public class PlaybackHistoryFragment extends Fragment {
private EpisodeItemListRecyclerView recyclerView;
private EmptyViewHandler emptyView;
private ProgressBar progressBar;
+ private Toolbar toolbar;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setRetainInstance(true);
- setHasOptionsMenu(true);
}
@Override
public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container,
@Nullable Bundle savedInstanceState) {
View root = inflater.inflate(R.layout.simple_list_fragment, container, false);
- Toolbar toolbar = root.findViewById(R.id.toolbar);
+ toolbar = root.findViewById(R.id.toolbar);
toolbar.setTitle(R.string.playback_history_label);
- ((AppCompatActivity) getActivity()).setSupportActionBar(toolbar);
+ toolbar.setOnMenuItemClickListener(this);
+ ((MainActivity) getActivity()).setupToolbarToggle(toolbar);
+ toolbar.inflateMenu(R.menu.playback_history);
+ refreshToolbarState();
recyclerView = root.findViewById(R.id.recyclerView);
recyclerView.setRecycledViewPool(((MainActivity) getActivity()).getRecycledViewPool());
@@ -146,39 +144,18 @@ public class PlaybackHistoryFragment extends Fragment {
}
}
- @Override
- public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
- if (!isAdded()) {
- return;
- }
- super.onCreateOptionsMenu(menu, inflater);
- MenuItem clearHistory = menu.add(Menu.NONE, R.id.clear_history_item, Menu.CATEGORY_CONTAINER, R.string.clear_history_label);
- clearHistory.setShowAsAction(MenuItem.SHOW_AS_ACTION_IF_ROOM);
- TypedArray drawables = getActivity().obtainStyledAttributes(new int[]{R.attr.ic_delete});
- clearHistory.setIcon(drawables.getDrawable(0));
- drawables.recycle();
- }
-
- @Override
- public void onPrepareOptionsMenu(Menu menu) {
- super.onPrepareOptionsMenu(menu);
- MenuItem menuItem = menu.findItem(R.id.clear_history_item);
- if (menuItem != null) {
- menuItem.setVisible(playbackHistory != null && !playbackHistory.isEmpty());
- }
+ public void refreshToolbarState() {
+ boolean hasHistory = playbackHistory != null && !playbackHistory.isEmpty();
+ toolbar.getMenu().findItem(R.id.clear_history_item).setVisible(hasHistory);
}
@Override
- public boolean onOptionsItemSelected(MenuItem item) {
- if (!super.onOptionsItemSelected(item)) {
- if (item.getItemId() == R.id.clear_history_item) {
- DBWriter.clearPlaybackHistory();
- return true;
- }
- return false;
- } else {
+ public boolean onMenuItemClick(MenuItem item) {
+ if (item.getItemId() == R.id.clear_history_item) {
+ DBWriter.clearPlaybackHistory();
return true;
}
+ return false;
}
@Override
@@ -194,18 +171,18 @@ public class PlaybackHistoryFragment extends Fragment {
@Subscribe(threadMode = ThreadMode.MAIN)
public void onHistoryUpdated(PlaybackHistoryEvent event) {
loadItems();
- getActivity().invalidateOptionsMenu();
+ refreshToolbarState();
}
@Subscribe(threadMode = ThreadMode.MAIN)
public void onPlayerStatusChanged(PlayerStatusEvent event) {
loadItems();
- getActivity().invalidateOptionsMenu();
+ refreshToolbarState();
}
private void onFragmentLoaded() {
adapter.notifyDataSetChanged();
- getActivity().invalidateOptionsMenu();
+ refreshToolbarState();
}
private void loadItems() {
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 122524b48..983bf4de1 100644
--- a/app/src/main/java/de/danoeh/antennapod/fragment/QueueFragment.java
+++ b/app/src/main/java/de/danoeh/antennapod/fragment/QueueFragment.java
@@ -6,8 +6,6 @@ import android.content.SharedPreferences;
import android.os.Bundle;
import android.util.Log;
import android.view.LayoutInflater;
-import android.view.Menu;
-import android.view.MenuInflater;
import android.view.MenuItem;
import android.view.View;
import android.view.ViewGroup;
@@ -15,7 +13,7 @@ import android.widget.CheckBox;
import android.widget.ProgressBar;
import android.widget.TextView;
import androidx.appcompat.app.AlertDialog;
-import androidx.appcompat.app.AppCompatActivity;
+import androidx.appcompat.widget.Toolbar;
import androidx.fragment.app.Fragment;
import androidx.recyclerview.widget.ItemTouchHelper;
import androidx.recyclerview.widget.RecyclerView;
@@ -67,7 +65,7 @@ import static de.danoeh.antennapod.dialog.EpisodesApplyActionFragment.ACTION_REM
/**
* Shows all items in the queue.
*/
-public class QueueFragment extends Fragment {
+public class QueueFragment extends Fragment implements Toolbar.OnMenuItemClickListener {
public static final String TAG = "QueueFragment";
private TextView infoBar;
@@ -75,6 +73,7 @@ public class QueueFragment extends Fragment {
private QueueRecyclerAdapter recyclerAdapter;
private EmptyViewHandler emptyView;
private ProgressBar progLoading;
+ private Toolbar toolbar;
private List<FeedItem> queue;
@@ -91,7 +90,6 @@ public class QueueFragment extends Fragment {
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setRetainInstance(true);
- setHasOptionsMenu(true);
prefs = getActivity().getSharedPreferences(PREFS, Context.MODE_PRIVATE);
}
@@ -182,7 +180,7 @@ public class QueueFragment extends Fragment {
Log.d(TAG, "onEventMainThread() called with DownloadEvent");
DownloaderUpdate update = event.update;
if (event.hasChangedFeedUpdateStatus(isUpdatingFeeds)) {
- getActivity().invalidateOptionsMenu();
+ refreshToolbarState();
}
if (recyclerAdapter != null && update.mediaIds.length > 0) {
for (long mediaId : update.mediaIds) {
@@ -212,7 +210,7 @@ public class QueueFragment extends Fragment {
public void onPlayerStatusChanged(PlayerStatusEvent event) {
loadItems(false);
if (isUpdatingFeeds != updateRefreshMenuItemChecker.isRefreshing()) {
- getActivity().invalidateOptionsMenu();
+ refreshToolbarState();
}
}
@@ -221,7 +219,7 @@ public class QueueFragment extends Fragment {
// Sent when playback position is reset
loadItems(false);
if (isUpdatingFeeds != updateRefreshMenuItemChecker.isRefreshing()) {
- getActivity().invalidateOptionsMenu();
+ refreshToolbarState();
}
}
@@ -238,114 +236,94 @@ public class QueueFragment extends Fragment {
private final MenuItemUtils.UpdateRefreshMenuItemChecker updateRefreshMenuItemChecker =
() -> DownloadService.isRunning && DownloadRequester.getInstance().isDownloadingFeeds();
- @Override
- public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
- if(!isAdded()) {
- return;
- }
- super.onCreateOptionsMenu(menu, inflater);
- if (queue != null) {
- inflater.inflate(R.menu.queue, menu);
- MenuItemUtils.setupSearchItem(menu, (MainActivity) getActivity(), 0, "");
- MenuItemUtils.refreshLockItem(getActivity(), menu);
-
- // Show Lock Item only if queue is sorted manually
- boolean keepSorted = UserPreferences.isQueueKeepSorted();
- MenuItem lockItem = menu.findItem(R.id.queue_lock);
- lockItem.setVisible(!keepSorted);
-
- // Random sort is not supported in keep sorted mode
- MenuItem sortRandomItem = menu.findItem(R.id.queue_sort_random);
- sortRandomItem.setVisible(!keepSorted);
-
- // Set keep sorted checkbox
- MenuItem keepSortedItem = menu.findItem(R.id.queue_keep_sorted);
- keepSortedItem.setChecked(keepSorted);
+ private void refreshToolbarState() {
+ MenuItemUtils.refreshLockItem(getActivity(), toolbar.getMenu());
+ boolean keepSorted = UserPreferences.isQueueKeepSorted();
+ toolbar.getMenu().findItem(R.id.queue_lock).setVisible(!keepSorted);
- isUpdatingFeeds = MenuItemUtils.updateRefreshMenuItem(menu, R.id.refresh_item, updateRefreshMenuItemChecker);
- }
+ toolbar.getMenu().findItem(R.id.queue_sort_random).setVisible(!keepSorted);
+ toolbar.getMenu().findItem(R.id.queue_keep_sorted).setChecked(keepSorted);
+ isUpdatingFeeds = MenuItemUtils.updateRefreshMenuItem(toolbar.getMenu(),
+ R.id.refresh_item, updateRefreshMenuItemChecker);
}
@Override
- public boolean onOptionsItemSelected(MenuItem item) {
- if (!super.onOptionsItemSelected(item)) {
- switch (item.getItemId()) {
- case R.id.queue_lock:
- toggleQueueLock();
- return true;
- case R.id.refresh_item:
- AutoUpdateManager.runImmediate(requireContext());
- return true;
- case R.id.clear_queue:
- // make sure the user really wants to clear the queue
- ConfirmationDialog conDialog = new ConfirmationDialog(getActivity(),
- R.string.clear_queue_label,
- R.string.clear_queue_confirmation_msg) {
-
- @Override
- public void onConfirmButtonPressed(
- DialogInterface dialog) {
- dialog.dismiss();
- DBWriter.clearQueue();
- }
- };
- conDialog.createNewDialog().show();
- return true;
- case R.id.episode_actions:
- ((MainActivity) requireActivity()).loadChildFragment(
- EpisodesApplyActionFragment.newInstance(queue, ACTION_DELETE | ACTION_REMOVE_FROM_QUEUE | ACTION_DOWNLOAD));
- return true;
- case R.id.queue_sort_episode_title_asc:
- setSortOrder(SortOrder.EPISODE_TITLE_A_Z);
- return true;
- case R.id.queue_sort_episode_title_desc:
- setSortOrder(SortOrder.EPISODE_TITLE_Z_A);
- return true;
- case R.id.queue_sort_date_asc:
- setSortOrder(SortOrder.DATE_OLD_NEW);
- return true;
- case R.id.queue_sort_date_desc:
- setSortOrder(SortOrder.DATE_NEW_OLD);
- return true;
- case R.id.queue_sort_duration_asc:
- setSortOrder(SortOrder.DURATION_SHORT_LONG);
- return true;
- case R.id.queue_sort_duration_desc:
- setSortOrder(SortOrder.DURATION_LONG_SHORT);
- return true;
- case R.id.queue_sort_feed_title_asc:
- setSortOrder(SortOrder.FEED_TITLE_A_Z);
- return true;
- case R.id.queue_sort_feed_title_desc:
- setSortOrder(SortOrder.FEED_TITLE_Z_A);
- return true;
- case R.id.queue_sort_random:
- setSortOrder(SortOrder.RANDOM);
- return true;
- case R.id.queue_sort_smart_shuffle_asc:
- setSortOrder(SortOrder.SMART_SHUFFLE_OLD_NEW);
- return true;
- case R.id.queue_sort_smart_shuffle_desc:
- setSortOrder(SortOrder.SMART_SHUFFLE_NEW_OLD);
- return true;
- case R.id.queue_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();
+ public boolean onMenuItemClick(MenuItem item) {
+ switch (item.getItemId()) {
+ case R.id.queue_lock:
+ toggleQueueLock();
+ return true;
+ case R.id.refresh_item:
+ AutoUpdateManager.runImmediate(requireContext());
+ return true;
+ case R.id.clear_queue:
+ // make sure the user really wants to clear the queue
+ ConfirmationDialog conDialog = new ConfirmationDialog(getActivity(),
+ R.string.clear_queue_label,
+ R.string.clear_queue_confirmation_msg) {
+
+ @Override
+ public void onConfirmButtonPressed(
+ DialogInterface dialog) {
+ dialog.dismiss();
+ DBWriter.clearQueue();
}
- getActivity().invalidateOptionsMenu();
- return true;
- default:
- return false;
- }
- } else {
- return true;
+ };
+ conDialog.createNewDialog().show();
+ return true;
+ case R.id.episode_actions:
+ ((MainActivity) requireActivity()).loadChildFragment(
+ EpisodesApplyActionFragment.newInstance(queue,
+ ACTION_DELETE | ACTION_REMOVE_FROM_QUEUE | ACTION_DOWNLOAD));
+ return true;
+ case R.id.queue_sort_episode_title_asc:
+ setSortOrder(SortOrder.EPISODE_TITLE_A_Z);
+ return true;
+ case R.id.queue_sort_episode_title_desc:
+ setSortOrder(SortOrder.EPISODE_TITLE_Z_A);
+ return true;
+ case R.id.queue_sort_date_asc:
+ setSortOrder(SortOrder.DATE_OLD_NEW);
+ return true;
+ case R.id.queue_sort_date_desc:
+ setSortOrder(SortOrder.DATE_NEW_OLD);
+ return true;
+ case R.id.queue_sort_duration_asc:
+ setSortOrder(SortOrder.DURATION_SHORT_LONG);
+ return true;
+ case R.id.queue_sort_duration_desc:
+ setSortOrder(SortOrder.DURATION_LONG_SHORT);
+ return true;
+ case R.id.queue_sort_feed_title_asc:
+ setSortOrder(SortOrder.FEED_TITLE_A_Z);
+ return true;
+ case R.id.queue_sort_feed_title_desc:
+ setSortOrder(SortOrder.FEED_TITLE_Z_A);
+ return true;
+ case R.id.queue_sort_random:
+ setSortOrder(SortOrder.RANDOM);
+ return true;
+ case R.id.queue_sort_smart_shuffle_asc:
+ setSortOrder(SortOrder.SMART_SHUFFLE_OLD_NEW);
+ return true;
+ case R.id.queue_sort_smart_shuffle_desc:
+ setSortOrder(SortOrder.SMART_SHUFFLE_NEW_OLD);
+ return true;
+ case R.id.queue_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;
+ default:
+ return false;
}
}
@@ -378,7 +356,7 @@ public class QueueFragment extends Fragment {
private void setQueueLocked(boolean locked) {
UserPreferences.setQueueLocked(locked);
- getActivity().invalidateOptionsMenu();
+ refreshToolbarState();
if (recyclerAdapter != null) {
recyclerAdapter.updateDragDropEnabled();
}
@@ -440,7 +418,13 @@ public class QueueFragment extends Fragment {
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
super.onCreateView(inflater, container, savedInstanceState);
View root = inflater.inflate(R.layout.queue_fragment, container, false);
- ((AppCompatActivity) getActivity()).setSupportActionBar(root.findViewById(R.id.toolbar));
+ toolbar = root.findViewById(R.id.toolbar);
+ toolbar.setOnMenuItemClickListener(this);
+ ((MainActivity) getActivity()).setupToolbarToggle(toolbar);
+ toolbar.inflateMenu(R.menu.queue);
+ MenuItemUtils.setupSearchItem(toolbar.getMenu(), (MainActivity) getActivity(), 0, "");
+ refreshToolbarState();
+
infoBar = root.findViewById(R.id.info_bar);
recyclerView = root.findViewById(R.id.recyclerView);
RecyclerView.ItemAnimator animator = recyclerView.getItemAnimator();
@@ -568,7 +552,7 @@ public class QueueFragment extends Fragment {
// we need to refresh the options menu because it sometimes
// needs data that may have just been loaded.
- getActivity().invalidateOptionsMenu();
+ refreshToolbarState();
refreshInfoBar();
}
diff --git a/app/src/main/java/de/danoeh/antennapod/fragment/RunningDownloadsFragment.java b/app/src/main/java/de/danoeh/antennapod/fragment/RunningDownloadsFragment.java
index ca9fba694..087abc327 100644
--- a/app/src/main/java/de/danoeh/antennapod/fragment/RunningDownloadsFragment.java
+++ b/app/src/main/java/de/danoeh/antennapod/fragment/RunningDownloadsFragment.java
@@ -76,12 +76,6 @@ public class RunningDownloadsFragment extends ListFragment {
}
@Override
- public void onResume() {
- super.onResume();
- setHasOptionsMenu(true);
- }
-
- @Override
public void onStop() {
super.onStop();
EventBus.getDefault().unregister(this);
@@ -94,9 +88,9 @@ public class RunningDownloadsFragment extends ListFragment {
}
@Override
- public void onCreateOptionsMenu(@NonNull Menu menu, @NonNull MenuInflater inflater) {
- super.onCreateOptionsMenu(menu, inflater);
- inflater.inflate(R.menu.downloads_running, menu);
+ public void onPrepareOptionsMenu(@NonNull Menu menu) {
+ menu.findItem(R.id.clear_logs_item).setVisible(false);
+ menu.findItem(R.id.episode_actions).setVisible(false);
isUpdatingFeeds = MenuItemUtils.updateRefreshMenuItem(menu, R.id.refresh_item, updateRefreshMenuItemChecker);
}
@@ -113,7 +107,7 @@ public class RunningDownloadsFragment extends ListFragment {
public void onEventMainThread(DownloadEvent event) {
Log.d(TAG, "onEventMainThread() called with: " + "event = [" + event + "]");
if (event.hasChangedFeedUpdateStatus(isUpdatingFeeds)) {
- getActivity().invalidateOptionsMenu();
+ ((PagedToolbarFragment) getParentFragment()).invalidateOptionsMenuIfActive(this);
}
}
diff --git a/app/src/main/java/de/danoeh/antennapod/fragment/SearchFragment.java b/app/src/main/java/de/danoeh/antennapod/fragment/SearchFragment.java
index 2061a8ba4..e791da1c6 100644
--- a/app/src/main/java/de/danoeh/antennapod/fragment/SearchFragment.java
+++ b/app/src/main/java/de/danoeh/antennapod/fragment/SearchFragment.java
@@ -4,16 +4,14 @@ import android.os.Bundle;
import android.util.Log;
import android.util.Pair;
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 androidx.appcompat.app.AppCompatActivity;
import androidx.appcompat.widget.SearchView;
+import androidx.appcompat.widget.Toolbar;
import androidx.fragment.app.Fragment;
import androidx.recyclerview.widget.LinearLayoutManager;
import androidx.recyclerview.widget.RecyclerView;
@@ -96,7 +94,6 @@ public class SearchFragment extends Fragment {
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setRetainInstance(true);
- setHasOptionsMenu(true);
}
@Override
@@ -118,7 +115,7 @@ public class SearchFragment extends Fragment {
public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container,
@Nullable Bundle savedInstanceState) {
View layout = inflater.inflate(R.layout.search_fragment, container, false);
- ((AppCompatActivity) getActivity()).setSupportActionBar(layout.findViewById(R.id.toolbar));
+ setupToolbar(layout.findViewById(R.id.toolbar));
progressBar = layout.findViewById(R.id.progressBar);
recyclerView = layout.findViewById(R.id.recyclerView);
@@ -154,11 +151,12 @@ public class SearchFragment extends Fragment {
EventBus.getDefault().unregister(this);
}
- @Override
- public void onCreateOptionsMenu(@NonNull Menu menu, @NonNull MenuInflater inflater) {
- super.onCreateOptionsMenu(menu, inflater);
- inflater.inflate(R.menu.search, menu);
- MenuItem item = menu.findItem(R.id.action_search);
+ private void setupToolbar(Toolbar toolbar) {
+ toolbar.setTitle(R.string.search_label);
+ toolbar.setNavigationOnClickListener(v -> getParentFragmentManager().popBackStack());
+ toolbar.inflateMenu(R.menu.search);
+
+ MenuItem item = toolbar.getMenu().findItem(R.id.action_search);
item.expandActionView();
final SearchView sv = (SearchView) item.getActionView();
sv.setQueryHint(getString(R.string.search_label));
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 3b2a72210..3b4246e3a 100644
--- a/app/src/main/java/de/danoeh/antennapod/fragment/SubscriptionFragment.java
+++ b/app/src/main/java/de/danoeh/antennapod/fragment/SubscriptionFragment.java
@@ -9,14 +9,13 @@ import android.os.Handler;
import android.os.Looper;
import android.widget.ProgressBar;
import androidx.annotation.StringRes;
-import androidx.appcompat.app.AppCompatActivity;
+import androidx.appcompat.widget.Toolbar;
import androidx.fragment.app.Fragment;
import androidx.swiperefreshlayout.widget.SwipeRefreshLayout;
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;
@@ -28,6 +27,7 @@ import android.widget.TextView;
import com.google.android.material.floatingactionbutton.FloatingActionButton;
import com.joanzapata.iconify.Iconify;
+import java.util.Locale;
import java.util.concurrent.Callable;
import de.danoeh.antennapod.R;
@@ -65,11 +65,17 @@ import org.greenrobot.eventbus.ThreadMode;
/**
* Fragment for displaying feed subscriptions
*/
-public class SubscriptionFragment extends Fragment {
+public class SubscriptionFragment extends Fragment implements Toolbar.OnMenuItemClickListener {
public static final String TAG = "SubscriptionFragment";
private static final String PREFS = "SubscriptionFragment";
private static final String PREF_NUM_COLUMNS = "columns";
+ private static final int MIN_NUM_COLUMNS = 2;
+ private static final int[] COLUMN_CHECKBOX_IDS = {
+ R.id.subscription_num_columns_2,
+ R.id.subscription_num_columns_3,
+ R.id.subscription_num_columns_4,
+ R.id.subscription_num_columns_5};
private GridView subscriptionGridLayout;
private DBReader.NavDrawerData navDrawerData;
@@ -78,6 +84,7 @@ public class SubscriptionFragment extends Fragment {
private ProgressBar progressBar;
private EmptyViewHandler emptyView;
private TextView feedsFilteredMsg;
+ private Toolbar toolbar;
private int mPosition = -1;
private boolean isUpdatingFeeds = false;
@@ -89,7 +96,6 @@ public class SubscriptionFragment extends Fragment {
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setRetainInstance(true);
- setHasOptionsMenu(true);
prefs = requireActivity().getSharedPreferences(PREFS, Context.MODE_PRIVATE);
}
@@ -98,7 +104,17 @@ public class SubscriptionFragment extends Fragment {
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
View root = inflater.inflate(R.layout.fragment_subscriptions, container, false);
- ((AppCompatActivity) getActivity()).setSupportActionBar(root.findViewById(R.id.toolbar));
+ toolbar = root.findViewById(R.id.toolbar);
+ toolbar.setOnMenuItemClickListener(this);
+ ((MainActivity) getActivity()).setupToolbarToggle(toolbar);
+ toolbar.inflateMenu(R.menu.subscriptions);
+ for (int i = 0; i < COLUMN_CHECKBOX_IDS.length; i++) {
+ // Do this in Java to localize numbers
+ toolbar.getMenu().findItem(COLUMN_CHECKBOX_IDS[i])
+ .setTitle(String.format(Locale.getDefault(), "%d", i + MIN_NUM_COLUMNS));
+ }
+ refreshToolbarState();
+
subscriptionGridLayout = root.findViewById(R.id.subscriptions_grid);
subscriptionGridLayout.setNumColumns(prefs.getInt(PREF_NUM_COLUMNS, getDefaultNumOfColumns()));
registerForContextMenu(subscriptionGridLayout);
@@ -117,25 +133,16 @@ public class SubscriptionFragment extends Fragment {
return root;
}
- @Override
- public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
- super.onCreateOptionsMenu(menu, inflater);
- inflater.inflate(R.menu.subscriptions, menu);
-
+ private void refreshToolbarState() {
int columns = prefs.getInt(PREF_NUM_COLUMNS, getDefaultNumOfColumns());
- menu.findItem(R.id.subscription_num_columns_2).setChecked(columns == 2);
- menu.findItem(R.id.subscription_num_columns_3).setChecked(columns == 3);
- menu.findItem(R.id.subscription_num_columns_4).setChecked(columns == 4);
- menu.findItem(R.id.subscription_num_columns_5).setChecked(columns == 5);
+ toolbar.getMenu().findItem(COLUMN_CHECKBOX_IDS[columns - MIN_NUM_COLUMNS]).setChecked(true);
- isUpdatingFeeds = MenuItemUtils.updateRefreshMenuItem(menu, R.id.refresh_item, updateRefreshMenuItemChecker);
+ isUpdatingFeeds = MenuItemUtils.updateRefreshMenuItem(toolbar.getMenu(),
+ R.id.refresh_item, updateRefreshMenuItemChecker);
}
@Override
- public boolean onOptionsItemSelected(MenuItem item) {
- if (super.onOptionsItemSelected(item)) {
- return true;
- }
+ public boolean onMenuItemClick(MenuItem item) {
switch (item.getItemId()) {
case R.id.refresh_item:
AutoUpdateManager.runImmediate(requireContext());
@@ -166,7 +173,7 @@ public class SubscriptionFragment extends Fragment {
private void setColumnNumber(int columns) {
subscriptionGridLayout.setNumColumns(columns);
prefs.edit().putInt(PREF_NUM_COLUMNS, columns).apply();
- getActivity().invalidateOptionsMenu();
+ refreshToolbarState();
}
private void setupEmptyView() {
@@ -361,7 +368,7 @@ public class SubscriptionFragment extends Fragment {
public void onEventMainThread(DownloadEvent event) {
Log.d(TAG, "onEventMainThread() called with: " + "event = [" + event + "]");
if (event.hasChangedFeedUpdateStatus(isUpdatingFeeds)) {
- getActivity().invalidateOptionsMenu();
+ refreshToolbarState();
}
}
diff --git a/app/src/main/java/de/danoeh/antennapod/fragment/gpodnet/GpodnetMainFragment.java b/app/src/main/java/de/danoeh/antennapod/fragment/gpodnet/GpodnetMainFragment.java
index 4ccc53118..641e82b5a 100644
--- a/app/src/main/java/de/danoeh/antennapod/fragment/gpodnet/GpodnetMainFragment.java
+++ b/app/src/main/java/de/danoeh/antennapod/fragment/gpodnet/GpodnetMainFragment.java
@@ -6,7 +6,6 @@ import android.view.View;
import android.view.ViewGroup;
import androidx.annotation.NonNull;
-import androidx.appcompat.app.AppCompatActivity;
import androidx.appcompat.widget.Toolbar;
import androidx.fragment.app.Fragment;
import androidx.viewpager2.adapter.FragmentStateAdapter;
@@ -33,7 +32,7 @@ public class GpodnetMainFragment extends Fragment {
View root = inflater.inflate(R.layout.pager_fragment, container, false);
Toolbar toolbar = root.findViewById(R.id.toolbar);
toolbar.setTitle(R.string.gpodnet_main_label);
- ((AppCompatActivity) getActivity()).setSupportActionBar(toolbar);
+ toolbar.setNavigationOnClickListener(v -> getParentFragmentManager().popBackStack());
ViewPager2 viewPager = root.findViewById(R.id.viewpager);
GpodnetPagerAdapter pagerAdapter = new GpodnetPagerAdapter(this);
diff --git a/app/src/main/java/de/danoeh/antennapod/fragment/gpodnet/PodcastListFragment.java b/app/src/main/java/de/danoeh/antennapod/fragment/gpodnet/PodcastListFragment.java
index 4cb50e2f4..b3f56941b 100644
--- a/app/src/main/java/de/danoeh/antennapod/fragment/gpodnet/PodcastListFragment.java
+++ b/app/src/main/java/de/danoeh/antennapod/fragment/gpodnet/PodcastListFragment.java
@@ -4,15 +4,11 @@ import android.content.Context;
import android.content.Intent;
import android.os.AsyncTask;
import android.os.Bundle;
-import androidx.appcompat.app.AppCompatActivity;
import androidx.appcompat.widget.Toolbar;
import androidx.fragment.app.Fragment;
-import androidx.core.view.MenuItemCompat;
import androidx.appcompat.widget.SearchView;
import android.util.Log;
import android.view.LayoutInflater;
-import android.view.Menu;
-import android.view.MenuInflater;
import android.view.MenuItem;
import android.view.View;
import android.view.ViewGroup;
@@ -46,16 +42,34 @@ public abstract class PodcastListFragment extends Fragment {
private Button butRetry;
@Override
- public void onCreate(Bundle savedInstanceState) {
- super.onCreate(savedInstanceState);
- setHasOptionsMenu(true);
+ public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
+ View root = inflater.inflate(R.layout.gpodnet_podcast_list, container, false);
+ setupToolbar(root.findViewById(R.id.toolbar));
+
+ gridView = root.findViewById(R.id.gridView);
+ progressBar = root.findViewById(R.id.progressBar);
+ txtvError = root.findViewById(R.id.txtvError);
+ butRetry = root.findViewById(R.id.butRetry);
+
+ gridView.setOnItemClickListener((parent, view, position, id) ->
+ onPodcastSelected((GpodnetPodcast) gridView.getAdapter().getItem(position)));
+ butRetry.setOnClickListener(v -> loadData());
+
+ loadData();
+ return root;
}
- @Override
- public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
- super.onCreateOptionsMenu(menu, inflater);
- inflater.inflate(R.menu.gpodder_podcasts, menu);
- MenuItem searchItem = menu.findItem(R.id.action_search);
+ private void setupToolbar(Toolbar toolbar) {
+ if (getArguments() != null && getArguments().getBoolean(ARGUMENT_HIDE_TOOLBAR, false)) {
+ toolbar.setVisibility(View.GONE);
+ return;
+ }
+
+ toolbar.setTitle(R.string.gpodnet_main_label);
+ toolbar.setNavigationOnClickListener(v -> getParentFragmentManager().popBackStack());
+ toolbar.inflateMenu(R.menu.gpodder_podcasts);
+
+ MenuItem searchItem = toolbar.getMenu().findItem(R.id.action_search);
final SearchView sv = (SearchView) searchItem.getActionView();
sv.setQueryHint(getString(R.string.gpodnet_search_hint));
sv.setOnQueryTextListener(new SearchView.OnQueryTextListener() {
@@ -76,30 +90,6 @@ public abstract class PodcastListFragment extends Fragment {
});
}
- @Override
- public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
- View root = inflater.inflate(R.layout.gpodnet_podcast_list, container, false);
- Toolbar toolbar = root.findViewById(R.id.toolbar);
- if (getArguments() == null || !getArguments().getBoolean(ARGUMENT_HIDE_TOOLBAR, false)) {
- toolbar.setTitle(R.string.gpodnet_main_label);
- ((AppCompatActivity) getActivity()).setSupportActionBar(toolbar);
- } else {
- toolbar.setVisibility(View.GONE);
- }
-
- gridView = root.findViewById(R.id.gridView);
- progressBar = root.findViewById(R.id.progressBar);
- txtvError = root.findViewById(R.id.txtvError);
- butRetry = root.findViewById(R.id.butRetry);
-
- gridView.setOnItemClickListener((parent, view, position, id) ->
- onPodcastSelected((GpodnetPodcast) gridView.getAdapter().getItem(position)));
- butRetry.setOnClickListener(v -> loadData());
-
- loadData();
- return root;
- }
-
private void onPodcastSelected(GpodnetPodcast selection) {
Log.d(TAG, "Selected podcast: " + selection.toString());
Intent intent = new Intent(getActivity(), OnlineFeedViewActivity.class);
diff --git a/app/src/main/java/de/danoeh/antennapod/menuhandler/FeedItemMenuHandler.java b/app/src/main/java/de/danoeh/antennapod/menuhandler/FeedItemMenuHandler.java
index 7604b94d6..3d8f3fe09 100644
--- a/app/src/main/java/de/danoeh/antennapod/menuhandler/FeedItemMenuHandler.java
+++ b/app/src/main/java/de/danoeh/antennapod/menuhandler/FeedItemMenuHandler.java
@@ -78,7 +78,7 @@ public class FeedItemMenuHandler {
setItemVisibility(menu, R.id.reset_position, false);
}
- if(!UserPreferences.isEnableAutodownload() || fileDownloaded) {
+ if (!UserPreferences.isEnableAutodownload() || fileDownloaded || selectedItem.getFeed().isLocalFeed()) {
setItemVisibility(menu, R.id.activate_auto_download, false);
setItemVisibility(menu, R.id.deactivate_auto_download, false);
} else if (selectedItem.getAutoDownload()) {
diff --git a/app/src/main/java/de/danoeh/antennapod/menuhandler/FeedMenuHandler.java b/app/src/main/java/de/danoeh/antennapod/menuhandler/FeedMenuHandler.java
index 5446d0191..9ceed9369 100644
--- a/app/src/main/java/de/danoeh/antennapod/menuhandler/FeedMenuHandler.java
+++ b/app/src/main/java/de/danoeh/antennapod/menuhandler/FeedMenuHandler.java
@@ -34,11 +34,6 @@ public class FeedMenuHandler {
private static final String TAG = "FeedMenuHandler";
- public static boolean onCreateOptionsMenu(MenuInflater inflater, Menu menu) {
- inflater.inflate(R.menu.feedlist, menu);
- return true;
- }
-
public static boolean onPrepareOptionsMenu(Menu menu, Feed selectedFeed) {
if (selectedFeed == null) {
return true;
diff --git a/app/src/main/java/de/danoeh/antennapod/menuhandler/MenuItemUtils.java b/app/src/main/java/de/danoeh/antennapod/menuhandler/MenuItemUtils.java
index 6b3c99975..9c54a529b 100644
--- a/app/src/main/java/de/danoeh/antennapod/menuhandler/MenuItemUtils.java
+++ b/app/src/main/java/de/danoeh/antennapod/menuhandler/MenuItemUtils.java
@@ -1,9 +1,10 @@
package de.danoeh.antennapod.menuhandler;
+import android.annotation.SuppressLint;
import android.content.Context;
-import android.content.res.TypedArray;
import android.view.Menu;
import android.view.MenuItem;
+import androidx.appcompat.view.menu.MenuItemImpl;
import androidx.appcompat.widget.SearchView;
import de.danoeh.antennapod.R;
import de.danoeh.antennapod.activity.MainActivity;
@@ -11,24 +12,23 @@ import de.danoeh.antennapod.core.preferences.UserPreferences;
import de.danoeh.antennapod.core.util.ThemeUtils;
import de.danoeh.antennapod.fragment.SearchFragment;
+import java.util.HashMap;
+import java.util.Map;
+
/**
- * Utilities for menu items
+ * Utilities for menu items.
*/
public class MenuItemUtils extends de.danoeh.antennapod.core.menuhandler.MenuItemUtils {
- @SuppressWarnings("ResourceType")
public static void refreshLockItem(Context context, Menu menu) {
- final MenuItem queueLock = menu.findItem(de.danoeh.antennapod.R.id.queue_lock);
- int[] lockIcons = new int[] { de.danoeh.antennapod.R.attr.ic_lock_open, de.danoeh.antennapod.R.attr.ic_lock_closed };
- TypedArray ta = context.obtainStyledAttributes(lockIcons);
+ final MenuItem queueLock = menu.findItem(R.id.queue_lock);
if (UserPreferences.isQueueLocked()) {
queueLock.setTitle(de.danoeh.antennapod.R.string.unlock_queue);
- queueLock.setIcon(ta.getDrawable(0));
+ queueLock.setIcon(ThemeUtils.getDrawableFromAttr(context, R.attr.ic_lock_open));
} else {
queueLock.setTitle(de.danoeh.antennapod.R.string.lock_queue);
- queueLock.setIcon(ta.getDrawable(1));
+ queueLock.setIcon(ThemeUtils.getDrawableFromAttr(context, R.attr.ic_lock_closed));
}
- ta.recycle();
}
public static void setupSearchItem(Menu menu, MainActivity activity, long feedId, String feedTitle) {
@@ -51,21 +51,49 @@ public class MenuItemUtils extends de.danoeh.antennapod.core.menuhandler.MenuIte
}
});
searchItem.setOnActionExpandListener(new MenuItem.OnActionExpandListener() {
+ private final Map<Integer, Integer> oldShowAsActionState = new HashMap<>();
+
@Override
- public boolean onMenuItemActionExpand(MenuItem item) {
+ public boolean onMenuItemActionExpand(MenuItem clickedItem) {
+ oldShowAsActionState.clear();
for (int i = 0; i < menu.size(); i++) {
- if (menu.getItem(i).getItemId() != searchItem.getItemId()) {
- menu.getItem(i).setShowAsAction(MenuItem.SHOW_AS_ACTION_NEVER);
+ MenuItem item = menu.getItem(i);
+ if (item.getItemId() != searchItem.getItemId()) {
+ oldShowAsActionState.put(item.getItemId(), getShowAsActionFlag(item));
+ item.setShowAsAction(MenuItem.SHOW_AS_ACTION_NEVER);
}
}
return true;
}
@Override
- public boolean onMenuItemActionCollapse(MenuItem item) {
- activity.invalidateOptionsMenu();
+ public boolean onMenuItemActionCollapse(MenuItem collapsedItem) {
+ for (int i = 0; i < menu.size(); i++) {
+ MenuItem item = menu.getItem(i);
+ if (item.getItemId() != searchItem.getItemId()
+ && oldShowAsActionState.containsKey(item.getItemId())) {
+ item.setShowAsAction(oldShowAsActionState.get(item.getItemId()));
+ }
+ }
return true;
}
});
}
+
+ @SuppressLint("RestrictedApi")
+ private static int getShowAsActionFlag(MenuItem item) {
+ if (!(item instanceof MenuItemImpl)) {
+ return MenuItemImpl.SHOW_AS_ACTION_NEVER;
+ }
+ MenuItemImpl itemImpl = ((MenuItemImpl) item);
+ if (itemImpl.requiresActionButton()) {
+ return MenuItemImpl.SHOW_AS_ACTION_ALWAYS;
+ } else if (itemImpl.requestsActionButton()) {
+ return MenuItemImpl.SHOW_AS_ACTION_IF_ROOM;
+ } else if (itemImpl.showsTextAsAction()) {
+ return MenuItemImpl.SHOW_AS_ACTION_WITH_TEXT;
+ } else {
+ return MenuItemImpl.SHOW_AS_ACTION_NEVER;
+ }
+ }
}
diff --git a/app/src/main/java/de/danoeh/antennapod/view/EmptyViewHandler.java b/app/src/main/java/de/danoeh/antennapod/view/EmptyViewHandler.java
index 89d9e26c7..eaad11d1a 100644
--- a/app/src/main/java/de/danoeh/antennapod/view/EmptyViewHandler.java
+++ b/app/src/main/java/de/danoeh/antennapod/view/EmptyViewHandler.java
@@ -3,7 +3,9 @@ package de.danoeh.antennapod.view;
import android.content.Context;
import android.database.DataSetObserver;
import android.graphics.drawable.Drawable;
+import android.view.Gravity;
import android.widget.AbsListView;
+import android.widget.FrameLayout;
import android.widget.ListAdapter;
import androidx.annotation.AttrRes;
import androidx.core.content.ContextCompat;
@@ -21,7 +23,7 @@ public class EmptyViewHandler {
private boolean layoutAdded = false;
private View list;
private ListAdapter listAdapter;
- private RecyclerView.Adapter recyclerAdapter;
+ private RecyclerView.Adapter<?> recyclerAdapter;
private final Context context;
private final View emptyView;
@@ -92,12 +94,19 @@ public class EmptyViewHandler {
layoutParams.addRule(RelativeLayout.CENTER_IN_PARENT, RelativeLayout.TRUE);
emptyView.setLayoutParams(layoutParams);
break;
+ } else if (parent instanceof FrameLayout) {
+ parent.addView(emptyView);
+ FrameLayout.LayoutParams layoutParams =
+ (FrameLayout.LayoutParams) emptyView.getLayoutParams();
+ layoutParams.gravity = Gravity.CENTER;
+ emptyView.setLayoutParams(layoutParams);
+ break;
}
parent = (ViewGroup) parent.getParent();
}
}
- public void updateAdapter(RecyclerView.Adapter adapter) {
+ public void updateAdapter(RecyclerView.Adapter<?> adapter) {
if (this.recyclerAdapter != null) {
this.recyclerAdapter.unregisterAdapterDataObserver(adapterObserver);
}
diff --git a/app/src/main/res/layout/onlinefeedview_activity.xml b/app/src/main/res/layout/onlinefeedview_activity.xml
index 88ffbb8b6..909d676f0 100644
--- a/app/src/main/res/layout/onlinefeedview_activity.xml
+++ b/app/src/main/res/layout/onlinefeedview_activity.xml
@@ -105,35 +105,55 @@
tools:text="Podcast author"/>
</RelativeLayout>
- <Spinner
- android:id="@+id/alternate_urls_spinner"
+ <LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
- android:layout_marginLeft="8dp"
- android:layout_marginRight="8dp"
- android:layout_marginTop="8dp"
- android:padding="8dp"
- android:textColor="?android:attr/textColorPrimary"
- android:textSize="@dimen/text_size_micro"/>
-
- <Button
- android:id="@+id/subscribeButton"
- android:layout_width="match_parent"
- android:layout_height="wrap_content"
- android:layout_margin="16dp"
- android:focusable="false"
- android:text="@string/subscribe_label"/>
-
- <Button
- android:id="@+id/stopPreviewButton"
- android:layout_width="match_parent"
- android:layout_height="wrap_content"
- android:layout_marginLeft="16dp"
- android:layout_marginRight="16dp"
+ android:layout_marginStart="8dp"
+ android:layout_marginEnd="8dp"
android:layout_marginBottom="16dp"
- android:focusable="false"
- android:text="@string/stop_preview"
- android:visibility="gone" />
+ android:orientation="vertical">
+
+ <Spinner
+ android:id="@+id/alternate_urls_spinner"
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:layout_marginTop="8dp"
+ android:padding="8dp"
+ android:textColor="?android:attr/textColorPrimary"
+ android:textSize="@dimen/text_size_micro" />
+
+ <Button
+ android:id="@+id/subscribeButton"
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:layout_marginStart="8dp"
+ android:layout_marginTop="16dp"
+ android:layout_marginEnd="8dp"
+ android:focusable="false"
+ android:text="@string/subscribe_label" />
+
+ <CheckBox
+ android:id="@+id/autoDownloadCheckBox"
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:layout_gravity="left"
+ android:focusable="false"
+ android:checked="true"
+ android:text="@string/auto_download_label"
+ android:visibility="gone"
+ tools:visibility="visible" />
+
+ <Button
+ android:id="@+id/stopPreviewButton"
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:layout_margin="8dp"
+ android:focusable="false"
+ android:text="@string/stop_preview"
+ android:visibility="gone"
+ tools:visibility="visible" />
+
+ </LinearLayout>
<ListView
android:id="@+id/listView"
diff --git a/app/src/main/res/layout/share_episode_dialog.xml b/app/src/main/res/layout/share_episode_dialog.xml
index 8cf955d4c..539efa5c8 100644
--- a/app/src/main/res/layout/share_episode_dialog.xml
+++ b/app/src/main/res/layout/share_episode_dialog.xml
@@ -13,17 +13,22 @@
android:layout_marginBottom="16dp"
android:orientation="vertical">
- <RadioButton android:id="@+id/share_episode_website_radio"
+ <RadioButton
+ android:id="@+id/share_episode_website_radio"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="@string/share_dialog_episode_website_label"
- android:checked="true"
- />
- <RadioButton android:id="@+id/share_media_file_radio"
+ android:checked="true" />
+ <RadioButton
+ android:id="@+id/share_media_file_url_radio"
android:layout_width="match_parent"
android:layout_height="wrap_content"
- android:text="@string/share_dialog_media_file_label"
- />
+ android:text="@string/share_dialog_media_file_url_label" />
+ <RadioButton
+ android:id="@+id/share_media_file_radio"
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:text="@string/share_dialog_media_file_label" />
</RadioGroup>
<TextView
diff --git a/app/src/main/res/menu/downloads_completed.xml b/app/src/main/res/menu/downloads.xml
index e07af520f..c8ee20e35 100644
--- a/app/src/main/res/menu/downloads_completed.xml
+++ b/app/src/main/res/menu/downloads.xml
@@ -6,6 +6,14 @@
android:menuCategory="container"
android:title="@string/multi_select"
android:icon="?attr/checkbox_multiple"
+ android:visible="false"
+ app:showAsAction="ifRoom" />
+ <item
+ android:id="@+id/clear_logs_item"
+ android:menuCategory="container"
+ android:title="@string/clear_history_label"
+ android:icon="?attr/ic_delete"
+ android:visible="false"
app:showAsAction="ifRoom" />
<item
android:id="@+id/refresh_item"
diff --git a/app/src/main/res/menu/downloads_log.xml b/app/src/main/res/menu/downloads_log.xml
deleted file mode 100644
index d37d9bf3f..000000000
--- a/app/src/main/res/menu/downloads_log.xml
+++ /dev/null
@@ -1,16 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<menu xmlns:android="http://schemas.android.com/apk/res/android"
- xmlns:app="http://schemas.android.com/apk/res-auto">
- <item
- android:id="@+id/clear_history_item"
- android:menuCategory="container"
- android:title="@string/clear_history_label"
- android:icon="?attr/ic_delete"
- app:showAsAction="ifRoom" />
- <item
- android:id="@+id/refresh_item"
- android:title="@string/refresh_label"
- android:menuCategory="container"
- app:showAsAction="ifRoom"
- android:icon="?attr/navigation_refresh"/>
-</menu> \ No newline at end of file
diff --git a/app/src/main/res/menu/downloads_running.xml b/app/src/main/res/menu/downloads_running.xml
deleted file mode 100644
index a2240d4aa..000000000
--- a/app/src/main/res/menu/downloads_running.xml
+++ /dev/null
@@ -1,10 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<menu xmlns:android="http://schemas.android.com/apk/res/android"
- xmlns:app="http://schemas.android.com/apk/res-auto">
- <item
- android:id="@+id/refresh_item"
- android:title="@string/refresh_label"
- android:menuCategory="container"
- app:showAsAction="ifRoom"
- android:icon="?attr/navigation_refresh"/>
-</menu> \ No newline at end of file
diff --git a/app/src/main/res/menu/feeditemlist_context.xml b/app/src/main/res/menu/feeditemlist_context.xml
index 6e4966206..84e45d4c9 100644
--- a/app/src/main/res/menu/feeditemlist_context.xml
+++ b/app/src/main/res/menu/feeditemlist_context.xml
@@ -64,28 +64,5 @@
<item
android:id="@+id/share_item"
android:menuCategory="container"
- android:title="@string/share_label">
- <menu>
- <item
- android:id="@+id/share_link_item"
- android:menuCategory="container"
- android:title="@string/share_link_label" />
- <item
- android:id="@+id/share_link_with_position_item"
- android:menuCategory="container"
- android:title="@string/share_link_with_position_label" />
- <item
- android:id="@+id/share_download_url_item"
- android:menuCategory="container"
- android:title="@string/share_item_url_label" />
- <item
- android:id="@+id/share_download_url_with_position_item"
- android:menuCategory="container"
- android:title="@string/share_item_url_with_position_label" />
- <item
- android:id="@+id/share_file"
- android:menuCategory="container"
- android:title="@string/share_file_label" />
- </menu>
- </item>
+ android:title="@string/share_label" />
</menu> \ No newline at end of file
diff --git a/app/src/main/res/menu/playback_history.xml b/app/src/main/res/menu/playback_history.xml
new file mode 100644
index 000000000..5362f0a25
--- /dev/null
+++ b/app/src/main/res/menu/playback_history.xml
@@ -0,0 +1,9 @@
+<?xml version="1.0" encoding="utf-8"?>
+<menu xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:app="http://schemas.android.com/apk/res-auto">
+ <item
+ android:id="@+id/clear_history_item"
+ android:icon="?attr/ic_delete"
+ android:title="@string/clear_history_label"
+ app:showAsAction="ifRoom"/>
+</menu>
diff --git a/app/src/main/res/menu/subscriptions.xml b/app/src/main/res/menu/subscriptions.xml
index b7dc95299..99acc4bb6 100644
--- a/app/src/main/res/menu/subscriptions.xml
+++ b/app/src/main/res/menu/subscriptions.xml
@@ -23,22 +23,21 @@
android:title="@string/subscription_num_columns"
custom:showAsAction="never">
<menu>
- <item
- android:id="@+id/subscription_num_columns_2"
- android:checkable="true"
- android:title="2"/>
- <item
- android:id="@+id/subscription_num_columns_3"
- android:checkable="true"
- android:title="3"/>
- <item
- android:id="@+id/subscription_num_columns_4"
- android:checkable="true"
- android:title="4"/>
- <item
- android:id="@+id/subscription_num_columns_5"
- android:checkable="true"
- android:title="5"/>
+ <group
+ android:checkableBehavior="single">
+ <item
+ android:id="@+id/subscription_num_columns_2"
+ android:title="2"/>
+ <item
+ android:id="@+id/subscription_num_columns_3"
+ android:title="3"/>
+ <item
+ android:id="@+id/subscription_num_columns_4"
+ android:title="4"/>
+ <item
+ android:id="@+id/subscription_num_columns_5"
+ android:title="5"/>
+ </group>
</menu>
</item>
</menu>
diff --git a/core/src/main/java/de/danoeh/antennapod/core/service/download/DownloadService.java b/core/src/main/java/de/danoeh/antennapod/core/service/download/DownloadService.java
index f1b35fe23..de106a01e 100644
--- a/core/src/main/java/de/danoeh/antennapod/core/service/download/DownloadService.java
+++ b/core/src/main/java/de/danoeh/antennapod/core/service/download/DownloadService.java
@@ -219,9 +219,9 @@ public class DownloadService extends Service {
} catch (InterruptedException e) {
e.printStackTrace();
}
+ cancelNotificationUpdater();
syncExecutor.shutdown();
schedExecutor.shutdown();
- cancelNotificationUpdater();
if (downloadPostFuture != null) {
downloadPostFuture.cancel(true);
}
@@ -640,6 +640,7 @@ public class DownloadService extends Service {
if (n != null) {
NotificationManager nm = (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);
nm.notify(R.id.notification_downloading, n);
+ Log.d(TAG, "Download progress notification was posted");
}
}
}
diff --git a/core/src/main/java/de/danoeh/antennapod/core/service/download/DownloadServiceNotification.java b/core/src/main/java/de/danoeh/antennapod/core/service/download/DownloadServiceNotification.java
index 2d482c689..fb6009c02 100644
--- a/core/src/main/java/de/danoeh/antennapod/core/service/download/DownloadServiceNotification.java
+++ b/core/src/main/java/de/danoeh/antennapod/core/service/download/DownloadServiceNotification.java
@@ -173,6 +173,7 @@ public class DownloadServiceNotification {
}
NotificationManager nm = (NotificationManager) context.getSystemService(Context.NOTIFICATION_SERVICE);
nm.notify(id, builder.build());
+ Log.d(TAG, "Download report notification was posted");
} else {
Log.d(TAG, "No report is created");
}
diff --git a/core/src/main/java/de/danoeh/antennapod/core/storage/PodDBAdapter.java b/core/src/main/java/de/danoeh/antennapod/core/storage/PodDBAdapter.java
index 935b06cd6..539bedd9f 100644
--- a/core/src/main/java/de/danoeh/antennapod/core/storage/PodDBAdapter.java
+++ b/core/src/main/java/de/danoeh/antennapod/core/storage/PodDBAdapter.java
@@ -195,11 +195,11 @@ public class PodDBAdapter {
+ TABLE_NAME_FEED_ITEMS + "_" + KEY_FEED + " ON " + TABLE_NAME_FEED_ITEMS + " ("
+ KEY_FEED + ")";
- static final String CREATE_INDEX_FEEDITEMS_PUBDATE = "CREATE INDEX IF NOT EXISTS "
+ static final String CREATE_INDEX_FEEDITEMS_PUBDATE = "CREATE INDEX "
+ TABLE_NAME_FEED_ITEMS + "_" + KEY_PUBDATE + " ON " + TABLE_NAME_FEED_ITEMS + " ("
+ KEY_PUBDATE + ")";
- static final String CREATE_INDEX_FEEDITEMS_READ = "CREATE INDEX IF NOT EXISTS "
+ static final String CREATE_INDEX_FEEDITEMS_READ = "CREATE INDEX "
+ TABLE_NAME_FEED_ITEMS + "_" + KEY_READ + " ON " + TABLE_NAME_FEED_ITEMS + " ("
+ KEY_READ + ")";
diff --git a/core/src/main/res/values/strings.xml b/core/src/main/res/values/strings.xml
index 9f536c037..82bb0ced0 100644
--- a/core/src/main/res/values/strings.xml
+++ b/core/src/main/res/values/strings.xml
@@ -33,11 +33,11 @@
<string name="notification_pref_fragment">Notifications</string>
<!-- Statistics fragment -->
- <string name="total_time_listened_to_podcasts">Total time of podcasts played:</string>
+ <string name="total_time_listened_to_podcasts">Total time of episodes played:</string>
<string name="statistics_details_dialog">%1$d out of %2$d episodes started.\n\nPlayed %3$s out of %4$s.</string>
<string name="statistics_mode">Statistics mode</string>
<string name="statistics_mode_normal">Calculate duration that was actually played. Playing twice is counted twice, while marking as played is not counted</string>
- <string name="statistics_mode_count_all">Sum up all podcasts marked as played</string>
+ <string name="statistics_mode_count_all">Sum up all episodes marked as played</string>
<string name="statistics_speed_not_counted">Notice: Playback speed is never taken into account.</string>
<string name="statistics_reset_data">Reset statistics data</string>
<string name="statistics_reset_data_msg">This will erase the history of duration played for all episodes. Are you sure you want to proceed?</string>
@@ -143,13 +143,9 @@
<string name="remove_feed_label">Remove podcast</string>
<string name="share_label">Share</string>
<string name="share_label_with_ellipses">Share…</string>
- <string name="share_link_label">Share Episode URL</string>
- <string name="share_link_with_position_label">Share Episode URL with Position</string>
<string name="share_file_label">Share File</string>
<string name="share_website_url_label">Website address</string>
<string name="share_feed_url_label">Podcast feed URL</string>
- <string name="share_item_url_label">Share Media File URL</string>
- <string name="share_item_url_with_position_label">Share Media File URL with Position</string>
<string name="feed_delete_confirmation_msg">Please confirm that you want to delete the podcast \"%1$s\" and ALL its episodes (including downloaded episodes).</string>
<string name="feed_delete_confirmation_local_msg">Please confirm that you want to remove the podcast \"%1$s\". The files in the local source folder will not be deleted.</string>
<string name="feed_remover_msg">Removing podcast</string>
@@ -740,7 +736,6 @@
<string name="discover_powered_by_itunes">Suggestions by iTunes</string>
<string name="search_powered_by">Results by %1$s</string>
<string name="add_local_folder">Add local folder</string>
- <string name="add_local_folder_success">Adding local folder succeeded</string>
<string name="reconnect_local_folder">Re-connect local folder</string>
<string name="reconnect_local_folder_warning">In case of permission denials, you can use this to re-connect to the exact same folder. Do not select another folder.</string>
<string name="local_feed_description">This virtual podcast was created by adding a folder to AntennaPod.</string>
@@ -802,8 +797,9 @@
<!-- Share episode dialog -->
<string name="share_dialog_include_label">Include:</string>
<string name="share_playback_position_dialog_label">Playback position</string>
- <string name="share_dialog_media_file_label">Media file URL</string>
+ <string name="share_dialog_media_file_url_label">Media file address</string>
<string name="share_dialog_episode_website_label">Episode webpage</string>
+ <string name="share_dialog_media_file_label">Media file</string>
<!-- Audio controls -->
<string name="audio_controls">Audio controls</string>