summaryrefslogtreecommitdiff
path: root/app/src/play/java/de/danoeh/antennapod
diff options
context:
space:
mode:
Diffstat (limited to 'app/src/play/java/de/danoeh/antennapod')
-rw-r--r--app/src/play/java/de/danoeh/antennapod/activity/CastEnabledActivity.java194
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());
}
}