Merge "Implement transfer fail callback" into rvc-dev am: 5ba28a107e
Change-Id: I8c7708821b89c39f5dc38b1a0105e804ea36eae9
This commit is contained in:
@@ -24,6 +24,7 @@ import static android.media.MediaRoute2Info.TYPE_REMOTE_TV;
|
||||
import static android.media.MediaRoute2Info.TYPE_UNKNOWN;
|
||||
import static android.media.MediaRoute2Info.TYPE_WIRED_HEADPHONES;
|
||||
import static android.media.MediaRoute2Info.TYPE_WIRED_HEADSET;
|
||||
import static android.media.MediaRoute2ProviderService.REASON_UNKNOWN_ERROR;
|
||||
|
||||
import android.app.Notification;
|
||||
import android.bluetooth.BluetoothAdapter;
|
||||
@@ -50,6 +51,7 @@ import java.util.concurrent.Executors;
|
||||
public class InfoMediaManager extends MediaManager {
|
||||
|
||||
private static final String TAG = "InfoMediaManager";
|
||||
private static final boolean DEBUG = false;
|
||||
|
||||
@VisibleForTesting
|
||||
final RouterManagerCallback mMediaRouterCallback = new RouterManagerCallback();
|
||||
@@ -339,6 +341,9 @@ public class InfoMediaManager extends MediaManager {
|
||||
|
||||
private void buildAllRoutes() {
|
||||
for (MediaRoute2Info route : mRouterManager.getAllRoutes()) {
|
||||
if (DEBUG) {
|
||||
Log.d(TAG, "buildAllRoutes() route : " + route.getName());
|
||||
}
|
||||
if (route.isSystemRoute()) {
|
||||
addMediaDevice(route);
|
||||
}
|
||||
@@ -347,6 +352,9 @@ public class InfoMediaManager extends MediaManager {
|
||||
|
||||
private void buildAvailableRoutes() {
|
||||
for (MediaRoute2Info route : mRouterManager.getAvailableRoutes(mPackageName)) {
|
||||
if (DEBUG) {
|
||||
Log.d(TAG, "buildAvailableRoutes() route : " + route.getName());
|
||||
}
|
||||
addMediaDevice(route);
|
||||
}
|
||||
}
|
||||
@@ -363,7 +371,8 @@ public class InfoMediaManager extends MediaManager {
|
||||
mediaDevice = new InfoMediaDevice(mContext, mRouterManager, route,
|
||||
mPackageName);
|
||||
if (!TextUtils.isEmpty(mPackageName)
|
||||
&& TextUtils.equals(route.getClientPackageName(), mPackageName)) {
|
||||
&& TextUtils.equals(route.getClientPackageName(), mPackageName)
|
||||
&& mCurrentConnectedDevice == null) {
|
||||
mCurrentConnectedDevice = mediaDevice;
|
||||
}
|
||||
break;
|
||||
@@ -409,12 +418,41 @@ public class InfoMediaManager extends MediaManager {
|
||||
|
||||
@Override
|
||||
public void onRoutesChanged(List<MediaRoute2Info> routes) {
|
||||
refreshDevices();
|
||||
mMediaDevices.clear();
|
||||
mCurrentConnectedDevice = null;
|
||||
if (TextUtils.isEmpty(mPackageName)) {
|
||||
buildAllRoutes();
|
||||
} else {
|
||||
buildAvailableRoutes();
|
||||
}
|
||||
|
||||
final String id = mCurrentConnectedDevice != null
|
||||
? mCurrentConnectedDevice.getId()
|
||||
: null;
|
||||
dispatchConnectedDeviceChanged(id);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onRoutesRemoved(List<MediaRoute2Info> routes) {
|
||||
refreshDevices();
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onTransferred(RoutingSessionInfo oldSession, RoutingSessionInfo newSession) {
|
||||
if (DEBUG) {
|
||||
Log.d(TAG, "onTransferred() oldSession : " + oldSession.getName()
|
||||
+ ", newSession : " + newSession.getName());
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onTransferFailed(RoutingSessionInfo session, MediaRoute2Info route) {
|
||||
dispatchOnRequestFailed(REASON_UNKNOWN_ERROR);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onRequestFailed(int reason) {
|
||||
dispatchOnRequestFailed(reason);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -142,20 +142,11 @@ public class LocalMediaManager implements BluetoothCallback {
|
||||
mCurrentConnectedDevice.disconnect();
|
||||
}
|
||||
|
||||
boolean isConnected = false;
|
||||
if (TextUtils.isEmpty(mPackageName)) {
|
||||
isConnected = mInfoMediaManager.connectDeviceWithoutPackageName(device);
|
||||
mInfoMediaManager.connectDeviceWithoutPackageName(device);
|
||||
} else {
|
||||
isConnected = device.connect();
|
||||
device.connect();
|
||||
}
|
||||
if (isConnected) {
|
||||
mCurrentConnectedDevice = device;
|
||||
}
|
||||
|
||||
final int state = isConnected
|
||||
? MediaDeviceState.STATE_CONNECTED
|
||||
: MediaDeviceState.STATE_DISCONNECTED;
|
||||
dispatchSelectedDeviceStateChanged(device, state);
|
||||
}
|
||||
|
||||
void dispatchSelectedDeviceStateChanged(MediaDevice device, @MediaDeviceState int state) {
|
||||
@@ -186,6 +177,12 @@ public class LocalMediaManager implements BluetoothCallback {
|
||||
}
|
||||
}
|
||||
|
||||
void dispatchOnRequestFailed(int reason) {
|
||||
for (DeviceCallback callback : getCallbacks()) {
|
||||
callback.onRequestFailed(reason);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Stop scan MediaDevice
|
||||
*/
|
||||
@@ -337,7 +334,7 @@ public class LocalMediaManager implements BluetoothCallback {
|
||||
MediaDevice phoneMediaDevice = null;
|
||||
for (MediaDevice device : mMediaDevices) {
|
||||
if (device instanceof BluetoothMediaDevice) {
|
||||
if (isConnected(((BluetoothMediaDevice) device).getCachedDevice())) {
|
||||
if (isActiveDevice(((BluetoothMediaDevice) device).getCachedDevice())) {
|
||||
return device;
|
||||
}
|
||||
} else if (device instanceof PhoneMediaDevice) {
|
||||
@@ -347,7 +344,7 @@ public class LocalMediaManager implements BluetoothCallback {
|
||||
return mMediaDevices.contains(phoneMediaDevice) ? phoneMediaDevice : null;
|
||||
}
|
||||
|
||||
private boolean isConnected(CachedBluetoothDevice device) {
|
||||
private boolean isActiveDevice(CachedBluetoothDevice device) {
|
||||
return device.isActiveDevice(BluetoothProfile.A2DP)
|
||||
|| device.isActiveDevice(BluetoothProfile.HEARING_AID);
|
||||
}
|
||||
@@ -423,20 +420,28 @@ public class LocalMediaManager implements BluetoothCallback {
|
||||
|
||||
@Override
|
||||
public void onConnectedDeviceChanged(String id) {
|
||||
final MediaDevice connectDevice = getMediaDeviceById(mMediaDevices, id);
|
||||
MediaDevice connectDevice = getMediaDeviceById(mMediaDevices, id);
|
||||
connectDevice = connectDevice != null
|
||||
? connectDevice : updateCurrentConnectedDevice();
|
||||
|
||||
if (connectDevice == mCurrentConnectedDevice) {
|
||||
Log.d(TAG, "onConnectedDeviceChanged() this device all ready connected!");
|
||||
return;
|
||||
}
|
||||
mCurrentConnectedDevice = connectDevice;
|
||||
dispatchDeviceAttributesChanged();
|
||||
dispatchSelectedDeviceStateChanged(mCurrentConnectedDevice,
|
||||
MediaDeviceState.STATE_CONNECTED);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onDeviceAttributesChanged() {
|
||||
dispatchDeviceAttributesChanged();
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onRequestFailed(int reason) {
|
||||
dispatchOnRequestFailed(reason);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -467,6 +472,18 @@ public class LocalMediaManager implements BluetoothCallback {
|
||||
* Callback for notifying the device attributes is changed.
|
||||
*/
|
||||
default void onDeviceAttributesChanged() {};
|
||||
|
||||
/**
|
||||
* Callback for notifying that transferring is failed.
|
||||
*
|
||||
* @param reason the reason that the request has failed. Can be one of followings:
|
||||
* {@link android.media.MediaRoute2ProviderService#REASON_UNKNOWN_ERROR},
|
||||
* {@link android.media.MediaRoute2ProviderService#REASON_REJECTED},
|
||||
* {@link android.media.MediaRoute2ProviderService#REASON_NETWORK_ERROR},
|
||||
* {@link android.media.MediaRoute2ProviderService#REASON_ROUTE_NOT_AVAILABLE},
|
||||
* {@link android.media.MediaRoute2ProviderService#REASON_INVALID_COMMAND},
|
||||
*/
|
||||
default void onRequestFailed(int reason){};
|
||||
}
|
||||
|
||||
/**
|
||||
|
||||
@@ -110,6 +110,12 @@ public abstract class MediaManager {
|
||||
}
|
||||
}
|
||||
|
||||
protected void dispatchOnRequestFailed(int reason) {
|
||||
for (MediaDeviceCallback callback : getCallbacks()) {
|
||||
callback.onRequestFailed(reason);
|
||||
}
|
||||
}
|
||||
|
||||
private Collection<MediaDeviceCallback> getCallbacks() {
|
||||
return new CopyOnWriteArrayList<>(mCallbacks);
|
||||
}
|
||||
@@ -158,5 +164,17 @@ public abstract class MediaManager {
|
||||
* (e.g: device name, connection state, subtitle) is changed.
|
||||
*/
|
||||
void onDeviceAttributesChanged();
|
||||
|
||||
/**
|
||||
* Callback for notifying that transferring is failed.
|
||||
*
|
||||
* @param reason the reason that the request has failed. Can be one of followings:
|
||||
* {@link android.media.MediaRoute2ProviderService#REASON_UNKNOWN_ERROR},
|
||||
* {@link android.media.MediaRoute2ProviderService#REASON_REJECTED},
|
||||
* {@link android.media.MediaRoute2ProviderService#REASON_NETWORK_ERROR},
|
||||
* {@link android.media.MediaRoute2ProviderService#REASON_ROUTE_NOT_AVAILABLE},
|
||||
* {@link android.media.MediaRoute2ProviderService#REASON_INVALID_COMMAND},
|
||||
*/
|
||||
void onRequestFailed(int reason);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -16,6 +16,9 @@
|
||||
|
||||
package com.android.settingslib.media;
|
||||
|
||||
import static android.media.MediaRoute2ProviderService.REASON_NETWORK_ERROR;
|
||||
import static android.media.MediaRoute2ProviderService.REASON_UNKNOWN_ERROR;
|
||||
|
||||
import static com.google.common.truth.Truth.assertThat;
|
||||
|
||||
import static org.mockito.Mockito.mock;
|
||||
@@ -54,6 +57,8 @@ public class InfoMediaManagerTest {
|
||||
private MediaRouter2Manager mRouterManager;
|
||||
@Mock
|
||||
private LocalBluetoothManager mLocalBluetoothManager;
|
||||
@Mock
|
||||
private MediaManager.MediaDeviceCallback mCallback;
|
||||
|
||||
private InfoMediaManager mInfoMediaManager;
|
||||
private Context mContext;
|
||||
@@ -144,6 +149,8 @@ public class InfoMediaManagerTest {
|
||||
@Test
|
||||
public void onRoutesChanged_getAvailableRoutes_shouldAddMediaDevice() {
|
||||
final MediaRoute2Info info = mock(MediaRoute2Info.class);
|
||||
mInfoMediaManager.registerCallback(mCallback);
|
||||
|
||||
when(info.getId()).thenReturn(TEST_ID);
|
||||
when(info.getClientPackageName()).thenReturn(TEST_PACKAGE_NAME);
|
||||
|
||||
@@ -160,11 +167,14 @@ public class InfoMediaManagerTest {
|
||||
assertThat(infoDevice.getId()).isEqualTo(TEST_ID);
|
||||
assertThat(mInfoMediaManager.getCurrentConnectedDevice()).isEqualTo(infoDevice);
|
||||
assertThat(mInfoMediaManager.mMediaDevices).hasSize(routes.size());
|
||||
verify(mCallback).onConnectedDeviceChanged(TEST_ID);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void onRoutesChanged_buildAllRoutes_shouldAddMediaDevice() {
|
||||
final MediaRoute2Info info = mock(MediaRoute2Info.class);
|
||||
mInfoMediaManager.registerCallback(mCallback);
|
||||
|
||||
when(info.getId()).thenReturn(TEST_ID);
|
||||
when(info.getClientPackageName()).thenReturn(TEST_PACKAGE_NAME);
|
||||
when(info.isSystemRoute()).thenReturn(true);
|
||||
@@ -182,6 +192,7 @@ public class InfoMediaManagerTest {
|
||||
final MediaDevice infoDevice = mInfoMediaManager.mMediaDevices.get(0);
|
||||
assertThat(infoDevice.getId()).isEqualTo(TEST_ID);
|
||||
assertThat(mInfoMediaManager.mMediaDevices).hasSize(routes.size());
|
||||
verify(mCallback).onConnectedDeviceChanged(null);
|
||||
}
|
||||
|
||||
@Test
|
||||
@@ -493,4 +504,22 @@ public class InfoMediaManagerTest {
|
||||
|
||||
assertThat(mInfoMediaManager.getSessionName()).isEqualTo(TEST_NAME);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void onTransferFailed_shouldDispatchOnRequestFailed() {
|
||||
mInfoMediaManager.registerCallback(mCallback);
|
||||
|
||||
mInfoMediaManager.mMediaRouterCallback.onTransferFailed(null, null);
|
||||
|
||||
verify(mCallback).onRequestFailed(REASON_UNKNOWN_ERROR);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void onRequestFailed_shouldDispatchOnRequestFailed() {
|
||||
mInfoMediaManager.registerCallback(mCallback);
|
||||
|
||||
mInfoMediaManager.mMediaRouterCallback.onRequestFailed(REASON_NETWORK_ERROR);
|
||||
|
||||
verify(mCallback).onRequestFailed(REASON_NETWORK_ERROR);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -477,4 +477,13 @@ public class LocalMediaManagerTest {
|
||||
assertThat(mLocalMediaManager.mMediaDevices).hasSize(3);
|
||||
verify(mCallback).onDeviceListUpdate(any());
|
||||
}
|
||||
|
||||
@Test
|
||||
public void onRequestFailed_shouldDispatchOnRequestFailed() {
|
||||
mLocalMediaManager.registerCallback(mCallback);
|
||||
|
||||
mLocalMediaManager.mMediaDeviceCallback.onRequestFailed(1);
|
||||
|
||||
verify(mCallback).onRequestFailed(1);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -136,4 +136,14 @@ public class MediaManagerTest {
|
||||
|
||||
assertThat(device).isNull();
|
||||
}
|
||||
|
||||
@Test
|
||||
public void dispatchOnRequestFailed_registerCallback_shouldDispatchCallback() {
|
||||
mMediaManager.registerCallback(mCallback);
|
||||
|
||||
mMediaManager.dispatchOnRequestFailed(1);
|
||||
|
||||
verify(mCallback).onRequestFailed(1);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user