1 package org.robolectric.shadows; 2 3 import static android.media.MediaRouter.ROUTE_TYPE_LIVE_AUDIO; 4 import static android.media.MediaRouter.ROUTE_TYPE_LIVE_VIDEO; 5 import static android.os.Build.VERSION_CODES.N; 6 import static android.os.Build.VERSION_CODES.O; 7 import static com.google.common.truth.Truth.assertThat; 8 import static org.robolectric.Shadows.shadowOf; 9 10 import android.app.Activity; 11 import android.content.Context; 12 import android.media.MediaRouter; 13 import android.media.MediaRouter.RouteInfo; 14 import androidx.test.core.app.ApplicationProvider; 15 import androidx.test.ext.junit.runners.AndroidJUnit4; 16 import org.junit.Before; 17 import org.junit.Test; 18 import org.junit.runner.RunWith; 19 import org.robolectric.Robolectric; 20 import org.robolectric.android.controller.ActivityController; 21 import org.robolectric.annotation.Config; 22 23 /** Tests for {@link ShadowMediaRouter}. */ 24 @RunWith(AndroidJUnit4.class) 25 public final class ShadowMediaRouterTest { 26 private MediaRouter mediaRouter; 27 28 @Before setUp()29 public void setUp() { 30 mediaRouter = 31 (MediaRouter) 32 ApplicationProvider.getApplicationContext() 33 .getSystemService(Context.MEDIA_ROUTER_SERVICE); 34 } 35 36 @Test testAddBluetoothRoute_additionalRouteAvailable()37 public void testAddBluetoothRoute_additionalRouteAvailable() { 38 shadowOf(mediaRouter).addBluetoothRoute(); 39 assertThat(mediaRouter.getRouteCount()).isEqualTo(2); 40 } 41 42 @Test testAddBluetoothRoute_bluetoothRouteSelected()43 public void testAddBluetoothRoute_bluetoothRouteSelected() { 44 shadowOf(mediaRouter).addBluetoothRoute(); 45 RouteInfo bluetoothRoute = mediaRouter.getRouteAt(1); 46 assertThat(mediaRouter.getSelectedRoute(ROUTE_TYPE_LIVE_AUDIO)).isEqualTo(bluetoothRoute); 47 } 48 49 @Test testAddBluetoothRoute_checkBluetoothRouteProperties()50 public void testAddBluetoothRoute_checkBluetoothRouteProperties() { 51 shadowOf(mediaRouter).addBluetoothRoute(); 52 RouteInfo bluetoothRoute = mediaRouter.getRouteAt(1); 53 assertThat(bluetoothRoute.getName().toString()) 54 .isEqualTo(ShadowMediaRouter.BLUETOOTH_DEVICE_NAME); 55 assertThat(bluetoothRoute.getDescription().toString()).isEqualTo("Bluetooth audio"); 56 } 57 58 @Test 59 @Config(minSdk = N) testAddBluetoothRoute_checkBluetoothRouteProperties_apiN()60 public void testAddBluetoothRoute_checkBluetoothRouteProperties_apiN() { 61 shadowOf(mediaRouter).addBluetoothRoute(); 62 RouteInfo bluetoothRoute = mediaRouter.getRouteAt(1); 63 assertThat(bluetoothRoute.getDeviceType()).isEqualTo(RouteInfo.DEVICE_TYPE_BLUETOOTH); 64 } 65 66 @Test testSelectBluetoothRoute_getsSetAsSelectedRoute()67 public void testSelectBluetoothRoute_getsSetAsSelectedRoute() { 68 // Although this isn't something faked out by the shadow we should ensure that the Bluetooth 69 // route can be selected after it's been added. 70 shadowOf(mediaRouter).addBluetoothRoute(); 71 RouteInfo bluetoothRoute = mediaRouter.getRouteAt(1); 72 73 mediaRouter.selectRoute(ROUTE_TYPE_LIVE_AUDIO, bluetoothRoute); 74 75 assertThat(mediaRouter.getSelectedRoute(ROUTE_TYPE_LIVE_AUDIO)).isEqualTo(bluetoothRoute); 76 } 77 78 @Test testRemoveBluetoothRoute_whenBluetoothSelected_defaultRouteAvailableAndSelected()79 public void testRemoveBluetoothRoute_whenBluetoothSelected_defaultRouteAvailableAndSelected() { 80 shadowOf(mediaRouter).addBluetoothRoute(); 81 82 shadowOf(mediaRouter).removeBluetoothRoute(); 83 84 assertThat(mediaRouter.getRouteCount()).isEqualTo(1); 85 assertThat(mediaRouter.getSelectedRoute(ROUTE_TYPE_LIVE_AUDIO)) 86 .isEqualTo(mediaRouter.getDefaultRoute()); 87 } 88 89 @Test testRemoveBluetoothRoute_whenDefaultSelected_defaultRouteAvailableAndSelected()90 public void testRemoveBluetoothRoute_whenDefaultSelected_defaultRouteAvailableAndSelected() { 91 shadowOf(mediaRouter).addBluetoothRoute(); 92 RouteInfo bluetoothRoute = mediaRouter.getRouteAt(1); 93 mediaRouter.selectRoute(ROUTE_TYPE_LIVE_AUDIO, bluetoothRoute); 94 95 shadowOf(mediaRouter).removeBluetoothRoute(); 96 97 assertThat(mediaRouter.getRouteCount()).isEqualTo(1); 98 assertThat(mediaRouter.getSelectedRoute(ROUTE_TYPE_LIVE_AUDIO)) 99 .isEqualTo(mediaRouter.getDefaultRoute()); 100 } 101 102 @Test testIsBluetoothRouteSelected_bluetoothRouteNotAdded_returnsFalse()103 public void testIsBluetoothRouteSelected_bluetoothRouteNotAdded_returnsFalse() { 104 assertThat(shadowOf(mediaRouter).isBluetoothRouteSelected(ROUTE_TYPE_LIVE_AUDIO)).isFalse(); 105 } 106 107 @Test testIsBluetoothRouteSelected_bluetoothRouteAddedButNotSelected_returnsFalse()108 public void testIsBluetoothRouteSelected_bluetoothRouteAddedButNotSelected_returnsFalse() { 109 shadowOf(mediaRouter).addBluetoothRoute(); 110 mediaRouter.selectRoute(ROUTE_TYPE_LIVE_AUDIO, mediaRouter.getDefaultRoute()); 111 assertThat(shadowOf(mediaRouter).isBluetoothRouteSelected(ROUTE_TYPE_LIVE_AUDIO)).isFalse(); 112 } 113 114 @Test testIsBluetoothRouteSelected_bluetoothRouteSelectedForDifferentType_returnsFalse()115 public void testIsBluetoothRouteSelected_bluetoothRouteSelectedForDifferentType_returnsFalse() { 116 shadowOf(mediaRouter).addBluetoothRoute(); 117 RouteInfo bluetoothRoute = mediaRouter.getRouteAt(1); 118 119 // Select the Bluetooth route for AUDIO and the default route for AUDIO. 120 mediaRouter.selectRoute(ROUTE_TYPE_LIVE_AUDIO, bluetoothRoute); 121 mediaRouter.selectRoute(ROUTE_TYPE_LIVE_VIDEO, mediaRouter.getDefaultRoute()); 122 123 assertThat(shadowOf(mediaRouter).isBluetoothRouteSelected(ROUTE_TYPE_LIVE_VIDEO)).isFalse(); 124 } 125 126 @Test testIsBluetoothRouteSelected_bluetoothRouteSelected_returnsTrue()127 public void testIsBluetoothRouteSelected_bluetoothRouteSelected_returnsTrue() { 128 shadowOf(mediaRouter).addBluetoothRoute(); 129 RouteInfo bluetoothRoute = mediaRouter.getRouteAt(1); 130 mediaRouter.selectRoute(ROUTE_TYPE_LIVE_AUDIO, bluetoothRoute); 131 assertThat(shadowOf(mediaRouter).isBluetoothRouteSelected(ROUTE_TYPE_LIVE_AUDIO)).isTrue(); 132 } 133 134 @Test 135 @Config(minSdk = O) mediaRouter_activityContextEnabled_differentInstancesRetrieveDefaultRoute()136 public void mediaRouter_activityContextEnabled_differentInstancesRetrieveDefaultRoute() { 137 String originalProperty = System.getProperty("robolectric.createActivityContexts", ""); 138 System.setProperty("robolectric.createActivityContexts", "true"); 139 try (ActivityController<Activity> controller = 140 Robolectric.buildActivity(Activity.class).setup()) { 141 MediaRouter applicationMediaRouter = 142 (MediaRouter) 143 ApplicationProvider.getApplicationContext() 144 .getSystemService(Context.MEDIA_ROUTER_SERVICE); 145 146 Activity activity = controller.get(); 147 MediaRouter activityMediaRouter = 148 (MediaRouter) activity.getSystemService(Context.MEDIA_ROUTER_SERVICE); 149 150 assertThat(applicationMediaRouter).isNotSameInstanceAs(activityMediaRouter); 151 152 MediaRouter.RouteInfo applicationDefaultRoute = applicationMediaRouter.getDefaultRoute(); 153 MediaRouter.RouteInfo activityDefaultRoute = activityMediaRouter.getDefaultRoute(); 154 155 assertThat(activityDefaultRoute).isEqualTo(applicationDefaultRoute); 156 } finally { 157 System.setProperty("robolectric.createActivityContexts", originalProperty); 158 } 159 } 160 } 161