From 5bb63c916e757ca90a3ad56ccb6a8e340bb4fcab Mon Sep 17 00:00:00 2001 From: Peter Kalauskas Date: Fri, 24 Jan 2020 18:51:13 -0800 Subject: [PATCH] Toggle loading state based on config_lowResTaskSnapshotScale Change high res loading state implementation to toggle on/off based on config_lowResTaskSnapshotScale!=0 instead of ro.config.low_ram=true Test: TaskSnapshotCacheTest Test: TaskSnapshotControllerTest Test: TaskSnapshotPersisterLoaderTest Test: TaskSnapshotSurfaceTest Bug: 148099851 Change-Id: I316e553a8a13fe38f1224c38f7aa717a0f628f57 --- .../android/quickstep/TaskThumbnailCache.java | 47 ++++++++++++------- 1 file changed, 31 insertions(+), 16 deletions(-) diff --git a/quickstep/src/com/android/quickstep/TaskThumbnailCache.java b/quickstep/src/com/android/quickstep/TaskThumbnailCache.java index 93bb75b520..ace674383e 100644 --- a/quickstep/src/com/android/quickstep/TaskThumbnailCache.java +++ b/quickstep/src/com/android/quickstep/TaskThumbnailCache.java @@ -17,7 +17,6 @@ package com.android.quickstep; import static com.android.launcher3.util.Executors.MAIN_EXECUTOR; -import android.app.ActivityManager; import android.content.Context; import android.content.res.Resources; import android.os.Handler; @@ -46,7 +45,7 @@ public class TaskThumbnailCache { private final boolean mEnableTaskSnapshotPreloading; public static class HighResLoadingState { - private boolean mIsLowRamDevice; + private boolean mForceHighResThumbnails; private boolean mVisible; private boolean mFlingingFast; private boolean mHighResLoadingEnabled; @@ -57,9 +56,9 @@ public class TaskThumbnailCache { } private HighResLoadingState(Context context) { - ActivityManager activityManager = - (ActivityManager) context.getSystemService(Context.ACTIVITY_SERVICE); - mIsLowRamDevice = activityManager.isLowRamDevice(); + // If the device does not support low-res thumbnails, only attempt to load high-res + // thumbnails + mForceHighResThumbnails = !supportsLowResThumbnails(); } public void addCallback(HighResLoadingStateChangedCallback callback) { @@ -86,7 +85,7 @@ public class TaskThumbnailCache { private void updateState() { boolean prevState = mHighResLoadingEnabled; - mHighResLoadingEnabled = !mIsLowRamDevice && mVisible && !mFlingingFast; + mHighResLoadingEnabled = mForceHighResThumbnails || (mVisible && !mFlingingFast); if (prevState != mHighResLoadingEnabled) { for (int i = mCallbacks.size() - 1; i >= 0; i--) { mCallbacks.get(i).onHighResLoadingStateChanged(mHighResLoadingEnabled); @@ -112,7 +111,7 @@ public class TaskThumbnailCache { Preconditions.assertUIThread(); // Fetch the thumbnail for this task and put it in the cache if (task.thumbnail == null) { - updateThumbnailInBackground(task.key, true /* reducedResolution */, + updateThumbnailInBackground(task.key, true /* lowResolution */, t -> task.thumbnail = t); } } @@ -135,8 +134,8 @@ public class TaskThumbnailCache { Task task, Consumer callback) { Preconditions.assertUIThread(); - boolean reducedResolution = !mHighResLoadingState.isEnabled(); - if (task.thumbnail != null && (!task.thumbnail.reducedResolution || reducedResolution)) { + boolean lowResolution = !mHighResLoadingState.isEnabled(); + if (task.thumbnail != null && (!task.thumbnail.reducedResolution || lowResolution)) { // Nothing to load, the thumbnail is already high-resolution or matches what the // request, so just callback callback.accept(task.thumbnail); @@ -150,23 +149,23 @@ public class TaskThumbnailCache { }); } - private ThumbnailLoadRequest updateThumbnailInBackground(TaskKey key, boolean reducedResolution, + private ThumbnailLoadRequest updateThumbnailInBackground(TaskKey key, boolean lowResolution, Consumer callback) { Preconditions.assertUIThread(); ThumbnailData cachedThumbnail = mCache.getAndInvalidateIfModified(key); - if (cachedThumbnail != null && (!cachedThumbnail.reducedResolution || reducedResolution)) { + if (cachedThumbnail != null && (!cachedThumbnail.reducedResolution || lowResolution)) { // Already cached, lets use that thumbnail callback.accept(cachedThumbnail); return null; } ThumbnailLoadRequest request = new ThumbnailLoadRequest(mBackgroundHandler, - reducedResolution) { + lowResolution) { @Override public void run() { ThumbnailData thumbnail = ActivityManagerWrapper.getInstance().getTaskThumbnail( - key.id, reducedResolution); + key.id, lowResolution); if (isCanceled()) { // We don't call back to the provided callback in this case return; @@ -218,11 +217,27 @@ public class TaskThumbnailCache { } public static abstract class ThumbnailLoadRequest extends HandlerRunnable { - public final boolean reducedResolution; + public final boolean mLowResolution; - ThumbnailLoadRequest(Handler handler, boolean reducedResolution) { + ThumbnailLoadRequest(Handler handler, boolean lowResolution) { super(handler, null); - this.reducedResolution = reducedResolution; + mLowResolution = lowResolution; } } + + /** + * @return Whether device supports low-res thumbnails. Low-res files are an optimization + * for faster load times of snapshots. Devices can optionally disable low-res files so that + * they only store snapshots at high-res scale. The actual scale can be configured in + * frameworks/base config overlay. + */ + private static boolean supportsLowResThumbnails() { + Resources res = Resources.getSystem(); + int resId = res.getIdentifier("config_lowResTaskSnapshotScale", "dimen", "android"); + if (resId != 0) { + return 0 < res.getFloat(resId); + } + return true; + } + }