From 540d92d28cf91edc86e59a48223b898f63f6009a Mon Sep 17 00:00:00 2001 From: wilsonshih Date: Mon, 20 Jul 2020 17:38:31 +0800 Subject: [PATCH] Remove possible residual callbacks when detach wallpaper. Lower the chance for continuously bind same wallpaper service from tryToRebind and package update. No matter which one of them calls bind wallpaper first, as long as the bind sequence success, there will create a new wallpaper connection then detach previous one, at that time we should remove those possible residue callbacks on previous connection to make sure the connection is removed completely. Bug: 160279563 Test: atest WallpaperManagerTest WallpaperManagerServiceTests MultiDisplaySystemDecorationTests Change-Id: I4507b4aa5449ab960fb72dceddfcd83e4ae0a8bb --- .../wallpaper/WallpaperManagerService.java | 21 ++++++++++++------- 1 file changed, 13 insertions(+), 8 deletions(-) diff --git a/services/core/java/com/android/server/wallpaper/WallpaperManagerService.java b/services/core/java/com/android/server/wallpaper/WallpaperManagerService.java index 31fbaff17e78e..1300e657333c7 100644 --- a/services/core/java/com/android/server/wallpaper/WallpaperManagerService.java +++ b/services/core/java/com/android/server/wallpaper/WallpaperManagerService.java @@ -1175,9 +1175,7 @@ public class WallpaperManagerService extends IWallpaperManager.Stub } }; - private Runnable mTryToRebindRunnable = () -> { - tryToRebind(); - }; + private Runnable mTryToRebindRunnable = this::tryToRebind; WallpaperConnection(WallpaperInfo info, WallpaperData wallpaper, int clientUid) { mInfo = info; @@ -1310,14 +1308,14 @@ public class WallpaperManagerService extends IWallpaperManager.Stub // a short time in the future, specifically to allow any pending package // update message on this same looper thread to be processed. if (!mWallpaper.wallpaperUpdating) { - mContext.getMainThreadHandler().postDelayed(() -> processDisconnect(this), + mContext.getMainThreadHandler().postDelayed(mDisconnectRunnable, 1000); } } } } - public void scheduleTimeoutLocked() { + private void scheduleTimeoutLocked() { // If we didn't reset it right away, do so after we couldn't connect to // it for an extended amount of time to avoid having a black wallpaper. final Handler fgHandler = FgThread.getHandler(); @@ -1357,11 +1355,11 @@ public class WallpaperManagerService extends IWallpaperManager.Stub } } - private void processDisconnect(final ServiceConnection connection) { + private Runnable mDisconnectRunnable = () -> { synchronized (mLock) { // The wallpaper disappeared. If this isn't a system-default one, track // crashes and fall back to default if it continues to misbehave. - if (connection == mWallpaper.connection) { + if (this == mWallpaper.connection) { final ComponentName wpService = mWallpaper.wallpaperComponent; if (!mWallpaper.wallpaperUpdating && mWallpaper.userId == mCurrentUserId @@ -1389,7 +1387,7 @@ public class WallpaperManagerService extends IWallpaperManager.Stub } } } - } + }; /** * Called by a live wallpaper if its colors have changed. @@ -2801,6 +2799,13 @@ public class WallpaperManagerService extends IWallpaperManager.Stub WallpaperConnection.DisplayConnector::disconnectLocked); wallpaper.connection.mService = null; wallpaper.connection.mDisplayConnector.clear(); + + FgThread.getHandler().removeCallbacks(wallpaper.connection.mResetRunnable); + mContext.getMainThreadHandler().removeCallbacks( + wallpaper.connection.mDisconnectRunnable); + mContext.getMainThreadHandler().removeCallbacks( + wallpaper.connection.mTryToRebindRunnable); + wallpaper.connection = null; if (wallpaper == mLastWallpaper) mLastWallpaper = null; }