diff options
| author | 2020-06-17 23:02:49 +0900 | |
|---|---|---|
| committer | 2020-06-18 19:22:39 +0900 | |
| commit | aa80375e10c27100f17d86ceaffa05e74a9df675 (patch) | |
| tree | 8b446d3b9979b1a43e92fcd0c06802a6592b285b | |
| parent | c934b468b51a3afb9da0415a2f85a97bc97808f3 (diff) | |
SystemMediaRoute2Provider: Set callback after instantiation is done
A NullPointerException can happen if some callback method is called
before the constructor of SystemMediaRoute2Provider ends.
This CL fixes the issue.
Bug: 158838070
Test: Passes CTS and mediaroutertest
Change-Id: Ibad3c54ad3f7921621628b6147c35605652da29b
| -rw-r--r-- | services/core/java/com/android/server/media/MediaRouter2ServiceImpl.java | 12 | ||||
| -rw-r--r-- | services/core/java/com/android/server/media/SystemMediaRoute2Provider.java | 15 |
2 files changed, 23 insertions, 4 deletions
diff --git a/services/core/java/com/android/server/media/MediaRouter2ServiceImpl.java b/services/core/java/com/android/server/media/MediaRouter2ServiceImpl.java index 93a27f2d17a9..72d296fc5f6b 100644 --- a/services/core/java/com/android/server/media/MediaRouter2ServiceImpl.java +++ b/services/core/java/com/android/server/media/MediaRouter2ServiceImpl.java @@ -985,6 +985,7 @@ class MediaRouter2ServiceImpl { if (userRecord == null) { userRecord = new UserRecord(userId); mUserRecords.put(userId, userRecord); + userRecord.init(); if (userId == mCurrentUserId) { userRecord.mHandler.sendMessage( obtainMessage(UserHandler::start, userRecord.mHandler)); @@ -1034,6 +1035,10 @@ class MediaRouter2ServiceImpl { mHandler = new UserHandler(MediaRouter2ServiceImpl.this, this); } + void init() { + mHandler.init(); + } + // TODO: This assumes that only one router exists in a package. // Do this in Android S or later. RouterRecord findRouterRecordLocked(String packageName) { @@ -1141,16 +1146,21 @@ class MediaRouter2ServiceImpl { private boolean mRunning; + // TODO: (In Android S+) Pull out SystemMediaRoute2Provider out of UserHandler. UserHandler(@NonNull MediaRouter2ServiceImpl service, @NonNull UserRecord userRecord) { super(Looper.getMainLooper(), null, true); mServiceRef = new WeakReference<>(service); mUserRecord = userRecord; - mSystemProvider = new SystemMediaRoute2Provider(service.mContext, this); + mSystemProvider = new SystemMediaRoute2Provider(service.mContext); mRouteProviders.add(mSystemProvider); mWatcher = new MediaRoute2ProviderWatcher(service.mContext, this, this, mUserRecord.mUserId); } + void init() { + mSystemProvider.setCallback(this); + } + private void start() { if (!mRunning) { mRunning = true; diff --git a/services/core/java/com/android/server/media/SystemMediaRoute2Provider.java b/services/core/java/com/android/server/media/SystemMediaRoute2Provider.java index d7e724780c94..bd39caa86338 100644 --- a/services/core/java/com/android/server/media/SystemMediaRoute2Provider.java +++ b/services/core/java/com/android/server/media/SystemMediaRoute2Provider.java @@ -98,12 +98,10 @@ class SystemMediaRoute2Provider extends MediaRoute2Provider { } }; - SystemMediaRoute2Provider(Context context, Callback callback) { + SystemMediaRoute2Provider(Context context) { super(sComponentName); - setCallback(callback); mIsSystemRouteProvider = true; - mContext = context; mHandler = new Handler(Looper.getMainLooper()); @@ -143,6 +141,13 @@ class SystemMediaRoute2Provider extends MediaRoute2Provider { } @Override + public void setCallback(Callback callback) { + super.setCallback(callback); + notifyProviderState(); + notifySessionInfoUpdated(); + } + + @Override public void requestCreateSession(long requestId, String packageName, String routeId, Bundle sessionHints) { // Assume a router without MODIFY_AUDIO_ROUTING permission can't request with @@ -354,6 +359,10 @@ class SystemMediaRoute2Provider extends MediaRoute2Provider { } void notifySessionInfoUpdated() { + if (mCallback == null) { + return; + } + RoutingSessionInfo sessionInfo; synchronized (mLock) { sessionInfo = mSessionInfos.get(0); |