Loading media/tests/MediaRouter/src/com/android/mediaroutertest/MediaRouterManagerTest.java +30 −13 Original line number Diff line number Diff line Loading @@ -82,6 +82,11 @@ public class MediaRouterManagerTest { public static final String CATEGORY_SPECIAL = "com.android.mediarouteprovider.CATEGORY_SPECIAL"; // system routes private static final String DEFAULT_ROUTE_ID = "DEFAULT_ROUTE"; private static final String CATEGORY_LIVE_AUDIO = "android.media.intent.category.LIVE_AUDIO"; private static final String CATEGORY_LIVE_VIDEO = "android.media.intent.category.LIVE_VIDEO"; private static final int TIMEOUT_MS = 5000; private Context mContext; Loading @@ -90,13 +95,17 @@ public class MediaRouterManagerTest { private Executor mExecutor; private String mPackageName; private static final List<String> CONTROL_CATEGORIES_ALL = new ArrayList(); private static final List<String> CONTROL_CATEGORIES_SPECIAL = new ArrayList(); private static final List<String> CATEGORIES_ALL = new ArrayList(); private static final List<String> CATEGORIES_SPECIAL = new ArrayList(); private static final List<String> CATEGORIES_LIVE_AUDIO = new ArrayList<>(); static { CONTROL_CATEGORIES_ALL.add(CATEGORY_SAMPLE); CONTROL_CATEGORIES_ALL.add(CATEGORY_SPECIAL); CATEGORIES_ALL.add(CATEGORY_SAMPLE); CATEGORIES_ALL.add(CATEGORY_SPECIAL); CATEGORIES_ALL.add(CATEGORY_LIVE_AUDIO); CATEGORIES_SPECIAL.add(CATEGORY_SPECIAL); CONTROL_CATEGORIES_SPECIAL.add(CATEGORY_SPECIAL); CATEGORIES_LIVE_AUDIO.add(CATEGORY_LIVE_AUDIO); } @Before Loading Loading @@ -153,7 +162,7 @@ public class MediaRouterManagerTest { mRouter2.registerCallback(mExecutor, routerCallback); Map<String, MediaRoute2Info> routes = waitAndGetRoutesWithManager(CONTROL_CATEGORIES_ALL); waitAndGetRoutesWithManager(CATEGORIES_ALL); CountDownLatch latch = new CountDownLatch(1); MediaRouter2Manager.Callback callback = new MediaRouter2Manager.Callback() { Loading Loading @@ -187,7 +196,7 @@ public class MediaRouterManagerTest { mManager.registerCallback(mExecutor, mockCallback); Map<String, MediaRoute2Info> routes = waitAndGetRoutesWithManager(CONTROL_CATEGORIES_SPECIAL); waitAndGetRoutesWithManager(CATEGORIES_SPECIAL); Assert.assertEquals(1, routes.size()); Assert.assertNotNull(routes.get(ROUTE_ID_SPECIAL_CATEGORY)); Loading @@ -203,7 +212,7 @@ public class MediaRouterManagerTest { MediaRouter2.Callback mockCallback = mock(MediaRouter2.Callback.class); mRouter2.registerCallback(mExecutor, mockCallback); Map<String, MediaRoute2Info> routes = waitAndGetRoutes(CONTROL_CATEGORIES_SPECIAL); Map<String, MediaRoute2Info> routes = waitAndGetRoutes(CATEGORIES_SPECIAL); Assert.assertEquals(1, routes.size()); Assert.assertNotNull(routes.get(ROUTE_ID_SPECIAL_CATEGORY)); Loading @@ -219,7 +228,7 @@ public class MediaRouterManagerTest { mManager.registerCallback(mExecutor, managerCallback); mRouter2.registerCallback(mExecutor, routerCallback); Map<String, MediaRoute2Info> routes = waitAndGetRoutesWithManager(CONTROL_CATEGORIES_ALL); Map<String, MediaRoute2Info> routes = waitAndGetRoutesWithManager(CATEGORIES_ALL); MediaRoute2Info routeToSelect = routes.get(ROUTE_ID1); assertNotNull(routeToSelect); Loading @@ -242,7 +251,7 @@ public class MediaRouterManagerTest { mRouter2.registerCallback(mExecutor, routerCallback); Map<String, MediaRoute2Info> routes = waitAndGetRoutesWithManager(CONTROL_CATEGORIES_ALL); Map<String, MediaRoute2Info> routes = waitAndGetRoutesWithManager(CATEGORIES_ALL); awaitOnRouteChangedManager( () -> mManager.selectRoute(mPackageName, routes.get(ROUTE_ID1)), Loading @@ -264,7 +273,7 @@ public class MediaRouterManagerTest { @Test public void testControlVolumeWithRouter() throws Exception { Map<String, MediaRoute2Info> routes = waitAndGetRoutes(CONTROL_CATEGORIES_ALL); Map<String, MediaRoute2Info> routes = waitAndGetRoutes(CATEGORIES_ALL); MediaRoute2Info volRoute = routes.get(ROUTE_ID_VARIABLE_VOLUME); int originalVolume = volRoute.getVolume(); Loading @@ -286,7 +295,7 @@ public class MediaRouterManagerTest { MediaRouter2.Callback mockCallback = mock(MediaRouter2.Callback.class); mRouter2.registerCallback(mExecutor, mockCallback); Map<String, MediaRoute2Info> routes = waitAndGetRoutesWithManager(CONTROL_CATEGORIES_ALL); Map<String, MediaRoute2Info> routes = waitAndGetRoutesWithManager(CATEGORIES_ALL); MediaRoute2Info volRoute = routes.get(ROUTE_ID_VARIABLE_VOLUME); int originalVolume = volRoute.getVolume(); Loading @@ -309,7 +318,7 @@ public class MediaRouterManagerTest { public void testVolumeHandling() throws Exception { MediaRouter2.Callback mockCallback = mock(MediaRouter2.Callback.class); mRouter2.registerCallback(mExecutor, mockCallback); Map<String, MediaRoute2Info> routes = waitAndGetRoutes(CONTROL_CATEGORIES_ALL); Map<String, MediaRoute2Info> routes = waitAndGetRoutes(CATEGORIES_ALL); MediaRoute2Info fixedVolumeRoute = routes.get(ROUTE_ID_FIXED_VOLUME); MediaRoute2Info variableVolumeRoute = routes.get(ROUTE_ID_VARIABLE_VOLUME); Loading @@ -321,6 +330,13 @@ public class MediaRouterManagerTest { mRouter2.unregisterCallback(mockCallback); } @Test public void testDefaultRoute() throws Exception { Map<String, MediaRoute2Info> routes = waitAndGetRoutes(CATEGORIES_LIVE_AUDIO); assertNotNull(routes.get(DEFAULT_ROUTE_ID)); } Map<String, MediaRoute2Info> waitAndGetRoutes(List<String> controlCategories) throws Exception { CountDownLatch latch = new CountDownLatch(1); MediaRouter2.Callback callback = new MediaRouter2.Callback() { Loading Loading @@ -417,6 +433,7 @@ public class MediaRouterManagerTest { static Map<String, MediaRoute2Info> createRouteMap(List<MediaRoute2Info> routes) { Map<String, MediaRoute2Info> routeMap = new HashMap<>(); for (MediaRoute2Info route : routes) { // intentionally not route.getUniqueId() for convenience. routeMap.put(route.getId(), route); } return routeMap; Loading services/core/java/com/android/server/media/MediaRoute2Provider.java 0 → 100644 +82 −0 Original line number Diff line number Diff line /* * Copyright 2019 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package com.android.server.media; import android.annotation.NonNull; import android.annotation.Nullable; import android.content.ComponentName; import android.content.Intent; import android.media.MediaRoute2Info; import android.media.MediaRoute2ProviderInfo; import java.util.Objects; abstract class MediaRoute2Provider { final ComponentName mComponentName; final String mUniqueId; private Callback mCallback; private MediaRoute2ProviderInfo mProviderInfo; MediaRoute2Provider(@NonNull ComponentName componentName) { mComponentName = Objects.requireNonNull(componentName, "Component name must not be null."); mUniqueId = componentName.flattenToShortString(); } public void setCallback(MediaRoute2ProviderProxy.Callback callback) { mCallback = callback; } public abstract void requestSelectRoute(String packageName, String routeId, int seq); public abstract void unselectRoute(String packageName, String routeId); public abstract void sendControlRequest(MediaRoute2Info route, Intent request); public abstract void requestSetVolume(MediaRoute2Info route, int volume); public abstract void requestUpdateVolume(MediaRoute2Info route, int delta); @NonNull public String getUniqueId() { return mUniqueId; } @Nullable public MediaRoute2ProviderInfo getProviderInfo() { return mProviderInfo; } void setAndNotifyProviderInfo(MediaRoute2ProviderInfo info) { //TODO: check if info is not updated if (info == null) { mProviderInfo = null; } else { mProviderInfo = new MediaRoute2ProviderInfo.Builder(info) .setUniqueId(mUniqueId) .build(); } if (mCallback != null) { mCallback.onProviderStateChanged(this); } } public boolean hasComponentName(String packageName, String className) { return mComponentName.getPackageName().equals(packageName) && mComponentName.getClassName().equals(className); } public interface Callback { void onProviderStateChanged(MediaRoute2Provider provider); } } services/core/java/com/android/server/media/MediaRoute2ProviderProxy.java +7 −42 Original line number Diff line number Diff line Loading @@ -17,7 +17,6 @@ package com.android.server.media; import android.annotation.NonNull; import android.annotation.Nullable; import android.content.ComponentName; import android.content.Context; import android.content.Intent; Loading @@ -42,20 +41,14 @@ import java.util.Objects; /** * Maintains a connection to a particular media route provider service. */ final class MediaRoute2ProviderProxy implements ServiceConnection { final class MediaRoute2ProviderProxy extends MediaRoute2Provider implements ServiceConnection { private static final String TAG = "MR2ProviderProxy"; private static final boolean DEBUG = Log.isLoggable(TAG, Log.DEBUG); private final Context mContext; private final ComponentName mComponentName; private final String mUniqueId; private final int mUserId; private final Handler mHandler; private Callback mCallback; private MediaRoute2ProviderInfo mProviderInfo; // Connection state private boolean mRunning; private boolean mBound; Loading @@ -64,9 +57,8 @@ final class MediaRoute2ProviderProxy implements ServiceConnection { MediaRoute2ProviderProxy(@NonNull Context context, @NonNull ComponentName componentName, int userId) { super(componentName); mContext = Objects.requireNonNull(context, "Context must not be null."); mComponentName = Objects.requireNonNull(componentName, "Component name must not be null."); mUniqueId = componentName.flattenToShortString(); mUserId = userId; mHandler = new Handler(); } Loading @@ -80,10 +72,7 @@ final class MediaRoute2ProviderProxy implements ServiceConnection { pw.println(prefix + " mConnectionReady=" + mConnectionReady); } public void setCallback(Callback callback) { mCallback = callback; } @Override public void requestSelectRoute(String packageName, String routeId, int seq) { if (mConnectionReady) { mActiveConnection.requestSelectRoute(packageName, routeId, seq); Loading @@ -91,6 +80,7 @@ final class MediaRoute2ProviderProxy implements ServiceConnection { } } @Override public void unselectRoute(String packageName, String routeId) { if (mConnectionReady) { mActiveConnection.unselectRoute(packageName, routeId); Loading @@ -98,6 +88,7 @@ final class MediaRoute2ProviderProxy implements ServiceConnection { } } @Override public void sendControlRequest(MediaRoute2Info route, Intent request) { if (mConnectionReady) { mActiveConnection.sendControlRequest(route.getId(), request); Loading @@ -105,6 +96,7 @@ final class MediaRoute2ProviderProxy implements ServiceConnection { } } @Override public void requestSetVolume(MediaRoute2Info route, int volume) { if (mConnectionReady) { mActiveConnection.requestSetVolume(route.getId(), volume); Loading @@ -112,6 +104,7 @@ final class MediaRoute2ProviderProxy implements ServiceConnection { } } @Override public void requestUpdateVolume(MediaRoute2Info route, int delta) { if (mConnectionReady) { mActiveConnection.requestUpdateVolume(route.getId(), delta); Loading @@ -119,16 +112,6 @@ final class MediaRoute2ProviderProxy implements ServiceConnection { } } @NonNull public String getUniqueId() { return mUniqueId; } @Nullable public MediaRoute2ProviderInfo getProviderInfo() { return mProviderInfo; } public boolean hasComponentName(String packageName, String className) { return mComponentName.getPackageName().equals(packageName) && mComponentName.getClassName().equals(className); Loading Loading @@ -270,20 +253,6 @@ final class MediaRoute2ProviderProxy implements ServiceConnection { setAndNotifyProviderInfo(info); } private void setAndNotifyProviderInfo(MediaRoute2ProviderInfo info) { //TODO: check if info is not updated if (info == null) { mProviderInfo = null; } else { mProviderInfo = new MediaRoute2ProviderInfo.Builder(info) .setUniqueId(mUniqueId) .build(); } if (mCallback != null) { mCallback.onProviderStateChanged(MediaRoute2ProviderProxy.this); } } private void disconnect() { if (mActiveConnection != null) { mConnectionReady = false; Loading @@ -298,10 +267,6 @@ final class MediaRoute2ProviderProxy implements ServiceConnection { return "Service connection " + mComponentName.flattenToShortString(); } public interface Callback { void onProviderStateChanged(@NonNull MediaRoute2ProviderProxy provider); } private final class Connection implements DeathRecipient { private final IMediaRoute2Provider mProvider; private final ProviderClient mClient; Loading services/core/java/com/android/server/media/MediaRouter2ServiceImpl.java +14 −11 Original line number Diff line number Diff line Loading @@ -728,14 +728,15 @@ class MediaRouter2ServiceImpl { static final class UserHandler extends Handler implements MediaRoute2ProviderWatcher.Callback, MediaRoute2ProviderProxy.Callback { MediaRoute2Provider.Callback { private final WeakReference<MediaRouter2ServiceImpl> mServiceRef; private final UserRecord mUserRecord; private final MediaRoute2ProviderWatcher mWatcher; //TODO: Make this thread-safe. private final ArrayList<MediaRoute2ProviderProxy> mMediaProviders = private final SystemMediaRoute2Provider mSystemProvider; private final ArrayList<MediaRoute2Provider> mMediaProviders = new ArrayList<>(); private final List<MediaRoute2ProviderInfo> mProviderInfos = new ArrayList<>(); Loading @@ -746,6 +747,8 @@ class MediaRouter2ServiceImpl { super(Looper.getMainLooper(), null, true); mServiceRef = new WeakReference<>(service); mUserRecord = userRecord; mSystemProvider = new SystemMediaRoute2Provider(service.mContext, this); mMediaProviders.add(mSystemProvider); mWatcher = new MediaRoute2ProviderWatcher(service.mContext, this, this, mUserRecord.mUserId); } Loading Loading @@ -777,7 +780,7 @@ class MediaRouter2ServiceImpl { } @Override public void onProviderStateChanged(@NonNull MediaRoute2ProviderProxy provider) { public void onProviderStateChanged(@NonNull MediaRoute2Provider provider) { sendMessage(PooledLambda.obtainMessage(UserHandler::updateProvider, this, provider)); } Loading @@ -790,7 +793,7 @@ class MediaRouter2ServiceImpl { controlHints, seq)); } private void updateProvider(MediaRoute2ProviderProxy provider) { private void updateProvider(MediaRoute2Provider provider) { int providerIndex = getProviderInfoIndex(provider.getUniqueId()); MediaRoute2ProviderInfo providerInfo = provider.getProviderInfo(); MediaRoute2ProviderInfo prevInfo = Loading Loading @@ -954,7 +957,7 @@ class MediaRouter2ServiceImpl { private void requestSelectRoute(String clientPackageName, MediaRoute2Info route, int seq) { if (route != null) { MediaRoute2ProviderProxy provider = findProvider(route.getProviderId()); MediaRoute2Provider provider = findProvider(route.getProviderId()); if (provider == null) { Slog.w(TAG, "Ignoring to select route of unknown provider " + route); } else { Loading @@ -965,7 +968,7 @@ class MediaRouter2ServiceImpl { private void unselectRoute(String clientPackageName, MediaRoute2Info route) { if (route != null) { MediaRoute2ProviderProxy provider = findProvider(route.getProviderId()); MediaRoute2Provider provider = findProvider(route.getProviderId()); if (provider == null) { Slog.w(TAG, "Ignoring to unselect route of unknown provider " + route); } else { Loading @@ -975,21 +978,21 @@ class MediaRouter2ServiceImpl { } private void sendControlRequest(MediaRoute2Info route, Intent request) { final MediaRoute2ProviderProxy provider = findProvider(route.getProviderId()); final MediaRoute2Provider provider = findProvider(route.getProviderId()); if (provider != null) { provider.sendControlRequest(route, request); } } private void requestSetVolume(MediaRoute2Info route, int volume) { final MediaRoute2ProviderProxy provider = findProvider(route.getProviderId()); final MediaRoute2Provider provider = findProvider(route.getProviderId()); if (provider != null) { provider.requestSetVolume(route, volume); } } private void requestUpdateVolume(MediaRoute2Info route, int delta) { final MediaRoute2ProviderProxy provider = findProvider(route.getProviderId()); final MediaRoute2Provider provider = findProvider(route.getProviderId()); if (provider != null) { provider.requestUpdateVolume(route, delta); } Loading Loading @@ -1153,8 +1156,8 @@ class MediaRouter2ServiceImpl { } } private MediaRoute2ProviderProxy findProvider(String providerId) { for (MediaRoute2ProviderProxy provider : mMediaProviders) { private MediaRoute2Provider findProvider(String providerId) { for (MediaRoute2Provider provider : mMediaProviders) { if (TextUtils.equals(provider.getUniqueId(), providerId)) { return provider; } Loading services/core/java/com/android/server/media/SystemMediaRoute2Provider.java 0 → 100644 +202 −0 File added.Preview size limit exceeded, changes collapsed. Show changes Loading
media/tests/MediaRouter/src/com/android/mediaroutertest/MediaRouterManagerTest.java +30 −13 Original line number Diff line number Diff line Loading @@ -82,6 +82,11 @@ public class MediaRouterManagerTest { public static final String CATEGORY_SPECIAL = "com.android.mediarouteprovider.CATEGORY_SPECIAL"; // system routes private static final String DEFAULT_ROUTE_ID = "DEFAULT_ROUTE"; private static final String CATEGORY_LIVE_AUDIO = "android.media.intent.category.LIVE_AUDIO"; private static final String CATEGORY_LIVE_VIDEO = "android.media.intent.category.LIVE_VIDEO"; private static final int TIMEOUT_MS = 5000; private Context mContext; Loading @@ -90,13 +95,17 @@ public class MediaRouterManagerTest { private Executor mExecutor; private String mPackageName; private static final List<String> CONTROL_CATEGORIES_ALL = new ArrayList(); private static final List<String> CONTROL_CATEGORIES_SPECIAL = new ArrayList(); private static final List<String> CATEGORIES_ALL = new ArrayList(); private static final List<String> CATEGORIES_SPECIAL = new ArrayList(); private static final List<String> CATEGORIES_LIVE_AUDIO = new ArrayList<>(); static { CONTROL_CATEGORIES_ALL.add(CATEGORY_SAMPLE); CONTROL_CATEGORIES_ALL.add(CATEGORY_SPECIAL); CATEGORIES_ALL.add(CATEGORY_SAMPLE); CATEGORIES_ALL.add(CATEGORY_SPECIAL); CATEGORIES_ALL.add(CATEGORY_LIVE_AUDIO); CATEGORIES_SPECIAL.add(CATEGORY_SPECIAL); CONTROL_CATEGORIES_SPECIAL.add(CATEGORY_SPECIAL); CATEGORIES_LIVE_AUDIO.add(CATEGORY_LIVE_AUDIO); } @Before Loading Loading @@ -153,7 +162,7 @@ public class MediaRouterManagerTest { mRouter2.registerCallback(mExecutor, routerCallback); Map<String, MediaRoute2Info> routes = waitAndGetRoutesWithManager(CONTROL_CATEGORIES_ALL); waitAndGetRoutesWithManager(CATEGORIES_ALL); CountDownLatch latch = new CountDownLatch(1); MediaRouter2Manager.Callback callback = new MediaRouter2Manager.Callback() { Loading Loading @@ -187,7 +196,7 @@ public class MediaRouterManagerTest { mManager.registerCallback(mExecutor, mockCallback); Map<String, MediaRoute2Info> routes = waitAndGetRoutesWithManager(CONTROL_CATEGORIES_SPECIAL); waitAndGetRoutesWithManager(CATEGORIES_SPECIAL); Assert.assertEquals(1, routes.size()); Assert.assertNotNull(routes.get(ROUTE_ID_SPECIAL_CATEGORY)); Loading @@ -203,7 +212,7 @@ public class MediaRouterManagerTest { MediaRouter2.Callback mockCallback = mock(MediaRouter2.Callback.class); mRouter2.registerCallback(mExecutor, mockCallback); Map<String, MediaRoute2Info> routes = waitAndGetRoutes(CONTROL_CATEGORIES_SPECIAL); Map<String, MediaRoute2Info> routes = waitAndGetRoutes(CATEGORIES_SPECIAL); Assert.assertEquals(1, routes.size()); Assert.assertNotNull(routes.get(ROUTE_ID_SPECIAL_CATEGORY)); Loading @@ -219,7 +228,7 @@ public class MediaRouterManagerTest { mManager.registerCallback(mExecutor, managerCallback); mRouter2.registerCallback(mExecutor, routerCallback); Map<String, MediaRoute2Info> routes = waitAndGetRoutesWithManager(CONTROL_CATEGORIES_ALL); Map<String, MediaRoute2Info> routes = waitAndGetRoutesWithManager(CATEGORIES_ALL); MediaRoute2Info routeToSelect = routes.get(ROUTE_ID1); assertNotNull(routeToSelect); Loading @@ -242,7 +251,7 @@ public class MediaRouterManagerTest { mRouter2.registerCallback(mExecutor, routerCallback); Map<String, MediaRoute2Info> routes = waitAndGetRoutesWithManager(CONTROL_CATEGORIES_ALL); Map<String, MediaRoute2Info> routes = waitAndGetRoutesWithManager(CATEGORIES_ALL); awaitOnRouteChangedManager( () -> mManager.selectRoute(mPackageName, routes.get(ROUTE_ID1)), Loading @@ -264,7 +273,7 @@ public class MediaRouterManagerTest { @Test public void testControlVolumeWithRouter() throws Exception { Map<String, MediaRoute2Info> routes = waitAndGetRoutes(CONTROL_CATEGORIES_ALL); Map<String, MediaRoute2Info> routes = waitAndGetRoutes(CATEGORIES_ALL); MediaRoute2Info volRoute = routes.get(ROUTE_ID_VARIABLE_VOLUME); int originalVolume = volRoute.getVolume(); Loading @@ -286,7 +295,7 @@ public class MediaRouterManagerTest { MediaRouter2.Callback mockCallback = mock(MediaRouter2.Callback.class); mRouter2.registerCallback(mExecutor, mockCallback); Map<String, MediaRoute2Info> routes = waitAndGetRoutesWithManager(CONTROL_CATEGORIES_ALL); Map<String, MediaRoute2Info> routes = waitAndGetRoutesWithManager(CATEGORIES_ALL); MediaRoute2Info volRoute = routes.get(ROUTE_ID_VARIABLE_VOLUME); int originalVolume = volRoute.getVolume(); Loading @@ -309,7 +318,7 @@ public class MediaRouterManagerTest { public void testVolumeHandling() throws Exception { MediaRouter2.Callback mockCallback = mock(MediaRouter2.Callback.class); mRouter2.registerCallback(mExecutor, mockCallback); Map<String, MediaRoute2Info> routes = waitAndGetRoutes(CONTROL_CATEGORIES_ALL); Map<String, MediaRoute2Info> routes = waitAndGetRoutes(CATEGORIES_ALL); MediaRoute2Info fixedVolumeRoute = routes.get(ROUTE_ID_FIXED_VOLUME); MediaRoute2Info variableVolumeRoute = routes.get(ROUTE_ID_VARIABLE_VOLUME); Loading @@ -321,6 +330,13 @@ public class MediaRouterManagerTest { mRouter2.unregisterCallback(mockCallback); } @Test public void testDefaultRoute() throws Exception { Map<String, MediaRoute2Info> routes = waitAndGetRoutes(CATEGORIES_LIVE_AUDIO); assertNotNull(routes.get(DEFAULT_ROUTE_ID)); } Map<String, MediaRoute2Info> waitAndGetRoutes(List<String> controlCategories) throws Exception { CountDownLatch latch = new CountDownLatch(1); MediaRouter2.Callback callback = new MediaRouter2.Callback() { Loading Loading @@ -417,6 +433,7 @@ public class MediaRouterManagerTest { static Map<String, MediaRoute2Info> createRouteMap(List<MediaRoute2Info> routes) { Map<String, MediaRoute2Info> routeMap = new HashMap<>(); for (MediaRoute2Info route : routes) { // intentionally not route.getUniqueId() for convenience. routeMap.put(route.getId(), route); } return routeMap; Loading
services/core/java/com/android/server/media/MediaRoute2Provider.java 0 → 100644 +82 −0 Original line number Diff line number Diff line /* * Copyright 2019 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package com.android.server.media; import android.annotation.NonNull; import android.annotation.Nullable; import android.content.ComponentName; import android.content.Intent; import android.media.MediaRoute2Info; import android.media.MediaRoute2ProviderInfo; import java.util.Objects; abstract class MediaRoute2Provider { final ComponentName mComponentName; final String mUniqueId; private Callback mCallback; private MediaRoute2ProviderInfo mProviderInfo; MediaRoute2Provider(@NonNull ComponentName componentName) { mComponentName = Objects.requireNonNull(componentName, "Component name must not be null."); mUniqueId = componentName.flattenToShortString(); } public void setCallback(MediaRoute2ProviderProxy.Callback callback) { mCallback = callback; } public abstract void requestSelectRoute(String packageName, String routeId, int seq); public abstract void unselectRoute(String packageName, String routeId); public abstract void sendControlRequest(MediaRoute2Info route, Intent request); public abstract void requestSetVolume(MediaRoute2Info route, int volume); public abstract void requestUpdateVolume(MediaRoute2Info route, int delta); @NonNull public String getUniqueId() { return mUniqueId; } @Nullable public MediaRoute2ProviderInfo getProviderInfo() { return mProviderInfo; } void setAndNotifyProviderInfo(MediaRoute2ProviderInfo info) { //TODO: check if info is not updated if (info == null) { mProviderInfo = null; } else { mProviderInfo = new MediaRoute2ProviderInfo.Builder(info) .setUniqueId(mUniqueId) .build(); } if (mCallback != null) { mCallback.onProviderStateChanged(this); } } public boolean hasComponentName(String packageName, String className) { return mComponentName.getPackageName().equals(packageName) && mComponentName.getClassName().equals(className); } public interface Callback { void onProviderStateChanged(MediaRoute2Provider provider); } }
services/core/java/com/android/server/media/MediaRoute2ProviderProxy.java +7 −42 Original line number Diff line number Diff line Loading @@ -17,7 +17,6 @@ package com.android.server.media; import android.annotation.NonNull; import android.annotation.Nullable; import android.content.ComponentName; import android.content.Context; import android.content.Intent; Loading @@ -42,20 +41,14 @@ import java.util.Objects; /** * Maintains a connection to a particular media route provider service. */ final class MediaRoute2ProviderProxy implements ServiceConnection { final class MediaRoute2ProviderProxy extends MediaRoute2Provider implements ServiceConnection { private static final String TAG = "MR2ProviderProxy"; private static final boolean DEBUG = Log.isLoggable(TAG, Log.DEBUG); private final Context mContext; private final ComponentName mComponentName; private final String mUniqueId; private final int mUserId; private final Handler mHandler; private Callback mCallback; private MediaRoute2ProviderInfo mProviderInfo; // Connection state private boolean mRunning; private boolean mBound; Loading @@ -64,9 +57,8 @@ final class MediaRoute2ProviderProxy implements ServiceConnection { MediaRoute2ProviderProxy(@NonNull Context context, @NonNull ComponentName componentName, int userId) { super(componentName); mContext = Objects.requireNonNull(context, "Context must not be null."); mComponentName = Objects.requireNonNull(componentName, "Component name must not be null."); mUniqueId = componentName.flattenToShortString(); mUserId = userId; mHandler = new Handler(); } Loading @@ -80,10 +72,7 @@ final class MediaRoute2ProviderProxy implements ServiceConnection { pw.println(prefix + " mConnectionReady=" + mConnectionReady); } public void setCallback(Callback callback) { mCallback = callback; } @Override public void requestSelectRoute(String packageName, String routeId, int seq) { if (mConnectionReady) { mActiveConnection.requestSelectRoute(packageName, routeId, seq); Loading @@ -91,6 +80,7 @@ final class MediaRoute2ProviderProxy implements ServiceConnection { } } @Override public void unselectRoute(String packageName, String routeId) { if (mConnectionReady) { mActiveConnection.unselectRoute(packageName, routeId); Loading @@ -98,6 +88,7 @@ final class MediaRoute2ProviderProxy implements ServiceConnection { } } @Override public void sendControlRequest(MediaRoute2Info route, Intent request) { if (mConnectionReady) { mActiveConnection.sendControlRequest(route.getId(), request); Loading @@ -105,6 +96,7 @@ final class MediaRoute2ProviderProxy implements ServiceConnection { } } @Override public void requestSetVolume(MediaRoute2Info route, int volume) { if (mConnectionReady) { mActiveConnection.requestSetVolume(route.getId(), volume); Loading @@ -112,6 +104,7 @@ final class MediaRoute2ProviderProxy implements ServiceConnection { } } @Override public void requestUpdateVolume(MediaRoute2Info route, int delta) { if (mConnectionReady) { mActiveConnection.requestUpdateVolume(route.getId(), delta); Loading @@ -119,16 +112,6 @@ final class MediaRoute2ProviderProxy implements ServiceConnection { } } @NonNull public String getUniqueId() { return mUniqueId; } @Nullable public MediaRoute2ProviderInfo getProviderInfo() { return mProviderInfo; } public boolean hasComponentName(String packageName, String className) { return mComponentName.getPackageName().equals(packageName) && mComponentName.getClassName().equals(className); Loading Loading @@ -270,20 +253,6 @@ final class MediaRoute2ProviderProxy implements ServiceConnection { setAndNotifyProviderInfo(info); } private void setAndNotifyProviderInfo(MediaRoute2ProviderInfo info) { //TODO: check if info is not updated if (info == null) { mProviderInfo = null; } else { mProviderInfo = new MediaRoute2ProviderInfo.Builder(info) .setUniqueId(mUniqueId) .build(); } if (mCallback != null) { mCallback.onProviderStateChanged(MediaRoute2ProviderProxy.this); } } private void disconnect() { if (mActiveConnection != null) { mConnectionReady = false; Loading @@ -298,10 +267,6 @@ final class MediaRoute2ProviderProxy implements ServiceConnection { return "Service connection " + mComponentName.flattenToShortString(); } public interface Callback { void onProviderStateChanged(@NonNull MediaRoute2ProviderProxy provider); } private final class Connection implements DeathRecipient { private final IMediaRoute2Provider mProvider; private final ProviderClient mClient; Loading
services/core/java/com/android/server/media/MediaRouter2ServiceImpl.java +14 −11 Original line number Diff line number Diff line Loading @@ -728,14 +728,15 @@ class MediaRouter2ServiceImpl { static final class UserHandler extends Handler implements MediaRoute2ProviderWatcher.Callback, MediaRoute2ProviderProxy.Callback { MediaRoute2Provider.Callback { private final WeakReference<MediaRouter2ServiceImpl> mServiceRef; private final UserRecord mUserRecord; private final MediaRoute2ProviderWatcher mWatcher; //TODO: Make this thread-safe. private final ArrayList<MediaRoute2ProviderProxy> mMediaProviders = private final SystemMediaRoute2Provider mSystemProvider; private final ArrayList<MediaRoute2Provider> mMediaProviders = new ArrayList<>(); private final List<MediaRoute2ProviderInfo> mProviderInfos = new ArrayList<>(); Loading @@ -746,6 +747,8 @@ class MediaRouter2ServiceImpl { super(Looper.getMainLooper(), null, true); mServiceRef = new WeakReference<>(service); mUserRecord = userRecord; mSystemProvider = new SystemMediaRoute2Provider(service.mContext, this); mMediaProviders.add(mSystemProvider); mWatcher = new MediaRoute2ProviderWatcher(service.mContext, this, this, mUserRecord.mUserId); } Loading Loading @@ -777,7 +780,7 @@ class MediaRouter2ServiceImpl { } @Override public void onProviderStateChanged(@NonNull MediaRoute2ProviderProxy provider) { public void onProviderStateChanged(@NonNull MediaRoute2Provider provider) { sendMessage(PooledLambda.obtainMessage(UserHandler::updateProvider, this, provider)); } Loading @@ -790,7 +793,7 @@ class MediaRouter2ServiceImpl { controlHints, seq)); } private void updateProvider(MediaRoute2ProviderProxy provider) { private void updateProvider(MediaRoute2Provider provider) { int providerIndex = getProviderInfoIndex(provider.getUniqueId()); MediaRoute2ProviderInfo providerInfo = provider.getProviderInfo(); MediaRoute2ProviderInfo prevInfo = Loading Loading @@ -954,7 +957,7 @@ class MediaRouter2ServiceImpl { private void requestSelectRoute(String clientPackageName, MediaRoute2Info route, int seq) { if (route != null) { MediaRoute2ProviderProxy provider = findProvider(route.getProviderId()); MediaRoute2Provider provider = findProvider(route.getProviderId()); if (provider == null) { Slog.w(TAG, "Ignoring to select route of unknown provider " + route); } else { Loading @@ -965,7 +968,7 @@ class MediaRouter2ServiceImpl { private void unselectRoute(String clientPackageName, MediaRoute2Info route) { if (route != null) { MediaRoute2ProviderProxy provider = findProvider(route.getProviderId()); MediaRoute2Provider provider = findProvider(route.getProviderId()); if (provider == null) { Slog.w(TAG, "Ignoring to unselect route of unknown provider " + route); } else { Loading @@ -975,21 +978,21 @@ class MediaRouter2ServiceImpl { } private void sendControlRequest(MediaRoute2Info route, Intent request) { final MediaRoute2ProviderProxy provider = findProvider(route.getProviderId()); final MediaRoute2Provider provider = findProvider(route.getProviderId()); if (provider != null) { provider.sendControlRequest(route, request); } } private void requestSetVolume(MediaRoute2Info route, int volume) { final MediaRoute2ProviderProxy provider = findProvider(route.getProviderId()); final MediaRoute2Provider provider = findProvider(route.getProviderId()); if (provider != null) { provider.requestSetVolume(route, volume); } } private void requestUpdateVolume(MediaRoute2Info route, int delta) { final MediaRoute2ProviderProxy provider = findProvider(route.getProviderId()); final MediaRoute2Provider provider = findProvider(route.getProviderId()); if (provider != null) { provider.requestUpdateVolume(route, delta); } Loading Loading @@ -1153,8 +1156,8 @@ class MediaRouter2ServiceImpl { } } private MediaRoute2ProviderProxy findProvider(String providerId) { for (MediaRoute2ProviderProxy provider : mMediaProviders) { private MediaRoute2Provider findProvider(String providerId) { for (MediaRoute2Provider provider : mMediaProviders) { if (TextUtils.equals(provider.getUniqueId(), providerId)) { return provider; } Loading
services/core/java/com/android/server/media/SystemMediaRoute2Provider.java 0 → 100644 +202 −0 File added.Preview size limit exceeded, changes collapsed. Show changes