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_UNKNOWN;
|
||||||
import static android.media.MediaRoute2Info.TYPE_WIRED_HEADPHONES;
|
import static android.media.MediaRoute2Info.TYPE_WIRED_HEADPHONES;
|
||||||
import static android.media.MediaRoute2Info.TYPE_WIRED_HEADSET;
|
import static android.media.MediaRoute2Info.TYPE_WIRED_HEADSET;
|
||||||
|
import static android.media.MediaRoute2ProviderService.REASON_UNKNOWN_ERROR;
|
||||||
|
|
||||||
import android.app.Notification;
|
import android.app.Notification;
|
||||||
import android.bluetooth.BluetoothAdapter;
|
import android.bluetooth.BluetoothAdapter;
|
||||||
@@ -50,6 +51,7 @@ import java.util.concurrent.Executors;
|
|||||||
public class InfoMediaManager extends MediaManager {
|
public class InfoMediaManager extends MediaManager {
|
||||||
|
|
||||||
private static final String TAG = "InfoMediaManager";
|
private static final String TAG = "InfoMediaManager";
|
||||||
|
private static final boolean DEBUG = false;
|
||||||
|
|
||||||
@VisibleForTesting
|
@VisibleForTesting
|
||||||
final RouterManagerCallback mMediaRouterCallback = new RouterManagerCallback();
|
final RouterManagerCallback mMediaRouterCallback = new RouterManagerCallback();
|
||||||
@@ -339,6 +341,9 @@ public class InfoMediaManager extends MediaManager {
|
|||||||
|
|
||||||
private void buildAllRoutes() {
|
private void buildAllRoutes() {
|
||||||
for (MediaRoute2Info route : mRouterManager.getAllRoutes()) {
|
for (MediaRoute2Info route : mRouterManager.getAllRoutes()) {
|
||||||
|
if (DEBUG) {
|
||||||
|
Log.d(TAG, "buildAllRoutes() route : " + route.getName());
|
||||||
|
}
|
||||||
if (route.isSystemRoute()) {
|
if (route.isSystemRoute()) {
|
||||||
addMediaDevice(route);
|
addMediaDevice(route);
|
||||||
}
|
}
|
||||||
@@ -347,6 +352,9 @@ public class InfoMediaManager extends MediaManager {
|
|||||||
|
|
||||||
private void buildAvailableRoutes() {
|
private void buildAvailableRoutes() {
|
||||||
for (MediaRoute2Info route : mRouterManager.getAvailableRoutes(mPackageName)) {
|
for (MediaRoute2Info route : mRouterManager.getAvailableRoutes(mPackageName)) {
|
||||||
|
if (DEBUG) {
|
||||||
|
Log.d(TAG, "buildAvailableRoutes() route : " + route.getName());
|
||||||
|
}
|
||||||
addMediaDevice(route);
|
addMediaDevice(route);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -363,7 +371,8 @@ public class InfoMediaManager extends MediaManager {
|
|||||||
mediaDevice = new InfoMediaDevice(mContext, mRouterManager, route,
|
mediaDevice = new InfoMediaDevice(mContext, mRouterManager, route,
|
||||||
mPackageName);
|
mPackageName);
|
||||||
if (!TextUtils.isEmpty(mPackageName)
|
if (!TextUtils.isEmpty(mPackageName)
|
||||||
&& TextUtils.equals(route.getClientPackageName(), mPackageName)) {
|
&& TextUtils.equals(route.getClientPackageName(), mPackageName)
|
||||||
|
&& mCurrentConnectedDevice == null) {
|
||||||
mCurrentConnectedDevice = mediaDevice;
|
mCurrentConnectedDevice = mediaDevice;
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
@@ -409,12 +418,41 @@ public class InfoMediaManager extends MediaManager {
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void onRoutesChanged(List<MediaRoute2Info> routes) {
|
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
|
@Override
|
||||||
public void onRoutesRemoved(List<MediaRoute2Info> routes) {
|
public void onRoutesRemoved(List<MediaRoute2Info> routes) {
|
||||||
refreshDevices();
|
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();
|
mCurrentConnectedDevice.disconnect();
|
||||||
}
|
}
|
||||||
|
|
||||||
boolean isConnected = false;
|
|
||||||
if (TextUtils.isEmpty(mPackageName)) {
|
if (TextUtils.isEmpty(mPackageName)) {
|
||||||
isConnected = mInfoMediaManager.connectDeviceWithoutPackageName(device);
|
mInfoMediaManager.connectDeviceWithoutPackageName(device);
|
||||||
} else {
|
} 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) {
|
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
|
* Stop scan MediaDevice
|
||||||
*/
|
*/
|
||||||
@@ -337,7 +334,7 @@ public class LocalMediaManager implements BluetoothCallback {
|
|||||||
MediaDevice phoneMediaDevice = null;
|
MediaDevice phoneMediaDevice = null;
|
||||||
for (MediaDevice device : mMediaDevices) {
|
for (MediaDevice device : mMediaDevices) {
|
||||||
if (device instanceof BluetoothMediaDevice) {
|
if (device instanceof BluetoothMediaDevice) {
|
||||||
if (isConnected(((BluetoothMediaDevice) device).getCachedDevice())) {
|
if (isActiveDevice(((BluetoothMediaDevice) device).getCachedDevice())) {
|
||||||
return device;
|
return device;
|
||||||
}
|
}
|
||||||
} else if (device instanceof PhoneMediaDevice) {
|
} else if (device instanceof PhoneMediaDevice) {
|
||||||
@@ -347,7 +344,7 @@ public class LocalMediaManager implements BluetoothCallback {
|
|||||||
return mMediaDevices.contains(phoneMediaDevice) ? phoneMediaDevice : null;
|
return mMediaDevices.contains(phoneMediaDevice) ? phoneMediaDevice : null;
|
||||||
}
|
}
|
||||||
|
|
||||||
private boolean isConnected(CachedBluetoothDevice device) {
|
private boolean isActiveDevice(CachedBluetoothDevice device) {
|
||||||
return device.isActiveDevice(BluetoothProfile.A2DP)
|
return device.isActiveDevice(BluetoothProfile.A2DP)
|
||||||
|| device.isActiveDevice(BluetoothProfile.HEARING_AID);
|
|| device.isActiveDevice(BluetoothProfile.HEARING_AID);
|
||||||
}
|
}
|
||||||
@@ -423,20 +420,28 @@ public class LocalMediaManager implements BluetoothCallback {
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void onConnectedDeviceChanged(String id) {
|
public void onConnectedDeviceChanged(String id) {
|
||||||
final MediaDevice connectDevice = getMediaDeviceById(mMediaDevices, id);
|
MediaDevice connectDevice = getMediaDeviceById(mMediaDevices, id);
|
||||||
|
connectDevice = connectDevice != null
|
||||||
|
? connectDevice : updateCurrentConnectedDevice();
|
||||||
|
|
||||||
if (connectDevice == mCurrentConnectedDevice) {
|
if (connectDevice == mCurrentConnectedDevice) {
|
||||||
Log.d(TAG, "onConnectedDeviceChanged() this device all ready connected!");
|
Log.d(TAG, "onConnectedDeviceChanged() this device all ready connected!");
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
mCurrentConnectedDevice = connectDevice;
|
mCurrentConnectedDevice = connectDevice;
|
||||||
dispatchDeviceAttributesChanged();
|
dispatchSelectedDeviceStateChanged(mCurrentConnectedDevice,
|
||||||
|
MediaDeviceState.STATE_CONNECTED);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void onDeviceAttributesChanged() {
|
public void onDeviceAttributesChanged() {
|
||||||
dispatchDeviceAttributesChanged();
|
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.
|
* Callback for notifying the device attributes is changed.
|
||||||
*/
|
*/
|
||||||
default void onDeviceAttributesChanged() {};
|
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() {
|
private Collection<MediaDeviceCallback> getCallbacks() {
|
||||||
return new CopyOnWriteArrayList<>(mCallbacks);
|
return new CopyOnWriteArrayList<>(mCallbacks);
|
||||||
}
|
}
|
||||||
@@ -158,5 +164,17 @@ public abstract class MediaManager {
|
|||||||
* (e.g: device name, connection state, subtitle) is changed.
|
* (e.g: device name, connection state, subtitle) is changed.
|
||||||
*/
|
*/
|
||||||
void onDeviceAttributesChanged();
|
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;
|
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 com.google.common.truth.Truth.assertThat;
|
||||||
|
|
||||||
import static org.mockito.Mockito.mock;
|
import static org.mockito.Mockito.mock;
|
||||||
@@ -54,6 +57,8 @@ public class InfoMediaManagerTest {
|
|||||||
private MediaRouter2Manager mRouterManager;
|
private MediaRouter2Manager mRouterManager;
|
||||||
@Mock
|
@Mock
|
||||||
private LocalBluetoothManager mLocalBluetoothManager;
|
private LocalBluetoothManager mLocalBluetoothManager;
|
||||||
|
@Mock
|
||||||
|
private MediaManager.MediaDeviceCallback mCallback;
|
||||||
|
|
||||||
private InfoMediaManager mInfoMediaManager;
|
private InfoMediaManager mInfoMediaManager;
|
||||||
private Context mContext;
|
private Context mContext;
|
||||||
@@ -144,6 +149,8 @@ public class InfoMediaManagerTest {
|
|||||||
@Test
|
@Test
|
||||||
public void onRoutesChanged_getAvailableRoutes_shouldAddMediaDevice() {
|
public void onRoutesChanged_getAvailableRoutes_shouldAddMediaDevice() {
|
||||||
final MediaRoute2Info info = mock(MediaRoute2Info.class);
|
final MediaRoute2Info info = mock(MediaRoute2Info.class);
|
||||||
|
mInfoMediaManager.registerCallback(mCallback);
|
||||||
|
|
||||||
when(info.getId()).thenReturn(TEST_ID);
|
when(info.getId()).thenReturn(TEST_ID);
|
||||||
when(info.getClientPackageName()).thenReturn(TEST_PACKAGE_NAME);
|
when(info.getClientPackageName()).thenReturn(TEST_PACKAGE_NAME);
|
||||||
|
|
||||||
@@ -160,11 +167,14 @@ public class InfoMediaManagerTest {
|
|||||||
assertThat(infoDevice.getId()).isEqualTo(TEST_ID);
|
assertThat(infoDevice.getId()).isEqualTo(TEST_ID);
|
||||||
assertThat(mInfoMediaManager.getCurrentConnectedDevice()).isEqualTo(infoDevice);
|
assertThat(mInfoMediaManager.getCurrentConnectedDevice()).isEqualTo(infoDevice);
|
||||||
assertThat(mInfoMediaManager.mMediaDevices).hasSize(routes.size());
|
assertThat(mInfoMediaManager.mMediaDevices).hasSize(routes.size());
|
||||||
|
verify(mCallback).onConnectedDeviceChanged(TEST_ID);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void onRoutesChanged_buildAllRoutes_shouldAddMediaDevice() {
|
public void onRoutesChanged_buildAllRoutes_shouldAddMediaDevice() {
|
||||||
final MediaRoute2Info info = mock(MediaRoute2Info.class);
|
final MediaRoute2Info info = mock(MediaRoute2Info.class);
|
||||||
|
mInfoMediaManager.registerCallback(mCallback);
|
||||||
|
|
||||||
when(info.getId()).thenReturn(TEST_ID);
|
when(info.getId()).thenReturn(TEST_ID);
|
||||||
when(info.getClientPackageName()).thenReturn(TEST_PACKAGE_NAME);
|
when(info.getClientPackageName()).thenReturn(TEST_PACKAGE_NAME);
|
||||||
when(info.isSystemRoute()).thenReturn(true);
|
when(info.isSystemRoute()).thenReturn(true);
|
||||||
@@ -182,6 +192,7 @@ public class InfoMediaManagerTest {
|
|||||||
final MediaDevice infoDevice = mInfoMediaManager.mMediaDevices.get(0);
|
final MediaDevice infoDevice = mInfoMediaManager.mMediaDevices.get(0);
|
||||||
assertThat(infoDevice.getId()).isEqualTo(TEST_ID);
|
assertThat(infoDevice.getId()).isEqualTo(TEST_ID);
|
||||||
assertThat(mInfoMediaManager.mMediaDevices).hasSize(routes.size());
|
assertThat(mInfoMediaManager.mMediaDevices).hasSize(routes.size());
|
||||||
|
verify(mCallback).onConnectedDeviceChanged(null);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
@@ -493,4 +504,22 @@ public class InfoMediaManagerTest {
|
|||||||
|
|
||||||
assertThat(mInfoMediaManager.getSessionName()).isEqualTo(TEST_NAME);
|
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);
|
assertThat(mLocalMediaManager.mMediaDevices).hasSize(3);
|
||||||
verify(mCallback).onDeviceListUpdate(any());
|
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();
|
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