diff options
| author | 2020-03-16 15:44:51 +0900 | |
|---|---|---|
| committer | 2020-03-17 13:53:30 +0900 | |
| commit | 613a77adee4206a707f932c5faf9b32b35e5f82a (patch) | |
| tree | 5a752c1b580bbf2b56e060611ac153ce8e604368 | |
| parent | e78f4abb70486e6b351f9dd3659da81a6102d277 (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.java | 2 | ||||
| -rw-r--r-- | services/core/java/com/android/server/media/SystemMediaRoute2Provider.java | 76 |
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; + } } } |