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
This commit is contained in:
@@ -1228,6 +1228,7 @@ public class WallpaperManagerService extends IWallpaperManager.Stub
|
||||
saveSettingsLocked(mWallpaper.userId);
|
||||
}
|
||||
FgThread.getHandler().removeCallbacks(mResetRunnable);
|
||||
mContext.getMainThreadHandler().removeCallbacks(this::tryToRebind);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1270,6 +1271,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
|
||||
@@ -1293,20 +1322,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) {
|
||||
|
||||
Reference in New Issue
Block a user