Merge "Delay tryToRebind if application exit reason is LMK"
This commit is contained in:
@@ -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,20 +1454,51 @@ public class WallpaperManagerService extends IWallpaperManager.Stub
|
||||
&& 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.
|
||||
// This race is overcome by the general rule that we only reset the
|
||||
// wallpaper if its service was shut down twice
|
||||
// during {@link #MIN_WALLPAPER_CRASH_TIME} millis.
|
||||
if (mWallpaper.lastDiedTime != 0
|
||||
&& mWallpaper.lastDiedTime + MIN_WALLPAPER_CRASH_TIME
|
||||
> SystemClock.uptimeMillis()) {
|
||||
Slog.w(TAG, "Reverting to built-in wallpaper!");
|
||||
clearWallpaperLocked(true, FLAG_SYSTEM, mWallpaper.userId, null);
|
||||
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 {
|
||||
mWallpaper.lastDiedTime = SystemClock.uptimeMillis();
|
||||
tryToRebind();
|
||||
// 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.
|
||||
// This race is overcome by the general rule that we only reset the
|
||||
// wallpaper if its service was shut down twice
|
||||
// during {@link #MIN_WALLPAPER_CRASH_TIME} millis.
|
||||
if (mWallpaper.lastDiedTime != 0
|
||||
&& mWallpaper.lastDiedTime + MIN_WALLPAPER_CRASH_TIME
|
||||
> SystemClock.uptimeMillis()) {
|
||||
Slog.w(TAG, "Reverting to built-in wallpaper!");
|
||||
clearWallpaperLocked(true, FLAG_SYSTEM, mWallpaper.userId, null);
|
||||
} else {
|
||||
mWallpaper.lastDiedTime = SystemClock.uptimeMillis();
|
||||
tryToRebind();
|
||||
}
|
||||
}
|
||||
}
|
||||
} else {
|
||||
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user