New API to display cast device slice

-Add test cases

Bug: 142772656
Test: make -j42 RunSettingsLibRoboTests
Change-Id: I97734b05b96f76429e8dc43c6b503e2dddd817de
This commit is contained in:
timhypeng
2020-02-04 17:15:48 +08:00
parent 758bc85bf7
commit a812e889a9
4 changed files with 125 additions and 0 deletions

View File

@@ -16,9 +16,12 @@
package com.android.settingslib.media;
import android.content.Context;
import android.content.pm.PackageManager;
import android.graphics.drawable.Drawable;
import android.media.MediaRoute2Info;
import android.media.MediaRouter2Manager;
import android.text.TextUtils;
import android.util.Log;
import com.android.settingslib.R;
import com.android.settingslib.bluetooth.BluetoothUtils;
@@ -88,6 +91,31 @@ public class InfoMediaDevice extends MediaDevice {
return mRouteInfo.getVolume();
}
@Override
public String getClientPackageName() {
return mRouteInfo.getClientPackageName();
}
@Override
public String getClientAppLabel() {
final String packageName = mRouteInfo.getClientPackageName();
if (TextUtils.isEmpty(packageName)) {
Log.d(TAG, "Client package name is empty");
return mContext.getResources().getString(R.string.unknown);
}
try {
final PackageManager packageManager = mContext.getPackageManager();
final String appLabel = packageManager.getApplicationLabel(
packageManager.getApplicationInfo(packageName, 0)).toString();
if (!TextUtils.isEmpty(appLabel)) {
return appLabel;
}
} catch (PackageManager.NameNotFoundException e) {
Log.e(TAG, "unable to find " + packageName);
}
return mContext.getResources().getString(R.string.unknown);
}
@Override
public void disconnect() {
//TODO(b/144535188): disconnected last select device

View File

@@ -235,6 +235,22 @@ public class LocalMediaManager implements BluetoothCallback {
return mCurrentConnectedDevice;
}
/**
* Find the active MediaDevice.
*
* @param type the media device type.
* @return MediaDevice list
*/
public List<MediaDevice> getActiveMediaDevice(@MediaDevice.MediaDeviceType int type) {
final List<MediaDevice> devices = new ArrayList<>();
for (MediaDevice device : mMediaDevices) {
if (type == device.mType && device.getClientPackageName() != null) {
devices.add(device);
}
}
return devices;
}
private MediaDevice updateCurrentConnectedDevice() {
for (MediaDevice device : mMediaDevices) {
if (device instanceof BluetoothMediaDevice) {

View File

@@ -22,6 +22,9 @@ import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.when;
import android.content.Context;
import android.content.pm.ApplicationInfo;
import android.content.pm.PackageInfo;
import android.content.pm.PackageStats;
import android.media.MediaRoute2Info;
import android.media.MediaRouter2Manager;
@@ -34,11 +37,14 @@ import org.mockito.Mock;
import org.mockito.MockitoAnnotations;
import org.robolectric.RobolectricTestRunner;
import org.robolectric.RuntimeEnvironment;
import org.robolectric.Shadows;
import org.robolectric.shadows.ShadowPackageManager;
@RunWith(RobolectricTestRunner.class)
public class InfoMediaDeviceTest {
private static final String TEST_PACKAGE_NAME = "com.test.packagename";
private static final String TEST_PACKAGE_NAME2 = "com.test.packagename2";
private static final String TEST_ID = "test_id";
private static final String TEST_NAME = "test_name";
@@ -50,11 +56,24 @@ public class InfoMediaDeviceTest {
private Context mContext;
private InfoMediaDevice mInfoMediaDevice;
private ShadowPackageManager mShadowPackageManager;
private ApplicationInfo mAppInfo;
private PackageInfo mPackageInfo;
private PackageStats mPackageStats;
@Before
public void setUp() {
MockitoAnnotations.initMocks(this);
mContext = RuntimeEnvironment.application;
mShadowPackageManager = Shadows.shadowOf(mContext.getPackageManager());
mAppInfo = new ApplicationInfo();
mAppInfo.flags = ApplicationInfo.FLAG_INSTALLED;
mAppInfo.packageName = TEST_PACKAGE_NAME;
mAppInfo.name = TEST_NAME;
mPackageInfo = new PackageInfo();
mPackageInfo.packageName = TEST_PACKAGE_NAME;
mPackageInfo.applicationInfo = mAppInfo;
mPackageStats = new PackageStats(TEST_PACKAGE_NAME);
mInfoMediaDevice = new InfoMediaDevice(mContext, mRouterManager, mRouteInfo,
TEST_PACKAGE_NAME);
@@ -95,4 +114,32 @@ public class InfoMediaDeviceTest {
verify(mRouterManager).selectRoute(TEST_PACKAGE_NAME, mRouteInfo);
}
@Test
public void getClientPackageName_returnPackageName() {
when(mRouteInfo.getClientPackageName()).thenReturn(TEST_PACKAGE_NAME);
assertThat(mInfoMediaDevice.getClientPackageName()).isEqualTo(TEST_PACKAGE_NAME);
}
@Test
public void getClientAppLabel_matchedPackageName_returnLabel() {
when(mRouteInfo.getClientPackageName()).thenReturn(TEST_PACKAGE_NAME);
assertThat(mInfoMediaDevice.getClientAppLabel()).isEqualTo(
mContext.getResources().getString(R.string.unknown));
mShadowPackageManager.addPackage(mPackageInfo, mPackageStats);
assertThat(mInfoMediaDevice.getClientAppLabel()).isEqualTo(TEST_NAME);
}
@Test
public void getClientAppLabel_noMatchedPackageName_returnDefault() {
mShadowPackageManager.addPackage(mPackageInfo, mPackageStats);
when(mRouteInfo.getClientPackageName()).thenReturn(TEST_PACKAGE_NAME2);
assertThat(mInfoMediaDevice.getClientAppLabel()).isEqualTo(
mContext.getResources().getString(R.string.unknown));
}
}

View File

@@ -384,4 +384,38 @@ public class LocalMediaManagerTest {
verify(mCallback).onDeviceAttributesChanged();
}
@Test
public void getActiveMediaDevice_checkList() {
final List<MediaDevice> devices = new ArrayList<>();
final MediaDevice device1 = mock(MediaDevice.class);
final MediaDevice device2 = mock(MediaDevice.class);
final MediaDevice device3 = mock(MediaDevice.class);
device1.mType = MediaDevice.MediaDeviceType.TYPE_PHONE_DEVICE;
device2.mType = MediaDevice.MediaDeviceType.TYPE_CAST_DEVICE;
device3.mType = MediaDevice.MediaDeviceType.TYPE_BLUETOOTH_DEVICE;
when(device1.getClientPackageName()).thenReturn(TEST_DEVICE_ID_1);
when(device2.getClientPackageName()).thenReturn(TEST_DEVICE_ID_2);
when(device3.getClientPackageName()).thenReturn(TEST_DEVICE_ID_3);
when(device1.getId()).thenReturn(TEST_DEVICE_ID_1);
when(device2.getId()).thenReturn(TEST_DEVICE_ID_2);
when(device3.getId()).thenReturn(TEST_DEVICE_ID_3);
devices.add(device1);
devices.add(device2);
devices.add(device3);
mLocalMediaManager.registerCallback(mCallback);
mLocalMediaManager.mMediaDeviceCallback.onDeviceListAdded(devices);
List<MediaDevice> activeDevices = mLocalMediaManager.getActiveMediaDevice(
MediaDevice.MediaDeviceType.TYPE_PHONE_DEVICE);
assertThat(activeDevices).containsExactly(device1);
activeDevices = mLocalMediaManager.getActiveMediaDevice(
MediaDevice.MediaDeviceType.TYPE_CAST_DEVICE);
assertThat(activeDevices).containsExactly(device2);
activeDevices = mLocalMediaManager.getActiveMediaDevice(
MediaDevice.MediaDeviceType.TYPE_BLUETOOTH_DEVICE);
assertThat(activeDevices).containsExactly(device3);
}
}