Loading packages/SettingsLib/src/com/android/settingslib/media/InfoMediaManager.java +40 −2 Original line number Diff line number Diff line Loading @@ -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; Loading @@ -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(); Loading Loading @@ -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); } Loading @@ -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); } } Loading @@ -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; Loading Loading @@ -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); } } } packages/SettingsLib/src/com/android/settingslib/media/LocalMediaManager.java +32 −15 Original line number Diff line number Diff line Loading @@ -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) { Loading Loading @@ -186,6 +177,12 @@ public class LocalMediaManager implements BluetoothCallback { } } void dispatchOnRequestFailed(int reason) { for (DeviceCallback callback : getCallbacks()) { callback.onRequestFailed(reason); } } /** * Stop scan MediaDevice */ Loading Loading @@ -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) { Loading @@ -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); } Loading Loading @@ -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); } } Loading Loading @@ -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){}; } /** Loading packages/SettingsLib/src/com/android/settingslib/media/MediaManager.java +18 −0 Original line number Diff line number Diff line Loading @@ -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); } Loading Loading @@ -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); } } packages/SettingsLib/tests/robotests/src/com/android/settingslib/media/InfoMediaManagerTest.java +29 −0 Original line number Diff line number Diff line Loading @@ -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; Loading Loading @@ -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; Loading Loading @@ -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); Loading @@ -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); Loading @@ -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 Loading Loading @@ -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); } } packages/SettingsLib/tests/robotests/src/com/android/settingslib/media/LocalMediaManagerTest.java +9 −0 Original line number Diff line number Diff line Loading @@ -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); } } Loading
packages/SettingsLib/src/com/android/settingslib/media/InfoMediaManager.java +40 −2 Original line number Diff line number Diff line Loading @@ -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; Loading @@ -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(); Loading Loading @@ -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); } Loading @@ -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); } } Loading @@ -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; Loading Loading @@ -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); } } }
packages/SettingsLib/src/com/android/settingslib/media/LocalMediaManager.java +32 −15 Original line number Diff line number Diff line Loading @@ -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) { Loading Loading @@ -186,6 +177,12 @@ public class LocalMediaManager implements BluetoothCallback { } } void dispatchOnRequestFailed(int reason) { for (DeviceCallback callback : getCallbacks()) { callback.onRequestFailed(reason); } } /** * Stop scan MediaDevice */ Loading Loading @@ -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) { Loading @@ -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); } Loading Loading @@ -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); } } Loading Loading @@ -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){}; } /** Loading
packages/SettingsLib/src/com/android/settingslib/media/MediaManager.java +18 −0 Original line number Diff line number Diff line Loading @@ -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); } Loading Loading @@ -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); } }
packages/SettingsLib/tests/robotests/src/com/android/settingslib/media/InfoMediaManagerTest.java +29 −0 Original line number Diff line number Diff line Loading @@ -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; Loading Loading @@ -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; Loading Loading @@ -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); Loading @@ -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); Loading @@ -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 Loading Loading @@ -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); } }
packages/SettingsLib/tests/robotests/src/com/android/settingslib/media/LocalMediaManagerTest.java +9 −0 Original line number Diff line number Diff line Loading @@ -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); } }