diff options
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(); + } +} |