summaryrefslogtreecommitdiffstats
path: root/core/java/android/app/MediaRouteActionProvider.java
diff options
context:
space:
mode:
authorAdam Powell <adamp@google.com>2012-06-16 14:25:38 -0700
committerAdam Powell <adamp@google.com>2012-06-16 14:49:13 -0700
commit39d5c6172503620ac3761148adac5fd7fa20d02d (patch)
tree8720e26aeab2ae36577309dd912be3f0933c6f14 /core/java/android/app/MediaRouteActionProvider.java
parentc4637d3efbbeb3e204691da96c357b5fea4ae2f1 (diff)
downloadframeworks_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.java43
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();
+ }
+ }
}