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

Commit 36c328b5 authored by wilsonshih's avatar wilsonshih Committed by Wei Sheng Shih
Browse files

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 b8753029)
parent fc07949b
Loading
Loading
Loading
Loading
+30 −13
Original line number Diff line number Diff line
@@ -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,21 +1331,9 @@ 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) {
                        Slog.i(TAG, "Wallpaper changed during disconnect tracking; ignoring");