From 39d5c6172503620ac3761148adac5fd7fa20d02d Mon Sep 17 00:00:00 2001 From: Adam Powell Date: Sat, 16 Jun 2012 14:25:38 -0700 Subject: Make MediaRouter UI more robust around route count changes Improve the API around ActionProvider visibility overriding. Allow the application to notify whatever is hosting the ActionProvider that visibility has changed in a way that is friendly to alternate support library-style reimplementations of MenuItem. Allow MediaRouter.Callback implementations to add or remove themselves or other Callbacks during dispatch of callback events. Make MediaRouteActionProvider track the visibility of corresponding menu items more accurately. Change-Id: Ic7ddb6a87c3637904750d2661e4a9fa323b09ea0 --- .../java/android/app/MediaRouteActionProvider.java | 43 +++++++++++++++++++++- 1 file changed, 42 insertions(+), 1 deletion(-) (limited to 'core/java/android/app/MediaRouteActionProvider.java') diff --git a/core/java/android/app/MediaRouteActionProvider.java b/core/java/android/app/MediaRouteActionProvider.java index b1fc90a..c2f5ac1 100644 --- a/core/java/android/app/MediaRouteActionProvider.java +++ b/core/java/android/app/MediaRouteActionProvider.java @@ -21,11 +21,14 @@ 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; import android.view.View; +import java.lang.ref.WeakReference; + public class MediaRouteActionProvider extends ActionProvider { private static final String TAG = "MediaRouteActionProvider"; @@ -35,11 +38,13 @@ public class MediaRouteActionProvider extends ActionProvider { private MediaRouteButton mView; private int mRouteTypes; private View.OnClickListener mExtendedSettingsListener; + private RouterCallback mCallback; public MediaRouteActionProvider(Context context) { super(context); mContext = context; mRouter = (MediaRouter) context.getSystemService(Context.MEDIA_ROUTER_SERVICE); + mCallback = new RouterCallback(this); // Start with live audio by default. // TODO Update this when new route types are added; segment by API level @@ -48,7 +53,14 @@ public class MediaRouteActionProvider extends ActionProvider { } public void setRouteTypes(int types) { + if (mRouteTypes == types) return; + if (mRouteTypes != 0) { + mRouter.removeCallback(mCallback); + } mRouteTypes = types; + if (types != 0) { + mRouter.addCallback(types, mCallback); + } if (mView != null) { mView.setRouteTypes(mRouteTypes); } @@ -68,7 +80,6 @@ public class MediaRouteActionProvider extends ActionProvider { } mMenuItem = item; mView = new MediaRouteButton(mContext); - mMenuItem.setVisible(mRouter.getRouteCount() > 1); mView.setRouteTypes(mRouteTypes); mView.setExtendedSettingsClickListener(mExtendedSettingsListener); return mView; @@ -123,4 +134,34 @@ public class MediaRouteActionProvider extends ActionProvider { public boolean isVisible() { return mRouter.getRouteCount() > 1; } + + private static class RouterCallback extends MediaRouter.SimpleCallback { + private WeakReference mAp; + + RouterCallback(MediaRouteActionProvider ap) { + mAp = new WeakReference(ap); + } + + @Override + public void onRouteAdded(MediaRouter router, RouteInfo info) { + final MediaRouteActionProvider ap = mAp.get(); + if (ap == null) { + router.removeCallback(this); + return; + } + + ap.refreshVisibility(); + } + + @Override + public void onRouteRemoved(MediaRouter router, RouteInfo info) { + final MediaRouteActionProvider ap = mAp.get(); + if (ap == null) { + router.removeCallback(this); + return; + } + + ap.refreshVisibility(); + } + } } -- cgit v1.1