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

Commit c1738b00 authored by Santiago Seifert's avatar Santiago Seifert
Browse files

Expand user control over the output switcher

- Enables deep linking on all routes.
- Enables subtext on enabled and disabled routes.

Bug: 266923039
Test: atest MediaRouter2HostTest
Change-Id: If897b69aa5bf158053eec088fb5fa5d3b673c0fe
parent c6a55488
Loading
Loading
Loading
Loading
+16 −14
Original line number Diff line number Diff line
@@ -24576,8 +24576,8 @@ package android.media {
  public final class RouteListingPreference implements android.os.Parcelable {
    method public int describeContents();
    method @Nullable public android.content.ComponentName getInAppOnlyItemRoutingReceiver();
    method @NonNull public java.util.List<android.media.RouteListingPreference.Item> getItems();
    method @Nullable public android.content.ComponentName getLinkedItemComponentName();
    method public boolean getUseSystemOrdering();
    method public void writeToParcel(@NonNull android.os.Parcel, int);
    field public static final String ACTION_TRANSFER_MEDIA = "android.media.action.TRANSFER_MEDIA";
@@ -24588,37 +24588,39 @@ package android.media {
  public static final class RouteListingPreference.Builder {
    ctor public RouteListingPreference.Builder();
    method @NonNull public android.media.RouteListingPreference build();
    method @NonNull public android.media.RouteListingPreference.Builder setInAppOnlyItemRoutingReceiver(@Nullable android.content.ComponentName);
    method @NonNull public android.media.RouteListingPreference.Builder setItems(@NonNull java.util.List<android.media.RouteListingPreference.Item>);
    method @NonNull public android.media.RouteListingPreference.Builder setLinkedItemComponentName(@Nullable android.content.ComponentName);
    method @NonNull public android.media.RouteListingPreference.Builder setUseSystemOrdering(boolean);
  }
  public static final class RouteListingPreference.Item implements android.os.Parcelable {
    method public int describeContents();
    method @Nullable public CharSequence getCustomDisableReasonMessage();
    method public int getDisableReason();
    method @Nullable public CharSequence getCustomSubtextMessage();
    method public int getFlags();
    method @NonNull public String getRouteId();
    method public int getSessionParticipantCount();
    method public int getSelectionBehavior();
    method public int getSubText();
    method public void writeToParcel(@NonNull android.os.Parcel, int);
    field @NonNull public static final android.os.Parcelable.Creator<android.media.RouteListingPreference.Item> CREATOR;
    field public static final int DISABLE_REASON_AD = 3; // 0x3
    field public static final int DISABLE_REASON_CUSTOM = 5; // 0x5
    field public static final int DISABLE_REASON_DOWNLOADED_CONTENT = 2; // 0x2
    field public static final int DISABLE_REASON_IN_APP_ONLY = 4; // 0x4
    field public static final int DISABLE_REASON_NONE = 0; // 0x0
    field public static final int DISABLE_REASON_SUBSCRIPTION_REQUIRED = 1; // 0x1
    field public static final int FLAG_ONGOING_SESSION = 1; // 0x1
    field public static final int FLAG_SUGGESTED_ROUTE = 2; // 0x2
    field public static final int SELECTION_BEHAVIOR_GO_TO_APP = 2; // 0x2
    field public static final int SELECTION_BEHAVIOR_NONE = 0; // 0x0
    field public static final int SELECTION_BEHAVIOR_TRANSFER = 1; // 0x1
    field public static final int SUBTEXT_AD_ROUTING_DISALLOWED = 3; // 0x3
    field public static final int SUBTEXT_CUSTOM = 10000; // 0x2710
    field public static final int SUBTEXT_DOWNLOADED_CONTENT_ROUTING_DISALLOWED = 2; // 0x2
    field public static final int SUBTEXT_NONE = 0; // 0x0
    field public static final int SUBTEXT_SUBSCRIPTION_REQUIRED = 1; // 0x1
  }
  public static final class RouteListingPreference.Item.Builder {
    ctor public RouteListingPreference.Item.Builder(@NonNull String);
    method @NonNull public android.media.RouteListingPreference.Item build();
    method @NonNull public android.media.RouteListingPreference.Item.Builder setCustomDisableReasonMessage(@Nullable CharSequence);
    method @NonNull public android.media.RouteListingPreference.Item.Builder setDisableReason(int);
    method @NonNull public android.media.RouteListingPreference.Item.Builder setCustomSubtextMessage(@Nullable CharSequence);
    method @NonNull public android.media.RouteListingPreference.Item.Builder setFlags(int);
    method @NonNull public android.media.RouteListingPreference.Item.Builder setSessionParticipantCount(@IntRange(from=0) int);
    method @NonNull public android.media.RouteListingPreference.Item.Builder setSelectionBehavior(int);
    method @NonNull public android.media.RouteListingPreference.Item.Builder setSubText(int);
  }
  public final class RoutingSessionInfo implements android.os.Parcelable {
+162 −136

File changed.

Preview size limit exceeded, changes collapsed.

+7 −5
Original line number Diff line number Diff line
@@ -30,8 +30,8 @@ import static android.media.MediaRoute2Info.TYPE_USB_DEVICE;
import static android.media.MediaRoute2Info.TYPE_USB_HEADSET;
import static android.media.MediaRoute2Info.TYPE_WIRED_HEADPHONES;
import static android.media.MediaRoute2Info.TYPE_WIRED_HEADSET;
import static android.media.RouteListingPreference.Item.DISABLE_REASON_NONE;
import static android.media.RouteListingPreference.Item.FLAG_SUGGESTED_ROUTE;
import static android.media.RouteListingPreference.Item.SUBTEXT_NONE;

import static com.android.settingslib.media.LocalMediaManager.MediaDeviceState.STATE_SELECTED;

@@ -198,10 +198,11 @@ public abstract class MediaDevice implements Comparable<MediaDevice> {
     *
     * @return disabled reason of device
     */
    @RouteListingPreference.Item.DisableReason
    @RouteListingPreference.Item.SubText
    public int getDisableReason() {
        return Build.VERSION.SDK_INT >= Build.VERSION_CODES.UPSIDE_DOWN_CAKE && mItem != null
                ? mItem.getDisableReason() : -1;
                ? mItem.getSubText()
                : -1;
    }

    /**
@@ -210,8 +211,9 @@ public abstract class MediaDevice implements Comparable<MediaDevice> {
     * @return true if device has disabled reason
     */
    public boolean hasDisabledReason() {
        return Build.VERSION.SDK_INT >= Build.VERSION_CODES.UPSIDE_DOWN_CAKE && mItem != null
                && mItem.getDisableReason() != DISABLE_REASON_NONE;
        return Build.VERSION.SDK_INT >= Build.VERSION_CODES.UPSIDE_DOWN_CAKE
                && mItem != null
                && mItem.getSubText() != SUBTEXT_NONE;
    }

    /**
+4 −4
Original line number Diff line number Diff line
@@ -16,7 +16,7 @@

package com.android.systemui.media.dialog;

import static android.media.RouteListingPreference.Item.DISABLE_REASON_SUBSCRIPTION_REQUIRED;
import static android.media.RouteListingPreference.Item.SUBTEXT_SUBSCRIPTION_REQUIRED;

import android.content.Context;
import android.content.res.ColorStateList;
@@ -411,10 +411,10 @@ public class MediaOutputAdapter extends MediaOutputBaseAdapter {
    @RequiresApi(34)
    private static class Api34Impl {
        @DoNotInline
        static String composeDisabledReason(@RouteListingPreference.Item.DisableReason int reason,
                Context context) {
        static String composeDisabledReason(
                @RouteListingPreference.Item.SubText int reason, Context context) {
            switch(reason) {
                case DISABLE_REASON_SUBSCRIPTION_REQUIRED:
                case SUBTEXT_SUBSCRIPTION_REQUIRED:
                    return context.getString(R.string.media_output_status_require_premium);
            }
            return "";
+2 −2
Original line number Diff line number Diff line
@@ -16,7 +16,7 @@

package com.android.systemui.media.dialog;

import static android.media.RouteListingPreference.Item.DISABLE_REASON_SUBSCRIPTION_REQUIRED;
import static android.media.RouteListingPreference.Item.SUBTEXT_SUBSCRIPTION_REQUIRED;

import static com.google.common.truth.Truth.assertThat;

@@ -436,7 +436,7 @@ public class MediaOutputAdapterTest extends SysuiTestCase {
                R.string.media_output_status_require_premium);
        when(mMediaOutputController.isSubStatusSupported()).thenReturn(true);
        when(mMediaDevice2.hasDisabledReason()).thenReturn(true);
        when(mMediaDevice2.getDisableReason()).thenReturn(DISABLE_REASON_SUBSCRIPTION_REQUIRED);
        when(mMediaDevice2.getDisableReason()).thenReturn(SUBTEXT_SUBSCRIPTION_REQUIRED);
        mMediaOutputAdapter.onBindViewHolder(mViewHolder, 1);

        assertThat(mViewHolder.mTitleText.getVisibility()).isEqualTo(View.GONE);
Loading