• R/O
  • HTTP
  • SSH
  • HTTPS

Commit

Frequently used words (click to add to your profile)

javac++androidlinuxc#windowsobjective-ccocoa誰得qtpythonphprubygameguibathyscaphec計画中(planning stage)翻訳omegatframeworktwitterdomtestvb.netdirectxゲームエンジンbtronarduinopreviewer

packages/apps/Settings


Commit MetaInfo

Révisionfaf7a2ad78a5cc769a6c687608df6ea449c7b4fa (tree)
l'heure2020-09-25 18:04:36
AuteurTreeHugger Robot <treehugger-gerrit@goog...>
CommiterAndroid (Google) Code Review

Message de Log

Merge "Disable entry point of output switcher" into rvc-qpr-dev

Change Summary

Modification

--- a/src/com/android/settings/Utils.java
+++ b/src/com/android/settings/Utils.java
@@ -18,6 +18,10 @@ package com.android.settings;
1818
1919 import static android.content.Intent.EXTRA_USER;
2020 import static android.content.Intent.EXTRA_USER_ID;
21+import static android.media.MediaRoute2Info.TYPE_GROUP;
22+import static android.media.MediaRoute2Info.TYPE_REMOTE_SPEAKER;
23+import static android.media.MediaRoute2Info.TYPE_REMOTE_TV;
24+import static android.media.MediaRoute2Info.TYPE_UNKNOWN;
2125 import static android.text.format.DateUtils.FORMAT_ABBREV_MONTH;
2226 import static android.text.format.DateUtils.FORMAT_SHOW_DATE;
2327
@@ -53,6 +57,8 @@ import android.graphics.drawable.Drawable;
5357 import android.graphics.drawable.VectorDrawable;
5458 import android.hardware.face.FaceManager;
5559 import android.hardware.fingerprint.FingerprintManager;
60+import android.media.MediaRoute2Info;
61+import android.media.MediaRouter2Manager;
5662 import android.net.ConnectivityManager;
5763 import android.net.LinkProperties;
5864 import android.net.Network;
@@ -1137,4 +1143,31 @@ public final class Utils extends com.android.settingslib.Utils {
11371143 drawable.draw(canvas);
11381144 return roundedBitmap;
11391145 }
1146+
1147+ /**
1148+ * Returns {@code true} if needed to disable media output, otherwise returns {@code false}.
1149+ */
1150+ public static boolean isMediaOutputDisabled(
1151+ MediaRouter2Manager router2Manager, String packageName) {
1152+ boolean isMediaOutputDisabled = false;
1153+ if (!TextUtils.isEmpty(packageName)) {
1154+ final List<MediaRoute2Info> infos = router2Manager.getAvailableRoutes(packageName);
1155+ if (infos.size() == 1) {
1156+ final MediaRoute2Info info = infos.get(0);
1157+ final int deviceType = info.getType();
1158+ switch (deviceType) {
1159+ case TYPE_UNKNOWN:
1160+ case TYPE_REMOTE_TV:
1161+ case TYPE_REMOTE_SPEAKER:
1162+ case TYPE_GROUP:
1163+ isMediaOutputDisabled = true;
1164+ break;
1165+ default:
1166+ isMediaOutputDisabled = false;
1167+ break;
1168+ }
1169+ }
1170+ }
1171+ return isMediaOutputDisabled;
1172+ }
11401173 }
--- a/src/com/android/settings/media/RemoteMediaSlice.java
+++ b/src/com/android/settings/media/RemoteMediaSlice.java
@@ -17,6 +17,7 @@
1717 package com.android.settings.media;
1818
1919 import static android.app.slice.Slice.EXTRA_RANGE_VALUE;
20+import static android.text.Spanned.SPAN_EXCLUSIVE_EXCLUSIVE;
2021
2122 import static com.android.settings.slices.CustomSliceRegistry.REMOTE_MEDIA_SLICE_URI;
2223
@@ -24,11 +25,15 @@ import android.app.PendingIntent;
2425 import android.content.Context;
2526 import android.content.Intent;
2627 import android.graphics.Bitmap;
28+import android.media.MediaRouter2Manager;
2729 import android.media.RoutingSessionInfo;
2830 import android.net.Uri;
31+import android.text.SpannableString;
2932 import android.text.TextUtils;
33+import android.text.style.ForegroundColorSpan;
3034 import android.util.Log;
3135
36+import androidx.annotation.VisibleForTesting;
3237 import androidx.core.graphics.drawable.IconCompat;
3338 import androidx.slice.Slice;
3439 import androidx.slice.builders.ListBuilder;
@@ -59,6 +64,9 @@ public class RemoteMediaSlice implements CustomSliceable {
5964
6065 private MediaDeviceUpdateWorker mWorker;
6166
67+ @VisibleForTesting
68+ MediaRouter2Manager mRouterManager;
69+
6270 public RemoteMediaSlice(Context context) {
6371 mContext = context;
6472 }
@@ -80,6 +88,9 @@ public class RemoteMediaSlice implements CustomSliceable {
8088 Log.e(TAG, "Unable to get the slice worker.");
8189 return listBuilder.build();
8290 }
91+ if (mRouterManager == null) {
92+ mRouterManager = MediaRouter2Manager.getInstance(mContext);
93+ }
8394 // Only displaying remote devices
8495 final List<RoutingSessionInfo> infos = getWorker().getActiveRemoteMediaDevice();
8596 if (infos.isEmpty()) {
@@ -98,8 +109,10 @@ public class RemoteMediaSlice implements CustomSliceable {
98109 + maxVolume);
99110 continue;
100111 }
112+ final CharSequence appName = Utils.getApplicationLabel(
113+ mContext, info.getClientPackageName());
101114 final CharSequence outputTitle = mContext.getString(R.string.media_output_label_title,
102- Utils.getApplicationLabel(mContext, info.getClientPackageName()));
115+ appName);
103116 listBuilder.addInputRange(new InputRangeBuilder()
104117 .setTitleItem(icon, ListBuilder.ICON_IMAGE)
105118 .setTitle(castVolume)
@@ -107,11 +120,21 @@ public class RemoteMediaSlice implements CustomSliceable {
107120 .setPrimaryAction(getSoundSettingAction(castVolume, icon, info.getId()))
108121 .setMax(maxVolume)
109122 .setValue(info.getVolume()));
123+
124+ final boolean isMediaOutputDisabled =
125+ Utils.isMediaOutputDisabled(mRouterManager, info.getClientPackageName());
126+ final SpannableString spannableTitle = new SpannableString(
127+ TextUtils.isEmpty(appName) ? "" : appName);
128+ spannableTitle.setSpan(new ForegroundColorSpan(
129+ Utils.getColorAttrDefaultColor(
130+ mContext, android.R.attr.textColorSecondary)), 0,
131+ spannableTitle.length(), SPAN_EXCLUSIVE_EXCLUSIVE);
110132 listBuilder.addRow(new ListBuilder.RowBuilder()
111- .setTitle(outputTitle)
133+ .setTitle(isMediaOutputDisabled ? spannableTitle : outputTitle)
112134 .setSubtitle(info.getName())
113135 .setTitleItem(emptyIcon, ListBuilder.ICON_IMAGE)
114- .setPrimaryAction(getMediaOutputSliceAction(info.getClientPackageName())));
136+ .setPrimaryAction(getMediaOutputSliceAction(
137+ info.getClientPackageName(), isMediaOutputDisabled)));
115138 }
116139 return listBuilder.build();
117140 }
@@ -144,9 +167,12 @@ public class RemoteMediaSlice implements CustomSliceable {
144167 return primarySliceAction;
145168 }
146169
147- private SliceAction getMediaOutputSliceAction(String packageName) {
170+ private SliceAction getMediaOutputSliceAction(
171+ String packageName, boolean isMediaOutputDisabled) {
148172 final Intent intent = new Intent()
149- .setAction(MediaOutputSliceConstants.ACTION_MEDIA_OUTPUT)
173+ .setAction(isMediaOutputDisabled
174+ ? ""
175+ : MediaOutputSliceConstants.ACTION_MEDIA_OUTPUT)
150176 .addFlags(Intent.FLAG_ACTIVITY_NEW_TASK)
151177 .putExtra(MediaOutputSliceConstants.EXTRA_PACKAGE_NAME, packageName);
152178 final IconCompat icon = IconCompat.createWithResource(mContext,
--- a/src/com/android/settings/notification/RemoteVolumeGroupController.java
+++ b/src/com/android/settings/notification/RemoteVolumeGroupController.java
@@ -18,6 +18,7 @@ package com.android.settings.notification;
1818
1919 import android.content.Context;
2020 import android.content.Intent;
21+import android.media.MediaRouter2Manager;
2122 import android.media.RoutingSessionInfo;
2223 import android.text.TextUtils;
2324
@@ -57,6 +58,8 @@ public class RemoteVolumeGroupController extends BasePreferenceController implem
5758
5859 @VisibleForTesting
5960 LocalMediaManager mLocalMediaManager;
61+ @VisibleForTesting
62+ MediaRouter2Manager mRouterManager;
6063
6164 public RemoteVolumeGroupController(Context context, String preferenceKey) {
6265 super(context, preferenceKey);
@@ -65,6 +68,7 @@ public class RemoteVolumeGroupController extends BasePreferenceController implem
6568 mLocalMediaManager.registerCallback(this);
6669 mLocalMediaManager.startScan();
6770 }
71+ mRouterManager = MediaRouter2Manager.getInstance(context);
6872 }
6973
7074 @Override
@@ -111,8 +115,10 @@ public class RemoteVolumeGroupController extends BasePreferenceController implem
111115 if (mPreferenceCategory.findPreference(info.getId()) != null) {
112116 continue;
113117 }
118+ final CharSequence appName = Utils.getApplicationLabel(
119+ mContext, info.getClientPackageName());
114120 final CharSequence outputTitle = mContext.getString(R.string.media_output_label_title,
115- Utils.getApplicationLabel(mContext, info.getClientPackageName()));
121+ appName);
116122 // Add slider
117123 final RemoteVolumeSeekBarPreference seekBarPreference =
118124 new RemoteVolumeSeekBarPreference(mContext);
@@ -125,10 +131,13 @@ public class RemoteVolumeGroupController extends BasePreferenceController implem
125131 seekBarPreference.setIcon(R.drawable.ic_volume_remote);
126132 mPreferenceCategory.addPreference(seekBarPreference);
127133 // Add output indicator
134+ final boolean isMediaOutputDisabled = Utils.isMediaOutputDisabled(
135+ mRouterManager, info.getClientPackageName());
128136 final Preference preference = new Preference(mContext);
129137 preference.setKey(SWITCHER_PREFIX + info.getId());
130- preference.setTitle(outputTitle);
138+ preference.setTitle(isMediaOutputDisabled ? appName : outputTitle);
131139 preference.setSummary(info.getName());
140+ preference.setEnabled(!isMediaOutputDisabled);
132141 mPreferenceCategory.addPreference(preference);
133142 }
134143 }
--- a/tests/robotests/src/com/android/settings/UtilsTest.java
+++ b/tests/robotests/src/com/android/settings/UtilsTest.java
@@ -40,6 +40,8 @@ import android.graphics.Color;
4040 import android.graphics.drawable.BitmapDrawable;
4141 import android.graphics.drawable.ColorDrawable;
4242 import android.graphics.drawable.VectorDrawable;
43+import android.media.MediaRoute2Info;
44+import android.media.MediaRouter2Manager;
4345 import android.net.ConnectivityManager;
4446 import android.net.LinkAddress;
4547 import android.net.LinkProperties;
@@ -299,4 +301,33 @@ public class UtilsTest {
299301
300302 assertThat(Utils.isSettingsIntelligence(mContext)).isFalse();
301303 }
304+
305+ @Test
306+ public void isMediaOutputDisabled_infosSizeEqual1_returnsTrue() {
307+ final MediaRouter2Manager router2Manager = mock(MediaRouter2Manager.class);
308+ final MediaRoute2Info info = mock(MediaRoute2Info.class);
309+ final List<MediaRoute2Info> infos = new ArrayList<>();
310+ infos.add(info);
311+
312+ when(router2Manager.getAvailableRoutes(anyString())).thenReturn(infos);
313+ when(info.getType()).thenReturn(0);
314+
315+ assertThat(Utils.isMediaOutputDisabled(router2Manager, "test")).isTrue();
316+ }
317+
318+ @Test
319+ public void isMediaOutputDisabled_infosSizeOverThan1_returnsFalse() {
320+ final MediaRouter2Manager router2Manager = mock(MediaRouter2Manager.class);
321+ final MediaRoute2Info info = mock(MediaRoute2Info.class);
322+ final MediaRoute2Info info2 = mock(MediaRoute2Info.class);
323+ final List<MediaRoute2Info> infos = new ArrayList<>();
324+ infos.add(info);
325+ infos.add(info2);
326+
327+ when(router2Manager.getAvailableRoutes(anyString())).thenReturn(infos);
328+ when(info.getType()).thenReturn(0);
329+ when(info2.getType()).thenReturn(0);
330+
331+ assertThat(Utils.isMediaOutputDisabled(router2Manager, "test")).isFalse();
332+ }
302333 }
--- a/tests/robotests/src/com/android/settings/media/RemoteMediaSliceTest.java
+++ b/tests/robotests/src/com/android/settings/media/RemoteMediaSliceTest.java
@@ -32,6 +32,7 @@ import static org.mockito.Mockito.when;
3232
3333 import android.content.Context;
3434 import android.content.Intent;
35+import android.media.MediaRouter2Manager;
3536 import android.media.RoutingSessionInfo;
3637 import android.net.Uri;
3738
@@ -87,6 +88,7 @@ public class RemoteMediaSliceTest {
8788 SliceProvider.setSpecs(SliceLiveData.SUPPORTED_SPECS);
8889
8990 mRemoteMediaSlice = new RemoteMediaSlice(mContext);
91+ mRemoteMediaSlice.mRouterManager = mock(MediaRouter2Manager.class);
9092 sMediaDeviceUpdateWorker = spy(new MediaDeviceUpdateWorker(mContext,
9193 REMOTE_MEDIA_SLICE_URI));
9294 sMediaDeviceUpdateWorker.mLocalMediaManager = mLocalMediaManager;
--- a/tests/robotests/src/com/android/settings/notification/RemoteVolumeGroupControllerTest.java
+++ b/tests/robotests/src/com/android/settings/notification/RemoteVolumeGroupControllerTest.java
@@ -30,6 +30,7 @@ import android.content.SharedPreferences;
3030 import android.content.pm.ApplicationInfo;
3131 import android.content.pm.PackageInfo;
3232 import android.content.pm.PackageStats;
33+import android.media.MediaRouter2Manager;
3334 import android.media.RoutingSessionInfo;
3435
3536 import androidx.preference.Preference;
@@ -94,6 +95,7 @@ public class RemoteVolumeGroupControllerTest {
9495 mContext = RuntimeEnvironment.application;
9596 mController = new RemoteVolumeGroupController(mContext, KEY_REMOTE_VOLUME_GROUP);
9697 mController.mLocalMediaManager = mLocalMediaManager;
98+ mController.mRouterManager = mock(MediaRouter2Manager.class);
9799 mPreferenceCategory = spy(new PreferenceCategory(mContext));
98100 mPreferenceCategory.setKey(mController.getPreferenceKey());
99101