diff options
author | ByteHamster <info@bytehamster.com> | 2020-03-25 17:00:48 +0100 |
---|---|---|
committer | ByteHamster <info@bytehamster.com> | 2020-03-25 17:00:48 +0100 |
commit | 9e84a0626049430fbd758aea2bf2fd00e12811b2 (patch) | |
tree | 4bc2f3553e131304037c822558fa9b67ebe72835 /app | |
parent | a989db586a853852549c638d43c425a3463f901d (diff) | |
download | AntennaPod-9e84a0626049430fbd758aea2bf2fd00e12811b2.zip |
Reworked cast button handling
Diffstat (limited to 'app')
7 files changed, 45 insertions, 202 deletions
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 @@ -325,30 +325,6 @@ public class MainActivity extends CastEnabledActivity { } @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)) { return true; 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 @@ <ProgressBar style="?android:attr/progressBarStyle" - android:layout_width="wrap_content" - android:layout_height="wrap_content" + android:layout_width="@dimen/audioplayer_playercontrols_length_big" + android:layout_height="@dimen/audioplayer_playercontrols_length_big" android:layout_centerHorizontal="true" android:layout_centerVertical="true" android:id="@+id/progLoading" diff --git a/app/src/play/java/de/danoeh/antennapod/activity/CastEnabledActivity.java b/app/src/play/java/de/danoeh/antennapod/activity/CastEnabledActivity.java index ca5806740..10678f556 100644 --- a/app/src/play/java/de/danoeh/antennapod/activity/CastEnabledActivity.java +++ b/app/src/play/java/de/danoeh/antennapod/activity/CastEnabledActivity.java @@ -4,8 +4,6 @@ import android.content.SharedPreferences; import android.media.AudioManager; import android.os.Bundle; import android.preference.PreferenceManager; -import androidx.annotation.CallSuper; -import androidx.core.view.MenuItemCompat; import androidx.appcompat.app.AppCompatActivity; import android.util.Log; import android.view.Menu; @@ -14,6 +12,7 @@ import android.view.MenuItem; import com.google.android.gms.cast.ApplicationMetadata; import de.danoeh.antennapod.R; +import de.danoeh.antennapod.core.cast.CastButtonVisibilityManager; import de.danoeh.antennapod.core.cast.CastConsumer; import de.danoeh.antennapod.core.cast.CastManager; import de.danoeh.antennapod.core.cast.DefaultCastConsumer; @@ -21,6 +20,9 @@ import de.danoeh.antennapod.core.cast.SwitchableMediaRouteActionProvider; import de.danoeh.antennapod.core.preferences.UserPreferences; import de.danoeh.antennapod.core.service.playback.PlaybackService; +import java.util.ArrayList; +import java.util.List; + /** * Activity that allows for showing the MediaRouter button whenever there's a cast device in the * network. @@ -31,8 +33,7 @@ public abstract class CastEnabledActivity extends AppCompatActivity private CastConsumer castConsumer; private CastManager castManager; - private SwitchableMediaRouteActionProvider mediaRouteActionProvider; - private CastButtonVisibilityManager castButtonVisibilityManager; + private final List<CastButtonVisibilityManager> 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 @@ -76,46 +78,14 @@ public abstract class CastEnabledActivity extends AppCompatActivity } @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()); } } |