diff --git a/api/current.txt b/api/current.txt index f2f79777d119d..14f7dd6dcd4cf 100644 --- a/api/current.txt +++ b/api/current.txt @@ -22815,10 +22815,12 @@ package android.view { public abstract class ActionProvider { ctor public ActionProvider(android.content.Context); method public boolean hasSubMenu(); + method public boolean isVisible(); method public abstract deprecated android.view.View onCreateActionView(); method public android.view.View onCreateActionView(android.view.MenuItem); method public boolean onPerformDefaultAction(); method public void onPrepareSubMenu(android.view.SubMenu); + method public boolean overridesItemVisibility(); } public final class Choreographer { diff --git a/core/java/android/app/MediaRouteActionProvider.java b/core/java/android/app/MediaRouteActionProvider.java index 4860182aa4d5e..b1fc90a052f15 100644 --- a/core/java/android/app/MediaRouteActionProvider.java +++ b/core/java/android/app/MediaRouteActionProvider.java @@ -21,7 +21,6 @@ import com.android.internal.app.MediaRouteChooserDialogFragment; import android.content.Context; import android.content.ContextWrapper; import android.media.MediaRouter; -import android.media.MediaRouter.RouteInfo; import android.util.Log; import android.view.ActionProvider; import android.view.MenuItem; @@ -35,7 +34,6 @@ public class MediaRouteActionProvider extends ActionProvider { private MenuItem mMenuItem; private MediaRouteButton mView; private int mRouteTypes; - private final RouterCallback mRouterCallback = new RouterCallback(); private View.OnClickListener mExtendedSettingsListener; public MediaRouteActionProvider(Context context) { @@ -50,18 +48,10 @@ public class MediaRouteActionProvider extends ActionProvider { } public void setRouteTypes(int types) { - if (types == mRouteTypes) { - // Already registered; nothing to do. - return; - } - if (mRouteTypes != 0) { - mRouter.removeCallback(mRouterCallback); - } mRouteTypes = types; if (mView != null) { mView.setRouteTypes(mRouteTypes); } - mRouter.addCallback(types, mRouterCallback); } @Override @@ -124,15 +114,13 @@ public class MediaRouteActionProvider extends ActionProvider { } } - private class RouterCallback extends MediaRouter.SimpleCallback { - @Override - public void onRouteAdded(MediaRouter router, RouteInfo info) { - mMenuItem.setVisible(mRouter.getRouteCount() > 1); - } + @Override + public boolean overridesItemVisibility() { + return true; + } - @Override - public void onRouteRemoved(MediaRouter router, RouteInfo info) { - mMenuItem.setVisible(mRouter.getRouteCount() > 1); - } + @Override + public boolean isVisible() { + return mRouter.getRouteCount() > 1; } } diff --git a/core/java/android/view/ActionProvider.java b/core/java/android/view/ActionProvider.java index fa79d360ed260..af9bf9e425d67 100644 --- a/core/java/android/view/ActionProvider.java +++ b/core/java/android/view/ActionProvider.java @@ -95,6 +95,32 @@ public abstract class ActionProvider { return onCreateActionView(); } + /** + * The result of this method determines whether or not {@link #isVisible()} will be used + * by the {@link MenuItem} this ActionProvider is bound to help determine its visibility. + * + * @return true if this ActionProvider overrides the visibility of the MenuItem + * it is bound to, false otherwise. The default implementation returns false. + * @see #isVisible() + */ + public boolean overridesItemVisibility() { + return false; + } + + /** + * If {@link #overridesItemVisibility()} returns true, the return value of this method + * will help determine the visibility of the {@link MenuItem} this ActionProvider is bound to. + * + *
If the MenuItem's visibility is explicitly set to false by the application, + * the MenuItem will not be shown, even if this method returns true.
+ * + * @return true if the MenuItem this ActionProvider is bound to is visible, false if + * it is invisible. The default implementation returns true. + */ + public boolean isVisible() { + return true; + } + /** * Performs an optional default action. *diff --git a/core/java/com/android/internal/view/menu/MenuItemImpl.java b/core/java/com/android/internal/view/menu/MenuItemImpl.java index de75962d5c1e5..9baface5ccbea 100644 --- a/core/java/com/android/internal/view/menu/MenuItemImpl.java +++ b/core/java/com/android/internal/view/menu/MenuItemImpl.java @@ -456,6 +456,9 @@ public final class MenuItemImpl implements MenuItem { } public boolean isVisible() { + if (mActionProvider != null && mActionProvider.overridesItemVisibility()) { + return (mFlags & HIDDEN) == 0 && mActionProvider.isVisible(); + } return (mFlags & HIDDEN) == 0; } diff --git a/media/java/android/media/MediaRouter.java b/media/java/android/media/MediaRouter.java index 10865030dbd80..d940185fbb9f4 100644 --- a/media/java/android/media/MediaRouter.java +++ b/media/java/android/media/MediaRouter.java @@ -662,6 +662,7 @@ public class MediaRouter { */ public void setTag(Object tag) { mTag = tag; + routeUpdated(); } /** @@ -675,7 +676,6 @@ public class MediaRouter { void setStatusInt(CharSequence status) { if (!status.equals(mStatus)) { mStatus = status; - routeUpdated(); if (mGroup != null) { mGroup.memberStatusChanged(this, status); }