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
This commit is contained in:
@@ -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<ThumbnailData> 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<ThumbnailData> 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;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user