diff options
author | Adam Powell <adamp@google.com> | 2012-06-16 14:25:38 -0700 |
---|---|---|
committer | Adam Powell <adamp@google.com> | 2012-06-16 14:49:13 -0700 |
commit | 39d5c6172503620ac3761148adac5fd7fa20d02d (patch) | |
tree | 8720e26aeab2ae36577309dd912be3f0933c6f14 /core/java/android/app/MediaRouteActionProvider.java | |
parent | c4637d3efbbeb3e204691da96c357b5fea4ae2f1 (diff) | |
download | frameworks_base-39d5c6172503620ac3761148adac5fd7fa20d02d.zip frameworks_base-39d5c6172503620ac3761148adac5fd7fa20d02d.tar.gz frameworks_base-39d5c6172503620ac3761148adac5fd7fa20d02d.tar.bz2 |
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
Diffstat (limited to 'core/java/android/app/MediaRouteActionProvider.java')
-rw-r--r-- | core/java/android/app/MediaRouteActionProvider.java | 43 |
1 files changed, 42 insertions, 1 deletions
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<MediaRouteActionProvider> mAp; + + RouterCallback(MediaRouteActionProvider ap) { + mAp = new WeakReference<MediaRouteActionProvider>(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(); + } + } } |