summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--app/src/main/java/de/danoeh/antennapod/activity/CastEnabledActivity.java30
-rw-r--r--app/src/main/res/menu/cast_enabled.xml2
-rw-r--r--core/src/main/java/de/danoeh/antennapod/core/cast/CastManager.java21
-rw-r--r--core/src/main/java/de/danoeh/antennapod/core/cast/SwitchableMediaRouteActionProvider.java36
4 files changed, 77 insertions, 12 deletions
diff --git a/app/src/main/java/de/danoeh/antennapod/activity/CastEnabledActivity.java b/app/src/main/java/de/danoeh/antennapod/activity/CastEnabledActivity.java
index 0ce90eae3..82cf0eed1 100644
--- a/app/src/main/java/de/danoeh/antennapod/activity/CastEnabledActivity.java
+++ b/app/src/main/java/de/danoeh/antennapod/activity/CastEnabledActivity.java
@@ -4,11 +4,12 @@ import android.content.SharedPreferences;
import android.os.Bundle;
import android.preference.PreferenceManager;
import android.support.v7.app.AppCompatActivity;
+import android.util.Log;
import android.view.Menu;
-import android.view.MenuItem;
import de.danoeh.antennapod.R;
import de.danoeh.antennapod.core.cast.CastManager;
+import de.danoeh.antennapod.core.cast.SwitchableMediaRouteActionProvider;
import de.danoeh.antennapod.core.preferences.UserPreferences;
/**
@@ -17,17 +18,18 @@ import de.danoeh.antennapod.core.preferences.UserPreferences;
*/
public abstract class CastEnabledActivity extends AppCompatActivity
implements SharedPreferences.OnSharedPreferenceChangeListener {
+ public static final String TAG = "CastEnabledActivity";
protected CastManager mCastManager;
- private int castUICounter;
- protected MenuItem mMediaRouteMenuItem;
- protected boolean isCastEnabled;
+ private volatile int castUICounter;
+ protected SwitchableMediaRouteActionProvider mMediaRouteActionProvider;
+ protected volatile boolean isCastEnabled;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
- PreferenceManager.getDefaultSharedPreferences(this).
+ PreferenceManager.getDefaultSharedPreferences(getApplicationContext()).
registerOnSharedPreferenceChangeListener(this);
castUICounter = 0;
@@ -36,6 +38,13 @@ public abstract class CastEnabledActivity extends AppCompatActivity
}
@Override
+ protected void onDestroy() {
+ PreferenceManager.getDefaultSharedPreferences(getApplicationContext())
+ .unregisterOnSharedPreferenceChangeListener(this);
+ super.onDestroy();
+ }
+
+ @Override
public boolean onCreateOptionsMenu(Menu menu) {
super.onCreateOptionsMenu(menu);
getMenuInflater().inflate(R.menu.cast_enabled, menu);
@@ -45,9 +54,9 @@ public abstract class CastEnabledActivity extends AppCompatActivity
@Override
public boolean onPrepareOptionsMenu(Menu menu) {
super.onPrepareOptionsMenu(menu);
- mMediaRouteMenuItem = menu.findItem(R.id.media_route_menu_item);
- mMediaRouteMenuItem.setEnabled(isCastEnabled);
- mMediaRouteMenuItem = mCastManager.addMediaRouterButton(menu, R.id.media_route_menu_item);
+ mMediaRouteActionProvider = mCastManager
+ .addMediaRouterButton(menu.findItem(R.id.media_route_menu_item));
+ mMediaRouteActionProvider.setEnabled(isCastEnabled);
return true;
}
@@ -71,13 +80,12 @@ public abstract class CastEnabledActivity extends AppCompatActivity
}
}
- //This whole method might just be useless because it's assumed that the cast button
- //won't show where the user actually has the power to change the preference.
@Override
public void onSharedPreferenceChanged(SharedPreferences sharedPreferences, String key) {
if (key.equals(UserPreferences.PREF_CAST_ENABLED)) {
isCastEnabled = UserPreferences.isCastEnabled();
- mMediaRouteMenuItem.setEnabled(isCastEnabled);
+ Log.d(TAG, "onSharedPreferenceChanged(), isCastEnabled set to " + isCastEnabled);
+ mMediaRouteActionProvider.setEnabled(isCastEnabled);
if (isCastEnabled) {
//Test if activity is resumed but without UI counter incremented
if (castUICounter==1) {
diff --git a/app/src/main/res/menu/cast_enabled.xml b/app/src/main/res/menu/cast_enabled.xml
index 25c10c88d..676f3ea1e 100644
--- a/app/src/main/res/menu/cast_enabled.xml
+++ b/app/src/main/res/menu/cast_enabled.xml
@@ -6,6 +6,6 @@
android:id="@+id/media_route_menu_item"
android:title="@string/cast_media_route_menu_title"
android:enabled="false"
- custom:actionProviderClass="android.support.v7.app.MediaRouteActionProvider"
+ custom:actionProviderClass="de.danoeh.antennapod.core.cast.SwitchableMediaRouteActionProvider"
custom:showAsAction="always"/>
</menu> \ No newline at end of file
diff --git a/core/src/main/java/de/danoeh/antennapod/core/cast/CastManager.java b/core/src/main/java/de/danoeh/antennapod/core/cast/CastManager.java
index 59a10c89f..b68e98e89 100644
--- a/core/src/main/java/de/danoeh/antennapod/core/cast/CastManager.java
+++ b/core/src/main/java/de/danoeh/antennapod/core/cast/CastManager.java
@@ -21,9 +21,11 @@ package de.danoeh.antennapod.core.cast;
import android.content.Context;
import android.os.Build;
+import android.support.v4.view.MenuItemCompat;
import android.support.v7.media.MediaRouter;
import android.util.Log;
import android.view.KeyEvent;
+import android.view.MenuItem;
import com.google.android.gms.cast.ApplicationMetadata;
import com.google.android.gms.cast.Cast;
@@ -1713,4 +1715,23 @@ public class CastManager extends BaseCastManager implements OnFailedListener {
return defaultVal;
}
}
+
+ /**
+ * Adds and wires up the Switchable Media Router cast button. It returns a reference to the
+ * {@link SwitchableMediaRouteActionProvider} associated with the button if the caller needs
+ * such reference. It is assumed that the enclosing
+ * {@link android.app.Activity} inherits (directly or indirectly) from
+ * {@link android.support.v7.app.AppCompatActivity}.
+ *
+ * @param menuItem MenuItem of the Media Router cast button.
+ */
+ public final SwitchableMediaRouteActionProvider addMediaRouterButton(MenuItem menuItem) {
+ SwitchableMediaRouteActionProvider mediaRouteActionProvider = (SwitchableMediaRouteActionProvider)
+ MenuItemCompat.getActionProvider(menuItem);
+ mediaRouteActionProvider.setRouteSelector(mMediaRouteSelector);
+ if (mCastConfiguration.getMediaRouteDialogFactory() != null) {
+ mediaRouteActionProvider.setDialogFactory(mCastConfiguration.getMediaRouteDialogFactory());
+ }
+ return mediaRouteActionProvider;
+ }
}
diff --git a/core/src/main/java/de/danoeh/antennapod/core/cast/SwitchableMediaRouteActionProvider.java b/core/src/main/java/de/danoeh/antennapod/core/cast/SwitchableMediaRouteActionProvider.java
new file mode 100644
index 000000000..3d40c90fd
--- /dev/null
+++ b/core/src/main/java/de/danoeh/antennapod/core/cast/SwitchableMediaRouteActionProvider.java
@@ -0,0 +1,36 @@
+package de.danoeh.antennapod.core.cast;
+
+import android.content.Context;
+import android.support.v7.app.MediaRouteActionProvider;
+
+/**
+ * <p>Action Provider that extends {@link MediaRouteActionProvider} and allows the client to
+ * disable completely the button by calling {@link #setEnabled(boolean)}.</p>
+ *
+ * <p>It is disabled by default, so if a client wants to initially have it enabled it must call
+ * <code>setEnabled(true)</code>.</p>
+ */
+public class SwitchableMediaRouteActionProvider extends MediaRouteActionProvider {
+
+ private boolean enabled;
+
+ public SwitchableMediaRouteActionProvider(Context context) {
+ super(context);
+ enabled = false;
+ }
+
+ /**
+ * <p>Sets whether the Media Router button should be allowed to become visible or not.</p>
+ *
+ * <p>It's invisible by default.</p>
+ */
+ public void setEnabled(boolean newVal) {
+ enabled = newVal;
+ refreshVisibility();
+ }
+
+ @Override
+ public boolean isVisible() {
+ return enabled && super.isVisible();
+ }
+}