summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
author Aurélien Pomini <pomini@google.com> 2025-01-15 01:20:10 -0800
committer Android (Google) Code Review <android-gerrit@google.com> 2025-01-15 01:20:10 -0800
commiteb8c2e81d436bde139ae2d670f02dcc56edc995a (patch)
treee5c9d9bcc15288ea260f8d0af1852bd4ee84bd96
parentda692d34ffcd5dd2ef4a68b4fe6537c4e3a3ba18 (diff)
parente2777eaf0d199613c56424a2a9573829b4eb9362 (diff)
Merge "Fix wallpaper dim race condition" into main
-rw-r--r--core/java/android/service/wallpaper/WallpaperService.java63
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;
+ }
}
}