From 9e84a0626049430fbd758aea2bf2fd00e12811b2 Mon Sep 17 00:00:00 2001 From: ByteHamster Date: Wed, 25 Mar 2020 17:00:48 +0100 Subject: Reworked cast button handling --- .../antennapod/activity/CastEnabledActivity.java | 4 +- .../danoeh/antennapod/activity/MainActivity.java | 24 --- .../antennapod/activity/MediaplayerActivity.java | 4 +- .../antennapod/fragment/AudioPlayerFragment.java | 14 +- .../antennapod/fragment/ItemPagerFragment.java | 3 - app/src/main/res/layout/audioplayer_fragment.xml | 4 +- .../antennapod/activity/CastEnabledActivity.java | 194 ++++----------------- 7 files changed, 45 insertions(+), 202 deletions(-) (limited to 'app') diff --git a/app/src/free/java/de/danoeh/antennapod/activity/CastEnabledActivity.java b/app/src/free/java/de/danoeh/antennapod/activity/CastEnabledActivity.java index aff1d6ea4..98d506f65 100644 --- a/app/src/free/java/de/danoeh/antennapod/activity/CastEnabledActivity.java +++ b/app/src/free/java/de/danoeh/antennapod/activity/CastEnabledActivity.java @@ -2,6 +2,8 @@ package de.danoeh.antennapod.activity; import androidx.appcompat.app.AppCompatActivity; +import android.view.Menu; + /** * Activity that allows for showing the MediaRouter button whenever there's a cast device in the * network. @@ -9,7 +11,7 @@ import androidx.appcompat.app.AppCompatActivity; public abstract class CastEnabledActivity extends AppCompatActivity { public static final String TAG = "CastEnabledActivity"; - public final void requestCastButton(int showAsAction) { + public final void requestCastButton(Menu menu) { // no-op } } 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 05b167201..115114504 100644 --- a/app/src/main/java/de/danoeh/antennapod/activity/MainActivity.java +++ b/app/src/main/java/de/danoeh/antennapod/activity/MainActivity.java @@ -324,30 +324,6 @@ public class MainActivity extends CastEnabledActivity { Glide.get(this).clearMemory(); } - @Override - public boolean onCreateOptionsMenu(Menu menu) { - boolean retVal = super.onCreateOptionsMenu(menu); - if (Flavors.FLAVOR == Flavors.PLAY) { - switch (NavDrawerFragment.getLastNavFragment(this)) { - case QueueFragment.TAG: - case EpisodesFragment.TAG: - case AudioPlayerFragment.TAG: - requestCastButton(MenuItem.SHOW_AS_ACTION_IF_ROOM); - return retVal; - case DownloadsFragment.TAG: - case PlaybackHistoryFragment.TAG: - case AddFeedFragment.TAG: - case SubscriptionFragment.TAG: - return retVal; - default: - requestCastButton(MenuItem.SHOW_AS_ACTION_NEVER); - return retVal; - } - } else { - return retVal; - } - } - @Override public boolean onOptionsItemSelected(MenuItem item) { if (drawerToggle.onOptionsItemSelected(item)) { diff --git a/app/src/main/java/de/danoeh/antennapod/activity/MediaplayerActivity.java b/app/src/main/java/de/danoeh/antennapod/activity/MediaplayerActivity.java index 973ca6b98..42f750353 100644 --- a/app/src/main/java/de/danoeh/antennapod/activity/MediaplayerActivity.java +++ b/app/src/main/java/de/danoeh/antennapod/activity/MediaplayerActivity.java @@ -295,9 +295,7 @@ public abstract class MediaplayerActivity extends CastEnabledActivity implements @Override public boolean onCreateOptionsMenu(Menu menu) { super.onCreateOptionsMenu(menu); - if (Flavors.FLAVOR == Flavors.PLAY) { - requestCastButton(MenuItem.SHOW_AS_ACTION_ALWAYS); - } + requestCastButton(menu); MenuInflater inflater = getMenuInflater(); inflater.inflate(R.menu.mediaplayer, menu); return true; diff --git a/app/src/main/java/de/danoeh/antennapod/fragment/AudioPlayerFragment.java b/app/src/main/java/de/danoeh/antennapod/fragment/AudioPlayerFragment.java index 5b9740154..ed136af3c 100644 --- a/app/src/main/java/de/danoeh/antennapod/fragment/AudioPlayerFragment.java +++ b/app/src/main/java/de/danoeh/antennapod/fragment/AudioPlayerFragment.java @@ -22,6 +22,7 @@ import androidx.fragment.app.FragmentPagerAdapter; import androidx.viewpager.widget.ViewPager; import com.google.android.material.bottomsheet.BottomSheetBehavior; import de.danoeh.antennapod.R; +import de.danoeh.antennapod.activity.CastEnabledActivity; import de.danoeh.antennapod.activity.MainActivity; import de.danoeh.antennapod.core.event.FavoritesEvent; import de.danoeh.antennapod.core.event.PlaybackPositionEvent; @@ -423,7 +424,6 @@ public class AudioPlayerFragment extends Fragment implements public void setupOptionsMenu() { if (toolbar.getMenu().size() == 0) { - //toolbar.inflateMenu(R.menu.cast_enabled); toolbar.inflateMenu(R.menu.mediaplayer); } if (controller == null) { @@ -439,17 +439,7 @@ public class AudioPlayerFragment extends Fragment implements toolbar.getMenu().findItem(R.id.set_sleeptimer_item).setVisible(!controller.sleepTimerActive()); toolbar.getMenu().findItem(R.id.disable_sleeptimer_item).setVisible(controller.sleepTimerActive()); - /*MenuItem mediaRouteButton = toolbar.getMenu().findItem(R.id.media_route_menu_item); - SwitchableMediaRouteActionProvider mediaRouteActionProvider = - CastManager.getInstance().addMediaRouterButton(mediaRouteButton); - CastEnabledActivity.CastButtonVisibilityManager castButtonVisibilityManager = - new CastEnabledActivity.CastButtonVisibilityManager(CastManager.getInstance()); - castButtonVisibilityManager.setMenu(toolbar.getMenu()); - castButtonVisibilityManager.setPrefEnabled(UserPreferences.isCastEnabled()); - castButtonVisibilityManager.mediaRouteActionProvider = mediaRouteActionProvider; - castButtonVisibilityManager.setResumed(true); - castButtonVisibilityManager.requestCastButton(MenuItem.SHOW_AS_ACTION_ALWAYS); - mediaRouteActionProvider.setEnabled(castButtonVisibilityManager.shouldEnable());*/ + ((CastEnabledActivity) getActivity()).requestCastButton(toolbar.getMenu()); } @Override 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 f251de5ec..39abdeda5 100644 --- a/app/src/main/java/de/danoeh/antennapod/fragment/ItemPagerFragment.java +++ b/app/src/main/java/de/danoeh/antennapod/fragment/ItemPagerFragment.java @@ -146,9 +146,6 @@ public class ItemPagerFragment extends Fragment { return; } super.onCreateOptionsMenu(menu, inflater); - if (Flavors.FLAVOR == Flavors.PLAY) { - ((CastEnabledActivity) getActivity()).requestCastButton(MenuItem.SHOW_AS_ACTION_ALWAYS); - } inflater.inflate(R.menu.feeditem_options, menu); if (item.hasMedia()) { FeedItemMenuHandler.onPrepareMenu(menu, item); diff --git a/app/src/main/res/layout/audioplayer_fragment.xml b/app/src/main/res/layout/audioplayer_fragment.xml index e1503334c..905371fa4 100644 --- a/app/src/main/res/layout/audioplayer_fragment.xml +++ b/app/src/main/res/layout/audioplayer_fragment.xml @@ -136,8 +136,8 @@ castButtons = new ArrayList<>(); @Override protected void onCreate(Bundle savedInstanceState) { @@ -58,9 +59,10 @@ public abstract class CastEnabledActivity extends AppCompatActivity }; castManager = CastManager.getInstance(); castManager.addCastConsumer(castConsumer); - castButtonVisibilityManager = new CastButtonVisibilityManager(castManager); + CastButtonVisibilityManager castButtonVisibilityManager = new CastButtonVisibilityManager(castManager); castButtonVisibilityManager.setPrefEnabled(UserPreferences.isCastEnabled()); onCastConnectionChanged(castManager.isConnected()); + castButtons.add(castButtonVisibilityManager); } @Override @@ -75,47 +77,15 @@ public abstract class CastEnabledActivity extends AppCompatActivity super.onDestroy(); } - @Override - @CallSuper - public boolean onCreateOptionsMenu(Menu menu) { - super.onCreateOptionsMenu(menu); - if (!CastManager.isInitialized()) { - return true; - } - getMenuInflater().inflate(R.menu.cast_enabled, menu); - castButtonVisibilityManager.setMenu(menu); - return true; - } - - @Override - @CallSuper - public boolean onPrepareOptionsMenu(Menu menu) { - super.onPrepareOptionsMenu(menu); - if (!CastManager.isInitialized()) { - return true; - } - - MenuItem mediaRouteButton = menu.findItem(R.id.media_route_menu_item); - if (mediaRouteButton == null) { - Log.wtf(TAG, "MediaRoute item could not be found on the menu!", new Exception()); - mediaRouteActionProvider = null; - return true; - } - mediaRouteActionProvider = castManager.addMediaRouterButton(mediaRouteButton); - if (mediaRouteActionProvider != null) { - castButtonVisibilityManager.mediaRouteActionProvider = mediaRouteActionProvider; - mediaRouteActionProvider.setEnabled(castButtonVisibilityManager.shouldEnable()); - } - return true; - } - @Override protected void onResume() { super.onResume(); if (!CastManager.isInitialized()) { return; } - castButtonVisibilityManager.setResumed(true); + for (CastButtonVisibilityManager castButton : castButtons) { + castButton.setResumed(true); + } } @Override @@ -124,7 +94,9 @@ public abstract class CastEnabledActivity extends AppCompatActivity if (!CastManager.isInitialized()) { return; } - castButtonVisibilityManager.setResumed(false); + for (CastButtonVisibilityManager castButton : castButtons) { + castButton.setResumed(false); + } } @@ -133,7 +105,9 @@ public abstract class CastEnabledActivity extends AppCompatActivity if (UserPreferences.PREF_CAST_ENABLED.equals(key)) { boolean newValue = UserPreferences.isCastEnabled(); Log.d(TAG, "onSharedPreferenceChanged(), isCastEnabled set to " + newValue); - castButtonVisibilityManager.setPrefEnabled(newValue); + for (CastButtonVisibilityManager castButton : castButtons) { + castButton.setPrefEnabled(newValue); + } // PlaybackService has its own listener, so if it's active we don't have to take action here. if (!newValue && !PlaybackService.isRunning) { CastManager.getInstance().disconnect(); @@ -143,135 +117,41 @@ public abstract class CastEnabledActivity extends AppCompatActivity private void onCastConnectionChanged(boolean connected) { if (connected) { - castButtonVisibilityManager.onConnected(); + for (CastButtonVisibilityManager castButton : castButtons) { + castButton.onConnected(); + } setVolumeControlStream(AudioManager.USE_DEFAULT_STREAM_TYPE); } else { - castButtonVisibilityManager.onDisconnected(); + for (CastButtonVisibilityManager castButton : castButtons) { + castButton.onDisconnected(); + } setVolumeControlStream(AudioManager.STREAM_MUSIC); } } /** * Should be called by any activity or fragment for which the cast button should be shown. - * - * @param showAsAction refer to {@link MenuItem#setShowAsAction(int)} */ - public final void requestCastButton(int showAsAction) { + public final void requestCastButton(Menu menu) { if (!CastManager.isInitialized()) { return; } - castButtonVisibilityManager.requestCastButton(showAsAction); - } - - public static class CastButtonVisibilityManager { - private final CastManager castManager; - private volatile boolean prefEnabled = false; - private volatile boolean viewRequested = false; - private volatile boolean resumed = false; - private volatile boolean connected = false; - private volatile int showAsAction = MenuItem.SHOW_AS_ACTION_IF_ROOM; - private Menu menu; - public SwitchableMediaRouteActionProvider mediaRouteActionProvider; - - public CastButtonVisibilityManager(CastManager castManager) { - this.castManager = castManager; - } - public synchronized void setPrefEnabled(boolean newValue) { - if (prefEnabled != newValue && resumed && (viewRequested || connected)) { - if (newValue) { - castManager.incrementUiCounter(); - } else { - castManager.decrementUiCounter(); - } - } - prefEnabled = newValue; - if (mediaRouteActionProvider != null) { - mediaRouteActionProvider.setEnabled(prefEnabled && (viewRequested || connected)); - } - } - - public synchronized void setResumed(boolean newValue) { - if (resumed == newValue) { - Log.e(TAG, "resumed should never change to the same value"); - return; - } - resumed = newValue; - if (prefEnabled && (viewRequested || connected)) { - if (resumed) { - castManager.incrementUiCounter(); - } else { - castManager.decrementUiCounter(); - } - } - } - - public synchronized void setViewRequested(boolean newValue) { - if (viewRequested != newValue && resumed && prefEnabled && !connected) { - if (newValue) { - castManager.incrementUiCounter(); - } else { - castManager.decrementUiCounter(); - } - } - viewRequested = newValue; - if (mediaRouteActionProvider != null) { - mediaRouteActionProvider.setEnabled(prefEnabled && (viewRequested || connected)); - } - } - - public synchronized void setConnected(boolean newValue) { - if (connected != newValue && resumed && prefEnabled && !prefEnabled) { - if (newValue) { - castManager.incrementUiCounter(); - } else { - castManager.decrementUiCounter(); - } - } - connected = newValue; - if (mediaRouteActionProvider != null) { - mediaRouteActionProvider.setEnabled(prefEnabled && (viewRequested || connected)); - } - } - - public synchronized boolean shouldEnable() { - return prefEnabled && viewRequested; - } - - public void setMenu(Menu menu) { - setViewRequested(false); - showAsAction = MenuItem.SHOW_AS_ACTION_IF_ROOM; - this.menu = menu; - setShowAsAction(); - } - - public void requestCastButton(int showAsAction) { - setViewRequested(true); - this.showAsAction = showAsAction; - setShowAsAction(); - } - - public void onConnected() { - setConnected(true); - setShowAsAction(); - } - - public void onDisconnected() { - setConnected(false); - setShowAsAction(); + MenuItem mediaRouteButton = menu.findItem(R.id.media_route_menu_item); + if (mediaRouteButton == null) { + getMenuInflater().inflate(R.menu.cast_enabled, menu); + mediaRouteButton = menu.findItem(R.id.media_route_menu_item); } - private void setShowAsAction() { - if (menu == null) { - Log.d(TAG, "setShowAsAction() without a menu"); - return; - } - MenuItem item = menu.findItem(R.id.media_route_menu_item); - if (item == null) { - Log.e(TAG, "setShowAsAction(), but cast button not inflated"); - return; - } - MenuItemCompat.setShowAsAction(item, connected? MenuItem.SHOW_AS_ACTION_ALWAYS : showAsAction); - } + SwitchableMediaRouteActionProvider mediaRouteActionProvider = + CastManager.getInstance().addMediaRouterButton(mediaRouteButton); + CastButtonVisibilityManager castButtonVisibilityManager = + new CastButtonVisibilityManager(CastManager.getInstance()); + castButtonVisibilityManager.setMenu(menu); + castButtonVisibilityManager.setPrefEnabled(UserPreferences.isCastEnabled()); + castButtonVisibilityManager.mediaRouteActionProvider = mediaRouteActionProvider; + castButtonVisibilityManager.setResumed(true); + castButtonVisibilityManager.requestCastButton(MenuItem.SHOW_AS_ACTION_ALWAYS); + mediaRouteActionProvider.setEnabled(castButtonVisibilityManager.shouldEnable()); } } -- cgit v1.2.3