Don't cast class to MainActivity to show message (#7771)

We can do that using an event.
This commit fixes one of the most prominent crashes on Google Play
where we cast the OnlineFeedViewActivity to MainActivity.
This commit is contained in:
ByteHamster 2025-04-30 22:12:11 +02:00 committed by GitHub
parent 310ce203ce
commit 373cde5c0a
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
28 changed files with 126 additions and 164 deletions

View File

@ -7,6 +7,7 @@ import androidx.test.platform.app.InstrumentationRegistry;
import de.danoeh.antennapod.R; import de.danoeh.antennapod.R;
import de.danoeh.antennapod.activity.MainActivity; import de.danoeh.antennapod.activity.MainActivity;
import de.danoeh.antennapod.model.feed.Feed; import de.danoeh.antennapod.model.feed.Feed;
import de.danoeh.antennapod.ui.appstartintent.MainActivityStarter;
import de.test.antennapod.EspressoTestUtils; import de.test.antennapod.EspressoTestUtils;
import org.junit.After; import org.junit.After;
import org.junit.Before; import org.junit.Before;
@ -44,7 +45,7 @@ public class FeedSettingsTest {
uiTestUtils.addLocalFeedData(false); uiTestUtils.addLocalFeedData(false);
feed = uiTestUtils.hostedFeeds.get(0); feed = uiTestUtils.hostedFeeds.get(0);
Intent intent = new Intent(InstrumentationRegistry.getInstrumentation().getTargetContext(), MainActivity.class); Intent intent = new Intent(InstrumentationRegistry.getInstrumentation().getTargetContext(), MainActivity.class);
intent.putExtra(MainActivity.EXTRA_FEED_ID, feed.getId()); intent.putExtra(MainActivityStarter.EXTRA_FEED_ID, feed.getId());
activityRule.launchActivity(intent); activityRule.launchActivity(intent);
} }

View File

@ -1,6 +1,5 @@
package de.danoeh.antennapod.activity; package de.danoeh.antennapod.activity;
import android.content.Context;
import android.content.Intent; import android.content.Intent;
import android.content.SharedPreferences; import android.content.SharedPreferences;
import android.content.res.Configuration; import android.content.res.Configuration;
@ -97,7 +96,6 @@ public class MainActivity extends CastEnabledActivity {
public static final String PREF_NAME = "MainActivityPrefs"; public static final String PREF_NAME = "MainActivityPrefs";
public static final String PREF_IS_FIRST_LAUNCH = "prefMainActivityIsFirstLaunch"; public static final String PREF_IS_FIRST_LAUNCH = "prefMainActivityIsFirstLaunch";
public static final String EXTRA_FEED_ID = "fragment_feed_id";
public static final String EXTRA_REFRESH_ON_START = "refresh_on_start"; public static final String EXTRA_REFRESH_ON_START = "refresh_on_start";
public static final String KEY_GENERATED_VIEW_ID = "generated_view_id"; public static final String KEY_GENERATED_VIEW_ID = "generated_view_id";
@ -112,14 +110,6 @@ public class MainActivity extends CastEnabledActivity {
private int lastTheme = 0; private int lastTheme = 0;
private Insets systemBarInsets = Insets.NONE; private Insets systemBarInsets = Insets.NONE;
@NonNull
public static Intent getIntentToOpenFeed(@NonNull Context context, long feedId) {
Intent intent = new Intent(context.getApplicationContext(), MainActivity.class);
intent.putExtra(MainActivity.EXTRA_FEED_ID, feedId);
intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
return intent;
}
@Override @Override
public void onCreate(Bundle savedInstanceState) { public void onCreate(Bundle savedInstanceState) {
lastTheme = ThemeSwitcher.getNoTitleTheme(this); lastTheme = ThemeSwitcher.getNoTitleTheme(this);
@ -651,8 +641,17 @@ public class MainActivity extends CastEnabledActivity {
@Subscribe(threadMode = ThreadMode.MAIN) @Subscribe(threadMode = ThreadMode.MAIN)
public void onEventMainThread(MessageEvent event) { public void onEventMainThread(MessageEvent event) {
Log.d(TAG, "onEvent(" + event + ")"); Log.d(TAG, "onEvent(" + event + ")");
Snackbar snackbar;
if (getBottomSheet().getState() == BottomSheetBehavior.STATE_COLLAPSED) {
snackbar = Snackbar.make(findViewById(R.id.main_content_view), event.message, Snackbar.LENGTH_LONG);
if (findViewById(R.id.audioplayerFragment).getVisibility() == View.VISIBLE) {
snackbar.setAnchorView(findViewById(R.id.audioplayerFragment));
}
} else {
snackbar = Snackbar.make(findViewById(android.R.id.content), event.message, Snackbar.LENGTH_LONG);
}
snackbar.show();
Snackbar snackbar = showSnackbarAbovePlayer(event.message, Snackbar.LENGTH_LONG);
if (event.action != null) { if (event.action != null) {
snackbar.setAction(event.actionText, v -> event.action.accept(this)); snackbar.setAction(event.actionText, v -> event.action.accept(this));
} }
@ -661,8 +660,8 @@ public class MainActivity extends CastEnabledActivity {
private void handleNavIntent() { private void handleNavIntent() {
Log.d(TAG, "handleNavIntent()"); Log.d(TAG, "handleNavIntent()");
Intent intent = getIntent(); Intent intent = getIntent();
if (intent.hasExtra(EXTRA_FEED_ID)) { if (intent.hasExtra(MainActivityStarter.EXTRA_FEED_ID)) {
long feedId = intent.getLongExtra(EXTRA_FEED_ID, 0); long feedId = intent.getLongExtra(MainActivityStarter.EXTRA_FEED_ID, 0);
Bundle args = intent.getBundleExtra(MainActivityStarter.EXTRA_FRAGMENT_ARGS); Bundle args = intent.getBundleExtra(MainActivityStarter.EXTRA_FRAGMENT_ARGS);
if (feedId > 0) { if (feedId > 0) {
if (intent.getBooleanExtra(MainActivityStarter.EXTRA_CLEAR_BACK_STACK, false)) { if (intent.getBooleanExtra(MainActivityStarter.EXTRA_CLEAR_BACK_STACK, false)) {
@ -710,24 +709,6 @@ public class MainActivity extends CastEnabledActivity {
handleNavIntent(); handleNavIntent();
} }
public Snackbar showSnackbarAbovePlayer(CharSequence text, int duration) {
Snackbar s;
if (getBottomSheet().getState() == BottomSheetBehavior.STATE_COLLAPSED) {
s = Snackbar.make(findViewById(R.id.main_content_view), text, duration);
if (findViewById(R.id.audioplayerFragment).getVisibility() == View.VISIBLE) {
s.setAnchorView(findViewById(R.id.audioplayerFragment));
}
} else {
s = Snackbar.make(findViewById(android.R.id.content), text, duration);
}
s.show();
return s;
}
public Snackbar showSnackbarAbovePlayer(int text, int duration) {
return showSnackbarAbovePlayer(getResources().getText(text), duration);
}
/** /**
* Handles the deep link incoming via App Actions. * Handles the deep link incoming via App Actions.
* Performs an in-app search or opens the relevant feature of the app * Performs an in-app search or opens the relevant feature of the app
@ -771,8 +752,7 @@ public class MainActivity extends CastEnabledActivity {
loadFragment(SubscriptionFragment.TAG, null); loadFragment(SubscriptionFragment.TAG, null);
break; break;
default: default:
showSnackbarAbovePlayer(getString(R.string.app_action_not_found, feature), EventBus.getDefault().post(new MessageEvent(getString(R.string.app_action_not_found, feature)));
Snackbar.LENGTH_LONG);
return; return;
} }
break; break;

View File

@ -1,7 +1,5 @@
package de.danoeh.antennapod.activity; package de.danoeh.antennapod.activity;
import static de.danoeh.antennapod.activity.MainActivity.EXTRA_FEED_ID;
import android.content.Intent; import android.content.Intent;
import android.graphics.Bitmap; import android.graphics.Bitmap;
import android.os.Bundle; import android.os.Bundle;
@ -26,6 +24,7 @@ import java.util.ArrayList;
import java.util.List; import java.util.List;
import de.danoeh.antennapod.R; import de.danoeh.antennapod.R;
import de.danoeh.antennapod.ui.appstartintent.MainActivityStarter;
import de.danoeh.antennapod.ui.common.ThemeSwitcher; import de.danoeh.antennapod.ui.common.ThemeSwitcher;
import de.danoeh.antennapod.storage.database.DBReader; import de.danoeh.antennapod.storage.database.DBReader;
import de.danoeh.antennapod.storage.database.NavDrawerData; import de.danoeh.antennapod.storage.database.NavDrawerData;
@ -93,7 +92,7 @@ public class SelectSubscriptionActivity extends AppCompatActivity {
Intent intent = new Intent(this, MainActivity.class); Intent intent = new Intent(this, MainActivity.class);
intent.setAction(Intent.ACTION_MAIN); intent.setAction(Intent.ACTION_MAIN);
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK); intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK);
intent.putExtra(EXTRA_FEED_ID, feed.getId()); intent.putExtra(MainActivityStarter.EXTRA_FEED_ID, feed.getId());
String id = "subscription-" + feed.getId(); String id = "subscription-" + feed.getId();
IconCompat icon; IconCompat icon;

View File

@ -21,8 +21,8 @@ import androidx.recyclerview.widget.SimpleItemAnimator;
import androidx.swiperefreshlayout.widget.SwipeRefreshLayout; import androidx.swiperefreshlayout.widget.SwipeRefreshLayout;
import com.google.android.material.appbar.MaterialToolbar; import com.google.android.material.appbar.MaterialToolbar;
import com.google.android.material.snackbar.Snackbar;
import de.danoeh.antennapod.event.MessageEvent;
import de.danoeh.antennapod.ui.screen.SearchFragment; import de.danoeh.antennapod.ui.screen.SearchFragment;
import de.danoeh.antennapod.net.download.serviceinterface.FeedUpdateManager; import de.danoeh.antennapod.net.download.serviceinterface.FeedUpdateManager;
import de.danoeh.antennapod.ui.view.FloatingSelectMenu; import de.danoeh.antennapod.ui.view.FloatingSelectMenu;
@ -211,8 +211,7 @@ public abstract class EpisodesListFragment extends Fragment
floatingSelectMenu.inflate(R.menu.episodes_apply_action_speeddial); floatingSelectMenu.inflate(R.menu.episodes_apply_action_speeddial);
floatingSelectMenu.setOnMenuItemClickListener(menuItem -> { floatingSelectMenu.setOnMenuItemClickListener(menuItem -> {
if (listAdapter.getSelectedCount() == 0) { if (listAdapter.getSelectedCount() == 0) {
((MainActivity) getActivity()).showSnackbarAbovePlayer(R.string.no_items_selected_message, EventBus.getDefault().post(new MessageEvent(getString(R.string.no_items_selected_message)));
Snackbar.LENGTH_SHORT);
return false; return false;
} }
int confirmationString = 0; int confirmationString = 0;
@ -241,8 +240,7 @@ public abstract class EpisodesListFragment extends Fragment
} }
private void performMultiSelectAction(int actionItemId) { private void performMultiSelectAction(int actionItemId) {
EpisodeMultiSelectActionHandler handler = EpisodeMultiSelectActionHandler handler = new EpisodeMultiSelectActionHandler(getActivity(), actionItemId);
new EpisodeMultiSelectActionHandler(((MainActivity) getActivity()), actionItemId);
Completable.fromAction( Completable.fromAction(
() -> { () -> {
handler.handleAction(listAdapter.getSelectedItems()); handler.handleAction(listAdapter.getSelectedItems());

View File

@ -11,13 +11,12 @@ import androidx.annotation.NonNull;
import androidx.fragment.app.Fragment; import androidx.fragment.app.Fragment;
import com.google.android.material.dialog.MaterialAlertDialogBuilder; import com.google.android.material.dialog.MaterialAlertDialogBuilder;
import com.google.android.material.snackbar.Snackbar;
import java.util.Arrays; import java.util.Arrays;
import java.util.List; import java.util.List;
import de.danoeh.antennapod.R; import de.danoeh.antennapod.R;
import de.danoeh.antennapod.activity.MainActivity; import de.danoeh.antennapod.event.MessageEvent;
import de.danoeh.antennapod.model.feed.Feed; import de.danoeh.antennapod.model.feed.Feed;
import de.danoeh.antennapod.net.sync.serviceinterface.SynchronizationQueue; import de.danoeh.antennapod.net.sync.serviceinterface.SynchronizationQueue;
import de.danoeh.antennapod.storage.preferences.PlaybackPreferences; import de.danoeh.antennapod.storage.preferences.PlaybackPreferences;
@ -34,6 +33,7 @@ import de.danoeh.antennapod.net.sync.serviceinterface.EpisodeAction;
import de.danoeh.antennapod.storage.preferences.UserPreferences; import de.danoeh.antennapod.storage.preferences.UserPreferences;
import de.danoeh.antennapod.ui.appstartintent.MediaButtonStarter; import de.danoeh.antennapod.ui.appstartintent.MediaButtonStarter;
import de.danoeh.antennapod.ui.view.LocalDeleteModal; import de.danoeh.antennapod.ui.view.LocalDeleteModal;
import org.greenrobot.eventbus.EventBus;
/** /**
* Handles interactions with the FeedItemMenu. * Handles interactions with the FeedItemMenu.
@ -301,19 +301,15 @@ public class FeedItemMenuHandler {
break; break;
} }
int duration = Snackbar.LENGTH_LONG;
if (showSnackbar) { if (showSnackbar) {
((MainActivity) fragment.getActivity()).showSnackbarAbovePlayer( EventBus.getDefault().post(new MessageEvent(fragment.getString(playStateStringRes),
playStateStringRes, duration) context -> {
.setAction(fragment.getString(R.string.undo), v -> {
DBWriter.markItemPlayed(item.getPlayState(), item.getId()); DBWriter.markItemPlayed(item.getPlayState(), item.getId());
// don't forget to cancel the thing that's going to remove the media // don't forget to cancel the thing that's going to remove the media
h.removeCallbacks(r); h.removeCallbacks(r);
}); }, fragment.getString(R.string.undo)));
} }
h.postDelayed(r, 2000);
h.postDelayed(r, (int) Math.ceil(duration * 1.05f));
} }
public static void removeNewFlagWithUndo(@NonNull Fragment fragment, FeedItem item) { public static void removeNewFlagWithUndo(@NonNull Fragment fragment, FeedItem item) {

View File

@ -1,5 +1,6 @@
package de.danoeh.antennapod.ui.episodeslist; package de.danoeh.antennapod.ui.episodeslist;
import android.app.Activity;
import android.view.LayoutInflater; import android.view.LayoutInflater;
import android.view.View; import android.view.View;
import android.view.ViewGroup; import android.view.ViewGroup;
@ -9,7 +10,6 @@ import android.widget.TextView;
import androidx.cardview.widget.CardView; import androidx.cardview.widget.CardView;
import androidx.recyclerview.widget.RecyclerView; import androidx.recyclerview.widget.RecyclerView;
import de.danoeh.antennapod.R; import de.danoeh.antennapod.R;
import de.danoeh.antennapod.activity.MainActivity;
import de.danoeh.antennapod.ui.CoverLoader; import de.danoeh.antennapod.ui.CoverLoader;
import de.danoeh.antennapod.actionbutton.ItemActionButton; import de.danoeh.antennapod.actionbutton.ItemActionButton;
import de.danoeh.antennapod.ui.common.DateFormatter; import de.danoeh.antennapod.ui.common.DateFormatter;
@ -33,10 +33,10 @@ public class HorizontalItemViewHolder extends RecyclerView.ViewHolder {
private final CircularProgressBar circularProgressBar; private final CircularProgressBar circularProgressBar;
private final View progressBarReplacementSpacer; private final View progressBarReplacementSpacer;
private final MainActivity activity; private final Activity activity;
private FeedItem item; private FeedItem item;
public HorizontalItemViewHolder(MainActivity activity, ViewGroup parent) { public HorizontalItemViewHolder(Activity activity, ViewGroup parent) {
super(LayoutInflater.from(activity).inflate(R.layout.horizontal_itemlist_item, parent, false)); super(LayoutInflater.from(activity).inflate(R.layout.horizontal_itemlist_item, parent, false));
this.activity = activity; this.activity = activity;

View File

@ -23,11 +23,11 @@ import com.google.android.material.dialog.MaterialAlertDialogBuilder;
import androidx.core.widget.NestedScrollView; import androidx.core.widget.NestedScrollView;
import androidx.documentfile.provider.DocumentFile; import androidx.documentfile.provider.DocumentFile;
import androidx.fragment.app.Fragment; import androidx.fragment.app.Fragment;
import com.google.android.material.snackbar.Snackbar;
import de.danoeh.antennapod.R; import de.danoeh.antennapod.R;
import de.danoeh.antennapod.activity.MainActivity; import de.danoeh.antennapod.activity.MainActivity;
import de.danoeh.antennapod.activity.OpmlImportActivity; import de.danoeh.antennapod.activity.OpmlImportActivity;
import de.danoeh.antennapod.event.MessageEvent;
import de.danoeh.antennapod.model.feed.Feed; import de.danoeh.antennapod.model.feed.Feed;
import de.danoeh.antennapod.net.download.serviceinterface.FeedUpdateManager; import de.danoeh.antennapod.net.download.serviceinterface.FeedUpdateManager;
import de.danoeh.antennapod.storage.database.FeedDatabaseWriter; import de.danoeh.antennapod.storage.database.FeedDatabaseWriter;
@ -45,6 +45,7 @@ import de.danoeh.antennapod.ui.view.LiftOnScrollListener;
import io.reactivex.Observable; import io.reactivex.Observable;
import io.reactivex.android.schedulers.AndroidSchedulers; import io.reactivex.android.schedulers.AndroidSchedulers;
import io.reactivex.schedulers.Schedulers; import io.reactivex.schedulers.Schedulers;
import org.greenrobot.eventbus.EventBus;
import java.util.Collections; import java.util.Collections;
@ -103,8 +104,7 @@ public class AddFeedFragment extends Fragment {
chooseOpmlImportPathLauncher.launch("*/*"); chooseOpmlImportPathLauncher.launch("*/*");
} catch (ActivityNotFoundException e) { } catch (ActivityNotFoundException e) {
e.printStackTrace(); e.printStackTrace();
((MainActivity) getActivity()) EventBus.getDefault().post(new MessageEvent(getString(R.string.unable_to_start_system_file_manager)));
.showSnackbarAbovePlayer(R.string.unable_to_start_system_file_manager, Snackbar.LENGTH_LONG);
} }
}); });
@ -113,8 +113,7 @@ public class AddFeedFragment extends Fragment {
addLocalFolderLauncher.launch(null); addLocalFolderLauncher.launch(null);
} catch (ActivityNotFoundException e) { } catch (ActivityNotFoundException e) {
e.printStackTrace(); e.printStackTrace();
((MainActivity) getActivity()) EventBus.getDefault().post(new MessageEvent(getString(R.string.unable_to_start_system_file_manager)));
.showSnackbarAbovePlayer(R.string.unable_to_start_system_file_manager, Snackbar.LENGTH_LONG);
} }
}); });
viewBinding.searchButton.setOnClickListener(view -> performSearch()); viewBinding.searchButton.setOnClickListener(view -> performSearch());
@ -188,8 +187,7 @@ public class AddFeedFragment extends Fragment {
((MainActivity) getActivity()).loadChildFragment(fragment); ((MainActivity) getActivity()).loadChildFragment(fragment);
}, error -> { }, error -> {
Log.e(TAG, Log.getStackTraceString(error)); Log.e(TAG, Log.getStackTraceString(error));
((MainActivity) getActivity()) EventBus.getDefault().post(new MessageEvent(error.getLocalizedMessage()));
.showSnackbarAbovePlayer(error.getLocalizedMessage(), Snackbar.LENGTH_LONG);
}); });
} }

View File

@ -8,12 +8,11 @@ import android.view.MenuItem;
import android.view.View; import android.view.View;
import android.view.ViewGroup; import android.view.ViewGroup;
import android.widget.CheckBox; import android.widget.CheckBox;
import android.widget.Toast;
import androidx.annotation.NonNull; import androidx.annotation.NonNull;
import androidx.annotation.Nullable; import androidx.annotation.Nullable;
import com.google.android.material.dialog.MaterialAlertDialogBuilder; import com.google.android.material.dialog.MaterialAlertDialogBuilder;
import de.danoeh.antennapod.R; import de.danoeh.antennapod.R;
import de.danoeh.antennapod.activity.MainActivity; import de.danoeh.antennapod.event.MessageEvent;
import de.danoeh.antennapod.storage.database.DBReader; import de.danoeh.antennapod.storage.database.DBReader;
import de.danoeh.antennapod.storage.database.DBWriter; import de.danoeh.antennapod.storage.database.DBWriter;
import de.danoeh.antennapod.ui.screen.feed.ItemSortDialog; import de.danoeh.antennapod.ui.screen.feed.ItemSortDialog;
@ -106,7 +105,7 @@ public class InboxFragment extends EpisodesListFragment {
private void removeAllFromInbox() { private void removeAllFromInbox() {
DBWriter.removeAllNewFlags(); DBWriter.removeAllNewFlags();
((MainActivity) getActivity()).showSnackbarAbovePlayer(R.string.removed_all_inbox_msg, Toast.LENGTH_SHORT); EventBus.getDefault().post(new MessageEvent(getString(R.string.removed_all_inbox_msg)));
} }
private void showRemoveAllDialog() { private void showRemoveAllDialog() {

View File

@ -22,10 +22,10 @@ import androidx.recyclerview.widget.LinearLayoutManager;
import androidx.recyclerview.widget.RecyclerView; import androidx.recyclerview.widget.RecyclerView;
import com.google.android.material.chip.Chip; import com.google.android.material.chip.Chip;
import com.google.android.material.snackbar.Snackbar;
import de.danoeh.antennapod.R; import de.danoeh.antennapod.R;
import de.danoeh.antennapod.activity.MainActivity; import de.danoeh.antennapod.activity.MainActivity;
import de.danoeh.antennapod.event.MessageEvent;
import de.danoeh.antennapod.ui.episodeslist.EpisodeItemListAdapter; import de.danoeh.antennapod.ui.episodeslist.EpisodeItemListAdapter;
import de.danoeh.antennapod.ui.screen.subscriptions.HorizontalFeedListAdapter; import de.danoeh.antennapod.ui.screen.subscriptions.HorizontalFeedListAdapter;
import de.danoeh.antennapod.ui.MenuItemUtils; import de.danoeh.antennapod.ui.MenuItemUtils;
@ -224,11 +224,10 @@ public class SearchFragment extends Fragment implements EpisodeItemListAdapter.O
floatingSelectMenu.inflate(R.menu.episodes_apply_action_speeddial); floatingSelectMenu.inflate(R.menu.episodes_apply_action_speeddial);
floatingSelectMenu.setOnMenuItemClickListener(menuItem -> { floatingSelectMenu.setOnMenuItemClickListener(menuItem -> {
if (adapter.getSelectedCount() == 0) { if (adapter.getSelectedCount() == 0) {
((MainActivity) getActivity()) EventBus.getDefault().post(new MessageEvent(getString(R.string.no_items_selected_message)));
.showSnackbarAbovePlayer(R.string.no_items_selected_message, Snackbar.LENGTH_SHORT);
return false; return false;
} }
new EpisodeMultiSelectActionHandler((MainActivity) getActivity(), menuItem.getItemId()) new EpisodeMultiSelectActionHandler(getActivity(), menuItem.getItemId())
.handleAction(adapter.getSelectedItems()); .handleAction(adapter.getSelectedItems());
adapter.endSelectMode(); adapter.endSelectMode();
return true; return true;

View File

@ -12,13 +12,14 @@ import android.widget.ProgressBar;
import androidx.annotation.NonNull; import androidx.annotation.NonNull;
import androidx.annotation.Nullable; import androidx.annotation.Nullable;
import androidx.fragment.app.Fragment; import androidx.fragment.app.Fragment;
import androidx.fragment.app.FragmentActivity;
import androidx.swiperefreshlayout.widget.SwipeRefreshLayout; import androidx.swiperefreshlayout.widget.SwipeRefreshLayout;
import com.google.android.material.appbar.MaterialToolbar; import com.google.android.material.appbar.MaterialToolbar;
import com.google.android.material.snackbar.Snackbar;
import de.danoeh.antennapod.R; import de.danoeh.antennapod.R;
import de.danoeh.antennapod.activity.MainActivity; import de.danoeh.antennapod.activity.MainActivity;
import de.danoeh.antennapod.event.FeedUpdateRunningEvent; import de.danoeh.antennapod.event.FeedUpdateRunningEvent;
import de.danoeh.antennapod.event.MessageEvent;
import de.danoeh.antennapod.ui.common.ConfirmationDialog; import de.danoeh.antennapod.ui.common.ConfirmationDialog;
import de.danoeh.antennapod.ui.episodeslist.EpisodeItemListAdapter; import de.danoeh.antennapod.ui.episodeslist.EpisodeItemListAdapter;
import de.danoeh.antennapod.actionbutton.DeleteActionButton; import de.danoeh.antennapod.actionbutton.DeleteActionButton;
@ -107,7 +108,7 @@ public class CompletedDownloadsFragment extends Fragment
recyclerView = root.findViewById(R.id.recyclerView); recyclerView = root.findViewById(R.id.recyclerView);
recyclerView.setRecycledViewPool(((MainActivity) getActivity()).getRecycledViewPool()); recyclerView.setRecycledViewPool(((MainActivity) getActivity()).getRecycledViewPool());
adapter = new CompletedDownloadsListAdapter((MainActivity) getActivity()); adapter = new CompletedDownloadsListAdapter(getActivity());
adapter.setOnSelectModeListener(this); adapter.setOnSelectModeListener(this);
recyclerView.setAdapter(adapter); recyclerView.setAdapter(adapter);
recyclerView.addOnScrollListener(new LiftOnScrollListener(root.findViewById(R.id.appbar))); recyclerView.addOnScrollListener(new LiftOnScrollListener(root.findViewById(R.id.appbar)));
@ -121,8 +122,7 @@ public class CompletedDownloadsFragment extends Fragment
floatingSelectMenu.inflate(R.menu.episodes_apply_action_speeddial); floatingSelectMenu.inflate(R.menu.episodes_apply_action_speeddial);
floatingSelectMenu.setOnMenuItemClickListener(menuItem -> { floatingSelectMenu.setOnMenuItemClickListener(menuItem -> {
if (adapter.getSelectedCount() == 0) { if (adapter.getSelectedCount() == 0) {
((MainActivity) getActivity()).showSnackbarAbovePlayer(R.string.no_items_selected_message, EventBus.getDefault().post(new MessageEvent(getString(R.string.no_items_selected_message)));
Snackbar.LENGTH_SHORT);
return false; return false;
} }
new EpisodeMultiSelectActionHandler(getActivity(), menuItem.getItemId()) new EpisodeMultiSelectActionHandler(getActivity(), menuItem.getItemId())
@ -363,7 +363,7 @@ public class CompletedDownloadsFragment extends Fragment
private class CompletedDownloadsListAdapter extends EpisodeItemListAdapter { private class CompletedDownloadsListAdapter extends EpisodeItemListAdapter {
public CompletedDownloadsListAdapter(MainActivity mainActivity) { public CompletedDownloadsListAdapter(FragmentActivity mainActivity) {
super(mainActivity); super(mainActivity);
} }

View File

@ -6,16 +6,16 @@ import android.util.Log;
import android.view.View; import android.view.View;
import android.view.ViewGroup; import android.view.ViewGroup;
import android.widget.BaseAdapter; import android.widget.BaseAdapter;
import android.widget.Toast;
import de.danoeh.antennapod.R; import de.danoeh.antennapod.R;
import de.danoeh.antennapod.activity.MainActivity;
import de.danoeh.antennapod.actionbutton.DownloadActionButton; import de.danoeh.antennapod.actionbutton.DownloadActionButton;
import de.danoeh.antennapod.event.MessageEvent;
import de.danoeh.antennapod.net.download.serviceinterface.FeedUpdateManager; import de.danoeh.antennapod.net.download.serviceinterface.FeedUpdateManager;
import de.danoeh.antennapod.storage.database.DBReader; import de.danoeh.antennapod.storage.database.DBReader;
import de.danoeh.antennapod.model.download.DownloadError; import de.danoeh.antennapod.model.download.DownloadError;
import de.danoeh.antennapod.model.download.DownloadResult; import de.danoeh.antennapod.model.download.DownloadResult;
import de.danoeh.antennapod.model.feed.Feed; import de.danoeh.antennapod.model.feed.Feed;
import de.danoeh.antennapod.model.feed.FeedMedia; import de.danoeh.antennapod.model.feed.FeedMedia;
import org.greenrobot.eventbus.EventBus;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.List; import java.util.List;
@ -114,8 +114,8 @@ public class DownloadLogAdapter extends BaseAdapter {
return; return;
} }
new DownloadActionButton(media.getItem()).onClick(context); new DownloadActionButton(media.getItem()).onClick(context);
((MainActivity) context).showSnackbarAbovePlayer( EventBus.getDefault().post(new MessageEvent(
R.string.status_downloading_label, Toast.LENGTH_SHORT); context.getResources().getString(R.string.status_downloading_label)));
}); });
} }
} }

View File

@ -20,7 +20,6 @@ import com.bumptech.glide.Glide;
import com.bumptech.glide.load.resource.bitmap.FitCenter; import com.bumptech.glide.load.resource.bitmap.FitCenter;
import com.bumptech.glide.load.resource.bitmap.RoundedCorners; import com.bumptech.glide.load.resource.bitmap.RoundedCorners;
import com.bumptech.glide.request.RequestOptions; import com.bumptech.glide.request.RequestOptions;
import com.google.android.material.snackbar.Snackbar;
import com.skydoves.balloon.ArrowOrientation; import com.skydoves.balloon.ArrowOrientation;
import com.skydoves.balloon.ArrowOrientationRules; import com.skydoves.balloon.ArrowOrientationRules;
import com.skydoves.balloon.Balloon; import com.skydoves.balloon.Balloon;
@ -38,6 +37,7 @@ import de.danoeh.antennapod.actionbutton.PlayLocalActionButton;
import de.danoeh.antennapod.actionbutton.StreamActionButton; import de.danoeh.antennapod.actionbutton.StreamActionButton;
import de.danoeh.antennapod.actionbutton.VisitWebsiteActionButton; import de.danoeh.antennapod.actionbutton.VisitWebsiteActionButton;
import de.danoeh.antennapod.event.EpisodeDownloadEvent; import de.danoeh.antennapod.event.EpisodeDownloadEvent;
import de.danoeh.antennapod.event.MessageEvent;
import de.danoeh.antennapod.model.feed.Feed; import de.danoeh.antennapod.model.feed.Feed;
import de.danoeh.antennapod.playback.service.PlaybackStatus; import de.danoeh.antennapod.playback.service.PlaybackStatus;
import de.danoeh.antennapod.event.FeedItemEvent; import de.danoeh.antennapod.event.FeedItemEvent;
@ -151,8 +151,7 @@ public class ItemFragment extends Fragment {
&& Objects.equals(item.getMedia().getIdentifier(), controller.getMedia().getIdentifier())) { && Objects.equals(item.getMedia().getIdentifier(), controller.getMedia().getIdentifier())) {
controller.seekTo(time); controller.seekTo(time);
} else { } else {
((MainActivity) getActivity()).showSnackbarAbovePlayer(R.string.play_this_to_seek_position_message, EventBus.getDefault().post(new MessageEvent(getString(R.string.play_this_to_seek_position_message)));
Snackbar.LENGTH_LONG);
} }
}); });
registerForContextMenu(webvDescription); registerForContextMenu(webvDescription);
@ -218,8 +217,7 @@ public class ItemFragment extends Fragment {
UserPreferences.setStreamOverDownload(offerStreaming); UserPreferences.setStreamOverDownload(offerStreaming);
// Update all visible lists to reflect new streaming action button // Update all visible lists to reflect new streaming action button
EventBus.getDefault().post(new UnreadItemsUpdateEvent()); EventBus.getDefault().post(new UnreadItemsUpdateEvent());
((MainActivity) getActivity()).showSnackbarAbovePlayer( EventBus.getDefault().post(new MessageEvent(getString(R.string.on_demand_config_setting_changed)));
R.string.on_demand_config_setting_changed, Snackbar.LENGTH_SHORT);
balloon.dismiss(); balloon.dismiss();
}); });
negativeButton.setOnClickListener(v1 -> { negativeButton.setOnClickListener(v1 -> {

View File

@ -1,6 +1,5 @@
package de.danoeh.antennapod.ui.screen.episode; package de.danoeh.antennapod.ui.screen.episode;
import android.content.Intent;
import android.os.Bundle; import android.os.Bundle;
import android.view.LayoutInflater; import android.view.LayoutInflater;
import android.view.MenuItem; import android.view.MenuItem;
@ -16,13 +15,13 @@ import androidx.viewpager2.widget.ViewPager2;
import de.danoeh.antennapod.event.UnreadItemsUpdateEvent; import de.danoeh.antennapod.event.UnreadItemsUpdateEvent;
import de.danoeh.antennapod.model.feed.Feed; import de.danoeh.antennapod.model.feed.Feed;
import de.danoeh.antennapod.ui.appstartintent.MainActivityStarter;
import de.danoeh.antennapod.ui.appstartintent.OnlineFeedviewActivityStarter; import de.danoeh.antennapod.ui.appstartintent.OnlineFeedviewActivityStarter;
import org.greenrobot.eventbus.EventBus; import org.greenrobot.eventbus.EventBus;
import org.greenrobot.eventbus.Subscribe; import org.greenrobot.eventbus.Subscribe;
import org.greenrobot.eventbus.ThreadMode; import org.greenrobot.eventbus.ThreadMode;
import de.danoeh.antennapod.R; import de.danoeh.antennapod.R;
import de.danoeh.antennapod.activity.MainActivity;
import de.danoeh.antennapod.event.FeedItemEvent; import de.danoeh.antennapod.event.FeedItemEvent;
import de.danoeh.antennapod.model.feed.FeedItem; import de.danoeh.antennapod.model.feed.FeedItem;
import de.danoeh.antennapod.storage.database.DBReader; import de.danoeh.antennapod.storage.database.DBReader;
@ -183,8 +182,7 @@ public class ItemPagerFragment extends Fragment implements MaterialToolbar.OnMen
return; return;
} }
if (item.getFeed().getState() == Feed.STATE_SUBSCRIBED) { if (item.getFeed().getState() == Feed.STATE_SUBSCRIBED) {
Intent intent = MainActivity.getIntentToOpenFeed(getContext(), item.getFeedId()); new MainActivityStarter(getContext()).withOpenFeed(item.getFeedId()).withClearTop().start();
startActivity(intent);
} else { } else {
startActivity(new OnlineFeedviewActivityStarter(getContext(), item.getFeed().getDownloadUrl()).getIntent()); startActivity(new OnlineFeedviewActivityStarter(getContext(), item.getFeed().getDownloadUrl()).getIntent());
} }

View File

@ -15,7 +15,6 @@ import android.view.LayoutInflater;
import android.view.MenuItem; import android.view.MenuItem;
import android.view.View; import android.view.View;
import android.view.ViewGroup; import android.view.ViewGroup;
import android.widget.Toast;
import androidx.activity.result.ActivityResultLauncher; import androidx.activity.result.ActivityResultLauncher;
import androidx.activity.result.contract.ActivityResultContracts; import androidx.activity.result.contract.ActivityResultContracts;
import androidx.annotation.NonNull; import androidx.annotation.NonNull;
@ -26,10 +25,10 @@ import com.bumptech.glide.Glide;
import com.bumptech.glide.request.RequestOptions; import com.bumptech.glide.request.RequestOptions;
import com.google.android.material.appbar.MaterialToolbar; import com.google.android.material.appbar.MaterialToolbar;
import com.google.android.material.dialog.MaterialAlertDialogBuilder; import com.google.android.material.dialog.MaterialAlertDialogBuilder;
import com.google.android.material.snackbar.Snackbar;
import de.danoeh.antennapod.R; import de.danoeh.antennapod.R;
import de.danoeh.antennapod.activity.MainActivity; import de.danoeh.antennapod.activity.MainActivity;
import de.danoeh.antennapod.databinding.FeedinfoBinding; import de.danoeh.antennapod.databinding.FeedinfoBinding;
import de.danoeh.antennapod.event.MessageEvent;
import de.danoeh.antennapod.storage.database.DBWriter; import de.danoeh.antennapod.storage.database.DBWriter;
import de.danoeh.antennapod.ui.TransitionEffect; import de.danoeh.antennapod.ui.TransitionEffect;
import de.danoeh.antennapod.storage.database.DBReader; import de.danoeh.antennapod.storage.database.DBReader;
@ -52,6 +51,7 @@ import io.reactivex.android.schedulers.AndroidSchedulers;
import io.reactivex.disposables.Disposable; import io.reactivex.disposables.Disposable;
import io.reactivex.schedulers.Schedulers; import io.reactivex.schedulers.Schedulers;
import org.apache.commons.lang3.StringUtils; import org.apache.commons.lang3.StringUtils;
import org.greenrobot.eventbus.EventBus;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.Iterator; import java.util.Iterator;
@ -87,11 +87,8 @@ public class FeedInfoFragment extends Fragment implements MaterialToolbar.OnMenu
android.content.ClipboardManager cm = (android.content.ClipboardManager) getContext() android.content.ClipboardManager cm = (android.content.ClipboardManager) getContext()
.getSystemService(Context.CLIPBOARD_SERVICE); .getSystemService(Context.CLIPBOARD_SERVICE);
cm.setPrimaryClip(clipData); cm.setPrimaryClip(clipData);
if (Build.VERSION.SDK_INT <= 32 && getActivity() instanceof MainActivity) { if (Build.VERSION.SDK_INT <= 32) {
((MainActivity) getActivity()).showSnackbarAbovePlayer(R.string.copied_to_clipboard, EventBus.getDefault().post(new MessageEvent(getString(R.string.copied_to_clipboard)));
Snackbar.LENGTH_SHORT);
} else if (Build.VERSION.SDK_INT <= 32) {
Snackbar.make(getView(), R.string.copied_to_clipboard, Snackbar.LENGTH_SHORT).show();
} }
} }
} }
@ -285,8 +282,7 @@ public class FeedInfoFragment extends Fragment implements MaterialToolbar.OnMenu
@Override @Override
public boolean onMenuItemClick(MenuItem item) { public boolean onMenuItemClick(MenuItem item) {
if (feed == null) { if (feed == null) {
((MainActivity) getActivity()).showSnackbarAbovePlayer( EventBus.getDefault().post(new MessageEvent(getString(R.string.please_wait_for_data)));
R.string.please_wait_for_data, Toast.LENGTH_LONG);
return false; return false;
} }
if (item.getItemId() == R.id.visit_website_item) { if (item.getItemId() == R.id.visit_website_item) {
@ -346,10 +342,8 @@ public class FeedInfoFragment extends Fragment implements MaterialToolbar.OnMenu
.subscribeOn(Schedulers.io()) .subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread()) .observeOn(AndroidSchedulers.mainThread())
.subscribe( .subscribe(
() -> ((MainActivity) getActivity()) () -> EventBus.getDefault().post(new MessageEvent(getString(android.R.string.ok))),
.showSnackbarAbovePlayer(android.R.string.ok, Snackbar.LENGTH_SHORT), error -> EventBus.getDefault().post(new MessageEvent(error.getLocalizedMessage())));
error -> ((MainActivity) getActivity())
.showSnackbarAbovePlayer(error.getLocalizedMessage(), Snackbar.LENGTH_LONG));
} }
private static class AddLocalFolder extends ActivityResultContracts.OpenDocumentTree { private static class AddLocalFolder extends ActivityResultContracts.OpenDocumentTree {

View File

@ -11,7 +11,6 @@ import android.view.MenuItem;
import android.view.View; import android.view.View;
import android.view.ViewGroup; import android.view.ViewGroup;
import android.widget.AdapterView; import android.widget.AdapterView;
import android.widget.Toast;
import androidx.annotation.NonNull; import androidx.annotation.NonNull;
import androidx.annotation.Nullable; import androidx.annotation.Nullable;
import androidx.core.util.Pair; import androidx.core.util.Pair;
@ -21,7 +20,6 @@ import androidx.recyclerview.widget.RecyclerView;
import com.bumptech.glide.Glide; import com.bumptech.glide.Glide;
import com.bumptech.glide.request.RequestOptions; import com.bumptech.glide.request.RequestOptions;
import com.google.android.material.appbar.MaterialToolbar; import com.google.android.material.appbar.MaterialToolbar;
import com.google.android.material.snackbar.Snackbar;
import de.danoeh.antennapod.R; import de.danoeh.antennapod.R;
import de.danoeh.antennapod.activity.MainActivity; import de.danoeh.antennapod.activity.MainActivity;
import de.danoeh.antennapod.databinding.FeedItemListFragmentBinding; import de.danoeh.antennapod.databinding.FeedItemListFragmentBinding;
@ -31,6 +29,7 @@ import de.danoeh.antennapod.event.FeedEvent;
import de.danoeh.antennapod.event.FeedItemEvent; import de.danoeh.antennapod.event.FeedItemEvent;
import de.danoeh.antennapod.event.FeedListUpdateEvent; import de.danoeh.antennapod.event.FeedListUpdateEvent;
import de.danoeh.antennapod.event.FeedUpdateRunningEvent; import de.danoeh.antennapod.event.FeedUpdateRunningEvent;
import de.danoeh.antennapod.event.MessageEvent;
import de.danoeh.antennapod.event.PlayerStatusEvent; import de.danoeh.antennapod.event.PlayerStatusEvent;
import de.danoeh.antennapod.event.QueueEvent; import de.danoeh.antennapod.event.QueueEvent;
import de.danoeh.antennapod.event.UnreadItemsUpdateEvent; import de.danoeh.antennapod.event.UnreadItemsUpdateEvent;
@ -198,8 +197,7 @@ public class FeedItemlistFragment extends Fragment implements AdapterView.OnItem
viewBinding.floatingSelectMenu.inflate(R.menu.episodes_apply_action_speeddial); viewBinding.floatingSelectMenu.inflate(R.menu.episodes_apply_action_speeddial);
viewBinding.floatingSelectMenu.setOnMenuItemClickListener(menuItem -> { viewBinding.floatingSelectMenu.setOnMenuItemClickListener(menuItem -> {
if (adapter.getSelectedCount() == 0) { if (adapter.getSelectedCount() == 0) {
((MainActivity) getActivity()).showSnackbarAbovePlayer(R.string.no_items_selected_message, EventBus.getDefault().post(new MessageEvent(getString(R.string.no_items_selected_message)));
Snackbar.LENGTH_SHORT);
return false; return false;
} }
EpisodeMultiSelectActionHandler handler EpisodeMultiSelectActionHandler handler
@ -333,8 +331,8 @@ public class FeedItemlistFragment extends Fragment implements AdapterView.OnItem
return true; return true;
} }
Runnable showRemovedAllSnackbar = () -> ((MainActivity) getActivity()) Runnable showRemovedAllSnackbar = () -> EventBus.getDefault().post(
.showSnackbarAbovePlayer(R.string.removed_all_inbox_msg, Toast.LENGTH_SHORT); new MessageEvent(getString(R.string.removed_all_inbox_msg)));
return FeedMenuHandler.onMenuItemClicked(this, item.getItemId(), feed, showRemovedAllSnackbar); return FeedMenuHandler.onMenuItemClicked(this, item.getItemId(), feed, showRemovedAllSnackbar);
} }

View File

@ -19,9 +19,11 @@ import androidx.annotation.Nullable;
import androidx.annotation.UiThread; import androidx.annotation.UiThread;
import androidx.appcompat.app.AppCompatActivity; import androidx.appcompat.app.AppCompatActivity;
import com.google.android.material.dialog.MaterialAlertDialogBuilder; import com.google.android.material.dialog.MaterialAlertDialogBuilder;
import com.google.android.material.snackbar.Snackbar;
import de.danoeh.antennapod.R; import de.danoeh.antennapod.R;
import de.danoeh.antennapod.databinding.EditTextDialogBinding; import de.danoeh.antennapod.databinding.EditTextDialogBinding;
import de.danoeh.antennapod.databinding.OnlinefeedviewActivityBinding; import de.danoeh.antennapod.databinding.OnlinefeedviewActivityBinding;
import de.danoeh.antennapod.event.MessageEvent;
import de.danoeh.antennapod.model.download.DownloadError; import de.danoeh.antennapod.model.download.DownloadError;
import de.danoeh.antennapod.model.download.DownloadRequest; import de.danoeh.antennapod.model.download.DownloadRequest;
import de.danoeh.antennapod.model.download.DownloadResult; import de.danoeh.antennapod.model.download.DownloadResult;
@ -51,6 +53,9 @@ import io.reactivex.Observable;
import io.reactivex.android.schedulers.AndroidSchedulers; import io.reactivex.android.schedulers.AndroidSchedulers;
import io.reactivex.disposables.Disposable; import io.reactivex.disposables.Disposable;
import io.reactivex.schedulers.Schedulers; import io.reactivex.schedulers.Schedulers;
import org.greenrobot.eventbus.EventBus;
import org.greenrobot.eventbus.Subscribe;
import org.greenrobot.eventbus.ThreadMode;
import java.io.File; import java.io.File;
import java.io.IOException; import java.io.IOException;
@ -128,6 +133,7 @@ public class OnlineFeedViewActivity extends AppCompatActivity {
protected void onStart() { protected void onStart() {
super.onStart(); super.onStart();
isPaused = false; isPaused = false;
EventBus.getDefault().register(this);
} }
@Override @Override
@ -140,6 +146,7 @@ public class OnlineFeedViewActivity extends AppCompatActivity {
if (dialog != null && dialog.isShowing()) { if (dialog != null && dialog.isShowing()) {
dialog.dismiss(); dialog.dismiss();
} }
EventBus.getDefault().unregister(this);
} }
@Override @Override
@ -468,6 +475,16 @@ public class OnlineFeedViewActivity extends AppCompatActivity {
return true; return true;
} }
@Subscribe(threadMode = ThreadMode.MAIN)
public void onEventMainThread(MessageEvent event) {
Log.d(TAG, "onEvent(" + event + ")");
Snackbar snackbar = Snackbar.make(findViewById(android.R.id.content), event.message, Snackbar.LENGTH_LONG);
snackbar.show();
if (event.action != null) {
snackbar.setAction(event.actionText, v -> event.action.accept(this));
}
}
private class FeedViewAuthenticationDialog extends AuthenticationDialog { private class FeedViewAuthenticationDialog extends AuthenticationDialog {
private final String feedUrl; private final String feedUrl;

View File

@ -1,6 +1,5 @@
package de.danoeh.antennapod.ui.screen.playback.audio; package de.danoeh.antennapod.ui.screen.playback.audio;
import android.content.Intent;
import android.os.Bundle; import android.os.Bundle;
import android.util.Log; import android.util.Log;
import android.view.KeyEvent; import android.view.KeyEvent;
@ -26,6 +25,7 @@ import com.google.android.material.bottomsheet.BottomSheetBehavior;
import de.danoeh.antennapod.model.feed.Feed; import de.danoeh.antennapod.model.feed.Feed;
import de.danoeh.antennapod.playback.service.PlaybackController; import de.danoeh.antennapod.playback.service.PlaybackController;
import de.danoeh.antennapod.ui.appstartintent.MainActivityStarter;
import de.danoeh.antennapod.ui.appstartintent.MediaButtonStarter; import de.danoeh.antennapod.ui.appstartintent.MediaButtonStarter;
import de.danoeh.antennapod.ui.appstartintent.OnlineFeedviewActivityStarter; import de.danoeh.antennapod.ui.appstartintent.OnlineFeedviewActivityStarter;
import de.danoeh.antennapod.ui.chapters.ChapterUtils; import de.danoeh.antennapod.ui.chapters.ChapterUtils;
@ -515,8 +515,7 @@ public class AudioPlayerFragment extends Fragment implements
return; return;
} }
if (feed.getState() == Feed.STATE_SUBSCRIBED) { if (feed.getState() == Feed.STATE_SUBSCRIBED) {
Intent intent = MainActivity.getIntentToOpenFeed(getContext(), feed.getId()); new MainActivityStarter(getContext()).withOpenFeed(feed.getId()).withClearTop().start();
startActivity(intent);
} else { } else {
startActivity(new OnlineFeedviewActivityStarter(getContext(), feed.getDownloadUrl()).getIntent()); startActivity(new OnlineFeedviewActivityStarter(getContext(), feed.getDownloadUrl()).getIntent());
} }

View File

@ -6,7 +6,6 @@ import android.animation.AnimatorSet;
import android.animation.ObjectAnimator; import android.animation.ObjectAnimator;
import android.content.ClipData; import android.content.ClipData;
import android.content.ClipboardManager; import android.content.ClipboardManager;
import android.content.Intent;
import android.content.res.Configuration; import android.content.res.Configuration;
import android.graphics.ColorFilter; import android.graphics.ColorFilter;
import android.graphics.drawable.Drawable; import android.graphics.drawable.Drawable;
@ -29,10 +28,10 @@ import com.bumptech.glide.RequestBuilder;
import com.bumptech.glide.load.resource.bitmap.FitCenter; import com.bumptech.glide.load.resource.bitmap.FitCenter;
import com.bumptech.glide.load.resource.bitmap.RoundedCorners; import com.bumptech.glide.load.resource.bitmap.RoundedCorners;
import com.bumptech.glide.request.RequestOptions; import com.bumptech.glide.request.RequestOptions;
import com.google.android.material.snackbar.Snackbar;
import de.danoeh.antennapod.R; import de.danoeh.antennapod.R;
import de.danoeh.antennapod.activity.MainActivity; import de.danoeh.antennapod.event.MessageEvent;
import de.danoeh.antennapod.model.feed.Feed; import de.danoeh.antennapod.model.feed.Feed;
import de.danoeh.antennapod.ui.appstartintent.MainActivityStarter;
import de.danoeh.antennapod.ui.appstartintent.OnlineFeedviewActivityStarter; import de.danoeh.antennapod.ui.appstartintent.OnlineFeedviewActivityStarter;
import de.danoeh.antennapod.ui.chapters.ChapterUtils; import de.danoeh.antennapod.ui.chapters.ChapterUtils;
import de.danoeh.antennapod.ui.screen.chapter.ChaptersFragment; import de.danoeh.antennapod.ui.screen.chapter.ChaptersFragment;
@ -169,8 +168,7 @@ public class CoverFragment extends Fragment {
return; return;
} }
if (feed.getState() == Feed.STATE_SUBSCRIBED) { if (feed.getState() == Feed.STATE_SUBSCRIBED) {
Intent intent = MainActivity.getIntentToOpenFeed(getContext(), feed.getId()); new MainActivityStarter(getContext()).withOpenFeed(feed.getId()).withClearTop().start();
startActivity(intent);
} else { } else {
startActivity(new OnlineFeedviewActivityStarter(getContext(), feed.getDownloadUrl()).getIntent()); startActivity(new OnlineFeedviewActivityStarter(getContext(), feed.getDownloadUrl()).getIntent());
} }
@ -349,8 +347,7 @@ public class CoverFragment extends Fragment {
clipboardManager.setPrimaryClip(ClipData.newPlainText("AntennaPod", text)); clipboardManager.setPrimaryClip(ClipData.newPlainText("AntennaPod", text));
} }
if (Build.VERSION.SDK_INT <= 32) { if (Build.VERSION.SDK_INT <= 32) {
((MainActivity) requireActivity()).showSnackbarAbovePlayer( EventBus.getDefault().post(new MessageEvent(getString(R.string.copied_to_clipboard)));
getResources().getString(R.string.copied_to_clipboard), Snackbar.LENGTH_SHORT);
} }
return true; return true;
} }

View File

@ -634,8 +634,7 @@ public class VideoplayerActivity extends CastEnabledActivity implements SeekBar.
PlaybackControlsDialog dialog = PlaybackControlsDialog.newInstance(); PlaybackControlsDialog dialog = PlaybackControlsDialog.newInstance();
dialog.show(getSupportFragmentManager(), "playback_controls"); dialog.show(getSupportFragmentManager(), "playback_controls");
} else if (item.getItemId() == R.id.open_feed_item && feedItem != null) { } else if (item.getItemId() == R.id.open_feed_item && feedItem != null) {
Intent intent = MainActivity.getIntentToOpenFeed(this, feedItem.getFeedId()); new MainActivityStarter(this).withOpenFeed(feedItem.getFeedId()).withClearTop().start();
startActivity(intent);
} else if (item.getItemId() == R.id.visit_website_item) { } else if (item.getItemId() == R.id.visit_website_item) {
IntentUtils.openInBrowser(VideoplayerActivity.this, getWebsiteLinkWithFallback(media)); IntentUtils.openInBrowser(VideoplayerActivity.this, getWebsiteLinkWithFallback(media));
} else if (item.getItemId() == R.id.share_item && feedItem != null) { } else if (item.getItemId() == R.id.share_item && feedItem != null) {

View File

@ -27,8 +27,8 @@ import androidx.swiperefreshlayout.widget.SwipeRefreshLayout;
import com.google.android.material.appbar.MaterialToolbar; import com.google.android.material.appbar.MaterialToolbar;
import com.google.android.material.dialog.MaterialAlertDialogBuilder; import com.google.android.material.dialog.MaterialAlertDialogBuilder;
import com.google.android.material.snackbar.Snackbar;
import de.danoeh.antennapod.event.MessageEvent;
import de.danoeh.antennapod.event.playback.SpeedChangedEvent; import de.danoeh.antennapod.event.playback.SpeedChangedEvent;
import de.danoeh.antennapod.ui.screen.InboxFragment; import de.danoeh.antennapod.ui.screen.InboxFragment;
import de.danoeh.antennapod.ui.screen.SearchFragment; import de.danoeh.antennapod.ui.screen.SearchFragment;
@ -351,11 +351,11 @@ public class QueueFragment extends Fragment implements MaterialToolbar.OnMenuIte
if (recyclerAdapter != null) { if (recyclerAdapter != null) {
recyclerAdapter.updateDragDropEnabled(); recyclerAdapter.updateDragDropEnabled();
} }
if (queue.size() == 0) { if (queue.isEmpty()) {
if (locked) { if (locked) {
((MainActivity) getActivity()).showSnackbarAbovePlayer(R.string.queue_locked, Snackbar.LENGTH_SHORT); EventBus.getDefault().post(new MessageEvent(getString(R.string.queue_locked)));
} else { } else {
((MainActivity) getActivity()).showSnackbarAbovePlayer(R.string.queue_unlocked, Snackbar.LENGTH_SHORT); EventBus.getDefault().post(new MessageEvent(getString(R.string.queue_unlocked)));
} }
} }
} }
@ -477,8 +477,7 @@ public class QueueFragment extends Fragment implements MaterialToolbar.OnMenuIte
floatingSelectMenu.inflate(R.menu.episodes_apply_action_speeddial); floatingSelectMenu.inflate(R.menu.episodes_apply_action_speeddial);
floatingSelectMenu.setOnMenuItemClickListener(menuItem -> { floatingSelectMenu.setOnMenuItemClickListener(menuItem -> {
if (recyclerAdapter.getSelectedCount() == 0) { if (recyclerAdapter.getSelectedCount() == 0) {
((MainActivity) getActivity()).showSnackbarAbovePlayer(R.string.no_items_selected_message, EventBus.getDefault().post(new MessageEvent(getString(R.string.no_items_selected_message)));
Snackbar.LENGTH_SHORT);
return false; return false;
} }
new EpisodeMultiSelectActionHandler(getActivity(), menuItem.getItemId()) new EpisodeMultiSelectActionHandler(getActivity(), menuItem.getItemId())

View File

@ -7,8 +7,8 @@ import android.view.MenuInflater;
import android.view.MotionEvent; import android.view.MotionEvent;
import android.view.View; import android.view.View;
import androidx.fragment.app.FragmentActivity;
import de.danoeh.antennapod.R; import de.danoeh.antennapod.R;
import de.danoeh.antennapod.activity.MainActivity;
import de.danoeh.antennapod.ui.episodeslist.EpisodeItemListAdapter; import de.danoeh.antennapod.ui.episodeslist.EpisodeItemListAdapter;
import de.danoeh.antennapod.storage.preferences.UserPreferences; import de.danoeh.antennapod.storage.preferences.UserPreferences;
import de.danoeh.antennapod.ui.swipeactions.SwipeActions; import de.danoeh.antennapod.ui.swipeactions.SwipeActions;
@ -24,7 +24,7 @@ public class QueueRecyclerAdapter extends EpisodeItemListAdapter {
private boolean dragDropEnabled; private boolean dragDropEnabled;
public QueueRecyclerAdapter(MainActivity mainActivity, SwipeActions swipeActions) { public QueueRecyclerAdapter(FragmentActivity mainActivity, SwipeActions swipeActions) {
super(mainActivity); super(mainActivity);
this.swipeActions = swipeActions; this.swipeActions = swipeActions;
dragDropEnabled = ! (UserPreferences.isQueueKeepSorted() || UserPreferences.isQueueLocked()); dragDropEnabled = ! (UserPreferences.isQueueKeepSorted() || UserPreferences.isQueueLocked());

View File

@ -3,17 +3,16 @@ package de.danoeh.antennapod.ui.screen.subscriptions;
import android.util.Log; import android.util.Log;
import androidx.annotation.PluralsRes; import androidx.annotation.PluralsRes;
import androidx.fragment.app.FragmentActivity;
import com.google.android.material.dialog.MaterialAlertDialogBuilder; import com.google.android.material.dialog.MaterialAlertDialogBuilder;
import androidx.core.util.Consumer; import androidx.core.util.Consumer;
import com.google.android.material.snackbar.Snackbar;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.List; import java.util.List;
import java.util.Locale; import java.util.Locale;
import de.danoeh.antennapod.R; import de.danoeh.antennapod.R;
import de.danoeh.antennapod.activity.MainActivity; import de.danoeh.antennapod.event.MessageEvent;
import de.danoeh.antennapod.storage.database.DBWriter; import de.danoeh.antennapod.storage.database.DBWriter;
import de.danoeh.antennapod.databinding.PlaybackSpeedFeedSettingDialogBinding; import de.danoeh.antennapod.databinding.PlaybackSpeedFeedSettingDialogBinding;
import de.danoeh.antennapod.ui.screen.feed.RemoveFeedDialog; import de.danoeh.antennapod.ui.screen.feed.RemoveFeedDialog;
@ -22,13 +21,14 @@ import de.danoeh.antennapod.model.feed.Feed;
import de.danoeh.antennapod.model.feed.FeedPreferences; import de.danoeh.antennapod.model.feed.FeedPreferences;
import de.danoeh.antennapod.ui.screen.preferences.PreferenceListDialog; import de.danoeh.antennapod.ui.screen.preferences.PreferenceListDialog;
import de.danoeh.antennapod.ui.screen.preferences.PreferenceSwitchDialog; import de.danoeh.antennapod.ui.screen.preferences.PreferenceSwitchDialog;
import org.greenrobot.eventbus.EventBus;
public class FeedMultiSelectActionHandler { public class FeedMultiSelectActionHandler {
private static final String TAG = "FeedSelectHandler"; private static final String TAG = "FeedSelectHandler";
private final MainActivity activity; private final FragmentActivity activity;
private final List<Feed> selectedItems; private final List<Feed> selectedItems;
public FeedMultiSelectActionHandler(MainActivity activity, List<Feed> selectedItems) { public FeedMultiSelectActionHandler(FragmentActivity activity, List<Feed> selectedItems) {
this.activity = activity; this.activity = activity;
this.selectedItems = selectedItems; this.selectedItems = selectedItems;
} }
@ -121,8 +121,8 @@ public class FeedMultiSelectActionHandler {
} }
private void showMessage(@PluralsRes int msgId, int numItems) { private void showMessage(@PluralsRes int msgId, int numItems) {
activity.showSnackbarAbovePlayer(activity.getResources() EventBus.getDefault().post(new MessageEvent(activity.getResources()
.getQuantityString(msgId, numItems, numItems), Snackbar.LENGTH_LONG); .getQuantityString(msgId, numItems, numItems)));
} }
private void saveFeedPreferences(Consumer<FeedPreferences> preferencesConsumer) { private void saveFeedPreferences(Consumer<FeedPreferences> preferencesConsumer) {

View File

@ -178,7 +178,7 @@ public class SubscriptionFragment extends Fragment
floatingSelectMenu = root.findViewById(R.id.floatingSelectMenu); floatingSelectMenu = root.findViewById(R.id.floatingSelectMenu);
floatingSelectMenu.inflate(R.menu.nav_feed_action_speeddial); floatingSelectMenu.inflate(R.menu.nav_feed_action_speeddial);
floatingSelectMenu.setOnMenuItemClickListener(menuItem -> { floatingSelectMenu.setOnMenuItemClickListener(menuItem -> {
new FeedMultiSelectActionHandler((MainActivity) getActivity(), subscriptionAdapter.getSelectedItems()) new FeedMultiSelectActionHandler(getActivity(), subscriptionAdapter.getSelectedItems())
.handleAction(menuItem.getItemId()); .handleAction(menuItem.getItemId());
return true; return true;
}); });

View File

@ -1,5 +1,6 @@
package de.danoeh.antennapod.ui.screen.subscriptions; package de.danoeh.antennapod.ui.screen.subscriptions;
import android.app.Activity;
import android.graphics.drawable.Drawable; import android.graphics.drawable.Drawable;
import android.view.View; import android.view.View;
import android.widget.CheckBox; import android.widget.CheckBox;
@ -11,7 +12,6 @@ import androidx.appcompat.content.res.AppCompatResources;
import androidx.cardview.widget.CardView; import androidx.cardview.widget.CardView;
import androidx.recyclerview.widget.RecyclerView; import androidx.recyclerview.widget.RecyclerView;
import de.danoeh.antennapod.R; import de.danoeh.antennapod.R;
import de.danoeh.antennapod.activity.MainActivity;
import de.danoeh.antennapod.model.feed.Feed; import de.danoeh.antennapod.model.feed.Feed;
import de.danoeh.antennapod.storage.database.NavDrawerData; import de.danoeh.antennapod.storage.database.NavDrawerData;
import de.danoeh.antennapod.storage.preferences.UserPreferences; import de.danoeh.antennapod.storage.preferences.UserPreferences;
@ -30,9 +30,9 @@ public class SubscriptionViewHolder extends RecyclerView.ViewHolder {
public final CheckBox selectCheckbox; public final CheckBox selectCheckbox;
public final CardView card; public final CardView card;
public final View errorIcon; public final View errorIcon;
public final WeakReference<MainActivity> mainActivityRef; public final WeakReference<Activity> mainActivityRef;
public SubscriptionViewHolder(@NonNull View itemView, MainActivity mainActivity) { public SubscriptionViewHolder(@NonNull View itemView, Activity mainActivity) {
super(itemView); super(itemView);
title = itemView.findViewById(R.id.titleLabel); title = itemView.findViewById(R.id.titleLabel);
coverImage = itemView.findViewById(R.id.coverImage); coverImage = itemView.findViewById(R.id.coverImage);

View File

@ -3,16 +3,14 @@ package de.danoeh.antennapod.ui.swipeactions;
import android.content.Context; import android.content.Context;
import androidx.fragment.app.Fragment; import androidx.fragment.app.Fragment;
import com.google.android.material.snackbar.Snackbar;
import java.util.Date; import java.util.Date;
import de.danoeh.antennapod.R; import de.danoeh.antennapod.R;
import de.danoeh.antennapod.activity.MainActivity; import de.danoeh.antennapod.event.MessageEvent;
import de.danoeh.antennapod.storage.database.DBWriter; import de.danoeh.antennapod.storage.database.DBWriter;
import de.danoeh.antennapod.model.feed.FeedItem; import de.danoeh.antennapod.model.feed.FeedItem;
import de.danoeh.antennapod.model.feed.FeedItemFilter; import de.danoeh.antennapod.model.feed.FeedItemFilter;
import org.greenrobot.eventbus.EventBus;
public class RemoveFromHistorySwipeAction implements SwipeAction { public class RemoveFromHistorySwipeAction implements SwipeAction {
@ -40,15 +38,11 @@ public class RemoveFromHistorySwipeAction implements SwipeAction {
@Override @Override
public void performAction(FeedItem item, Fragment fragment, FeedItemFilter filter) { public void performAction(FeedItem item, Fragment fragment, FeedItemFilter filter) {
Date playbackCompletionDate = item.getMedia().getPlaybackCompletionDate(); Date playbackCompletionDate = item.getMedia().getPlaybackCompletionDate();
DBWriter.deleteFromPlaybackHistory(item); DBWriter.deleteFromPlaybackHistory(item);
EventBus.getDefault().post(new MessageEvent(fragment.getString(R.string.removed_history_label),
((MainActivity) fragment.requireActivity()) context -> DBWriter.addItemToPlaybackHistory(item.getMedia(), playbackCompletionDate),
.showSnackbarAbovePlayer(R.string.removed_history_label, Snackbar.LENGTH_LONG) fragment.getString(R.string.undo)));
.setAction(fragment.getString(R.string.undo),
v -> DBWriter.addItemToPlaybackHistory(item.getMedia(), playbackCompletionDate));
} }
@Override @Override

View File

@ -1,17 +1,14 @@
package de.danoeh.antennapod.ui.swipeactions; package de.danoeh.antennapod.ui.swipeactions;
import android.content.Context; import android.content.Context;
import androidx.fragment.app.Fragment; import androidx.fragment.app.Fragment;
import com.google.android.material.snackbar.Snackbar;
import de.danoeh.antennapod.R; import de.danoeh.antennapod.R;
import de.danoeh.antennapod.activity.MainActivity; import de.danoeh.antennapod.event.MessageEvent;
import de.danoeh.antennapod.storage.database.DBReader; import de.danoeh.antennapod.storage.database.DBReader;
import de.danoeh.antennapod.storage.database.DBWriter; import de.danoeh.antennapod.storage.database.DBWriter;
import de.danoeh.antennapod.model.feed.FeedItem; import de.danoeh.antennapod.model.feed.FeedItem;
import de.danoeh.antennapod.model.feed.FeedItemFilter; import de.danoeh.antennapod.model.feed.FeedItemFilter;
import org.greenrobot.eventbus.EventBus;
public class RemoveFromQueueSwipeAction implements SwipeAction { public class RemoveFromQueueSwipeAction implements SwipeAction {
@ -38,15 +35,12 @@ public class RemoveFromQueueSwipeAction implements SwipeAction {
@Override @Override
public void performAction(FeedItem item, Fragment fragment, FeedItemFilter filter) { public void performAction(FeedItem item, Fragment fragment, FeedItemFilter filter) {
int position = DBReader.getQueueIDList().indexOf(item.getId()); int position = DBReader.getQueueIDList().indexOf(item.getId());
DBWriter.removeQueueItem(fragment.requireActivity(), true, item); DBWriter.removeQueueItem(fragment.requireActivity(), true, item);
if (willRemove(filter, item)) { if (willRemove(filter, item)) {
((MainActivity) fragment.requireActivity()).showSnackbarAbovePlayer( EventBus.getDefault().post(new MessageEvent(
fragment.getResources().getQuantityString(R.plurals.removed_from_queue_message, 1, 1), fragment.getResources().getQuantityString(R.plurals.removed_from_queue_message, 1, 1),
Snackbar.LENGTH_LONG) context -> DBWriter.addQueueItemAt(fragment.requireActivity(), item.getId(), position),
.setAction(fragment.getString(R.string.undo), v -> fragment.getString(R.string.undo)));
DBWriter.addQueueItemAt(fragment.requireActivity(), item.getId(), position));
} }
} }

View File

@ -23,13 +23,14 @@ import androidx.core.util.Consumer;
import com.google.android.material.snackbar.Snackbar; import com.google.android.material.snackbar.Snackbar;
import de.danoeh.antennapod.R; import de.danoeh.antennapod.R;
import de.danoeh.antennapod.activity.MainActivity; import de.danoeh.antennapod.event.MessageEvent;
import de.danoeh.antennapod.ui.MenuItemUtils; import de.danoeh.antennapod.ui.MenuItemUtils;
import de.danoeh.antennapod.ui.common.Converter; import de.danoeh.antennapod.ui.common.Converter;
import de.danoeh.antennapod.ui.common.IntentUtils; import de.danoeh.antennapod.ui.common.IntentUtils;
import de.danoeh.antennapod.net.common.NetworkUtils; import de.danoeh.antennapod.net.common.NetworkUtils;
import de.danoeh.antennapod.ui.share.ShareUtils; import de.danoeh.antennapod.ui.share.ShareUtils;
import de.danoeh.antennapod.ui.cleaner.ShownotesCleaner; import de.danoeh.antennapod.ui.cleaner.ShownotesCleaner;
import org.greenrobot.eventbus.EventBus;
public class ShownotesWebView extends WebView implements View.OnLongClickListener { public class ShownotesWebView extends WebView implements View.OnLongClickListener {
private static final String TAG = "ShownotesWebView"; private static final String TAG = "ShownotesWebView";
@ -104,10 +105,9 @@ public class ShownotesWebView extends WebView implements View.OnLongClickListene
if (clipboardManager != null) { if (clipboardManager != null) {
clipboardManager.setPrimaryClip(ClipData.newPlainText("AntennaPod", r.getExtra())); clipboardManager.setPrimaryClip(ClipData.newPlainText("AntennaPod", r.getExtra()));
} }
if (Build.VERSION.SDK_INT <= 32 && this.getContext() instanceof MainActivity) { if (Build.VERSION.SDK_INT <= 32) {
((MainActivity) this.getContext()).showSnackbarAbovePlayer( EventBus.getDefault().post(new MessageEvent(
getResources().getString(R.string.copied_to_clipboard), getContext().getResources().getString(R.string.copied_to_clipboard)));
Snackbar.LENGTH_SHORT);
} }
return true; return true;
} }

View File

@ -76,6 +76,11 @@ public class MainActivityStarter {
return this; return this;
} }
public MainActivityStarter withClearTop() {
intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
return this;
}
public MainActivityStarter withFragmentArgs(String name, boolean value) { public MainActivityStarter withFragmentArgs(String name, boolean value) {
if (fragmentArgs == null) { if (fragmentArgs == null) {
fragmentArgs = new Bundle(); fragmentArgs = new Bundle();