Merge "Add task snapshot for home task"

This commit is contained in:
TreeHugger Robot
2019-12-16 08:42:31 +00:00
committed by Android (Google) Code Review
7 changed files with 85 additions and 17 deletions

View File

@@ -404,6 +404,14 @@ interface IActivityTaskManager {
*/
void setDisablePreviewScreenshots(IBinder token, boolean disable);
/**
* It should only be called from home activity to remove its outdated snapshot. The home
* snapshot is used to speed up entering home from screen off. If the content of home activity
* is significantly different from before taking the snapshot, then the home activity can use
* this method to avoid inconsistent transition.
*/
void invalidateHomeTaskSnapshot(IBinder homeToken);
/**
* Return the user id of last resumed activity.
*/

View File

@@ -28,6 +28,7 @@ import static android.app.WindowConfiguration.WINDOWING_MODE_SPLIT_SCREEN_SECOND
import static android.app.WindowConfiguration.WINDOWING_MODE_UNDEFINED;
import android.annotation.NonNull;
import android.app.Activity;
import android.app.ActivityManager;
import android.app.ActivityManager.RecentTaskInfo;
import android.app.ActivityManager.RunningTaskInfo;
@@ -160,6 +161,23 @@ public class ActivityManagerWrapper {
}
}
/**
* Removes the outdated snapshot of home task.
*/
public void invalidateHomeTaskSnapshot(final Activity homeActivity) {
mBackgroundExecutor.submit(new Runnable() {
@Override
public void run() {
try {
ActivityTaskManager.getService().invalidateHomeTaskSnapshot(
homeActivity.getActivityToken());
} catch (RemoteException e) {
Log.w(TAG, "Failed to invalidate home snapshot", e);
}
}
});
}
/**
* @return the activity label, badging if necessary.
*/

View File

@@ -157,6 +157,7 @@ import android.os.ServiceManager;
import android.os.StrictMode;
import android.os.SystemClock;
import android.os.SystemProperties;
import android.os.Trace;
import android.os.UEventObserver;
import android.os.UserHandle;
import android.os.VibrationEffect;
@@ -4603,6 +4604,7 @@ public class PhoneWindowManager implements WindowManagerPolicy {
public void screenTurningOn(final ScreenOnListener screenOnListener) {
if (DEBUG_WAKEUP) Slog.i(TAG, "Screen turning on...");
Trace.asyncTraceBegin(Trace.TRACE_TAG_WINDOW_MANAGER, "screenTurningOn", 0 /* cookie */);
updateScreenOffSleepToken(false);
mDefaultDisplayPolicy.screenTurnedOn(screenOnListener);
@@ -4665,6 +4667,7 @@ public class PhoneWindowManager implements WindowManagerPolicy {
if (!mDefaultDisplayPolicy.finishScreenTurningOn()) {
return; // Spurious or not ready yet.
}
Trace.asyncTraceEnd(Trace.TRACE_TAG_WINDOW_MANAGER, "screenTurningOn", 0 /* cookie */);
final boolean enableScreen;
final boolean awake = mDefaultDisplayPolicy.isAwake();

View File

@@ -1640,6 +1640,17 @@ final class ActivityRecord extends WindowToken implements WindowManagerService.A
allowTaskSnapshot, activityCreated, fromRecents, snapshot);
if (type == STARTING_WINDOW_TYPE_SNAPSHOT) {
if (isActivityTypeHome()) {
// The snapshot of home is only used once because it won't be updated while screen
// is on (see {@link TaskSnapshotController#screenTurningOff}).
mWmService.mTaskSnapshotController.removeSnapshotCache(task.mTaskId);
// TODO(b/9684093): Use more general condition to specify the case.
if (mDisplayContent.mAppTransition
.getAppTransition() != WindowManager.TRANSIT_KEYGUARD_GOING_AWAY) {
// Only use snapshot of home as starting window when unlocking.
return false;
}
}
return createSnapshot(snapshot);
}

View File

@@ -4572,6 +4572,17 @@ public class ActivityTaskManagerService extends IActivityTaskManager.Stub {
}
}
@Override
public void invalidateHomeTaskSnapshot(IBinder token) {
synchronized (mGlobalLock) {
final ActivityRecord r = ActivityRecord.isInStackLocked(token);
if (r == null || !r.isActivityTypeHome()) {
return;
}
mWindowManager.mTaskSnapshotController.removeSnapshotCache(r.getTask().mTaskId);
}
}
/** Return the user id of the last resumed activity. */
@Override
public @UserIdInt

View File

@@ -109,7 +109,7 @@ class TaskSnapshotCache {
removeRunningEntry(taskId);
}
private void removeRunningEntry(int taskId) {
void removeRunningEntry(int taskId) {
final CacheEntry entry = mRunningCache.get(taskId);
if (entry != null) {
mAppTaskMap.remove(entry.topApp);

View File

@@ -171,22 +171,30 @@ class TaskSnapshotController {
}
void snapshotTasks(ArraySet<Task> tasks) {
snapshotTasks(mTmpTasks, false /* allowSnapshotHome */);
}
private void snapshotTasks(ArraySet<Task> tasks, boolean allowSnapshotHome) {
for (int i = tasks.size() - 1; i >= 0; i--) {
final Task task = tasks.valueAt(i);
final int mode = getSnapshotMode(task);
final TaskSnapshot snapshot;
switch (mode) {
case SNAPSHOT_MODE_NONE:
continue;
case SNAPSHOT_MODE_APP_THEME:
snapshot = drawAppThemeSnapshot(task);
break;
case SNAPSHOT_MODE_REAL:
snapshot = snapshotTask(task);
break;
default:
snapshot = null;
break;
final boolean snapshotHome = allowSnapshotHome && task.isActivityTypeHome();
if (snapshotHome) {
snapshot = snapshotTask(task);
} else {
switch (getSnapshotMode(task)) {
case SNAPSHOT_MODE_NONE:
continue;
case SNAPSHOT_MODE_APP_THEME:
snapshot = drawAppThemeSnapshot(task);
break;
case SNAPSHOT_MODE_REAL:
snapshot = snapshotTask(task);
break;
default:
snapshot = null;
break;
}
}
if (snapshot != null) {
final GraphicBuffer buffer = snapshot.getSnapshot();
@@ -196,8 +204,11 @@ class TaskSnapshotController {
+ buffer.getHeight());
} else {
mCache.putSnapshot(task, snapshot);
mPersister.persistSnapshot(task.mTaskId, task.mUserId, snapshot);
task.onSnapshotChanged(snapshot);
// Don't persist or notify the change for the temporal snapshot.
if (!snapshotHome) {
mPersister.persistSnapshot(task.mTaskId, task.mUserId, snapshot);
task.onSnapshotChanged(snapshot);
}
}
}
}
@@ -450,6 +461,10 @@ class TaskSnapshotController {
mPersister.onTaskRemovedFromRecents(taskId, userId);
}
void removeSnapshotCache(int taskId) {
mCache.removeRunningEntry(taskId);
}
/**
* See {@link TaskSnapshotPersister#removeObsoleteFiles}
*/
@@ -485,7 +500,9 @@ class TaskSnapshotController {
mTmpTasks.add(task);
}
});
snapshotTasks(mTmpTasks);
// Allow taking snapshot of home when turning screen off to reduce the delay of
// unlocking/waking to home.
snapshotTasks(mTmpTasks, true /* allowSnapshotHome */);
}
} finally {
listener.onScreenOff();