Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 0d03c042 authored by Adam Powell's avatar Adam Powell
Browse files

API updates for MediaRouter

* Accept a Context when fetching the names of routes and
  categories. This lets string resources resolve at time of access
  with the correct configuration. The older versions remain available
  that will use the static resources from the application. (There are
  enough cases where applications will populate this from external
  data that requiring it each time even when it was not initialized
  from a resource doesn't seem reasonable.)

* Remove the ability for apps to programmatically select non-user
  routes.

* Make MediaRouter.Callback an abstract class instead of an interface.
  This will make further extensions easier to keep compatible in the
  future.

Change-Id: If981c511dfbdfaf41ef0d1cfe4a377fc14bb5600
parent f9b7f9f5
Loading
Loading
Loading
Loading
+18 −2
Original line number Diff line number Diff line
@@ -3679,6 +3679,7 @@ package android.app {
  public class MediaRouteActionProvider extends android.view.ActionProvider {
    ctor public MediaRouteActionProvider(android.content.Context);
    method public android.view.View onCreateActionView();
    method public void setExtendedSettingsClickListener(android.view.View.OnClickListener);
    method public void setRouteTypes(int);
  }
@@ -3687,7 +3688,9 @@ package android.app {
    ctor public MediaRouteButton(android.content.Context, android.util.AttributeSet);
    ctor public MediaRouteButton(android.content.Context, android.util.AttributeSet, int);
    method public int getRouteTypes();
    method public void setExtendedSettingsClickListener(android.view.View.OnClickListener);
    method public void setRouteTypes(int);
    method public void showDialog();
  }
  public class NativeActivity extends android.app.Activity implements android.view.InputQueue.Callback android.view.SurfaceHolder.Callback2 android.view.ViewTreeObserver.OnGlobalLayoutListener {
@@ -11511,6 +11514,7 @@ package android.media {
    method public void addUserRoute(android.media.MediaRouter.UserRouteInfo);
    method public void clearUserRoutes();
    method public android.media.MediaRouter.RouteCategory createRouteCategory(java.lang.CharSequence, boolean);
    method public android.media.MediaRouter.RouteCategory createRouteCategory(int, boolean);
    method public android.media.MediaRouter.UserRouteInfo createUserRoute(android.media.MediaRouter.RouteCategory);
    method public android.media.MediaRouter.RouteCategory getCategoryAt(int);
    method public int getCategoryCount();
@@ -11524,7 +11528,8 @@ package android.media {
    field public static final int ROUTE_TYPE_USER = 8388608; // 0x800000
  }
  public static abstract interface MediaRouter.Callback {
  public static abstract class MediaRouter.Callback {
    ctor public MediaRouter.Callback();
    method public abstract void onRouteAdded(android.media.MediaRouter, android.media.MediaRouter.RouteInfo);
    method public abstract void onRouteChanged(android.media.MediaRouter, android.media.MediaRouter.RouteInfo);
    method public abstract void onRouteGrouped(android.media.MediaRouter, android.media.MediaRouter.RouteInfo, android.media.MediaRouter.RouteGroup, int);
@@ -11536,6 +11541,7 @@ package android.media {
  public static class MediaRouter.RouteCategory {
    method public java.lang.CharSequence getName();
    method public java.lang.CharSequence getName(android.content.Context);
    method public java.util.List<android.media.MediaRouter.RouteInfo> getRoutes(java.util.List<android.media.MediaRouter.RouteInfo>);
    method public int getSupportedTypes();
    method public boolean isGroupable();
@@ -11548,17 +11554,21 @@ package android.media {
    method public int getRouteCount();
    method public void removeRoute(android.media.MediaRouter.RouteInfo);
    method public void removeRoute(int);
    method public void setIconDrawable(android.graphics.drawable.Drawable);
    method public void setIconResource(int);
  }
  public static class MediaRouter.RouteInfo {
    method public android.media.MediaRouter.RouteCategory getCategory();
    method public android.media.MediaRouter.RouteGroup getGroup();
    method public android.graphics.drawable.Drawable getIconDrawable();
    method public java.lang.CharSequence getName();
    method public java.lang.CharSequence getName(android.content.Context);
    method public java.lang.CharSequence getStatus();
    method public int getSupportedTypes();
  }
  public static class MediaRouter.SimpleCallback implements android.media.MediaRouter.Callback {
  public static class MediaRouter.SimpleCallback extends android.media.MediaRouter.Callback {
    ctor public MediaRouter.SimpleCallback();
    method public void onRouteAdded(android.media.MediaRouter, android.media.MediaRouter.RouteInfo);
    method public void onRouteChanged(android.media.MediaRouter, android.media.MediaRouter.RouteInfo);
@@ -11570,8 +11580,14 @@ package android.media {
  }
  public static class MediaRouter.UserRouteInfo extends android.media.MediaRouter.RouteInfo {
    method public java.lang.Object getTag();
    method public void setIconDrawable(android.graphics.drawable.Drawable);
    method public void setIconResource(int);
    method public void setName(java.lang.CharSequence);
    method public void setName(int);
    method public void setRemoteControlClient(android.media.RemoteControlClient);
    method public void setStatus(java.lang.CharSequence);
    method public void setTag(java.lang.Object);
  }
  public class MediaScannerConnection implements android.content.ServiceConnection {
+7 −2
Original line number Diff line number Diff line
@@ -11514,6 +11514,7 @@ package android.media {
    method public void addUserRoute(android.media.MediaRouter.UserRouteInfo);
    method public void clearUserRoutes();
    method public android.media.MediaRouter.RouteCategory createRouteCategory(java.lang.CharSequence, boolean);
    method public android.media.MediaRouter.RouteCategory createRouteCategory(int, boolean);
    method public android.media.MediaRouter.UserRouteInfo createUserRoute(android.media.MediaRouter.RouteCategory);
    method public android.media.MediaRouter.RouteCategory getCategoryAt(int);
    method public int getCategoryCount();
@@ -11527,7 +11528,8 @@ package android.media {
    field public static final int ROUTE_TYPE_USER = 8388608; // 0x800000
  }
  public static abstract interface MediaRouter.Callback {
  public static abstract class MediaRouter.Callback {
    ctor public MediaRouter.Callback();
    method public abstract void onRouteAdded(android.media.MediaRouter, android.media.MediaRouter.RouteInfo);
    method public abstract void onRouteChanged(android.media.MediaRouter, android.media.MediaRouter.RouteInfo);
    method public abstract void onRouteGrouped(android.media.MediaRouter, android.media.MediaRouter.RouteInfo, android.media.MediaRouter.RouteGroup, int);
@@ -11539,6 +11541,7 @@ package android.media {
  public static class MediaRouter.RouteCategory {
    method public java.lang.CharSequence getName();
    method public java.lang.CharSequence getName(android.content.Context);
    method public java.util.List<android.media.MediaRouter.RouteInfo> getRoutes(java.util.List<android.media.MediaRouter.RouteInfo>);
    method public int getSupportedTypes();
    method public boolean isGroupable();
@@ -11560,11 +11563,12 @@ package android.media {
    method public android.media.MediaRouter.RouteGroup getGroup();
    method public android.graphics.drawable.Drawable getIconDrawable();
    method public java.lang.CharSequence getName();
    method public java.lang.CharSequence getName(android.content.Context);
    method public java.lang.CharSequence getStatus();
    method public int getSupportedTypes();
  }
  public static class MediaRouter.SimpleCallback implements android.media.MediaRouter.Callback {
  public static class MediaRouter.SimpleCallback extends android.media.MediaRouter.Callback {
    ctor public MediaRouter.SimpleCallback();
    method public void onRouteAdded(android.media.MediaRouter, android.media.MediaRouter.RouteInfo);
    method public void onRouteChanged(android.media.MediaRouter, android.media.MediaRouter.RouteInfo);
@@ -11580,6 +11584,7 @@ package android.media {
    method public void setIconDrawable(android.graphics.drawable.Drawable);
    method public void setIconResource(int);
    method public void setName(java.lang.CharSequence);
    method public void setName(int);
    method public void setRemoteControlClient(android.media.RemoteControlClient);
    method public void setStatus(java.lang.CharSequence);
    method public void setTag(java.lang.Object);
+1 −1
Original line number Diff line number Diff line
@@ -103,7 +103,7 @@ public class MediaRouteButton extends View {

        if (mToggleMode) {
            if (mRemoteActive) {
                mRouter.selectRoute(mRouteTypes, mRouter.getSystemAudioRoute());
                mRouter.selectRouteInt(mRouteTypes, mRouter.getSystemAudioRoute());
            } else {
                final int N = mRouter.getRouteCount();
                for (int i = 0; i < N; i++) {
+104 −97
Original line number Diff line number Diff line
@@ -77,7 +77,7 @@ public class MediaRouteChooserDialogFragment extends DialogFragment {
    private GroupAdapter mGroupAdapter;
    private ListView mListView;

    static final RouteComparator sComparator = new RouteComparator();
    final RouteComparator mComparator = new RouteComparator();

    public MediaRouteChooserDialogFragment() {
        setStyle(STYLE_NO_TITLE, R.style.Theme_DeviceDefault_Dialog);
@@ -100,11 +100,11 @@ public class MediaRouteChooserDialogFragment extends DialogFragment {
            mLauncherListener.onDetached(this);
        }
        if (mGroupAdapter != null) {
            mRouter.removeCallback(mGroupAdapter);
            mRouter.removeCallback(mGroupAdapter.mCallback);
            mGroupAdapter = null;
        }
        if (mAdapter != null) {
            mRouter.removeCallback(mAdapter);
            mRouter.removeCallback(mAdapter.mCallback);
            mAdapter = null;
        }
        mInflater = null;
@@ -146,14 +146,14 @@ public class MediaRouteChooserDialogFragment extends DialogFragment {
        list.setOnItemClickListener(mAdapter);

        mListView = list;
        mRouter.addCallback(mRouteTypes, mAdapter);
        mRouter.addCallback(mRouteTypes, mAdapter.mCallback);

        return layout;
    }

    void onExpandGroup(RouteGroup info) {
        mGroupAdapter = new GroupAdapter(info);
        mRouter.addCallback(mRouteTypes, mGroupAdapter);
        mRouter.addCallback(mRouteTypes, mGroupAdapter.mCallback);
        mListView.setAdapter(mGroupAdapter);
        mListView.setOnItemClickListener(mGroupAdapter);
        mListView.setItemsCanFocus(false);
@@ -172,7 +172,7 @@ public class MediaRouteChooserDialogFragment extends DialogFragment {
        mListView.setChoiceMode(ListView.CHOICE_MODE_SINGLE);
        mListView.setItemChecked(mAdapter.getSelectedRoutePosition(), true);

        mRouter.removeCallback(mGroupAdapter);
        mRouter.removeCallback(mGroupAdapter.mCallback);
        mGroupAdapter = null;

        getDialog().setCanceledOnTouchOutside(true);
@@ -205,14 +205,14 @@ public class MediaRouteChooserDialogFragment extends DialogFragment {
        public int position;
    }

    private class RouteAdapter extends BaseAdapter implements MediaRouter.Callback,
            ListView.OnItemClickListener {
    private class RouteAdapter extends BaseAdapter implements ListView.OnItemClickListener {
        private static final int VIEW_TOP_HEADER = 0;
        private static final int VIEW_SECTION_HEADER = 1;
        private static final int VIEW_ROUTE = 2;

        private int mSelectedItemPosition;
        private final ArrayList<Object> mItems = new ArrayList<Object>();
        final MediaRouterCallback mCallback = new MediaRouterCallback();

        RouteAdapter() {
            update();
@@ -333,7 +333,7 @@ public class MediaRouteChooserDialogFragment extends DialogFragment {

        void bindItemView(int position, ViewHolder holder) {
            RouteInfo info = (RouteInfo) mItems.get(position);
            holder.text1.setText(info.getName());
            holder.text1.setText(info.getName(getActivity()));
            final CharSequence status = info.getStatus();
            if (TextUtils.isEmpty(status)) {
                holder.text2.setVisibility(View.GONE);
@@ -363,13 +363,37 @@ public class MediaRouteChooserDialogFragment extends DialogFragment {

        void bindHeaderView(int position, ViewHolder holder) {
            RouteCategory cat = (RouteCategory) mItems.get(position);
            holder.text1.setText(cat.getName());
            holder.text1.setText(cat.getName(getActivity()));
        }

        public int getSelectedRoutePosition() {
            return mSelectedItemPosition;
        }

        @Override
        public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
            ListView lv = (ListView) parent;
            final Object item = getItem(lv.getCheckedItemPosition());
            if (!(item instanceof RouteInfo)) {
                // Oops. Stale event running around? Skip it.
                return;
            }
            mRouter.selectRouteInt(mRouteTypes, (RouteInfo) item);
            dismiss();
        }

        class ExpandGroupListener implements View.OnClickListener {
            int position;

            @Override
            public void onClick(View v) {
                // Assumption: this is only available for the user to click if we're presenting
                // a groupable category, where every top-level route in the category is a group.
                onExpandGroup((RouteGroup) getItem(position));
            }
        }

        class MediaRouterCallback extends MediaRouter.Callback {
            @Override
            public void onRouteSelected(MediaRouter router, int type, RouteInfo info) {
                update();
@@ -405,33 +429,10 @@ public class MediaRouteChooserDialogFragment extends DialogFragment {
            public void onRouteUngrouped(MediaRouter router, RouteInfo info, RouteGroup group) {
                update();
            }

        @Override
        public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
            ListView lv = (ListView) parent;
            final Object item = getItem(lv.getCheckedItemPosition());
            if (!(item instanceof RouteInfo)) {
                // Oops. Stale event running around? Skip it.
                return;
            }
            mRouter.selectRoute(mRouteTypes, (RouteInfo) item);
            dismiss();
        }

        class ExpandGroupListener implements View.OnClickListener {
            int position;

            @Override
            public void onClick(View v) {
                // Assumption: this is only available for the user to click if we're presenting
                // a groupable category, where every top-level route in the category is a group.
                onExpandGroup((RouteGroup) getItem(position));
            }
        }
    }

    private class GroupAdapter extends BaseAdapter implements MediaRouter.Callback,
            ListView.OnItemClickListener {
    private class GroupAdapter extends BaseAdapter implements ListView.OnItemClickListener {
        private static final int VIEW_HEADER = 0;
        private static final int VIEW_ROUTE = 1;
        private static final int VIEW_DONE = 2;
@@ -442,6 +443,8 @@ public class MediaRouteChooserDialogFragment extends DialogFragment {
        private final ArrayList<RouteInfo> mFlatRoutes = new ArrayList<RouteInfo>();
        private boolean mIgnoreUpdates;
        
        final MediaRouterCallback mCallback = new MediaRouterCallback();

        public GroupAdapter(RouteGroup primary) {
            mPrimary = primary;
            mCategory = primary.getCategory();
@@ -493,7 +496,7 @@ public class MediaRouteChooserDialogFragment extends DialogFragment {

            // Sort by name. This will keep the route positions relatively stable even though they
            // will be repeatedly added and removed.
            Collections.sort(mFlatRoutes, sComparator);
            Collections.sort(mFlatRoutes, mComparator);
            notifyDataSetChanged();
        }

@@ -563,7 +566,7 @@ public class MediaRouteChooserDialogFragment extends DialogFragment {

        void bindItemView(int position, ViewHolder holder) {
            RouteInfo info = (RouteInfo) getItem(position);
            holder.text1.setText(info.getName());
            holder.text1.setText(info.getName(getActivity()));
            final CharSequence status = info.getStatus();
            if (TextUtils.isEmpty(status)) {
                holder.text2.setVisibility(View.GONE);
@@ -574,49 +577,7 @@ public class MediaRouteChooserDialogFragment extends DialogFragment {
        }

        void bindHeaderView(int position, ViewHolder holder) {
            holder.text1.setText(mCategory.getName());
        }

        @Override
        public void onRouteSelected(MediaRouter router, int type, RouteInfo info) {
        }

        @Override
        public void onRouteUnselected(MediaRouter router, int type, RouteInfo info) {
        }

        @Override
        public void onRouteAdded(MediaRouter router, RouteInfo info) {
            update();
            initCheckedItems();
        }

        @Override
        public void onRouteRemoved(MediaRouter router, RouteInfo info) {
            if (info == mPrimary) {
                // Can't keep grouping, clean it up.
                onDoneGrouping();
            } else {
                update();
                initCheckedItems();
            }
        }

        @Override
        public void onRouteChanged(MediaRouter router, RouteInfo info) {
            update();
        }

        @Override
        public void onRouteGrouped(MediaRouter router, RouteInfo info, RouteGroup group, int index) {
            update();
            initCheckedItems();
        }

        @Override
        public void onRouteUngrouped(MediaRouter router, RouteInfo info, RouteGroup group) {
            update();
            initCheckedItems();
            holder.text1.setText(mCategory.getName(getActivity()));
        }

        @Override
@@ -641,7 +602,7 @@ public class MediaRouteChooserDialogFragment extends DialogFragment {
                    if (mRouter.getSelectedRoute(mRouteTypes) == oldGroup) {
                        // Old group was selected but is now empty. Select the group
                        // we're manipulating since that's where the last route went.
                        mRouter.selectRoute(mRouteTypes, mPrimary);
                        mRouter.selectRouteInt(mRouteTypes, mPrimary);
                    }
                    mRouter.removeRouteInt(oldGroup);
                }
@@ -664,12 +625,58 @@ public class MediaRouteChooserDialogFragment extends DialogFragment {
            update();
            initCheckedItems();
        }

        class MediaRouterCallback extends MediaRouter.Callback {
            @Override
            public void onRouteSelected(MediaRouter router, int type, RouteInfo info) {
            }

            @Override
            public void onRouteUnselected(MediaRouter router, int type, RouteInfo info) {
            }

            @Override
            public void onRouteAdded(MediaRouter router, RouteInfo info) {
                update();
                initCheckedItems();
            }

            @Override
            public void onRouteRemoved(MediaRouter router, RouteInfo info) {
                if (info == mPrimary) {
                    // Can't keep grouping, clean it up.
                    onDoneGrouping();
                } else {
                    update();
                    initCheckedItems();
                }
            }

            @Override
            public void onRouteChanged(MediaRouter router, RouteInfo info) {
                update();
            }

            @Override
            public void onRouteGrouped(MediaRouter router, RouteInfo info, RouteGroup group,
                    int index) {
                update();
                initCheckedItems();
            }

            @Override
            public void onRouteUngrouped(MediaRouter router, RouteInfo info, RouteGroup group) {
                update();
                initCheckedItems();
            }
        }
    }

    static class RouteComparator implements Comparator<RouteInfo> {
    class RouteComparator implements Comparator<RouteInfo> {
        @Override
        public int compare(RouteInfo lhs, RouteInfo rhs) {
            return lhs.getName().toString().compareTo(rhs.getName().toString());
            return lhs.getName(getActivity()).toString()
                    .compareTo(rhs.getName(getActivity()).toString());
        }
    }

+103 −21

File changed.

Preview size limit exceeded, changes collapsed.