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

Commit c9c7ebb4 authored by Ahan Wu's avatar Ahan Wu
Browse files

Fix potential NPE while releasing worker thread of ImageWallpaper

We nullify mWorker right in ImageWallpaper#destroy(),
we might get NPE if postRender is invoked later.
Thus, we add null check to avoid NPE.

Bug: 144039509
Bug: 146167292
Test: atest com.android.systemui
Test: atest CtsMultiUserHostTestCases
Change-Id: Idff558cbdbfa96df3154eb726a36645ee847c0bd
parent 10d16e52
Loading
Loading
Loading
Loading
+8 −2
Original line number Diff line number Diff line
@@ -168,12 +168,13 @@ public class ImageWallpaper extends WallpaperService {
        @Override
        public void onOffsetsChanged(float xOffset, float yOffset, float xOffsetStep,
                float yOffsetStep, int xPixelOffset, int yPixelOffset) {
            if (mWorker == null) return;
            mWorker.getThreadHandler().post(() -> mRenderer.updateOffsets(xOffset, yOffset));
        }

        @Override
        public void onAmbientModeChanged(boolean inAmbientMode, long animationDuration) {
            if (!mNeedTransition) return;
            if (mWorker == null || !mNeedTransition) return;
            final long duration = mShouldStopTransition ? 0 : animationDuration;
            if (DEBUG) {
                Log.d(TAG, "onAmbientModeChanged: inAmbient=" + inAmbientMode
@@ -223,6 +224,7 @@ public class ImageWallpaper extends WallpaperService {
        @Override
        public void onSurfaceCreated(SurfaceHolder holder) {
            mShouldStopTransition = checkIfShouldStopTransition();
            if (mWorker == null) return;
            mWorker.getThreadHandler().post(() -> {
                mEglHelper.init(holder, needSupportWideColorGamut());
                mRenderer.onSurfaceCreated();
@@ -231,6 +233,7 @@ public class ImageWallpaper extends WallpaperService {

        @Override
        public void onSurfaceChanged(SurfaceHolder holder, int format, int width, int height) {
            if (mWorker == null) return;
            mWorker.getThreadHandler().post(() -> {
                mRenderer.onSurfaceChanged(width, height);
                mNeedRedraw = true;
@@ -239,6 +242,7 @@ public class ImageWallpaper extends WallpaperService {

        @Override
        public void onSurfaceRedrawNeeded(SurfaceHolder holder) {
            if (mWorker == null) return;
            if (DEBUG) {
                Log.d(TAG, "onSurfaceRedrawNeeded: mNeedRedraw=" + mNeedRedraw);
            }
@@ -267,7 +271,7 @@ public class ImageWallpaper extends WallpaperService {
        @Override
        public void onStatePostChange() {
            // When back to home, we try to release EGL, which is preserved in lock screen or aod.
            if (mController.getState() == StatusBarState.SHADE) {
            if (mWorker != null && mController.getState() == StatusBarState.SHADE) {
                mWorker.getThreadHandler().post(this::scheduleFinishRendering);
            }
        }
@@ -356,10 +360,12 @@ public class ImageWallpaper extends WallpaperService {
        }

        private void cancelFinishRenderingTask() {
            if (mWorker == null) return;
            mWorker.getThreadHandler().removeCallbacks(mFinishRenderingTask);
        }

        private void scheduleFinishRendering() {
            if (mWorker == null) return;
            cancelFinishRenderingTask();
            mWorker.getThreadHandler().postDelayed(mFinishRenderingTask, DELAY_FINISH_RENDERING);
        }