From 36c328b56505cd6cdd7d9e5e6187cf166c312cc9 Mon Sep 17 00:00:00 2001 From: wilsonshih Date: Wed, 9 Oct 2019 20:50:44 +0800 Subject: [PATCH] Try to rebind disconnected wallpaper service for 10 seconds. When we received the wallpaper service disconnected, we could not immediately know the reason for the disconnection, so if the service was disconnected because the package was updating, and we received the update broadcast after 1 second, in original design we will only revert to the built-in wallpaper. However, it will be too late to bind the original service after we receiving the package update broadcast. In this CL, if currently wallpaper service is accidentally disconnected, we will try to re-bind it for 10 seconds. Fix: 138973259 Test: Manual install wallpaper service and delay the package update broadcast on purpose, verify the service can be bind back. Test: atest WallpaperManagerTest Change-Id: I11891098164372002b36c558f670621d8c852af8 (cherry picked from commit b87530296b3b42638138d90effdc8dcb067206f1) --- .../server/wallpaper/WallpaperManagerService.java | 43 +++++++++++++++------- 1 file changed, 30 insertions(+), 13 deletions(-) diff --git a/services/core/java/com/android/server/wallpaper/WallpaperManagerService.java b/services/core/java/com/android/server/wallpaper/WallpaperManagerService.java index b0f1e5d69be4..ead9acda873e 100644 --- a/services/core/java/com/android/server/wallpaper/WallpaperManagerService.java +++ b/services/core/java/com/android/server/wallpaper/WallpaperManagerService.java @@ -1237,6 +1237,7 @@ public class WallpaperManagerService extends IWallpaperManager.Stub saveSettingsLocked(mWallpaper.userId); } FgThread.getHandler().removeCallbacks(mResetRunnable); + mContext.getMainThreadHandler().removeCallbacks(this::tryToRebind); } } } @@ -1279,6 +1280,34 @@ public class WallpaperManagerService extends IWallpaperManager.Stub } } + private void tryToRebind() { + synchronized (mLock) { + if (mWallpaper.wallpaperUpdating) { + return; + } + final ComponentName wpService = mWallpaper.wallpaperComponent; + // The broadcast of package update could be delayed after service disconnected. Try + // to re-bind the service for 10 seconds. + if (bindWallpaperComponentLocked( + wpService, true, false, mWallpaper, null)) { + mWallpaper.connection.scheduleTimeoutLocked(); + } else if (SystemClock.uptimeMillis() - mWallpaper.lastDiedTime + < WALLPAPER_RECONNECT_TIMEOUT_MS) { + // Bind fail without timeout, schedule rebind + Slog.w(TAG, "Rebind fail! Try again later"); + mContext.getMainThreadHandler().postDelayed(this::tryToRebind, 1000); + } else { + // Timeout + Slog.w(TAG, "Reverting to built-in wallpaper!"); + clearWallpaperLocked(true, FLAG_SYSTEM, mWallpaper.userId, null); + final String flattened = wpService.flattenToString(); + EventLog.writeEvent(EventLogTags.WP_WALLPAPER_CRASHED, + flattened.substring(0, Math.min(flattened.length(), + MAX_WALLPAPER_COMPONENT_LOG_LENGTH))); + } + } + } + private void processDisconnect(final ServiceConnection connection) { synchronized (mLock) { // The wallpaper disappeared. If this isn't a system-default one, track @@ -1302,20 +1331,8 @@ public class WallpaperManagerService extends IWallpaperManager.Stub clearWallpaperLocked(true, FLAG_SYSTEM, mWallpaper.userId, null); } else { mWallpaper.lastDiedTime = SystemClock.uptimeMillis(); - - clearWallpaperComponentLocked(mWallpaper); - if (bindWallpaperComponentLocked( - wpService, false, false, mWallpaper, null)) { - mWallpaper.connection.scheduleTimeoutLocked(); - } else { - Slog.w(TAG, "Reverting to built-in wallpaper!"); - clearWallpaperLocked(true, FLAG_SYSTEM, mWallpaper.userId, null); - } + tryToRebind(); } - final String flattened = wpService.flattenToString(); - EventLog.writeEvent(EventLogTags.WP_WALLPAPER_CRASHED, - flattened.substring(0, Math.min(flattened.length(), - MAX_WALLPAPER_COMPONENT_LOG_LENGTH))); } } else { if (DEBUG_LIVE) { -- 2.11.0