diff options
| -rw-r--r-- | services/core/java/com/android/server/wallpaper/WallpaperManagerService.java | 63 |
1 files changed, 48 insertions, 15 deletions
diff --git a/services/core/java/com/android/server/wallpaper/WallpaperManagerService.java b/services/core/java/com/android/server/wallpaper/WallpaperManagerService.java index 8f64353a362d..c6b032b955fa 100644 --- a/services/core/java/com/android/server/wallpaper/WallpaperManagerService.java +++ b/services/core/java/com/android/server/wallpaper/WallpaperManagerService.java @@ -111,10 +111,12 @@ import java.io.PrintWriter; import java.nio.charset.StandardCharsets; import java.util.Arrays; import java.util.List; +import java.util.Objects; public class WallpaperManagerService extends IWallpaperManager.Stub { static final String TAG = "WallpaperManagerService"; static final boolean DEBUG = false; + static final boolean DEBUG_LIVE = DEBUG || true; public static class Lifecycle extends SystemService { private WallpaperManagerService mService; @@ -495,6 +497,11 @@ public class WallpaperManagerService extends IWallpaperManager.Stub { */ final ComponentName mImageWallpaper; + /** + * Name of the default wallpaper component; might be different from mImageWallpaper + */ + final ComponentName mDefaultWallpaperComponent; + final SparseArray<WallpaperData> mWallpaperMap = new SparseArray<WallpaperData>(); final SparseArray<WallpaperData> mLockWallpaperMap = new SparseArray<WallpaperData>(); @@ -581,6 +588,10 @@ public class WallpaperManagerService extends IWallpaperManager.Stub { boolean cropExists() { return cropFile.exists(); } + + boolean sourceExists() { + return wallpaperFile.exists(); + } } int makeWallpaperIdLocked() { @@ -595,7 +606,7 @@ public class WallpaperManagerService extends IWallpaperManager.Stub { /** Time in milliseconds until we expect the wallpaper to reconnect (unless we're in the * middle of an update). If exceeded, the wallpaper gets reset to the system default. */ - private static final long WALLPAPER_RECONNECT_TIMEOUT_MS = 5000; + private static final long WALLPAPER_RECONNECT_TIMEOUT_MS = 10000; final WallpaperInfo mInfo; final Binder mToken = new Binder(); @@ -611,7 +622,7 @@ public class WallpaperManagerService extends IWallpaperManager.Stub { synchronized (mLock) { if (mShuttingDown) { // Don't expect wallpaper services to relaunch during shutdown - if (DEBUG) { + if (DEBUG_LIVE) { Slog.i(TAG, "Ignoring relaunch timeout during shutdown"); } return; @@ -619,8 +630,8 @@ public class WallpaperManagerService extends IWallpaperManager.Stub { if (!mWallpaper.wallpaperUpdating && mWallpaper.userId == mCurrentUserId) { - Slog.w(TAG, "Wallpaper reconnect timed out, " - + "reverting to built-in wallpaper!"); + Slog.w(TAG, "Wallpaper reconnect timed out for " + mWallpaper.wallpaperComponent + + ", reverting to built-in wallpaper!"); clearWallpaperLocked(true, FLAG_SYSTEM, mWallpaper.userId, null); } @@ -654,9 +665,14 @@ public class WallpaperManagerService extends IWallpaperManager.Stub { mService = null; mEngine = null; if (mWallpaper.connection == this) { - Slog.w(TAG, "Wallpaper service gone: " + mWallpaper.wallpaperComponent); + // The wallpaper disappeared. If this isn't a system-default one, track + // crashes and fall back to default if it continues to misbehave. + final ComponentName wpService = mWallpaper.wallpaperComponent; + Slog.w(TAG, "Wallpaper service gone: " + wpService); if (!mWallpaper.wallpaperUpdating - && mWallpaper.userId == mCurrentUserId) { + && mWallpaper.userId == mCurrentUserId + && !Objects.equals(mDefaultWallpaperComponent, wpService) + && !Objects.equals(mImageWallpaper, wpService)) { // There is a race condition which causes // {@link #mWallpaper.wallpaperUpdating} to be false even if it is // currently updating since the broadcast notifying us is async. @@ -676,6 +692,9 @@ public class WallpaperManagerService extends IWallpaperManager.Stub { FgThread.getHandler().removeCallbacks(mResetRunnable); FgThread.getHandler().postDelayed(mResetRunnable, WALLPAPER_RECONNECT_TIMEOUT_MS); + if (DEBUG_LIVE) { + Slog.i(TAG, "Started wallpaper reconnect timeout for " + wpService); + } } final String flattened = name.flattenToString(); EventLog.writeEvent(EventLogTags.WP_WALLPAPER_CRASHED, @@ -744,14 +763,17 @@ public class WallpaperManagerService extends IWallpaperManager.Stub { } WallpaperData wallpaper = mWallpaperMap.get(mCurrentUserId); if (wallpaper != null) { - if (wallpaper.wallpaperComponent != null - && wallpaper.wallpaperComponent.getPackageName().equals(packageName)) { + final ComponentName wpService = wallpaper.wallpaperComponent; + if (wpService != null && wpService.getPackageName().equals(packageName)) { + if (DEBUG_LIVE) { + Slog.i(TAG, "Wallpaper " + wpService + " update has finished"); + } wallpaper.wallpaperUpdating = false; - ComponentName comp = wallpaper.wallpaperComponent; clearWallpaperComponentLocked(wallpaper); - if (!bindWallpaperComponentLocked(comp, false, false, + if (!bindWallpaperComponentLocked(wpService, false, false, wallpaper, null)) { - Slog.w(TAG, "Wallpaper no longer available; reverting to default"); + Slog.w(TAG, "Wallpaper " + wpService + + " no longer available; reverting to default"); clearWallpaperLocked(false, FLAG_SYSTEM, wallpaper.userId, null); } } @@ -786,6 +808,10 @@ public class WallpaperManagerService extends IWallpaperManager.Stub { if (wallpaper != null) { if (wallpaper.wallpaperComponent != null && wallpaper.wallpaperComponent.getPackageName().equals(packageName)) { + if (DEBUG_LIVE) { + Slog.i(TAG, "Wallpaper service " + wallpaper.wallpaperComponent + + " is updating"); + } wallpaper.wallpaperUpdating = true; if (wallpaper.connection != null) { FgThread.getHandler().removeCallbacks( @@ -880,6 +906,7 @@ public class WallpaperManagerService extends IWallpaperManager.Stub { mShuttingDown = false; mImageWallpaper = ComponentName.unflattenFromString( context.getResources().getString(R.string.image_wallpaper_component)); + mDefaultWallpaperComponent = WallpaperManager.getDefaultWallpaperComponent(context); mIWindowManager = IWindowManager.Stub.asInterface( ServiceManager.getService(Context.WINDOW_SERVICE)); mIPackageManager = AppGlobals.getPackageManager(); @@ -1583,7 +1610,9 @@ public class WallpaperManagerService extends IWallpaperManager.Stub { boolean bindWallpaperComponentLocked(ComponentName componentName, boolean force, boolean fromUser, WallpaperData wallpaper, IRemoteCallback reply) { - if (DEBUG) Slog.v(TAG, "bindWallpaperComponentLocked: componentName=" + componentName); + if (DEBUG_LIVE) { + Slog.v(TAG, "bindWallpaperComponentLocked: componentName=" + componentName); + } // Has the component changed? if (!force) { if (wallpaper.connection != null) { @@ -1603,13 +1632,13 @@ public class WallpaperManagerService extends IWallpaperManager.Stub { try { if (componentName == null) { - componentName = WallpaperManager.getDefaultWallpaperComponent(mContext); + componentName = mDefaultWallpaperComponent; if (componentName == null) { // Fall back to static image wallpaper componentName = mImageWallpaper; //clearWallpaperComponentLocked(); //return; - if (DEBUG) Slog.v(TAG, "Using image wallpaper"); + if (DEBUG_LIVE) Slog.v(TAG, "No default component; using image wallpaper"); } } int serviceUserId = wallpaper.userId; @@ -1987,7 +2016,11 @@ public class WallpaperManagerService extends IWallpaperManager.Stub { wallpaper.allowBackup = true; mWallpaperMap.put(userId, wallpaper); if (!wallpaper.cropExists()) { - generateCrop(wallpaper); + if (wallpaper.sourceExists()) { + generateCrop(wallpaper); + } else { + Slog.i(TAG, "No static wallpaper imagery; defaults will be shown"); + } } } boolean success = false; |