diff options
Diffstat (limited to 'app/src/play')
-rw-r--r-- | app/src/play/java/de/danoeh/antennapod/activity/CastEnabledActivity.java | 194 |
1 files changed, 37 insertions, 157 deletions
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()); } } |