Kyunglyul Hyun | d51666d | 2019-04-11 04:08:40 +0000 | [diff] [blame] | 1 | /* |
| 2 | * Copyright 2019 The Android Open Source Project |
| 3 | * |
| 4 | * Licensed under the Apache License, Version 2.0 (the "License"); |
| 5 | * you may not use this file except in compliance with the License. |
| 6 | * You may obtain a copy of the License at |
| 7 | * |
| 8 | * http://www.apache.org/licenses/LICENSE-2.0 |
| 9 | * |
| 10 | * Unless required by applicable law or agreed to in writing, software |
| 11 | * distributed under the License is distributed on an "AS IS" BASIS, |
| 12 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| 13 | * See the License for the specific language governing permissions and |
| 14 | * limitations under the License. |
| 15 | */ |
| 16 | |
| 17 | package com.android.mediaroutertest; |
| 18 | |
Hyundo Moon | 5de706f | 2020-02-03 20:16:33 +0900 | [diff] [blame] | 19 | import static android.media.MediaRoute2Info.FEATURE_LIVE_AUDIO; |
Kyunglyul Hyun | a3be2de | 2020-06-02 17:42:36 +0900 | [diff] [blame] | 20 | import static android.media.MediaRoute2Info.FEATURE_REMOTE_PLAYBACK; |
Kyunglyul Hyun | 9b10a64 | 2019-10-08 15:29:23 +0900 | [diff] [blame] | 21 | import static android.media.MediaRoute2Info.PLAYBACK_VOLUME_FIXED; |
| 22 | import static android.media.MediaRoute2Info.PLAYBACK_VOLUME_VARIABLE; |
Hyundo Moon | 0fa60e8 | 2020-02-14 11:44:45 +0900 | [diff] [blame] | 23 | import static android.media.MediaRoute2ProviderService.REASON_REJECTED; |
| 24 | import static android.media.MediaRoute2ProviderService.REQUEST_ID_NONE; |
Kyunglyul Hyun | 9b10a64 | 2019-10-08 15:29:23 +0900 | [diff] [blame] | 25 | |
Hyundo Moon | 1c888e2 | 2020-03-15 19:46:41 +0900 | [diff] [blame] | 26 | import static com.android.mediaroutertest.StubMediaRoute2ProviderService.FEATURE_SAMPLE; |
| 27 | import static com.android.mediaroutertest.StubMediaRoute2ProviderService.FEATURE_SPECIAL; |
| 28 | import static com.android.mediaroutertest.StubMediaRoute2ProviderService.ROUTE_ID1; |
| 29 | import static com.android.mediaroutertest.StubMediaRoute2ProviderService.ROUTE_ID2; |
Kyunglyul Hyun | 45512bb | 2020-05-08 15:21:13 +0900 | [diff] [blame] | 30 | import static com.android.mediaroutertest.StubMediaRoute2ProviderService.ROUTE_ID4_TO_SELECT_AND_DESELECT; |
Hyundo Moon | 1c888e2 | 2020-03-15 19:46:41 +0900 | [diff] [blame] | 31 | import static com.android.mediaroutertest.StubMediaRoute2ProviderService.ROUTE_ID5_TO_TRANSFER_TO; |
Kyunglyul Hyun | 8df5fb6 | 2020-06-03 16:52:04 +0900 | [diff] [blame] | 32 | import static com.android.mediaroutertest.StubMediaRoute2ProviderService.ROUTE_ID6_TO_BE_IGNORED; |
Hyundo Moon | 1c888e2 | 2020-03-15 19:46:41 +0900 | [diff] [blame] | 33 | import static com.android.mediaroutertest.StubMediaRoute2ProviderService.ROUTE_ID_FIXED_VOLUME; |
| 34 | import static com.android.mediaroutertest.StubMediaRoute2ProviderService.ROUTE_ID_SPECIAL_FEATURE; |
| 35 | import static com.android.mediaroutertest.StubMediaRoute2ProviderService.ROUTE_ID_VARIABLE_VOLUME; |
| 36 | import static com.android.mediaroutertest.StubMediaRoute2ProviderService.ROUTE_NAME2; |
| 37 | import static com.android.mediaroutertest.StubMediaRoute2ProviderService.VOLUME_MAX; |
Hyundo Moon | 5de706f | 2020-02-03 20:16:33 +0900 | [diff] [blame] | 38 | |
Kyunglyul Hyun | a0d4741 | 2019-07-01 11:14:24 +0900 | [diff] [blame] | 39 | import static org.junit.Assert.assertEquals; |
Hyundo Moon | 0fa60e8 | 2020-02-14 11:44:45 +0900 | [diff] [blame] | 40 | import static org.junit.Assert.assertFalse; |
Kyunglyul Hyun | 23b3aaa | 2019-08-06 11:17:16 +0900 | [diff] [blame] | 41 | import static org.junit.Assert.assertNotNull; |
Kyunglyul Hyun | 350d7b4 | 2020-04-17 23:09:08 +0900 | [diff] [blame] | 42 | import static org.junit.Assert.assertNull; |
Kyunglyul Hyun | 7af7301 | 2019-10-11 20:01:30 +0900 | [diff] [blame] | 43 | import static org.junit.Assert.assertTrue; |
Kyunglyul Hyun | d51666d | 2019-04-11 04:08:40 +0000 | [diff] [blame] | 44 | |
| 45 | import android.content.Context; |
Kyunglyul Hyun | 6c5d7dc | 2019-04-24 15:57:07 +0900 | [diff] [blame] | 46 | import android.media.MediaRoute2Info; |
Kyunglyul Hyun | caae8dc | 2019-04-29 15:45:23 +0900 | [diff] [blame] | 47 | import android.media.MediaRouter2; |
Hyundo Moon | 63a0540 | 2019-12-19 20:13:56 +0900 | [diff] [blame] | 48 | import android.media.MediaRouter2.RouteCallback; |
Kyunglyul Hyun | 3729e9f | 2020-02-12 10:50:43 +0900 | [diff] [blame] | 49 | import android.media.MediaRouter2.TransferCallback; |
Kyunglyul Hyun | d51666d | 2019-04-11 04:08:40 +0000 | [diff] [blame] | 50 | import android.media.MediaRouter2Manager; |
Kyunglyul Hyun | 5161b37 | 2020-02-05 18:45:35 +0900 | [diff] [blame] | 51 | import android.media.MediaRouter2Utils; |
Kyunglyul Hyun | 616096e | 2020-01-09 16:15:03 +0900 | [diff] [blame] | 52 | import android.media.RouteDiscoveryPreference; |
Kyunglyul Hyun | c658383 | 2020-01-17 11:11:46 +0000 | [diff] [blame] | 53 | import android.media.RoutingSessionInfo; |
Kyunglyul Hyun | f0eb51b | 2020-04-14 19:56:16 +0900 | [diff] [blame] | 54 | import android.os.Bundle; |
Kyunglyul Hyun | d51666d | 2019-04-11 04:08:40 +0000 | [diff] [blame] | 55 | import android.support.test.InstrumentationRegistry; |
Kyunglyul Hyun | 8df5fb6 | 2020-06-03 16:52:04 +0900 | [diff] [blame] | 56 | import android.support.test.filters.LargeTest; |
Kyunglyul Hyun | d51666d | 2019-04-11 04:08:40 +0000 | [diff] [blame] | 57 | import android.support.test.filters.SmallTest; |
| 58 | import android.support.test.runner.AndroidJUnit4; |
Kyunglyul Hyun | 13bc105 | 2019-05-31 17:00:36 +0900 | [diff] [blame] | 59 | import android.text.TextUtils; |
Kyunglyul Hyun | d51666d | 2019-04-11 04:08:40 +0000 | [diff] [blame] | 60 | |
Kyunglyul Hyun | f7d5e04 | 2019-11-11 13:56:28 +0900 | [diff] [blame] | 61 | import org.junit.After; |
Kyunglyul Hyun | d51666d | 2019-04-11 04:08:40 +0000 | [diff] [blame] | 62 | import org.junit.Before; |
| 63 | import org.junit.Test; |
| 64 | import org.junit.runner.RunWith; |
| 65 | |
| 66 | import java.util.ArrayList; |
Kyunglyul Hyun | a0d4741 | 2019-07-01 11:14:24 +0900 | [diff] [blame] | 67 | import java.util.HashMap; |
Kyunglyul Hyun | d51666d | 2019-04-11 04:08:40 +0000 | [diff] [blame] | 68 | import java.util.List; |
Kyunglyul Hyun | a0d4741 | 2019-07-01 11:14:24 +0900 | [diff] [blame] | 69 | import java.util.Map; |
Kyunglyul Hyun | 5a8dedc | 2019-10-10 14:09:44 +0900 | [diff] [blame] | 70 | import java.util.concurrent.CountDownLatch; |
Kyunglyul Hyun | d51666d | 2019-04-11 04:08:40 +0000 | [diff] [blame] | 71 | import java.util.concurrent.Executor; |
Kyunglyul Hyun | d1f0b6e | 2019-08-06 11:17:16 +0900 | [diff] [blame] | 72 | import java.util.concurrent.Executors; |
Kyunglyul Hyun | 5a8dedc | 2019-10-10 14:09:44 +0900 | [diff] [blame] | 73 | import java.util.concurrent.TimeUnit; |
Kyunglyul Hyun | 4ed6875 | 2019-11-04 16:05:34 +0900 | [diff] [blame] | 74 | import java.util.function.Predicate; |
Kyunglyul Hyun | 45512bb | 2020-05-08 15:21:13 +0900 | [diff] [blame] | 75 | import java.util.stream.Collectors; |
Kyunglyul Hyun | d51666d | 2019-04-11 04:08:40 +0000 | [diff] [blame] | 76 | |
| 77 | @RunWith(AndroidJUnit4.class) |
| 78 | @SmallTest |
Hyundo Moon | e90a28e | 2020-02-14 10:43:51 +0900 | [diff] [blame] | 79 | public class MediaRouter2ManagerTest { |
| 80 | private static final String TAG = "MediaRouter2ManagerTest"; |
Hyundo Moon | 0fa60e8 | 2020-02-14 11:44:45 +0900 | [diff] [blame] | 81 | private static final int WAIT_TIME_MS = 2000; |
Kyunglyul Hyun | 6c5d7dc | 2019-04-24 15:57:07 +0900 | [diff] [blame] | 82 | private static final int TIMEOUT_MS = 5000; |
Kyunglyul Hyun | f0eb51b | 2020-04-14 19:56:16 +0900 | [diff] [blame] | 83 | private static final String TEST_KEY = "test_key"; |
| 84 | private static final String TEST_VALUE = "test_value"; |
Kyunglyul Hyun | a3be2de | 2020-06-02 17:42:36 +0900 | [diff] [blame] | 85 | private static final String TEST_ID_UNKNOWN = "id_unknown"; |
| 86 | private static final String TEST_NAME_UNKNOWN = "unknown"; |
Kyunglyul Hyun | d51666d | 2019-04-11 04:08:40 +0000 | [diff] [blame] | 87 | |
| 88 | private Context mContext; |
| 89 | private MediaRouter2Manager mManager; |
Kyunglyul Hyun | 2f43fd6 | 2019-09-16 18:47:52 +0900 | [diff] [blame] | 90 | private MediaRouter2 mRouter2; |
Kyunglyul Hyun | d51666d | 2019-04-11 04:08:40 +0000 | [diff] [blame] | 91 | private Executor mExecutor; |
Kyunglyul Hyun | a0d4741 | 2019-07-01 11:14:24 +0900 | [diff] [blame] | 92 | private String mPackageName; |
Kyunglyul Hyun | d51666d | 2019-04-11 04:08:40 +0000 | [diff] [blame] | 93 | |
Kyunglyul Hyun | f7d5e04 | 2019-11-11 13:56:28 +0900 | [diff] [blame] | 94 | private final List<MediaRouter2Manager.Callback> mManagerCallbacks = new ArrayList<>(); |
Kyunglyul Hyun | 138246e | 2020-01-02 18:19:52 +0900 | [diff] [blame] | 95 | private final List<RouteCallback> mRouteCallbacks = new ArrayList<>(); |
Kyunglyul Hyun | 3729e9f | 2020-02-12 10:50:43 +0900 | [diff] [blame] | 96 | private final List<MediaRouter2.TransferCallback> mTransferCallbacks = new ArrayList<>(); |
Kyunglyul Hyun | f7d5e04 | 2019-11-11 13:56:28 +0900 | [diff] [blame] | 97 | |
Kyunglyul Hyun | 616096e | 2020-01-09 16:15:03 +0900 | [diff] [blame] | 98 | public static final List<String> FEATURES_ALL = new ArrayList(); |
| 99 | public static final List<String> FEATURES_SPECIAL = new ArrayList(); |
| 100 | private static final List<String> FEATURES_LIVE_AUDIO = new ArrayList<>(); |
Kyunglyul Hyun | f7d5e04 | 2019-11-11 13:56:28 +0900 | [diff] [blame] | 101 | |
Kyunglyul Hyun | d51666d | 2019-04-11 04:08:40 +0000 | [diff] [blame] | 102 | static { |
Kyunglyul Hyun | 616096e | 2020-01-09 16:15:03 +0900 | [diff] [blame] | 103 | FEATURES_ALL.add(FEATURE_SAMPLE); |
| 104 | FEATURES_ALL.add(FEATURE_SPECIAL); |
| 105 | FEATURES_ALL.add(FEATURE_LIVE_AUDIO); |
Kyunglyul Hyun | e23e5ed | 2019-07-15 16:06:26 +0900 | [diff] [blame] | 106 | |
Kyunglyul Hyun | 616096e | 2020-01-09 16:15:03 +0900 | [diff] [blame] | 107 | FEATURES_SPECIAL.add(FEATURE_SPECIAL); |
Kyunglyul Hyun | 0332e9a2 | 2019-11-20 01:39:25 +0000 | [diff] [blame] | 108 | |
Kyunglyul Hyun | 616096e | 2020-01-09 16:15:03 +0900 | [diff] [blame] | 109 | FEATURES_LIVE_AUDIO.add(FEATURE_LIVE_AUDIO); |
Kyunglyul Hyun | d51666d | 2019-04-11 04:08:40 +0000 | [diff] [blame] | 110 | } |
| 111 | |
| 112 | @Before |
| 113 | public void setUp() throws Exception { |
| 114 | mContext = InstrumentationRegistry.getTargetContext(); |
| 115 | mManager = MediaRouter2Manager.getInstance(mContext); |
Kyunglyul Hyun | 2f43fd6 | 2019-09-16 18:47:52 +0900 | [diff] [blame] | 116 | mRouter2 = MediaRouter2.getInstance(mContext); |
Hyundo Moon | 0f78fc6 | 2020-06-01 14:50:32 +0900 | [diff] [blame] | 117 | // If we need to support thread pool executors, change this to thread pool executor. |
Kyunglyul Hyun | d1f0b6e | 2019-08-06 11:17:16 +0900 | [diff] [blame] | 118 | mExecutor = Executors.newSingleThreadExecutor(); |
Kyunglyul Hyun | a0d4741 | 2019-07-01 11:14:24 +0900 | [diff] [blame] | 119 | mPackageName = mContext.getPackageName(); |
Kyunglyul Hyun | f7d5e04 | 2019-11-11 13:56:28 +0900 | [diff] [blame] | 120 | } |
| 121 | |
| 122 | @After |
| 123 | public void tearDown() { |
Kyunglyul Hyun | c658383 | 2020-01-17 11:11:46 +0000 | [diff] [blame] | 124 | // order matters (callbacks should be cleared at the last) |
| 125 | releaseAllSessions(); |
Kyunglyul Hyun | f7d5e04 | 2019-11-11 13:56:28 +0900 | [diff] [blame] | 126 | // unregister callbacks |
| 127 | clearCallbacks(); |
Hyundo Moon | 0fa60e8 | 2020-02-14 11:44:45 +0900 | [diff] [blame] | 128 | |
Hyundo Moon | 1c888e2 | 2020-03-15 19:46:41 +0900 | [diff] [blame] | 129 | StubMediaRoute2ProviderService instance = StubMediaRoute2ProviderService.getInstance(); |
Hyundo Moon | 0fa60e8 | 2020-02-14 11:44:45 +0900 | [diff] [blame] | 130 | if (instance != null) { |
| 131 | instance.setProxy(null); |
| 132 | } |
Kyunglyul Hyun | a0d4741 | 2019-07-01 11:14:24 +0900 | [diff] [blame] | 133 | } |
| 134 | |
Kyunglyul Hyun | d51666d | 2019-04-11 04:08:40 +0000 | [diff] [blame] | 135 | @Test |
Kyunglyul Hyun | c943f21 | 2020-02-14 17:58:23 +0900 | [diff] [blame] | 136 | public void testOnRoutesRemovedAndAdded() throws Exception { |
Hyundo Moon | 899535c | 2020-02-28 17:47:37 +0900 | [diff] [blame] | 137 | RouteCallback routeCallback = new RouteCallback() {}; |
Kyunglyul Hyun | c943f21 | 2020-02-14 17:58:23 +0900 | [diff] [blame] | 138 | mRouteCallbacks.add(routeCallback); |
| 139 | mRouter2.registerRouteCallback(mExecutor, routeCallback, |
| 140 | new RouteDiscoveryPreference.Builder(FEATURES_ALL, true).build()); |
Kyunglyul Hyun | d51666d | 2019-04-11 04:08:40 +0000 | [diff] [blame] | 141 | |
Kyunglyul Hyun | 616096e | 2020-01-09 16:15:03 +0900 | [diff] [blame] | 142 | Map<String, MediaRoute2Info> routes = waitAndGetRoutesWithManager(FEATURES_ALL); |
Kyunglyul Hyun | 484074a | 2019-12-04 20:43:28 +0900 | [diff] [blame] | 143 | |
Kyunglyul Hyun | c943f21 | 2020-02-14 17:58:23 +0900 | [diff] [blame] | 144 | CountDownLatch removedLatch = new CountDownLatch(1); |
| 145 | CountDownLatch addedLatch = new CountDownLatch(1); |
| 146 | |
Kyunglyul Hyun | f7d5e04 | 2019-11-11 13:56:28 +0900 | [diff] [blame] | 147 | addManagerCallback(new MediaRouter2Manager.Callback() { |
Kyunglyul Hyun | 4ed6875 | 2019-11-04 16:05:34 +0900 | [diff] [blame] | 148 | @Override |
| 149 | public void onRoutesRemoved(List<MediaRoute2Info> routes) { |
| 150 | assertTrue(routes.size() > 0); |
| 151 | for (MediaRoute2Info route : routes) { |
Hyundo Moon | 5de706f | 2020-02-03 20:16:33 +0900 | [diff] [blame] | 152 | if (route.getOriginalId().equals(ROUTE_ID2) |
| 153 | && route.getName().equals(ROUTE_NAME2)) { |
Kyunglyul Hyun | c943f21 | 2020-02-14 17:58:23 +0900 | [diff] [blame] | 154 | removedLatch.countDown(); |
| 155 | } |
| 156 | } |
| 157 | } |
| 158 | @Override |
| 159 | public void onRoutesAdded(List<MediaRoute2Info> routes) { |
| 160 | assertTrue(routes.size() > 0); |
| 161 | if (removedLatch.getCount() > 0) { |
| 162 | return; |
| 163 | } |
| 164 | for (MediaRoute2Info route : routes) { |
| 165 | if (route.getOriginalId().equals(ROUTE_ID2) |
| 166 | && route.getName().equals(ROUTE_NAME2)) { |
| 167 | addedLatch.countDown(); |
Kyunglyul Hyun | 4ed6875 | 2019-11-04 16:05:34 +0900 | [diff] [blame] | 168 | } |
| 169 | } |
| 170 | } |
Kyunglyul Hyun | f7d5e04 | 2019-11-11 13:56:28 +0900 | [diff] [blame] | 171 | }); |
Kyunglyul Hyun | caae8dc | 2019-04-29 15:45:23 +0900 | [diff] [blame] | 172 | |
Kyunglyul Hyun | c943f21 | 2020-02-14 17:58:23 +0900 | [diff] [blame] | 173 | MediaRoute2Info routeToRemove = routes.get(ROUTE_ID2); |
Kyunglyul Hyun | 350d7b4 | 2020-04-17 23:09:08 +0900 | [diff] [blame] | 174 | assertNotNull(routeToRemove); |
Kyunglyul Hyun | c943f21 | 2020-02-14 17:58:23 +0900 | [diff] [blame] | 175 | |
Hyundo Moon | 1c888e2 | 2020-03-15 19:46:41 +0900 | [diff] [blame] | 176 | StubMediaRoute2ProviderService sInstance = |
| 177 | StubMediaRoute2ProviderService.getInstance(); |
Kyunglyul Hyun | 3729e9f | 2020-02-12 10:50:43 +0900 | [diff] [blame] | 178 | assertNotNull(sInstance); |
| 179 | sInstance.removeRoute(ROUTE_ID2); |
| 180 | assertTrue(removedLatch.await(TIMEOUT_MS, TimeUnit.MILLISECONDS)); |
Kyunglyul Hyun | c943f21 | 2020-02-14 17:58:23 +0900 | [diff] [blame] | 181 | |
Kyunglyul Hyun | 3729e9f | 2020-02-12 10:50:43 +0900 | [diff] [blame] | 182 | sInstance.addRoute(routeToRemove); |
| 183 | assertTrue(addedLatch.await(TIMEOUT_MS, TimeUnit.MILLISECONDS)); |
Kyunglyul Hyun | 2f43fd6 | 2019-09-16 18:47:52 +0900 | [diff] [blame] | 184 | } |
| 185 | |
Kyunglyul Hyun | 350d7b4 | 2020-04-17 23:09:08 +0900 | [diff] [blame] | 186 | @Test |
| 187 | public void testGetRoutes_removedRoute_returnsCorrectRoutes() throws Exception { |
| 188 | CountDownLatch addedLatch = new CountDownLatch(1); |
| 189 | CountDownLatch removedLatch = new CountDownLatch(1); |
| 190 | |
| 191 | RouteCallback routeCallback = new RouteCallback() { |
| 192 | // Used to ensure the removed route is added. |
| 193 | @Override |
| 194 | public void onRoutesAdded(List<MediaRoute2Info> routes) { |
| 195 | if (removedLatch.getCount() > 0) { |
| 196 | return; |
| 197 | } |
| 198 | addedLatch.countDown(); |
| 199 | } |
| 200 | |
| 201 | @Override |
| 202 | public void onRoutesRemoved(List<MediaRoute2Info> routes) { |
| 203 | removedLatch.countDown(); |
| 204 | } |
| 205 | }; |
| 206 | |
| 207 | mRouter2.registerRouteCallback(mExecutor, routeCallback, |
| 208 | new RouteDiscoveryPreference.Builder(FEATURES_ALL, true).build()); |
| 209 | mRouteCallbacks.add(routeCallback); |
| 210 | |
| 211 | Map<String, MediaRoute2Info> routes = waitAndGetRoutesWithManager(FEATURES_ALL); |
| 212 | MediaRoute2Info routeToRemove = routes.get(ROUTE_ID2); |
| 213 | assertNotNull(routeToRemove); |
| 214 | |
| 215 | StubMediaRoute2ProviderService sInstance = |
| 216 | StubMediaRoute2ProviderService.getInstance(); |
| 217 | assertNotNull(sInstance); |
| 218 | sInstance.removeRoute(ROUTE_ID2); |
| 219 | |
| 220 | // Wait until the route is removed. |
| 221 | assertTrue(removedLatch.await(TIMEOUT_MS, TimeUnit.MILLISECONDS)); |
| 222 | |
| 223 | Map<String, MediaRoute2Info> newRoutes = waitAndGetRoutesWithManager(FEATURES_ALL); |
| 224 | assertNull(newRoutes.get(ROUTE_ID2)); |
| 225 | |
| 226 | // Revert the removal. |
| 227 | sInstance.addRoute(routeToRemove); |
| 228 | assertTrue(addedLatch.await(TIMEOUT_MS, TimeUnit.MILLISECONDS)); |
| 229 | mRouter2.unregisterRouteCallback(routeCallback); |
| 230 | } |
| 231 | |
Kyunglyul Hyun | 2f43fd6 | 2019-09-16 18:47:52 +0900 | [diff] [blame] | 232 | /** |
Kyunglyul Hyun | 616096e | 2020-01-09 16:15:03 +0900 | [diff] [blame] | 233 | * Tests if we get proper routes for application that has special route feature. |
Kyunglyul Hyun | 2f43fd6 | 2019-09-16 18:47:52 +0900 | [diff] [blame] | 234 | */ |
| 235 | @Test |
Kyunglyul Hyun | 616096e | 2020-01-09 16:15:03 +0900 | [diff] [blame] | 236 | public void testRouteFeatures() throws Exception { |
| 237 | Map<String, MediaRoute2Info> routes = waitAndGetRoutesWithManager(FEATURES_SPECIAL); |
Kyunglyul Hyun | d51666d | 2019-04-11 04:08:40 +0000 | [diff] [blame] | 238 | |
Kyunglyul Hyun | 96d36ce | 2020-01-29 19:59:33 +0900 | [diff] [blame] | 239 | int routeCount = 0; |
| 240 | for (MediaRoute2Info route : routes.values()) { |
| 241 | if (!route.isSystemRoute()) { |
| 242 | routeCount++; |
| 243 | } |
| 244 | } |
| 245 | |
| 246 | assertEquals(1, routeCount); |
Kyunglyul Hyun | 616096e | 2020-01-09 16:15:03 +0900 | [diff] [blame] | 247 | assertNotNull(routes.get(ROUTE_ID_SPECIAL_FEATURE)); |
Kyunglyul Hyun | d51666d | 2019-04-11 04:08:40 +0000 | [diff] [blame] | 248 | } |
Kyunglyul Hyun | 13bc105 | 2019-05-31 17:00:36 +0900 | [diff] [blame] | 249 | |
Kyunglyul Hyun | 23b3aaa | 2019-08-06 11:17:16 +0900 | [diff] [blame] | 250 | /** |
Kyunglyul Hyun | 138246e | 2020-01-02 18:19:52 +0900 | [diff] [blame] | 251 | * Tests if MR2.SessionCallback.onSessionCreated is called |
| 252 | * when a route is selected from MR2Manager. |
Kyunglyul Hyun | f7d5e04 | 2019-11-11 13:56:28 +0900 | [diff] [blame] | 253 | */ |
Colin Cross | 0f78216 | 2019-12-18 17:16:36 -0800 | [diff] [blame] | 254 | @Test |
Kyunglyul Hyun | 138246e | 2020-01-02 18:19:52 +0900 | [diff] [blame] | 255 | public void testRouterOnSessionCreated() throws Exception { |
Kyunglyul Hyun | 616096e | 2020-01-09 16:15:03 +0900 | [diff] [blame] | 256 | Map<String, MediaRoute2Info> routes = waitAndGetRoutesWithManager(FEATURES_ALL); |
Kyunglyul Hyun | 484074a | 2019-12-04 20:43:28 +0900 | [diff] [blame] | 257 | |
Kyunglyul Hyun | f7d5e04 | 2019-11-11 13:56:28 +0900 | [diff] [blame] | 258 | CountDownLatch latch = new CountDownLatch(1); |
Kyunglyul Hyun | 13bc105 | 2019-05-31 17:00:36 +0900 | [diff] [blame] | 259 | |
Kyunglyul Hyun | 484074a | 2019-12-04 20:43:28 +0900 | [diff] [blame] | 260 | addManagerCallback(new MediaRouter2Manager.Callback()); |
Hyundo Moon | 899535c | 2020-02-28 17:47:37 +0900 | [diff] [blame] | 261 | addRouterCallback(new MediaRouter2.RouteCallback() {}); |
Kyunglyul Hyun | 3729e9f | 2020-02-12 10:50:43 +0900 | [diff] [blame] | 262 | addTransferCallback(new MediaRouter2.TransferCallback() { |
Kyunglyul Hyun | 138246e | 2020-01-02 18:19:52 +0900 | [diff] [blame] | 263 | @Override |
Kyunglyul Hyun | f4552af | 2020-03-20 23:25:11 +0900 | [diff] [blame] | 264 | public void onTransfer(MediaRouter2.RoutingController oldController, |
Kyunglyul Hyun | 3729e9f | 2020-02-12 10:50:43 +0900 | [diff] [blame] | 265 | MediaRouter2.RoutingController newController) { |
| 266 | if (newController == null) { |
| 267 | return; |
| 268 | } |
| 269 | if (createRouteMap(newController.getSelectedRoutes()).containsKey(ROUTE_ID1)) { |
Kyunglyul Hyun | 138246e | 2020-01-02 18:19:52 +0900 | [diff] [blame] | 270 | latch.countDown(); |
| 271 | } |
| 272 | } |
| 273 | }); |
Kyunglyul Hyun | 13bc105 | 2019-05-31 17:00:36 +0900 | [diff] [blame] | 274 | |
Kyunglyul Hyun | 484074a | 2019-12-04 20:43:28 +0900 | [diff] [blame] | 275 | MediaRoute2Info routeToSelect = routes.get(ROUTE_ID1); |
Kyunglyul Hyun | 23b3aaa | 2019-08-06 11:17:16 +0900 | [diff] [blame] | 276 | assertNotNull(routeToSelect); |
Kyunglyul Hyun | 5a8dedc | 2019-10-10 14:09:44 +0900 | [diff] [blame] | 277 | |
Kyunglyul Hyun | c658383 | 2020-01-17 11:11:46 +0000 | [diff] [blame] | 278 | mManager.selectRoute(mPackageName, routeToSelect); |
| 279 | assertTrue(latch.await(TIMEOUT_MS, TimeUnit.MILLISECONDS)); |
Hyundo Moon | 67c41fd | 2020-01-17 14:22:42 +0900 | [diff] [blame] | 280 | assertEquals(2, mManager.getActiveSessions().size()); |
Kyunglyul Hyun | 13bc105 | 2019-05-31 17:00:36 +0900 | [diff] [blame] | 281 | } |
Kyunglyul Hyun | a0d4741 | 2019-07-01 11:14:24 +0900 | [diff] [blame] | 282 | |
Colin Cross | 0f78216 | 2019-12-18 17:16:36 -0800 | [diff] [blame] | 283 | @Test |
Kyunglyul Hyun | fe7b5b1 | 2020-06-04 20:17:59 +0900 | [diff] [blame] | 284 | public void testGetRoutingSessions() throws Exception { |
Kyunglyul Hyun | 86998f4 | 2019-12-12 17:50:48 +0900 | [diff] [blame] | 285 | CountDownLatch latch = new CountDownLatch(1); |
Kyunglyul Hyun | 86998f4 | 2019-12-12 17:50:48 +0900 | [diff] [blame] | 286 | |
Kyunglyul Hyun | 616096e | 2020-01-09 16:15:03 +0900 | [diff] [blame] | 287 | Map<String, MediaRoute2Info> routes = waitAndGetRoutesWithManager(FEATURES_ALL); |
Kyunglyul Hyun | fe7b5b1 | 2020-06-04 20:17:59 +0900 | [diff] [blame] | 288 | MediaRoute2Info routeToSelect = routes.get(ROUTE_ID1); |
| 289 | |
Hyundo Moon | 899535c | 2020-02-28 17:47:37 +0900 | [diff] [blame] | 290 | addRouterCallback(new RouteCallback() {}); |
Kyunglyul Hyun | 86998f4 | 2019-12-12 17:50:48 +0900 | [diff] [blame] | 291 | addManagerCallback(new MediaRouter2Manager.Callback() { |
| 292 | @Override |
Kyunglyul Hyun | f064dcae | 2020-03-06 22:59:14 +0900 | [diff] [blame] | 293 | public void onTransferred(RoutingSessionInfo oldSessionInfo, |
| 294 | RoutingSessionInfo newSessionInfo) { |
| 295 | if (TextUtils.equals(mPackageName, newSessionInfo.getClientPackageName()) |
Kyunglyul Hyun | fe7b5b1 | 2020-06-04 20:17:59 +0900 | [diff] [blame] | 296 | && newSessionInfo.getSelectedRoutes().contains(routeToSelect.getId())) { |
Kyunglyul Hyun | 86998f4 | 2019-12-12 17:50:48 +0900 | [diff] [blame] | 297 | latch.countDown(); |
| 298 | } |
| 299 | } |
| 300 | }); |
| 301 | |
Kyunglyul Hyun | 5161b37 | 2020-02-05 18:45:35 +0900 | [diff] [blame] | 302 | assertEquals(1, mManager.getRoutingSessions(mPackageName).size()); |
Kyunglyul Hyun | 86998f4 | 2019-12-12 17:50:48 +0900 | [diff] [blame] | 303 | |
Kyunglyul Hyun | fe7b5b1 | 2020-06-04 20:17:59 +0900 | [diff] [blame] | 304 | mManager.selectRoute(mPackageName, routeToSelect); |
| 305 | assertTrue(latch.await(TIMEOUT_MS, TimeUnit.MILLISECONDS)); |
Kyunglyul Hyun | 86998f4 | 2019-12-12 17:50:48 +0900 | [diff] [blame] | 306 | |
Kyunglyul Hyun | 5161b37 | 2020-02-05 18:45:35 +0900 | [diff] [blame] | 307 | List<RoutingSessionInfo> sessions = mManager.getRoutingSessions(mPackageName); |
Kyunglyul Hyun | 5161b37 | 2020-02-05 18:45:35 +0900 | [diff] [blame] | 308 | assertEquals(2, sessions.size()); |
Kyunglyul Hyun | c658383 | 2020-01-17 11:11:46 +0000 | [diff] [blame] | 309 | |
Kyunglyul Hyun | a3365d7 | 2020-02-20 13:46:45 +0900 | [diff] [blame] | 310 | RoutingSessionInfo sessionInfo = sessions.get(1); |
Kyunglyul Hyun | 86998f4 | 2019-12-12 17:50:48 +0900 | [diff] [blame] | 311 | awaitOnRouteChangedManager( |
Kyunglyul Hyun | a3365d7 | 2020-02-20 13:46:45 +0900 | [diff] [blame] | 312 | () -> mManager.releaseSession(sessionInfo), |
Kyunglyul Hyun | 86998f4 | 2019-12-12 17:50:48 +0900 | [diff] [blame] | 313 | ROUTE_ID1, |
| 314 | route -> TextUtils.equals(route.getClientPackageName(), null)); |
Kyunglyul Hyun | 5161b37 | 2020-02-05 18:45:35 +0900 | [diff] [blame] | 315 | assertEquals(1, mManager.getRoutingSessions(mPackageName).size()); |
Kyunglyul Hyun | 86998f4 | 2019-12-12 17:50:48 +0900 | [diff] [blame] | 316 | } |
| 317 | |
Kyunglyul Hyun | a3be2de | 2020-06-02 17:42:36 +0900 | [diff] [blame] | 318 | @Test |
| 319 | public void testTransfer_unknownRoute_fail() throws Exception { |
| 320 | addRouterCallback(new RouteCallback() {}); |
| 321 | |
| 322 | CountDownLatch onSessionCreatedLatch = new CountDownLatch(1); |
| 323 | CountDownLatch onTransferFailedLatch = new CountDownLatch(1); |
| 324 | |
| 325 | addManagerCallback(new MediaRouter2Manager.Callback() { |
| 326 | @Override |
| 327 | public void onTransferred(RoutingSessionInfo oldSessionInfo, |
| 328 | RoutingSessionInfo newSessionInfo) { |
| 329 | assertNotNull(newSessionInfo); |
| 330 | onSessionCreatedLatch.countDown(); |
| 331 | } |
| 332 | @Override |
| 333 | public void onTransferFailed(RoutingSessionInfo session, MediaRoute2Info route) { |
| 334 | onTransferFailedLatch.countDown(); |
| 335 | } |
| 336 | }); |
| 337 | |
| 338 | MediaRoute2Info unknownRoute = |
| 339 | new MediaRoute2Info.Builder(TEST_ID_UNKNOWN, TEST_NAME_UNKNOWN) |
| 340 | .addFeature(FEATURE_REMOTE_PLAYBACK) |
| 341 | .build(); |
| 342 | |
| 343 | mManager.transfer(mManager.getSystemRoutingSession(), unknownRoute); |
| 344 | assertFalse(onSessionCreatedLatch.await(WAIT_TIME_MS, TimeUnit.MILLISECONDS)); |
| 345 | assertTrue(onTransferFailedLatch.await(TIMEOUT_MS, TimeUnit.MILLISECONDS)); |
| 346 | } |
| 347 | |
Kyunglyul Hyun | fe7b5b1 | 2020-06-04 20:17:59 +0900 | [diff] [blame] | 348 | @Test |
| 349 | public void testRouterRelease_managerGetRoutingSessions() throws Exception { |
| 350 | CountDownLatch transferLatch = new CountDownLatch(1); |
| 351 | CountDownLatch releaseLatch = new CountDownLatch(1); |
| 352 | |
| 353 | Map<String, MediaRoute2Info> routes = waitAndGetRoutesWithManager(FEATURES_ALL); |
| 354 | MediaRoute2Info routeToSelect = routes.get(ROUTE_ID1); |
| 355 | assertNotNull(routeToSelect); |
| 356 | |
| 357 | addRouterCallback(new RouteCallback() {}); |
| 358 | addManagerCallback(new MediaRouter2Manager.Callback() { |
| 359 | @Override |
| 360 | public void onTransferred(RoutingSessionInfo oldSessionInfo, |
| 361 | RoutingSessionInfo newSessionInfo) { |
| 362 | if (TextUtils.equals(mPackageName, newSessionInfo.getClientPackageName()) |
| 363 | && newSessionInfo.getSelectedRoutes().contains(routeToSelect.getId())) { |
| 364 | transferLatch.countDown(); |
| 365 | } |
| 366 | } |
| 367 | @Override |
| 368 | public void onSessionReleased(RoutingSessionInfo session) { |
| 369 | releaseLatch.countDown(); |
| 370 | } |
| 371 | }); |
| 372 | |
| 373 | assertEquals(1, mManager.getRoutingSessions(mPackageName).size()); |
| 374 | assertEquals(1, mRouter2.getControllers().size()); |
| 375 | |
| 376 | mManager.transfer(mManager.getRoutingSessions(mPackageName).get(0), routeToSelect); |
| 377 | assertTrue(transferLatch.await(TIMEOUT_MS, TimeUnit.MILLISECONDS)); |
| 378 | |
| 379 | assertEquals(2, mManager.getRoutingSessions(mPackageName).size()); |
| 380 | assertEquals(2, mRouter2.getControllers().size()); |
| 381 | mRouter2.getControllers().get(1).release(); |
| 382 | |
| 383 | assertTrue(releaseLatch.await(TIMEOUT_MS, TimeUnit.MILLISECONDS)); |
| 384 | |
| 385 | assertEquals(1, mRouter2.getControllers().size()); |
| 386 | assertEquals(1, mManager.getRoutingSessions(mPackageName).size()); |
| 387 | } |
| 388 | |
Kyunglyul Hyun | a0d4741 | 2019-07-01 11:14:24 +0900 | [diff] [blame] | 389 | /** |
Kyunglyul Hyun | c658383 | 2020-01-17 11:11:46 +0000 | [diff] [blame] | 390 | * Tests select, transfer, release of routes of a provider |
Kyunglyul Hyun | a0d4741 | 2019-07-01 11:14:24 +0900 | [diff] [blame] | 391 | */ |
Colin Cross | 0f78216 | 2019-12-18 17:16:36 -0800 | [diff] [blame] | 392 | @Test |
Kyunglyul Hyun | c658383 | 2020-01-17 11:11:46 +0000 | [diff] [blame] | 393 | public void testSelectAndTransferAndRelease() throws Exception { |
Kyunglyul Hyun | 616096e | 2020-01-09 16:15:03 +0900 | [diff] [blame] | 394 | Map<String, MediaRoute2Info> routes = waitAndGetRoutesWithManager(FEATURES_ALL); |
Hyundo Moon | 899535c | 2020-02-28 17:47:37 +0900 | [diff] [blame] | 395 | addRouterCallback(new RouteCallback() {}); |
Kyunglyul Hyun | 484074a | 2019-12-04 20:43:28 +0900 | [diff] [blame] | 396 | |
Kyunglyul Hyun | c658383 | 2020-01-17 11:11:46 +0000 | [diff] [blame] | 397 | CountDownLatch onSessionCreatedLatch = new CountDownLatch(1); |
| 398 | |
| 399 | addManagerCallback(new MediaRouter2Manager.Callback() { |
| 400 | @Override |
Kyunglyul Hyun | f064dcae | 2020-03-06 22:59:14 +0900 | [diff] [blame] | 401 | public void onTransferred(RoutingSessionInfo oldSessionInfo, |
| 402 | RoutingSessionInfo newSessionInfo) { |
| 403 | assertNotNull(newSessionInfo); |
Kyunglyul Hyun | c658383 | 2020-01-17 11:11:46 +0000 | [diff] [blame] | 404 | onSessionCreatedLatch.countDown(); |
| 405 | } |
| 406 | }); |
Kyunglyul Hyun | 4ed6875 | 2019-11-04 16:05:34 +0900 | [diff] [blame] | 407 | awaitOnRouteChangedManager( |
Kyunglyul Hyun | 484074a | 2019-12-04 20:43:28 +0900 | [diff] [blame] | 408 | () -> mManager.selectRoute(mPackageName, routes.get(ROUTE_ID1)), |
Kyunglyul Hyun | 4ed6875 | 2019-11-04 16:05:34 +0900 | [diff] [blame] | 409 | ROUTE_ID1, |
| 410 | route -> TextUtils.equals(route.getClientPackageName(), mPackageName)); |
Kyunglyul Hyun | c658383 | 2020-01-17 11:11:46 +0000 | [diff] [blame] | 411 | assertTrue(onSessionCreatedLatch.await(TIMEOUT_MS, TimeUnit.MILLISECONDS)); |
| 412 | |
Kyunglyul Hyun | 5161b37 | 2020-02-05 18:45:35 +0900 | [diff] [blame] | 413 | List<RoutingSessionInfo> sessions = mManager.getRoutingSessions(mPackageName); |
Kyunglyul Hyun | c658383 | 2020-01-17 11:11:46 +0000 | [diff] [blame] | 414 | |
Kyunglyul Hyun | 5161b37 | 2020-02-05 18:45:35 +0900 | [diff] [blame] | 415 | assertEquals(2, sessions.size()); |
Kyunglyul Hyun | a3365d7 | 2020-02-20 13:46:45 +0900 | [diff] [blame] | 416 | RoutingSessionInfo sessionInfo = sessions.get(1); |
Kyunglyul Hyun | a0d4741 | 2019-07-01 11:14:24 +0900 | [diff] [blame] | 417 | |
Kyunglyul Hyun | 4ed6875 | 2019-11-04 16:05:34 +0900 | [diff] [blame] | 418 | awaitOnRouteChangedManager( |
Kyunglyul Hyun | c658383 | 2020-01-17 11:11:46 +0000 | [diff] [blame] | 419 | () -> mManager.selectRoute(mPackageName, routes.get(ROUTE_ID5_TO_TRANSFER_TO)), |
| 420 | ROUTE_ID5_TO_TRANSFER_TO, |
Kyunglyul Hyun | 4ed6875 | 2019-11-04 16:05:34 +0900 | [diff] [blame] | 421 | route -> TextUtils.equals(route.getClientPackageName(), mPackageName)); |
Kyunglyul Hyun | a0d4741 | 2019-07-01 11:14:24 +0900 | [diff] [blame] | 422 | |
Kyunglyul Hyun | 4ed6875 | 2019-11-04 16:05:34 +0900 | [diff] [blame] | 423 | awaitOnRouteChangedManager( |
Kyunglyul Hyun | a3365d7 | 2020-02-20 13:46:45 +0900 | [diff] [blame] | 424 | () -> mManager.releaseSession(sessionInfo), |
Kyunglyul Hyun | c658383 | 2020-01-17 11:11:46 +0000 | [diff] [blame] | 425 | ROUTE_ID5_TO_TRANSFER_TO, |
Kyunglyul Hyun | 4ed6875 | 2019-11-04 16:05:34 +0900 | [diff] [blame] | 426 | route -> TextUtils.equals(route.getClientPackageName(), null)); |
Kyunglyul Hyun | a0d4741 | 2019-07-01 11:14:24 +0900 | [diff] [blame] | 427 | } |
| 428 | |
Kyunglyul Hyun | 9b10a64 | 2019-10-08 15:29:23 +0900 | [diff] [blame] | 429 | @Test |
Kyunglyul Hyun | 8df5fb6 | 2020-06-03 16:52:04 +0900 | [diff] [blame] | 430 | @LargeTest |
| 431 | public void testTransfer_ignored_fails() throws Exception { |
| 432 | Map<String, MediaRoute2Info> routes = waitAndGetRoutesWithManager(FEATURES_ALL); |
| 433 | addRouterCallback(new RouteCallback() {}); |
| 434 | |
| 435 | CountDownLatch onSessionCreatedLatch = new CountDownLatch(1); |
| 436 | CountDownLatch onFailedLatch = new CountDownLatch(1); |
| 437 | |
| 438 | addManagerCallback(new MediaRouter2Manager.Callback() { |
| 439 | @Override |
| 440 | public void onTransferred(RoutingSessionInfo oldSessionInfo, |
| 441 | RoutingSessionInfo newSessionInfo) { |
| 442 | onSessionCreatedLatch.countDown(); |
| 443 | } |
| 444 | @Override |
| 445 | public void onTransferFailed(RoutingSessionInfo session, MediaRoute2Info route) { |
| 446 | onFailedLatch.countDown(); |
| 447 | } |
| 448 | }); |
| 449 | |
| 450 | List<RoutingSessionInfo> sessions = mManager.getRoutingSessions(mPackageName); |
| 451 | RoutingSessionInfo targetSession = sessions.get(sessions.size() - 1); |
| 452 | mManager.transfer(targetSession, routes.get(ROUTE_ID6_TO_BE_IGNORED)); |
| 453 | |
| 454 | assertFalse(onSessionCreatedLatch.await(WAIT_TIME_MS, TimeUnit.MILLISECONDS)); |
| 455 | assertTrue(onFailedLatch.await(MediaRouter2Manager.TRANSFER_TIMEOUT_MS, |
| 456 | TimeUnit.MILLISECONDS)); |
| 457 | } |
| 458 | @Test |
Kyunglyul Hyun | 5161b37 | 2020-02-05 18:45:35 +0900 | [diff] [blame] | 459 | public void testSetSystemRouteVolume() throws Exception { |
| 460 | // ensure client |
| 461 | addManagerCallback(new MediaRouter2Manager.Callback()); |
| 462 | String selectedSystemRouteId = |
| 463 | MediaRouter2Utils.getOriginalId( |
| 464 | mManager.getActiveSessions().get(0).getSelectedRoutes().get(0)); |
Kyunglyul Hyun | f55befb | 2020-02-20 19:57:43 +0900 | [diff] [blame] | 465 | Map<String, MediaRoute2Info> routes = waitAndGetRoutesWithManager(FEATURES_ALL); |
Kyunglyul Hyun | 5161b37 | 2020-02-05 18:45:35 +0900 | [diff] [blame] | 466 | MediaRoute2Info volRoute = routes.get(selectedSystemRouteId); |
| 467 | assertNotNull(volRoute); |
| 468 | |
| 469 | int originalVolume = volRoute.getVolume(); |
| 470 | int targetVolume = originalVolume == volRoute.getVolumeMax() |
| 471 | ? originalVolume - 1 : originalVolume + 1; |
| 472 | |
| 473 | awaitOnRouteChangedManager( |
| 474 | () -> mManager.setRouteVolume(volRoute, targetVolume), |
| 475 | selectedSystemRouteId, |
| 476 | (route -> route.getVolume() == targetVolume)); |
| 477 | |
| 478 | awaitOnRouteChangedManager( |
| 479 | () -> mManager.setRouteVolume(volRoute, originalVolume), |
| 480 | selectedSystemRouteId, |
| 481 | (route -> route.getVolume() == originalVolume)); |
| 482 | } |
| 483 | |
| 484 | @Test |
| 485 | public void testSetRouteVolume() throws Exception { |
Kyunglyul Hyun | 616096e | 2020-01-09 16:15:03 +0900 | [diff] [blame] | 486 | Map<String, MediaRoute2Info> routes = waitAndGetRoutesWithManager(FEATURES_ALL); |
Kyunglyul Hyun | 484074a | 2019-12-04 20:43:28 +0900 | [diff] [blame] | 487 | MediaRoute2Info volRoute = routes.get(ROUTE_ID_VARIABLE_VOLUME); |
| 488 | |
Kyunglyul Hyun | 5a8dedc | 2019-10-10 14:09:44 +0900 | [diff] [blame] | 489 | int originalVolume = volRoute.getVolume(); |
Hyundo Moon | 891c94f | 2020-02-04 10:29:50 +0900 | [diff] [blame] | 490 | int targetVolume = originalVolume == volRoute.getVolumeMax() |
| 491 | ? originalVolume - 1 : originalVolume + 1; |
Kyunglyul Hyun | 5a8dedc | 2019-10-10 14:09:44 +0900 | [diff] [blame] | 492 | |
Kyunglyul Hyun | 4ed6875 | 2019-11-04 16:05:34 +0900 | [diff] [blame] | 493 | awaitOnRouteChangedManager( |
Kyunglyul Hyun | 5161b37 | 2020-02-05 18:45:35 +0900 | [diff] [blame] | 494 | () -> mManager.setRouteVolume(volRoute, targetVolume), |
Kyunglyul Hyun | 4ed6875 | 2019-11-04 16:05:34 +0900 | [diff] [blame] | 495 | ROUTE_ID_VARIABLE_VOLUME, |
Hyundo Moon | 891c94f | 2020-02-04 10:29:50 +0900 | [diff] [blame] | 496 | (route -> route.getVolume() == targetVolume)); |
Kyunglyul Hyun | 5a8dedc | 2019-10-10 14:09:44 +0900 | [diff] [blame] | 497 | |
Kyunglyul Hyun | 4ed6875 | 2019-11-04 16:05:34 +0900 | [diff] [blame] | 498 | awaitOnRouteChangedManager( |
Kyunglyul Hyun | 5161b37 | 2020-02-05 18:45:35 +0900 | [diff] [blame] | 499 | () -> mManager.setRouteVolume(volRoute, originalVolume), |
Kyunglyul Hyun | 4ed6875 | 2019-11-04 16:05:34 +0900 | [diff] [blame] | 500 | ROUTE_ID_VARIABLE_VOLUME, |
| 501 | (route -> route.getVolume() == originalVolume)); |
Kyunglyul Hyun | 5a8dedc | 2019-10-10 14:09:44 +0900 | [diff] [blame] | 502 | } |
| 503 | |
| 504 | @Test |
Kyunglyul Hyun | 5161b37 | 2020-02-05 18:45:35 +0900 | [diff] [blame] | 505 | public void testSetSessionVolume() throws Exception { |
| 506 | Map<String, MediaRoute2Info> routes = waitAndGetRoutesWithManager(FEATURES_ALL); |
Hyundo Moon | 899535c | 2020-02-28 17:47:37 +0900 | [diff] [blame] | 507 | addRouterCallback(new RouteCallback() {}); |
Kyunglyul Hyun | 5161b37 | 2020-02-05 18:45:35 +0900 | [diff] [blame] | 508 | |
| 509 | CountDownLatch onSessionCreatedLatch = new CountDownLatch(1); |
| 510 | CountDownLatch volumeChangedLatch = new CountDownLatch(2); |
| 511 | |
| 512 | // create a controller |
| 513 | addManagerCallback(new MediaRouter2Manager.Callback() { |
| 514 | @Override |
Kyunglyul Hyun | f064dcae | 2020-03-06 22:59:14 +0900 | [diff] [blame] | 515 | public void onTransferred(RoutingSessionInfo oldSessionInfo, |
| 516 | RoutingSessionInfo newSessionInfo) { |
| 517 | assertNotNull(newSessionInfo); |
Kyunglyul Hyun | 5161b37 | 2020-02-05 18:45:35 +0900 | [diff] [blame] | 518 | onSessionCreatedLatch.countDown(); |
| 519 | } |
| 520 | }); |
| 521 | |
| 522 | mManager.selectRoute(mPackageName, routes.get(ROUTE_ID1)); |
| 523 | assertTrue(onSessionCreatedLatch.await(TIMEOUT_MS, TimeUnit.MILLISECONDS)); |
| 524 | |
| 525 | List<RoutingSessionInfo> sessions = mManager.getRoutingSessions(mPackageName); |
| 526 | assertEquals(2, sessions.size()); |
| 527 | |
| 528 | // test setSessionVolume |
| 529 | RoutingSessionInfo sessionInfo = sessions.get(1); |
| 530 | int currentVolume = sessionInfo.getVolume(); |
| 531 | int targetVolume = (currentVolume == 0) ? 1 : (currentVolume - 1); |
| 532 | |
Kyunglyul Hyun | 3729e9f | 2020-02-12 10:50:43 +0900 | [diff] [blame] | 533 | MediaRouter2.ControllerCallback controllerCallback = new MediaRouter2.ControllerCallback() { |
Kyunglyul Hyun | 5161b37 | 2020-02-05 18:45:35 +0900 | [diff] [blame] | 534 | @Override |
| 535 | public void onControllerUpdated(MediaRouter2.RoutingController controller) { |
| 536 | if (!TextUtils.equals(sessionInfo.getId(), controller.getId())) { |
| 537 | return; |
| 538 | } |
| 539 | if (controller.getVolume() == targetVolume) { |
| 540 | volumeChangedLatch.countDown(); |
| 541 | } |
| 542 | } |
| 543 | }; |
Kyunglyul Hyun | 5161b37 | 2020-02-05 18:45:35 +0900 | [diff] [blame] | 544 | |
| 545 | addManagerCallback(new MediaRouter2Manager.Callback() { |
| 546 | @Override |
Kyunglyul Hyun | f064dcae | 2020-03-06 22:59:14 +0900 | [diff] [blame] | 547 | public void onSessionUpdated(RoutingSessionInfo updatedSessionInfo) { |
| 548 | if (!TextUtils.equals(sessionInfo.getId(), updatedSessionInfo.getId())) { |
Kyunglyul Hyun | 5161b37 | 2020-02-05 18:45:35 +0900 | [diff] [blame] | 549 | return; |
| 550 | } |
| 551 | |
Kyunglyul Hyun | f064dcae | 2020-03-06 22:59:14 +0900 | [diff] [blame] | 552 | if (updatedSessionInfo.getVolume() == targetVolume) { |
Kyunglyul Hyun | 5161b37 | 2020-02-05 18:45:35 +0900 | [diff] [blame] | 553 | volumeChangedLatch.countDown(); |
| 554 | } |
| 555 | } |
| 556 | }); |
| 557 | |
Kyunglyul Hyun | 5161b37 | 2020-02-05 18:45:35 +0900 | [diff] [blame] | 558 | try { |
Kyunglyul Hyun | 3729e9f | 2020-02-12 10:50:43 +0900 | [diff] [blame] | 559 | mRouter2.registerControllerCallback(mExecutor, controllerCallback); |
| 560 | mManager.setSessionVolume(sessionInfo, targetVolume); |
Kyunglyul Hyun | 5161b37 | 2020-02-05 18:45:35 +0900 | [diff] [blame] | 561 | assertTrue(volumeChangedLatch.await(TIMEOUT_MS, TimeUnit.MILLISECONDS)); |
| 562 | } finally { |
Kyunglyul Hyun | 3729e9f | 2020-02-12 10:50:43 +0900 | [diff] [blame] | 563 | mRouter2.unregisterControllerCallback(controllerCallback); |
Kyunglyul Hyun | 5161b37 | 2020-02-05 18:45:35 +0900 | [diff] [blame] | 564 | } |
| 565 | } |
| 566 | |
Hyundo Moon | 0fa60e8 | 2020-02-14 11:44:45 +0900 | [diff] [blame] | 567 | /** |
| 568 | * Tests that {@link android.media.MediaRoute2ProviderService#notifyRequestFailed(long, int)} |
| 569 | * should invoke the callback only when the right requestId is used. |
| 570 | */ |
| 571 | @Test |
| 572 | public void testOnRequestFailedCalledForProperRequestId() throws Exception { |
| 573 | Map<String, MediaRoute2Info> routes = waitAndGetRoutesWithManager(FEATURES_ALL); |
| 574 | MediaRoute2Info volRoute = routes.get(ROUTE_ID_VARIABLE_VOLUME); |
| 575 | |
Hyundo Moon | 1c888e2 | 2020-03-15 19:46:41 +0900 | [diff] [blame] | 576 | StubMediaRoute2ProviderService instance = StubMediaRoute2ProviderService.getInstance(); |
Hyundo Moon | 0fa60e8 | 2020-02-14 11:44:45 +0900 | [diff] [blame] | 577 | assertNotNull(instance); |
| 578 | |
| 579 | final List<Long> requestIds = new ArrayList<>(); |
| 580 | final CountDownLatch onSetRouteVolumeLatch = new CountDownLatch(1); |
Hyundo Moon | 1c888e2 | 2020-03-15 19:46:41 +0900 | [diff] [blame] | 581 | instance.setProxy(new StubMediaRoute2ProviderService.Proxy() { |
Hyundo Moon | 0fa60e8 | 2020-02-14 11:44:45 +0900 | [diff] [blame] | 582 | @Override |
| 583 | public void onSetRouteVolume(String routeId, int volume, long requestId) { |
| 584 | requestIds.add(requestId); |
| 585 | onSetRouteVolumeLatch.countDown(); |
| 586 | } |
| 587 | }); |
| 588 | |
| 589 | addManagerCallback(new MediaRouter2Manager.Callback() {}); |
| 590 | mManager.setRouteVolume(volRoute, 0); |
| 591 | assertTrue(onSetRouteVolumeLatch.await(TIMEOUT_MS, TimeUnit.MILLISECONDS)); |
| 592 | assertFalse(requestIds.isEmpty()); |
| 593 | |
| 594 | final int failureReason = REASON_REJECTED; |
| 595 | final CountDownLatch onRequestFailedLatch = new CountDownLatch(1); |
Hyundo Moon | 9b5e392 | 2020-06-09 16:34:20 +0900 | [diff] [blame] | 596 | final CountDownLatch onRequestFailedSecondCallLatch = new CountDownLatch(1); |
Hyundo Moon | 0fa60e8 | 2020-02-14 11:44:45 +0900 | [diff] [blame] | 597 | addManagerCallback(new MediaRouter2Manager.Callback() { |
| 598 | @Override |
| 599 | public void onRequestFailed(int reason) { |
| 600 | if (reason == failureReason) { |
Hyundo Moon | 9b5e392 | 2020-06-09 16:34:20 +0900 | [diff] [blame] | 601 | if (onRequestFailedLatch.getCount() > 0) { |
| 602 | onRequestFailedLatch.countDown(); |
| 603 | } else { |
| 604 | onRequestFailedSecondCallLatch.countDown(); |
| 605 | } |
Hyundo Moon | 0fa60e8 | 2020-02-14 11:44:45 +0900 | [diff] [blame] | 606 | } |
| 607 | } |
| 608 | }); |
| 609 | |
| 610 | final long invalidRequestId = REQUEST_ID_NONE; |
| 611 | instance.notifyRequestFailed(invalidRequestId, failureReason); |
| 612 | assertFalse(onRequestFailedLatch.await(WAIT_TIME_MS, TimeUnit.MILLISECONDS)); |
| 613 | |
| 614 | final long validRequestId = requestIds.get(0); |
| 615 | instance.notifyRequestFailed(validRequestId, failureReason); |
| 616 | assertTrue(onRequestFailedLatch.await(TIMEOUT_MS, TimeUnit.MILLISECONDS)); |
Hyundo Moon | 9b5e392 | 2020-06-09 16:34:20 +0900 | [diff] [blame] | 617 | |
| 618 | // Test calling notifyRequestFailed() multiple times with the same valid requestId. |
| 619 | // onRequestFailed() shouldn't be called since the requestId has been already handled. |
| 620 | instance.notifyRequestFailed(validRequestId, failureReason); |
| 621 | assertFalse(onRequestFailedSecondCallLatch.await(TIMEOUT_MS, TimeUnit.MILLISECONDS)); |
Hyundo Moon | 0fa60e8 | 2020-02-14 11:44:45 +0900 | [diff] [blame] | 622 | } |
| 623 | |
Kyunglyul Hyun | 5161b37 | 2020-02-05 18:45:35 +0900 | [diff] [blame] | 624 | @Test |
Kyunglyul Hyun | 5a8dedc | 2019-10-10 14:09:44 +0900 | [diff] [blame] | 625 | public void testVolumeHandling() throws Exception { |
Kyunglyul Hyun | 616096e | 2020-01-09 16:15:03 +0900 | [diff] [blame] | 626 | Map<String, MediaRoute2Info> routes = waitAndGetRoutesWithManager(FEATURES_ALL); |
Kyunglyul Hyun | 484074a | 2019-12-04 20:43:28 +0900 | [diff] [blame] | 627 | |
| 628 | MediaRoute2Info fixedVolumeRoute = routes.get(ROUTE_ID_FIXED_VOLUME); |
| 629 | MediaRoute2Info variableVolumeRoute = routes.get(ROUTE_ID_VARIABLE_VOLUME); |
Kyunglyul Hyun | 9b10a64 | 2019-10-08 15:29:23 +0900 | [diff] [blame] | 630 | |
| 631 | assertEquals(PLAYBACK_VOLUME_FIXED, fixedVolumeRoute.getVolumeHandling()); |
| 632 | assertEquals(PLAYBACK_VOLUME_VARIABLE, variableVolumeRoute.getVolumeHandling()); |
| 633 | assertEquals(VOLUME_MAX, variableVolumeRoute.getVolumeMax()); |
Kyunglyul Hyun | 9b10a64 | 2019-10-08 15:29:23 +0900 | [diff] [blame] | 634 | } |
| 635 | |
Kyunglyul Hyun | f0eb51b | 2020-04-14 19:56:16 +0900 | [diff] [blame] | 636 | @Test |
| 637 | public void testRouter2SetOnGetControllerHintsListener() throws Exception { |
| 638 | Map<String, MediaRoute2Info> routes = waitAndGetRoutesWithManager(FEATURES_ALL); |
| 639 | addRouterCallback(new RouteCallback() {}); |
| 640 | |
| 641 | MediaRoute2Info route = routes.get(ROUTE_ID1); |
| 642 | assertNotNull(route); |
| 643 | |
| 644 | final Bundle controllerHints = new Bundle(); |
| 645 | controllerHints.putString(TEST_KEY, TEST_VALUE); |
| 646 | final CountDownLatch hintLatch = new CountDownLatch(1); |
| 647 | final MediaRouter2.OnGetControllerHintsListener listener = |
| 648 | route1 -> { |
| 649 | hintLatch.countDown(); |
| 650 | return controllerHints; |
| 651 | }; |
| 652 | |
| 653 | final CountDownLatch successLatch = new CountDownLatch(1); |
| 654 | final CountDownLatch failureLatch = new CountDownLatch(1); |
| 655 | |
| 656 | addManagerCallback(new MediaRouter2Manager.Callback() { |
| 657 | @Override |
| 658 | public void onTransferred(RoutingSessionInfo oldSession, |
| 659 | RoutingSessionInfo newSession) { |
| 660 | assertTrue(newSession.getSelectedRoutes().contains(route.getId())); |
| 661 | // The StubMediaRoute2ProviderService is supposed to set control hints |
| 662 | // with the given controllerHints. |
| 663 | Bundle controlHints = newSession.getControlHints(); |
| 664 | assertNotNull(controlHints); |
| 665 | assertTrue(controlHints.containsKey(TEST_KEY)); |
| 666 | assertEquals(TEST_VALUE, controlHints.getString(TEST_KEY)); |
| 667 | |
| 668 | successLatch.countDown(); |
| 669 | } |
| 670 | |
| 671 | @Override |
| 672 | public void onTransferFailed(RoutingSessionInfo session, |
| 673 | MediaRoute2Info requestedRoute) { |
| 674 | failureLatch.countDown(); |
| 675 | } |
| 676 | }); |
| 677 | |
| 678 | mRouter2.setOnGetControllerHintsListener(listener); |
| 679 | mManager.selectRoute(mPackageName, route); |
| 680 | assertTrue(hintLatch.await(TIMEOUT_MS, TimeUnit.MILLISECONDS)); |
| 681 | assertTrue(successLatch.await(TIMEOUT_MS, TimeUnit.MILLISECONDS)); |
| 682 | |
| 683 | assertFalse(failureLatch.await(WAIT_TIME_MS, TimeUnit.MILLISECONDS)); |
| 684 | } |
| 685 | |
Kyunglyul Hyun | 45512bb | 2020-05-08 15:21:13 +0900 | [diff] [blame] | 686 | /** |
| 687 | * Tests if getSelectableRoutes and getDeselectableRoutes filter routes based on |
| 688 | * selected routes |
| 689 | */ |
| 690 | @Test |
| 691 | public void testGetSelectableRoutes_notReturnsSelectedRoutes() throws Exception { |
| 692 | Map<String, MediaRoute2Info> routes = waitAndGetRoutesWithManager(FEATURES_ALL); |
| 693 | addRouterCallback(new RouteCallback() {}); |
| 694 | |
| 695 | CountDownLatch onSessionCreatedLatch = new CountDownLatch(1); |
| 696 | |
| 697 | addManagerCallback(new MediaRouter2Manager.Callback() { |
| 698 | @Override |
| 699 | public void onTransferred(RoutingSessionInfo oldSessionInfo, |
| 700 | RoutingSessionInfo newSessionInfo) { |
| 701 | assertNotNull(newSessionInfo); |
| 702 | List<String> selectedRoutes = mManager.getSelectedRoutes(newSessionInfo).stream() |
| 703 | .map(MediaRoute2Info::getId) |
| 704 | .collect(Collectors.toList()); |
| 705 | for (MediaRoute2Info selectableRoute : |
| 706 | mManager.getSelectableRoutes(newSessionInfo)) { |
| 707 | assertFalse(selectedRoutes.contains(selectableRoute.getId())); |
| 708 | } |
| 709 | for (MediaRoute2Info deselectableRoute : |
| 710 | mManager.getDeselectableRoutes(newSessionInfo)) { |
| 711 | assertTrue(selectedRoutes.contains(deselectableRoute.getId())); |
| 712 | } |
| 713 | onSessionCreatedLatch.countDown(); |
| 714 | } |
| 715 | }); |
| 716 | |
| 717 | mManager.selectRoute(mPackageName, routes.get(ROUTE_ID4_TO_SELECT_AND_DESELECT)); |
| 718 | assertTrue(onSessionCreatedLatch.await(TIMEOUT_MS, TimeUnit.MILLISECONDS)); |
| 719 | } |
| 720 | |
Kyunglyul Hyun | ccb9587 | 2020-05-11 15:33:34 +0900 | [diff] [blame] | 721 | @Test |
| 722 | public void testGetActiveSessions_returnsNonEmptyList() { |
| 723 | assertFalse(mManager.getActiveSessions().isEmpty()); |
| 724 | } |
| 725 | |
Kyunglyul Hyun | 616096e | 2020-01-09 16:15:03 +0900 | [diff] [blame] | 726 | Map<String, MediaRoute2Info> waitAndGetRoutesWithManager(List<String> routeFeatures) |
Kyunglyul Hyun | 5a8dedc | 2019-10-10 14:09:44 +0900 | [diff] [blame] | 727 | throws Exception { |
Kyunglyul Hyun | c24317d | 2020-02-17 16:58:24 +0900 | [diff] [blame] | 728 | CountDownLatch addedLatch = new CountDownLatch(1); |
| 729 | CountDownLatch featuresLatch = new CountDownLatch(1); |
Kyunglyul Hyun | 5a8dedc | 2019-10-10 14:09:44 +0900 | [diff] [blame] | 730 | |
Kyunglyul Hyun | 616096e | 2020-01-09 16:15:03 +0900 | [diff] [blame] | 731 | // A dummy callback is required to send route feature info. |
Hyundo Moon | 899535c | 2020-02-28 17:47:37 +0900 | [diff] [blame] | 732 | RouteCallback routeCallback = new RouteCallback() {}; |
Kyunglyul Hyun | 5a8dedc | 2019-10-10 14:09:44 +0900 | [diff] [blame] | 733 | MediaRouter2Manager.Callback managerCallback = new MediaRouter2Manager.Callback() { |
| 734 | @Override |
Kyunglyul Hyun | 4ed6875 | 2019-11-04 16:05:34 +0900 | [diff] [blame] | 735 | public void onRoutesAdded(List<MediaRoute2Info> routes) { |
Kyunglyul Hyun | 350d7b4 | 2020-04-17 23:09:08 +0900 | [diff] [blame] | 736 | for (MediaRoute2Info route : routes) { |
| 737 | if (!route.isSystemRoute()) { |
Kyunglyul Hyun | c24317d | 2020-02-17 16:58:24 +0900 | [diff] [blame] | 738 | addedLatch.countDown(); |
Kyunglyul Hyun | 484074a | 2019-12-04 20:43:28 +0900 | [diff] [blame] | 739 | break; |
| 740 | } |
Kyunglyul Hyun | 7af7301 | 2019-10-11 20:01:30 +0900 | [diff] [blame] | 741 | } |
Kyunglyul Hyun | 5a8dedc | 2019-10-10 14:09:44 +0900 | [diff] [blame] | 742 | } |
Kyunglyul Hyun | f7d5e04 | 2019-11-11 13:56:28 +0900 | [diff] [blame] | 743 | |
Kyunglyul Hyun | 4ed6875 | 2019-11-04 16:05:34 +0900 | [diff] [blame] | 744 | @Override |
Kyunglyul Hyun | f55befb | 2020-02-20 19:57:43 +0900 | [diff] [blame] | 745 | public void onPreferredFeaturesChanged(String packageName, |
Kyunglyul Hyun | 616096e | 2020-01-09 16:15:03 +0900 | [diff] [blame] | 746 | List<String> preferredFeatures) { |
Kyunglyul Hyun | e6b6238 | 2019-12-24 11:17:24 +0900 | [diff] [blame] | 747 | if (TextUtils.equals(mPackageName, packageName) |
Kyunglyul Hyun | f55befb | 2020-02-20 19:57:43 +0900 | [diff] [blame] | 748 | && preferredFeatures.size() == routeFeatures.size() |
| 749 | && preferredFeatures.containsAll(routeFeatures)) { |
Kyunglyul Hyun | c24317d | 2020-02-17 16:58:24 +0900 | [diff] [blame] | 750 | featuresLatch.countDown(); |
Kyunglyul Hyun | 4ed6875 | 2019-11-04 16:05:34 +0900 | [diff] [blame] | 751 | } |
| 752 | } |
Kyunglyul Hyun | 5a8dedc | 2019-10-10 14:09:44 +0900 | [diff] [blame] | 753 | }; |
| 754 | mManager.registerCallback(mExecutor, managerCallback); |
Kyunglyul Hyun | 91c792e | 2020-01-08 13:51:27 +0900 | [diff] [blame] | 755 | mRouter2.registerRouteCallback(mExecutor, routeCallback, |
Kyunglyul Hyun | 616096e | 2020-01-09 16:15:03 +0900 | [diff] [blame] | 756 | new RouteDiscoveryPreference.Builder(routeFeatures, true).build()); |
Kyunglyul Hyun | 5a8dedc | 2019-10-10 14:09:44 +0900 | [diff] [blame] | 757 | try { |
Kyunglyul Hyun | a3be2de | 2020-06-02 17:42:36 +0900 | [diff] [blame] | 758 | if (mManager.getAllRoutes().isEmpty()) { |
| 759 | addedLatch.await(WAIT_TIME_MS, TimeUnit.MILLISECONDS); |
| 760 | } |
| 761 | featuresLatch.await(WAIT_TIME_MS, TimeUnit.MILLISECONDS); |
Kyunglyul Hyun | 5a8dedc | 2019-10-10 14:09:44 +0900 | [diff] [blame] | 762 | return createRouteMap(mManager.getAvailableRoutes(mPackageName)); |
| 763 | } finally { |
Hyundo Moon | a64ca9e | 2019-12-27 17:41:17 +0900 | [diff] [blame] | 764 | mRouter2.unregisterRouteCallback(routeCallback); |
Kyunglyul Hyun | 5a8dedc | 2019-10-10 14:09:44 +0900 | [diff] [blame] | 765 | mManager.unregisterCallback(managerCallback); |
| 766 | } |
| 767 | } |
| 768 | |
Kyunglyul Hyun | 4ed6875 | 2019-11-04 16:05:34 +0900 | [diff] [blame] | 769 | void awaitOnRouteChangedManager(Runnable task, String routeId, |
| 770 | Predicate<MediaRoute2Info> predicate) throws Exception { |
| 771 | CountDownLatch latch = new CountDownLatch(1); |
| 772 | MediaRouter2Manager.Callback callback = new MediaRouter2Manager.Callback() { |
| 773 | @Override |
| 774 | public void onRoutesChanged(List<MediaRoute2Info> changed) { |
| 775 | MediaRoute2Info route = createRouteMap(changed).get(routeId); |
| 776 | if (route != null && predicate.test(route)) { |
| 777 | latch.countDown(); |
| 778 | } |
| 779 | } |
| 780 | }; |
| 781 | mManager.registerCallback(mExecutor, callback); |
| 782 | try { |
Kyunglyul Hyun | f7d5e04 | 2019-11-11 13:56:28 +0900 | [diff] [blame] | 783 | task.run(); |
Kyunglyul Hyun | 4ed6875 | 2019-11-04 16:05:34 +0900 | [diff] [blame] | 784 | assertTrue(latch.await(TIMEOUT_MS, TimeUnit.MILLISECONDS)); |
| 785 | } finally { |
| 786 | mManager.unregisterCallback(callback); |
| 787 | } |
Kyunglyul Hyun | 7af7301 | 2019-10-11 20:01:30 +0900 | [diff] [blame] | 788 | } |
| 789 | |
Kyunglyul Hyun | 23b3aaa | 2019-08-06 11:17:16 +0900 | [diff] [blame] | 790 | // Helper for getting routes easily |
| 791 | static Map<String, MediaRoute2Info> createRouteMap(List<MediaRoute2Info> routes) { |
Kyunglyul Hyun | a0d4741 | 2019-07-01 11:14:24 +0900 | [diff] [blame] | 792 | Map<String, MediaRoute2Info> routeMap = new HashMap<>(); |
| 793 | for (MediaRoute2Info route : routes) { |
Hyundo Moon | 5de706f | 2020-02-03 20:16:33 +0900 | [diff] [blame] | 794 | routeMap.put(route.getOriginalId(), route); |
Kyunglyul Hyun | a0d4741 | 2019-07-01 11:14:24 +0900 | [diff] [blame] | 795 | } |
| 796 | return routeMap; |
| 797 | } |
Kyunglyul Hyun | f7d5e04 | 2019-11-11 13:56:28 +0900 | [diff] [blame] | 798 | |
| 799 | private void addManagerCallback(MediaRouter2Manager.Callback callback) { |
| 800 | mManagerCallbacks.add(callback); |
| 801 | mManager.registerCallback(mExecutor, callback); |
| 802 | } |
| 803 | |
Hyundo Moon | 63a0540 | 2019-12-19 20:13:56 +0900 | [diff] [blame] | 804 | private void addRouterCallback(RouteCallback routeCallback) { |
| 805 | mRouteCallbacks.add(routeCallback); |
Kyunglyul Hyun | 616096e | 2020-01-09 16:15:03 +0900 | [diff] [blame] | 806 | mRouter2.registerRouteCallback(mExecutor, routeCallback, RouteDiscoveryPreference.EMPTY); |
Kyunglyul Hyun | f7d5e04 | 2019-11-11 13:56:28 +0900 | [diff] [blame] | 807 | } |
| 808 | |
Kyunglyul Hyun | 3729e9f | 2020-02-12 10:50:43 +0900 | [diff] [blame] | 809 | private void addTransferCallback(TransferCallback transferCallback) { |
| 810 | mTransferCallbacks.add(transferCallback); |
| 811 | mRouter2.registerTransferCallback(mExecutor, transferCallback); |
Kyunglyul Hyun | 138246e | 2020-01-02 18:19:52 +0900 | [diff] [blame] | 812 | } |
| 813 | |
Kyunglyul Hyun | f7d5e04 | 2019-11-11 13:56:28 +0900 | [diff] [blame] | 814 | private void clearCallbacks() { |
| 815 | for (MediaRouter2Manager.Callback callback : mManagerCallbacks) { |
| 816 | mManager.unregisterCallback(callback); |
| 817 | } |
| 818 | mManagerCallbacks.clear(); |
| 819 | |
Hyundo Moon | 63a0540 | 2019-12-19 20:13:56 +0900 | [diff] [blame] | 820 | for (RouteCallback routeCallback : mRouteCallbacks) { |
Hyundo Moon | a64ca9e | 2019-12-27 17:41:17 +0900 | [diff] [blame] | 821 | mRouter2.unregisterRouteCallback(routeCallback); |
Kyunglyul Hyun | f7d5e04 | 2019-11-11 13:56:28 +0900 | [diff] [blame] | 822 | } |
Hyundo Moon | 63a0540 | 2019-12-19 20:13:56 +0900 | [diff] [blame] | 823 | mRouteCallbacks.clear(); |
Kyunglyul Hyun | 138246e | 2020-01-02 18:19:52 +0900 | [diff] [blame] | 824 | |
Kyunglyul Hyun | 3729e9f | 2020-02-12 10:50:43 +0900 | [diff] [blame] | 825 | for (MediaRouter2.TransferCallback transferCallback : mTransferCallbacks) { |
| 826 | mRouter2.unregisterTransferCallback(transferCallback); |
Kyunglyul Hyun | 138246e | 2020-01-02 18:19:52 +0900 | [diff] [blame] | 827 | } |
Kyunglyul Hyun | 3729e9f | 2020-02-12 10:50:43 +0900 | [diff] [blame] | 828 | mTransferCallbacks.clear(); |
Kyunglyul Hyun | f7d5e04 | 2019-11-11 13:56:28 +0900 | [diff] [blame] | 829 | } |
Kyunglyul Hyun | c658383 | 2020-01-17 11:11:46 +0000 | [diff] [blame] | 830 | |
| 831 | private void releaseAllSessions() { |
| 832 | // ensure ManagerRecord in MediaRouter2ServiceImpl |
| 833 | addManagerCallback(new MediaRouter2Manager.Callback()); |
| 834 | |
| 835 | for (RoutingSessionInfo session : mManager.getActiveSessions()) { |
Kyunglyul Hyun | a3365d7 | 2020-02-20 13:46:45 +0900 | [diff] [blame] | 836 | mManager.releaseSession(session); |
Kyunglyul Hyun | c658383 | 2020-01-17 11:11:46 +0000 | [diff] [blame] | 837 | } |
| 838 | } |
Kyunglyul Hyun | d51666d | 2019-04-11 04:08:40 +0000 | [diff] [blame] | 839 | } |