Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 56a70e38 authored by Adrian Roos's avatar Adrian Roos Committed by Android (Google) Code Review
Browse files

Merge "Fix black wallpaper after repeated crashes" into nyc-mr1-dev

parents 5119df7f c3f915e4
Loading
Loading
Loading
Loading
+29 −0
Original line number Diff line number Diff line
@@ -89,6 +89,7 @@ import com.android.internal.os.BackgroundThread;
import com.android.internal.util.FastXmlSerializer;
import com.android.internal.util.JournaledFile;
import com.android.server.EventLogTags;
import com.android.server.FgThread;
import com.android.server.SystemService;

import libcore.io.IoUtils;
@@ -589,6 +590,11 @@ public class WallpaperManagerService extends IWallpaperManager.Stub {

    class WallpaperConnection extends IWallpaperConnection.Stub
            implements ServiceConnection {

        /** 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;

        final WallpaperInfo mInfo;
        final Binder mToken = new Binder();
        IWallpaperService mService;
@@ -599,6 +605,18 @@ public class WallpaperManagerService extends IWallpaperManager.Stub {
        boolean mDimensionsChanged = false;
        boolean mPaddingChanged = false;

        private Runnable mResetRunnable = () -> {
            synchronized (mLock) {
                if (!mWallpaper.wallpaperUpdating
                        && mWallpaper.userId == mCurrentUserId) {
                    Slog.w(TAG, "Wallpaper reconnect timed out, "
                            + "reverting to built-in wallpaper!");
                    clearWallpaperLocked(true, FLAG_SYSTEM, mWallpaper.userId,
                            null);
                }
            }
        };

        public WallpaperConnection(WallpaperInfo info, WallpaperData wallpaper) {
            mInfo = info;
            mWallpaper = wallpaper;
@@ -615,6 +633,7 @@ public class WallpaperManagerService extends IWallpaperManager.Stub {
                    // locking there and anyway we always need to be able to
                    // recover if there is something wrong.
                    saveSettingsLocked(mWallpaper.userId);
                    FgThread.getHandler().removeCallbacks(mResetRunnable);
                }
            }
        }
@@ -641,6 +660,12 @@ public class WallpaperManagerService extends IWallpaperManager.Stub {
                            clearWallpaperLocked(true, FLAG_SYSTEM, mWallpaper.userId, null);
                        } else {
                            mWallpaper.lastDiedTime = SystemClock.uptimeMillis();

                            // 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.
                            FgThread.getHandler().removeCallbacks(mResetRunnable);
                            FgThread.getHandler().postDelayed(mResetRunnable,
                                    WALLPAPER_RECONNECT_TIMEOUT_MS);
                        }
                        final String flattened = name.flattenToString();
                        EventLog.writeEvent(EventLogTags.WP_WALLPAPER_CRASHED,
@@ -752,6 +777,10 @@ public class WallpaperManagerService extends IWallpaperManager.Stub {
                    if (wallpaper.wallpaperComponent != null
                            && wallpaper.wallpaperComponent.getPackageName().equals(packageName)) {
                        wallpaper.wallpaperUpdating = true;
                        if (wallpaper.connection != null) {
                            FgThread.getHandler().removeCallbacks(
                                    wallpaper.connection.mResetRunnable);
                        }
                    }
                }
            }