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

Commit 7378b084 authored by Vijay Kumar's avatar Vijay Kumar Committed by Koji Fukui
Browse files

Delay tryToRebind if application exit reason is LMK

Live Wallpaper should fallback to Default Wallpaper only when there is
an issue with Live Wallpaper. For any other reason if the application
exits for example Live Wallpaper is exited because of LMK and fallback
happened to Default WallPaper, which is not expected behavior.

This change will check if application exit reason is LMK and device is
on running on low memory then will try to rebind after 10 seconds. If
the device is running on sufficient memory then we will try to avoid
repeated rebinds, we are restricting with retries rebind count as 3 and
if lmk situation is not improved during the 3 trials and live wallpaper
is not set, then set the default image wallpaper.

Bug: 266364123
Test: Manual - Fill the RAM using a memory fill application.
Change-Id: I6dd2daccfdb1bd3f1c8f6ca245ab2d0aee373b56
parent d52e734a
Loading
Loading
Loading
Loading
+58 −13
Original line number Diff line number Diff line
@@ -36,6 +36,7 @@ import android.annotation.NonNull;
import android.app.ActivityManager;
import android.app.AppGlobals;
import android.app.AppOpsManager;
import android.app.ApplicationExitInfo;
import android.app.ILocalWallpaperColorConsumer;
import android.app.IWallpaperManager;
import android.app.IWallpaperManagerCallback;
@@ -189,6 +190,10 @@ public class WallpaperManagerService extends IWallpaperManager.Stub

    private final Object mLock = new Object();

    private static final double LMK_LOW_THRESHOLD_MEMORY_PERCENTAGE = 10;
    private static final int LMK_RECONNECT_REBIND_RETRIES = 3;
    private static final long LMK_RECONNECT_DELAY_MS = 5000;

    /**
     * Minimum time between crashes of a wallpaper service for us to consider
     * restarting it vs. just reverting to the static wallpaper.
@@ -1208,6 +1213,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 = 10000;
        private int mLmkLimitRebindRetries = LMK_RECONNECT_REBIND_RETRIES;

        final WallpaperInfo mInfo;
        IWallpaperService mService;
@@ -1448,6 +1454,36 @@ public class WallpaperManagerService extends IWallpaperManager.Stub
                            && mWallpaper.userId == mCurrentUserId
                            && !Objects.equals(mDefaultWallpaperComponent, wpService)
                            && !Objects.equals(mImageWallpaper, wpService)) {
                        List<ApplicationExitInfo> reasonList =
                                mActivityManager.getHistoricalProcessExitReasons(
                                wpService.getPackageName(), 0, 1);
                        int exitReason = ApplicationExitInfo.REASON_UNKNOWN;
                        if (reasonList != null && !reasonList.isEmpty()) {
                            ApplicationExitInfo info = reasonList.get(0);
                            exitReason = info.getReason();
                        }
                        Slog.d(TAG, "exitReason: " + exitReason);
                        // If exit reason is LOW_MEMORY_KILLER
                        // delay the mTryToRebindRunnable for 10s
                        if (exitReason == ApplicationExitInfo.REASON_LOW_MEMORY) {
                            if (isRunningOnLowMemory()) {
                                Slog.i(TAG, "Rebind is delayed due to lmk");
                                mContext.getMainThreadHandler().postDelayed(mTryToRebindRunnable,
                                        LMK_RECONNECT_DELAY_MS);
                                mLmkLimitRebindRetries = LMK_RECONNECT_REBIND_RETRIES;
                            } else {
                                if (mLmkLimitRebindRetries <= 0) {
                                    Slog.w(TAG, "Reverting to built-in wallpaper due to lmk!");
                                    clearWallpaperLocked(true, FLAG_SYSTEM, mWallpaper.userId,
                                            null);
                                    mLmkLimitRebindRetries = LMK_RECONNECT_REBIND_RETRIES;
                                    return;
                                }
                                mLmkLimitRebindRetries--;
                                mContext.getMainThreadHandler().postDelayed(mTryToRebindRunnable,
                                        LMK_RECONNECT_DELAY_MS);
                            }
                        } else {
                            // 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.
@@ -1464,6 +1500,7 @@ public class WallpaperManagerService extends IWallpaperManager.Stub
                                tryToRebind();
                            }
                        }
                    }
                } else {
                    if (DEBUG_LIVE) {
                        Slog.i(TAG, "Wallpaper changed during disconnect tracking; ignoring");
@@ -1472,6 +1509,14 @@ public class WallpaperManagerService extends IWallpaperManager.Stub
            }
        };

        private boolean isRunningOnLowMemory() {
            ActivityManager.MemoryInfo memoryInfo = new ActivityManager.MemoryInfo();
            mActivityManager.getMemoryInfo(memoryInfo);
            double availableMBsInPercentage = memoryInfo.availMem / (double)memoryInfo.totalMem *
                    100.0;
            return availableMBsInPercentage < LMK_LOW_THRESHOLD_MEMORY_PERCENTAGE;
        }

        /**
         * Called by a live wallpaper if its colors have changed.
         * @param primaryColors representation of wallpaper primary colors