summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
author Sungsoo Lim <sungsoo@google.com> 2020-03-16 15:44:51 +0900
committer Sungsoo Lim <sungsoo@google.com> 2020-03-17 13:53:30 +0900
commit613a77adee4206a707f932c5faf9b32b35e5f82a (patch)
tree5a752c1b580bbf2b56e060611ac153ce8e604368
parente78f4abb70486e6b351f9dd3659da81a6102d277 (diff)
Prevent callbacks being called before the constructor
BluetoothRouteProvider requires a listener in the constructor, but the listener method can be called before the constructor finished. This CL makes the listemer mether be called after the constructor finished. Bug: 149751047 Test: pass MediaRouter2 tests Change-Id: I3fae3f64253f3f7d3417f71bae76e2f483db3e69
-rw-r--r--services/core/java/com/android/server/media/BluetoothRouteProvider.java2
-rw-r--r--services/core/java/com/android/server/media/SystemMediaRoute2Provider.java76
2 files changed, 39 insertions, 39 deletions
diff --git a/services/core/java/com/android/server/media/BluetoothRouteProvider.java b/services/core/java/com/android/server/media/BluetoothRouteProvider.java
index 265b9ad10561..28f838044907 100644
--- a/services/core/java/com/android/server/media/BluetoothRouteProvider.java
+++ b/services/core/java/com/android/server/media/BluetoothRouteProvider.java
@@ -85,7 +85,9 @@ class BluetoothRouteProvider {
mListener = listener;
mAudioManager = (AudioManager) mContext.getSystemService(Context.AUDIO_SERVICE);
buildBluetoothRoutes();
+ }
+ public void start() {
mBluetoothAdapter.getProfileProxy(mContext, mProfileListener, BluetoothProfile.A2DP);
mBluetoothAdapter.getProfileProxy(mContext, mProfileListener, BluetoothProfile.HEARING_AID);
diff --git a/services/core/java/com/android/server/media/SystemMediaRoute2Provider.java b/services/core/java/com/android/server/media/SystemMediaRoute2Provider.java
index 5c97e90a3ba3..c7d14e0afe7b 100644
--- a/services/core/java/com/android/server/media/SystemMediaRoute2Provider.java
+++ b/services/core/java/com/android/server/media/SystemMediaRoute2Provider.java
@@ -103,25 +103,20 @@ class SystemMediaRoute2Provider extends MediaRoute2Provider {
publishProviderState();
boolean sessionInfoChanged;
- synchronized (mLock) {
- sessionInfoChanged = updateSessionInfosIfNeededLocked();
- }
+ sessionInfoChanged = updateSessionInfosIfNeeded();
if (sessionInfoChanged) {
notifySessionInfoUpdated();
}
});
-
- mHandler.post(() -> notifyProviderState());
-
- //TODO: clean up this
- // This is required because it is not instantiated in the main thread and
- // BluetoothRoutesUpdatedListener can be called before here
- synchronized (mLock) {
- updateSessionInfosIfNeededLocked();
- }
+ updateSessionInfosIfNeeded();
mContext.registerReceiver(new VolumeChangeReceiver(),
new IntentFilter(AudioManager.VOLUME_CHANGED_ACTION));
+
+ mHandler.post(() -> {
+ mBtRouteProvider.start();
+ notifyProviderState();
+ });
}
@Override
@@ -220,35 +215,38 @@ class SystemMediaRoute2Provider extends MediaRoute2Provider {
/**
* Updates the mSessionInfo. Returns true if the session info is changed.
*/
- boolean updateSessionInfosIfNeededLocked() {
- // Prevent to execute this method before mBtRouteProvider is created.
- if (mBtRouteProvider == null) return false;
- RoutingSessionInfo oldSessionInfo = mSessionInfos.isEmpty() ? null : mSessionInfos.get(0);
-
- RoutingSessionInfo.Builder builder = new RoutingSessionInfo.Builder(
- SYSTEM_SESSION_ID, "" /* clientPackageName */)
- .setSystemSession(true);
-
- MediaRoute2Info selectedRoute = mBtRouteProvider.getSelectedRoute();
- if (selectedRoute == null) {
- selectedRoute = mDefaultRoute;
- } else {
- builder.addTransferableRoute(mDefaultRoute.getId());
- }
- mSelectedRouteId = selectedRoute.getId();
- builder.addSelectedRoute(mSelectedRouteId);
+ boolean updateSessionInfosIfNeeded() {
+ synchronized (mLock) {
+ // Prevent to execute this method before mBtRouteProvider is created.
+ if (mBtRouteProvider == null) return false;
+ RoutingSessionInfo oldSessionInfo = mSessionInfos.isEmpty() ? null : mSessionInfos.get(
+ 0);
+
+ RoutingSessionInfo.Builder builder = new RoutingSessionInfo.Builder(
+ SYSTEM_SESSION_ID, "" /* clientPackageName */)
+ .setSystemSession(true);
+
+ MediaRoute2Info selectedRoute = mBtRouteProvider.getSelectedRoute();
+ if (selectedRoute == null) {
+ selectedRoute = mDefaultRoute;
+ } else {
+ builder.addTransferableRoute(mDefaultRoute.getId());
+ }
+ mSelectedRouteId = selectedRoute.getId();
+ builder.addSelectedRoute(mSelectedRouteId);
- for (MediaRoute2Info route : mBtRouteProvider.getTransferableRoutes()) {
- builder.addTransferableRoute(route.getId());
- }
+ for (MediaRoute2Info route : mBtRouteProvider.getTransferableRoutes()) {
+ builder.addTransferableRoute(route.getId());
+ }
- RoutingSessionInfo newSessionInfo = builder.setProviderId(mUniqueId).build();
- if (Objects.equals(oldSessionInfo, newSessionInfo)) {
- return false;
- } else {
- mSessionInfos.clear();
- mSessionInfos.add(newSessionInfo);
- return true;
+ RoutingSessionInfo newSessionInfo = builder.setProviderId(mUniqueId).build();
+ if (Objects.equals(oldSessionInfo, newSessionInfo)) {
+ return false;
+ } else {
+ mSessionInfos.clear();
+ mSessionInfos.add(newSessionInfo);
+ return true;
+ }
}
}