diff options
| author | 2025-01-15 01:20:10 -0800 | |
|---|---|---|
| committer | 2025-01-15 01:20:10 -0800 | |
| commit | eb8c2e81d436bde139ae2d670f02dcc56edc995a (patch) | |
| tree | e5c9d9bcc15288ea260f8d0af1852bd4ee84bd96 | |
| parent | da692d34ffcd5dd2ef4a68b4fe6537c4e3a3ba18 (diff) | |
| parent | e2777eaf0d199613c56424a2a9573829b4eb9362 (diff) | |
Merge "Fix wallpaper dim race condition" into main
| -rw-r--r-- | core/java/android/service/wallpaper/WallpaperService.java | 63 |
1 files changed, 35 insertions, 28 deletions
diff --git a/core/java/android/service/wallpaper/WallpaperService.java b/core/java/android/service/wallpaper/WallpaperService.java index 990b099d616e..eeb56d4d6c05 100644 --- a/core/java/android/service/wallpaper/WallpaperService.java +++ b/core/java/android/service/wallpaper/WallpaperService.java @@ -325,6 +325,7 @@ public abstract class WallpaperService extends Service { IWindowSession mSession; final Object mLock = new Object(); + private final Object mSurfaceReleaseLock = new Object(); boolean mOffsetMessageEnqueued; @UnsupportedAppUsage(maxTargetSdk = Build.VERSION_CODES.P, trackingBug = 115609023) @@ -1075,9 +1076,11 @@ public abstract class WallpaperService extends Service { animator.setDuration(DIMMING_ANIMATION_DURATION_MS); animator.addUpdateListener((ValueAnimator va) -> { final float dimValue = (float) va.getAnimatedValue(); - if (mBbqSurfaceControl != null) { - surfaceControlTransaction - .setAlpha(mBbqSurfaceControl, 1 - dimValue).apply(); + synchronized (mSurfaceReleaseLock) { + if (mBbqSurfaceControl != null && mBbqSurfaceControl.isValid()) { + surfaceControlTransaction + .setAlpha(mBbqSurfaceControl, 1 - dimValue).apply(); + } } }); animator.addListener(new AnimatorListenerAdapter() { @@ -2356,35 +2359,39 @@ public abstract class WallpaperService extends Service { if (DEBUG) Log.v(TAG, "onDestroy(): " + this); onDestroy(); - if (mCreated) { - try { - if (DEBUG) Log.v(TAG, "Removing window and destroying surface " - + mSurfaceHolder.getSurface() + " of: " + this); + synchronized (mSurfaceReleaseLock) { + if (mCreated) { + try { + if (DEBUG) { + Log.v(TAG, "Removing window and destroying surface " + + mSurfaceHolder.getSurface() + " of: " + this); + } - if (mInputEventReceiver != null) { - mInputEventReceiver.dispose(); - mInputEventReceiver = null; - } + if (mInputEventReceiver != null) { + mInputEventReceiver.dispose(); + mInputEventReceiver = null; + } - mSession.remove(mWindow.asBinder()); - } catch (RemoteException e) { - } - mSurfaceHolder.mSurface.release(); - if (mBlastBufferQueue != null) { - mBlastBufferQueue.destroy(); - mBlastBufferQueue = null; - } - if (mBbqSurfaceControl != null) { - new SurfaceControl.Transaction().remove(mBbqSurfaceControl).apply(); - mBbqSurfaceControl = null; + mSession.remove(mWindow.asBinder()); + } catch (RemoteException e) { + } + mSurfaceHolder.mSurface.release(); + if (mBlastBufferQueue != null) { + mBlastBufferQueue.destroy(); + mBlastBufferQueue = null; + } + if (mBbqSurfaceControl != null) { + new SurfaceControl.Transaction().remove(mBbqSurfaceControl).apply(); + mBbqSurfaceControl = null; + } + mCreated = false; } - mCreated = false; - } - if (mSurfaceControl != null) { - mSurfaceControl.release(); - mSurfaceControl = null; - mRelayoutResult = null; + if (mSurfaceControl != null) { + mSurfaceControl.release(); + mSurfaceControl = null; + mRelayoutResult = null; + } } } |