Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit a3aec618 authored by Gyumin Sim's avatar Gyumin Sim
Browse files

Ensure MediaSession2Record is initialized before used

NPE happens at mController.close() if session is destroyed while the
MediaController2 instance is being created in the constructor of
MediaSession2Record. It ensures the MediaSession2Record instance is
initialized before the instance is used by Controller2Callback.

Bug: 189119798
Fix: 189119798
Test: atest CtsMediaTestCases:android.media.cts.MediaSessionTest
Change-Id: I23ca2f3dbc657ac38f4154a0fb428a4c25e6b5ad
parent a0ecdaaf
Loading
Loading
Loading
Loading
+22 −10
Original line number Diff line number Diff line
@@ -56,6 +56,9 @@ public class MediaSession2Record implements MediaSessionRecordImpl {

    public MediaSession2Record(Session2Token sessionToken, MediaSessionService service,
            Looper handlerLooper, int policies) {
        // The lock is required to prevent `Controller2Callback` from using partially initialized
        // `MediaSession2Record.this`.
        synchronized (mLock) {
            mSessionToken = sessionToken;
            mService = service;
            mHandlerExecutor = new HandlerExecutor(new Handler(handlerLooper));
@@ -64,6 +67,7 @@ public class MediaSession2Record implements MediaSessionRecordImpl {
                    .build();
            mPolicies = policies;
        }
    }

    @Override
    public String getPackageName() {
@@ -176,10 +180,12 @@ public class MediaSession2Record implements MediaSessionRecordImpl {
            if (DEBUG) {
                Log.d(TAG, "connected to " + mSessionToken + ", allowed=" + allowedCommands);
            }
            MediaSessionService service;
            synchronized (mLock) {
                mIsConnected = true;
                service = mService;
            }
            mService.onSessionActiveStateChanged(MediaSession2Record.this);
            service.onSessionActiveStateChanged(MediaSession2Record.this);
        }

        @Override
@@ -187,10 +193,12 @@ public class MediaSession2Record implements MediaSessionRecordImpl {
            if (DEBUG) {
                Log.d(TAG, "disconnected from " + mSessionToken);
            }
            MediaSessionService service;
            synchronized (mLock) {
                mIsConnected = false;
                service = mService;
            }
            mService.onSessionDied(MediaSession2Record.this);
            service.onSessionDied(MediaSession2Record.this);
        }

        @Override
@@ -199,7 +207,11 @@ public class MediaSession2Record implements MediaSessionRecordImpl {
                Log.d(TAG, "playback active changed, " + mSessionToken + ", active="
                        + playbackActive);
            }
            mService.onSessionPlaybackStateChanged(MediaSession2Record.this, playbackActive);
            MediaSessionService service;
            synchronized (mLock) {
                service = mService;
            }
            service.onSessionPlaybackStateChanged(MediaSession2Record.this, playbackActive);
        }
    }
}