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

Commit 1ee9fafb authored by Adam Powell's avatar Adam Powell Committed by The Android Automerger
Browse files

Add wireless display selection support to MediaRouter.

* Adds the new route type LIVE_VIDEO

* Wireless displays support both LIVE_VIDEO and LIVE_AUDIO, making
  wireless display routes valid selections in when apps make selecting
  live audio routes available.

* MediaRouter will only report/manipulate wireless displays that have
  already been paired at the system level.

Bug 7177920

Change-Id: Ic221b8687d77b4c0df9801c396b74870e86206e9
parent df02c905
Loading
Loading
Loading
Loading
+2 −0
Original line number Diff line number Diff line
@@ -11750,6 +11750,7 @@ package android.media {
    method public void removeUserRoute(android.media.MediaRouter.UserRouteInfo);
    method public void selectRoute(int, android.media.MediaRouter.RouteInfo);
    field public static final int ROUTE_TYPE_LIVE_AUDIO = 1; // 0x1
    field public static final int ROUTE_TYPE_LIVE_VIDEO = 2; // 0x2
    field public static final int ROUTE_TYPE_USER = 8388608; // 0x800000
  }
@@ -11798,6 +11799,7 @@ package android.media {
    method public int getVolume();
    method public int getVolumeHandling();
    method public int getVolumeMax();
    method public boolean isEnabled();
    method public void requestSetVolume(int);
    method public void requestUpdateVolume(int);
    method public void setTag(java.lang.Object);
+10 −3
Original line number Diff line number Diff line
@@ -221,21 +221,28 @@ public class MediaRouteButton extends View {
    void updateRouteCount() {
        final int N = mRouter.getRouteCount();
        int count = 0;
        boolean hasVideoRoutes = false;
        for (int i = 0; i < N; i++) {
            final RouteInfo route = mRouter.getRouteAt(i);
            if ((route.getSupportedTypes() & mRouteTypes) != 0) {
            final int routeTypes = route.getSupportedTypes();
            if ((routeTypes & mRouteTypes) != 0) {
                if (route instanceof RouteGroup) {
                    count += ((RouteGroup) route).getRouteCount();
                } else {
                    count++;
                }
                if ((routeTypes & MediaRouter.ROUTE_TYPE_LIVE_VIDEO) != 0) {
                    hasVideoRoutes = true;
                }
            }
        }

        setEnabled(count != 0);

        // Only allow toggling if we have more than just user routes
        mToggleMode = count == 2 && (mRouteTypes & MediaRouter.ROUTE_TYPE_LIVE_AUDIO) != 0;
        // Only allow toggling if we have more than just user routes.
        // Don't toggle if we support video routes, we may have to let the dialog scan.
        mToggleMode = count == 2 && (mRouteTypes & MediaRouter.ROUTE_TYPE_LIVE_AUDIO) != 0 &&
                !hasVideoRoutes;
    }

    @Override
+20 −2
Original line number Diff line number Diff line
@@ -25,7 +25,7 @@ import android.app.MediaRouteActionProvider;
import android.app.MediaRouteButton;
import android.content.Context;
import android.graphics.drawable.Drawable;
import android.media.AudioManager;
import android.hardware.display.DisplayManager;
import android.media.MediaRouter;
import android.media.MediaRouter.RouteCategory;
import android.media.MediaRouter.RouteGroup;
@@ -70,6 +70,7 @@ public class MediaRouteChooserDialogFragment extends DialogFragment {
    };

    MediaRouter mRouter;
    DisplayManager mDisplayService;
    private int mRouteTypes;

    private LayoutInflater mInflater;
@@ -97,6 +98,7 @@ public class MediaRouteChooserDialogFragment extends DialogFragment {
    public void onAttach(Activity activity) {
        super.onAttach(activity);
        mRouter = (MediaRouter) activity.getSystemService(Context.MEDIA_ROUTER_SERVICE);
        mDisplayService = (DisplayManager) activity.getSystemService(Context.DISPLAY_SERVICE);
    }

    @Override
@@ -119,6 +121,15 @@ public class MediaRouteChooserDialogFragment extends DialogFragment {

    public void setRouteTypes(int types) {
        mRouteTypes = types;
        if ((mRouteTypes & MediaRouter.ROUTE_TYPE_LIVE_VIDEO) != 0 && mDisplayService == null) {
            final Context activity = getActivity();
            if (activity != null) {
                mDisplayService = (DisplayManager) activity.getSystemService(
                        Context.DISPLAY_SERVICE);
            }
        } else {
            mDisplayService = null;
        }
    }

    void updateVolume() {
@@ -194,6 +205,9 @@ public class MediaRouteChooserDialogFragment extends DialogFragment {
    @Override
    public void onResume() {
        super.onResume();
        if (mDisplayService != null) {
            mDisplayService.scanWifiDisplays();
        }
    }

    private static class ViewHolder {
@@ -253,7 +267,9 @@ public class MediaRouteChooserDialogFragment extends DialogFragment {
                final RouteCategory cat = mRouter.getCategoryAt(i);
                routes = cat.getRoutes(mCatRouteList);

                if (!cat.isSystem()) {
                    mItems.add(cat);
                }

                if (cat == mCategoryEditingGroups) {
                    addGroupEditingCategoryRoutes(routes);
@@ -370,6 +386,7 @@ public class MediaRouteChooserDialogFragment extends DialogFragment {
        public boolean isEnabled(int position) {
            switch (getItemViewType(position)) {
                case VIEW_ROUTE:
                    return ((RouteInfo) mItems.get(position)).isEnabled();
                case VIEW_GROUPING_ROUTE:
                case VIEW_GROUPING_DONE:
                    return true;
@@ -434,6 +451,7 @@ public class MediaRouteChooserDialogFragment extends DialogFragment {
            }

            convertView.setActivated(position == mSelectedItemPosition);
            convertView.setEnabled(isEnabled(position));

            return convertView;
        }
+10 −5
Original line number Diff line number Diff line
@@ -24,7 +24,8 @@
               android:layout_height="56dp"
               android:scaleType="center"
               android:id="@+id/icon"
               android:visibility="gone" />
               android:visibility="gone"
               android:duplicateParentState="true" />

    <LinearLayout android:layout_width="0dp"
                  android:layout_height="match_parent"
@@ -32,21 +33,24 @@
                  android:orientation="vertical"
                  android:gravity="start|center_vertical"
                  android:paddingStart="?android:attr/listPreferredItemPaddingStart"
                  android:paddingEnd="?android:attr/listPreferredItemPaddingEnd">
                  android:paddingEnd="?android:attr/listPreferredItemPaddingEnd"
                  android:duplicateParentState="true">

        <TextView android:id="@android:id/text1"
                  android:layout_width="match_parent"
                  android:layout_height="wrap_content"
                  android:singleLine="true"
                  android:ellipsize="marquee"
                  android:textAppearance="?android:attr/textAppearanceMedium" />
                  android:textAppearance="?android:attr/textAppearanceMedium"
                  android:duplicateParentState="true" />

        <TextView android:id="@android:id/text2"
                  android:layout_width="match_parent"
                  android:layout_height="wrap_content"
                  android:singleLine="true"
                  android:ellipsize="marquee"
                  android:textAppearance="?android:attr/textAppearanceSmall" />
                  android:textAppearance="?android:attr/textAppearanceSmall"
                  android:duplicateParentState="true" />
    </LinearLayout>

    <ImageButton
@@ -56,6 +60,7 @@
        android:background="?android:attr/selectableItemBackground"
        android:src="@drawable/ic_media_group_expand"
        android:scaleType="center"
        android:visibility="gone" />
        android:visibility="gone"
        android:duplicateParentState="true" />

</LinearLayout>
+12 −0
Original line number Diff line number Diff line
@@ -3783,6 +3783,18 @@
    <!-- Content description of a MediaRouteButton for accessibility support -->
    <string name="media_route_button_content_description">Media output</string>

    <!-- Status message for remote routes attempting to scan/determine availability -->
    <string name="media_route_status_scanning">Scanning...</string>

    <!-- Status message for a remote route attempting to connect -->
    <string name="media_route_status_connecting">Connecting...</string>

    <!-- Status message for a remote route that is confirmed to be available for connection -->
    <string name="media_route_status_available">Available</string>

    <!-- Status message for remote routes that are not available for connection right now -->
    <string name="media_route_status_not_available">Not available</string>

    <!-- Display manager service -->

    <!-- Name of the built-in display.  [CHAR LIMIT=50] -->
Loading