Merge "Fix snapshot starting window stuck if the task never gain focus" into sc-v2-dev

This commit is contained in:
Wei Sheng Shih
2021-10-06 03:00:48 +00:00
committed by Android (Google) Code Review
18 changed files with 205 additions and 109 deletions

View File

@@ -3191,13 +3191,6 @@ package android.window {
method @Nullable public android.view.View getBrandingView();
}
public final class StartingWindowInfo implements android.os.Parcelable {
ctor public StartingWindowInfo();
method public int describeContents();
method public void writeToParcel(@NonNull android.os.Parcel, int);
field @NonNull public static final android.os.Parcelable.Creator<android.window.StartingWindowInfo> CREATOR;
}
public final class TaskAppearedInfo implements android.os.Parcelable {
ctor public TaskAppearedInfo(@NonNull android.app.ActivityManager.RunningTaskInfo, @NonNull android.view.SurfaceControl);
method public int describeContents();
@@ -3264,7 +3257,6 @@ package android.window {
public class TaskOrganizer extends android.window.WindowOrganizer {
ctor public TaskOrganizer();
method @BinderThread public void addStartingWindow(@NonNull android.window.StartingWindowInfo, @NonNull android.os.IBinder);
method @BinderThread public void copySplashScreenView(int);
method @Nullable @RequiresPermission(android.Manifest.permission.MANAGE_ACTIVITY_TASKS) public void createRootTask(int, int, @Nullable android.os.IBinder);
method @RequiresPermission(android.Manifest.permission.MANAGE_ACTIVITY_TASKS) public boolean deleteRootTask(@NonNull android.window.WindowContainerToken);
@@ -3277,7 +3269,6 @@ package android.window {
method @BinderThread public void onTaskInfoChanged(@NonNull android.app.ActivityManager.RunningTaskInfo);
method @BinderThread public void onTaskVanished(@NonNull android.app.ActivityManager.RunningTaskInfo);
method @CallSuper @NonNull @RequiresPermission(android.Manifest.permission.MANAGE_ACTIVITY_TASKS) public java.util.List<android.window.TaskAppearedInfo> registerOrganizer();
method @BinderThread public void removeStartingWindow(int, @Nullable android.view.SurfaceControl, @Nullable android.graphics.Rect, boolean);
method @RequiresPermission(android.Manifest.permission.MANAGE_ACTIVITY_TASKS) public void setInterceptBackPressedOnTaskRoot(@NonNull android.window.WindowContainerToken, boolean);
method @CallSuper @RequiresPermission(android.Manifest.permission.MANAGE_ACTIVITY_TASKS) public void unregisterOrganizer();
}

View File

@@ -20,6 +20,7 @@ import android.view.SurfaceControl;
import android.app.ActivityManager;
import android.graphics.Rect;
import android.window.StartingWindowInfo;
import android.window.StartingWindowRemovalInfo;
import android.window.WindowContainerToken;
/**
@@ -39,12 +40,9 @@ oneway interface ITaskOrganizer {
/**
* Called when the Task want to remove the starting window.
* @param leash A persistent leash for the top window in this task.
* @param frame Window frame of the top window.
* @param playRevealAnimation Play vanish animation.
* @param removalInfo The information used to remove the starting window.
*/
void removeStartingWindow(int taskId, in SurfaceControl leash, in Rect frame,
in boolean playRevealAnimation);
void removeStartingWindow(in StartingWindowRemovalInfo removalInfo);
/**
* Called when the Task want to copy the splash screen.

View File

@@ -19,7 +19,6 @@ package android.window;
import android.annotation.IntDef;
import android.annotation.NonNull;
import android.annotation.Nullable;
import android.annotation.TestApi;
import android.app.ActivityManager;
import android.app.TaskInfo;
import android.content.pm.ActivityInfo;
@@ -34,7 +33,6 @@ import android.view.WindowManager;
* start in the system.
* @hide
*/
@TestApi
public final class StartingWindowInfo implements Parcelable {
/**
* Prefer nothing or not care the type of starting window.

View File

@@ -0,0 +1,20 @@
/**
* Copyright (c) 2021, The Android Open Source Project
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package android.window;
/** @hide */
parcelable StartingWindowRemovalInfo;

View File

@@ -0,0 +1,111 @@
/*
* Copyright (C) 2021 The Android Open Source Project
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package android.window;
import android.annotation.NonNull;
import android.annotation.Nullable;
import android.graphics.Rect;
import android.os.Parcel;
import android.os.Parcelable;
import android.view.SurfaceControl;
/**
* Information when removing a starting window of a particular task.
* @hide
*/
public final class StartingWindowRemovalInfo implements Parcelable {
/**
* The identifier of a task.
* @hide
*/
public int taskId;
/**
* The animation container layer of the top activity.
* @hide
*/
@Nullable
public SurfaceControl windowAnimationLeash;
/**
* The main window frame for the window of the top activity.
* @hide
*/
@Nullable
public Rect mainFrame;
/**
* Whether need to play reveal animation.
* @hide
*/
public boolean playRevealAnimation;
/**
* Whether need to defer removing the starting window for IME.
* @hide
*/
public boolean deferRemoveForIme;
public StartingWindowRemovalInfo() {
}
private StartingWindowRemovalInfo(@NonNull Parcel source) {
readFromParcel(source);
}
@Override
public int describeContents() {
return 0;
}
void readFromParcel(@NonNull Parcel source) {
taskId = source.readInt();
windowAnimationLeash = source.readTypedObject(SurfaceControl.CREATOR);
mainFrame = source.readTypedObject(Rect.CREATOR);
playRevealAnimation = source.readBoolean();
deferRemoveForIme = source.readBoolean();
}
@Override
public void writeToParcel(@NonNull Parcel dest, int flags) {
dest.writeInt(taskId);
dest.writeTypedObject(windowAnimationLeash, flags);
dest.writeTypedObject(mainFrame, flags);
dest.writeBoolean(playRevealAnimation);
dest.writeBoolean(deferRemoveForIme);
}
@Override
public String toString() {
return "StartingWindowRemovalInfo{taskId=" + taskId
+ " frame=" + mainFrame
+ " playRevealAnimation=" + playRevealAnimation
+ " deferRemoveForIme=" + deferRemoveForIme + "}";
}
public static final @android.annotation.NonNull Creator<StartingWindowRemovalInfo> CREATOR =
new Creator<StartingWindowRemovalInfo>() {
public StartingWindowRemovalInfo createFromParcel(@NonNull Parcel source) {
return new StartingWindowRemovalInfo(source);
}
public StartingWindowRemovalInfo[] newArray(int size) {
return new StartingWindowRemovalInfo[size];
}
};
}

View File

@@ -24,7 +24,6 @@ import android.annotation.RequiresPermission;
import android.annotation.SuppressLint;
import android.annotation.TestApi;
import android.app.ActivityManager;
import android.graphics.Rect;
import android.os.IBinder;
import android.os.RemoteException;
import android.view.SurfaceControl;
@@ -94,6 +93,7 @@ public class TaskOrganizer extends WindowOrganizer {
* @param info The information about the Task that's available
* @param appToken Token of the application being started.
* context to for resources
* @hide
*/
@BinderThread
public void addStartingWindow(@NonNull StartingWindowInfo info,
@@ -101,14 +101,11 @@ public class TaskOrganizer extends WindowOrganizer {
/**
* Called when the Task want to remove the starting window.
* @param leash A persistent leash for the top window in this task. Release it once exit
* animation has finished.
* @param frame Window frame of the top window.
* @param playRevealAnimation Play vanish animation.
* @param removalInfo The information used to remove the starting window.
* @hide
*/
@BinderThread
public void removeStartingWindow(int taskId, @Nullable SurfaceControl leash,
@Nullable Rect frame, boolean playRevealAnimation) {}
public void removeStartingWindow(@NonNull StartingWindowRemovalInfo removalInfo) {}
/**
* Called when the Task want to copy the splash screen.
@@ -257,10 +254,8 @@ public class TaskOrganizer extends WindowOrganizer {
}
@Override
public void removeStartingWindow(int taskId, SurfaceControl leash, Rect frame,
boolean playRevealAnimation) {
mExecutor.execute(() -> TaskOrganizer.this.removeStartingWindow(taskId, leash, frame,
playRevealAnimation));
public void removeStartingWindow(StartingWindowRemovalInfo removalInfo) {
mExecutor.execute(() -> TaskOrganizer.this.removeStartingWindow(removalInfo));
}
@Override

View File

@@ -42,6 +42,7 @@ import android.util.SparseArray;
import android.view.SurfaceControl;
import android.window.ITaskOrganizerController;
import android.window.StartingWindowInfo;
import android.window.StartingWindowRemovalInfo;
import android.window.TaskAppearedInfo;
import android.window.TaskOrganizer;
@@ -322,10 +323,9 @@ public class ShellTaskOrganizer extends TaskOrganizer implements
}
@Override
public void removeStartingWindow(int taskId, SurfaceControl leash, Rect frame,
boolean playRevealAnimation) {
public void removeStartingWindow(StartingWindowRemovalInfo removalInfo) {
if (mStartingWindow != null) {
mStartingWindow.removeStartingWindow(taskId, leash, frame, playRevealAnimation);
mStartingWindow.removeStartingWindow(removalInfo);
}
}

View File

@@ -37,7 +37,6 @@ import android.content.res.Resources;
import android.content.res.TypedArray;
import android.graphics.Color;
import android.graphics.PixelFormat;
import android.graphics.Rect;
import android.hardware.display.DisplayManager;
import android.os.IBinder;
import android.os.RemoteCallback;
@@ -48,7 +47,6 @@ import android.util.Slog;
import android.util.SparseArray;
import android.view.Choreographer;
import android.view.Display;
import android.view.SurfaceControl;
import android.view.SurfaceControlViewHost;
import android.view.View;
import android.view.WindowManager;
@@ -58,6 +56,7 @@ import android.window.SplashScreenView;
import android.window.SplashScreenView.SplashScreenViewParcelable;
import android.window.StartingWindowInfo;
import android.window.StartingWindowInfo.StartingWindowType;
import android.window.StartingWindowRemovalInfo;
import android.window.TaskSnapshot;
import com.android.internal.R;
@@ -118,6 +117,7 @@ public class StartingSurfaceDrawer {
private Choreographer mChoreographer;
private final WindowManagerGlobal mWindowManagerGlobal;
private StartingSurface.SysuiProxy mSysuiProxy;
private final StartingWindowRemovalInfo mTmpRemovalInfo = new StartingWindowRemovalInfo();
/**
* @param splashScreenExecutor The thread used to control add and remove starting window.
@@ -458,12 +458,13 @@ public class StartingSurfaceDrawer {
/**
* Called when the content of a task is ready to show, starting window can be removed.
*/
public void removeStartingWindow(int taskId, SurfaceControl leash, Rect frame,
boolean playRevealAnimation) {
public void removeStartingWindow(StartingWindowRemovalInfo removalInfo) {
if (DEBUG_SPLASH_SCREEN || DEBUG_TASK_SNAPSHOT) {
Slog.d(TAG, "Task start finish, remove starting surface for task " + taskId);
Slog.d(TAG, "Task start finish, remove starting surface for task "
+ removalInfo.taskId);
}
removeWindowSynced(taskId, leash, frame, playRevealAnimation);
removeWindowSynced(removalInfo);
}
/**
@@ -556,7 +557,8 @@ public class StartingSurfaceDrawer {
}
private void removeWindowNoAnimate(int taskId) {
removeWindowSynced(taskId, null, null, false);
mTmpRemovalInfo.taskId = taskId;
removeWindowSynced(mTmpRemovalInfo);
}
void onImeDrawnOnTask(int taskId) {
@@ -568,8 +570,8 @@ public class StartingSurfaceDrawer {
mStartingWindowRecords.remove(taskId);
}
protected void removeWindowSynced(int taskId, SurfaceControl leash, Rect frame,
boolean playRevealAnimation) {
protected void removeWindowSynced(StartingWindowRemovalInfo removalInfo) {
final int taskId = removalInfo.taskId;
final StartingWindowRecord record = mStartingWindowRecords.get(taskId);
if (record != null) {
if (record.mDecorView != null) {
@@ -580,9 +582,9 @@ public class StartingSurfaceDrawer {
if (record.mSuggestType == STARTING_WINDOW_TYPE_LEGACY_SPLASH_SCREEN) {
removeWindowInner(record.mDecorView, false);
} else {
if (playRevealAnimation) {
if (removalInfo.playRevealAnimation) {
mSplashscreenContentDrawer.applyExitAnimation(record.mContentView,
leash, frame,
removalInfo.windowAnimationLeash, removalInfo.mainFrame,
() -> removeWindowInner(record.mDecorView, true));
} else {
// the SplashScreenView has been copied to client, hide the view to skip
@@ -602,7 +604,7 @@ public class StartingSurfaceDrawer {
Slog.v(TAG, "Removing task snapshot window for " + taskId);
}
record.mTaskSnapshotWindow.scheduleRemove(
() -> mStartingWindowRecords.remove(taskId));
() -> mStartingWindowRecords.remove(taskId), removalInfo.deferRemoveForIme);
}
}
}

View File

@@ -28,16 +28,14 @@ import android.app.ActivityManager.RunningTaskInfo;
import android.app.TaskInfo;
import android.content.Context;
import android.graphics.Color;
import android.graphics.Rect;
import android.os.Build;
import android.os.IBinder;
import android.os.RemoteException;
import android.os.Trace;
import android.util.Slog;
import android.util.SparseIntArray;
import android.view.SurfaceControl;
import android.window.StartingWindowInfo;
import android.window.StartingWindowInfo.StartingWindowType;
import android.window.StartingWindowRemovalInfo;
import android.window.TaskOrganizer;
import android.window.TaskSnapshot;
@@ -68,7 +66,7 @@ import com.android.wm.shell.common.TransactionPool;
public class StartingWindowController implements RemoteCallable<StartingWindowController> {
private static final String TAG = StartingWindowController.class.getSimpleName();
public static final boolean DEBUG_SPLASH_SCREEN = Build.isDebuggable();
public static final boolean DEBUG_SPLASH_SCREEN = false;
public static final boolean DEBUG_TASK_SNAPSHOT = false;
private static final long TASK_BG_COLOR_RETAIN_TIME_MS = 5000;
@@ -186,13 +184,12 @@ public class StartingWindowController implements RemoteCallable<StartingWindowCo
/**
* Called when the content of a task is ready to show, starting window can be removed.
*/
public void removeStartingWindow(int taskId, SurfaceControl leash, Rect frame,
boolean playRevealAnimation) {
public void removeStartingWindow(StartingWindowRemovalInfo removalInfo) {
mSplashScreenExecutor.execute(() -> mStartingSurfaceDrawer.removeStartingWindow(
taskId, leash, frame, playRevealAnimation));
removalInfo));
mSplashScreenExecutor.executeDelayed(() -> {
synchronized (mTaskBackgroundColors) {
mTaskBackgroundColors.delete(taskId);
mTaskBackgroundColors.delete(removalInfo.taskId);
}
}, TASK_BG_COLOR_RETAIN_TIME_MS);
}

View File

@@ -123,14 +123,13 @@ public class TaskSnapshotWindow {
* Ideally the delay time will be shorter when receiving
* {@link StartingSurfaceDrawer#onImeDrawnOnTask(int)}.
*/
private static final long MAX_DELAY_REMOVAL_TIME_IME_VISIBLE = 450;
private static final long MAX_DELAY_REMOVAL_TIME_IME_VISIBLE = 600;
//tmp vars for unused relayout params
private static final Point TMP_SURFACE_SIZE = new Point();
private final Window mWindow;
private final Runnable mClearWindowHandler;
private final long mDelayRemovalTime;
private final ShellExecutor mSplashScreenExecutor;
private final SurfaceControl mSurfaceControl;
private final IWindowSession mSession;
@@ -221,13 +220,10 @@ public class TaskSnapshotWindow {
taskDescription.setBackgroundColor(WHITE);
}
final long delayRemovalTime = snapshot.hasImeSurface() ? MAX_DELAY_REMOVAL_TIME_IME_VISIBLE
: DELAY_REMOVAL_TIME_GENERAL;
final TaskSnapshotWindow snapshotSurface = new TaskSnapshotWindow(
surfaceControl, snapshot, layoutParams.getTitle(), taskDescription, appearance,
windowFlags, windowPrivateFlags, taskBounds, orientation, activityType,
delayRemovalTime, topWindowInsetsState, clearWindowHandler, splashScreenExecutor);
topWindowInsetsState, clearWindowHandler, splashScreenExecutor);
final Window window = snapshotSurface.mWindow;
final InsetsState tmpInsetsState = new InsetsState();
@@ -265,9 +261,8 @@ public class TaskSnapshotWindow {
public TaskSnapshotWindow(SurfaceControl surfaceControl,
TaskSnapshot snapshot, CharSequence title, TaskDescription taskDescription,
int appearance, int windowFlags, int windowPrivateFlags, Rect taskBounds,
int currentOrientation, int activityType, long delayRemovalTime,
InsetsState topWindowInsetsState, Runnable clearWindowHandler,
ShellExecutor splashScreenExecutor) {
int currentOrientation, int activityType, InsetsState topWindowInsetsState,
Runnable clearWindowHandler, ShellExecutor splashScreenExecutor) {
mSplashScreenExecutor = splashScreenExecutor;
mSession = WindowManagerGlobal.getWindowSession();
mWindow = new Window();
@@ -283,7 +278,6 @@ public class TaskSnapshotWindow {
mStatusBarColor = taskDescription.getStatusBarColor();
mOrientationOnCreation = currentOrientation;
mActivityType = activityType;
mDelayRemovalTime = delayRemovalTime;
mTransaction = new SurfaceControl.Transaction();
mClearWindowHandler = clearWindowHandler;
mHasImeSurface = snapshot.hasImeSurface();
@@ -314,7 +308,7 @@ public class TaskSnapshotWindow {
mSystemBarBackgroundPainter.drawNavigationBarBackground(c);
}
void scheduleRemove(Runnable onRemove) {
void scheduleRemove(Runnable onRemove, boolean deferRemoveForIme) {
// Show the latest content as soon as possible for unlocking to home.
if (mActivityType == ACTIVITY_TYPE_HOME) {
removeImmediately();
@@ -329,9 +323,12 @@ public class TaskSnapshotWindow {
TaskSnapshotWindow.this.removeImmediately();
onRemove.run();
};
mSplashScreenExecutor.executeDelayed(mScheduledRunnable, mDelayRemovalTime);
final long delayRemovalTime = mHasImeSurface && deferRemoveForIme
? MAX_DELAY_REMOVAL_TIME_IME_VISIBLE
: DELAY_REMOVAL_TIME_GENERAL;
mSplashScreenExecutor.executeDelayed(mScheduledRunnable, delayRemovalTime);
if (DEBUG) {
Slog.d(TAG, "Defer removing snapshot surface in " + mDelayRemovalTime);
Slog.d(TAG, "Defer removing snapshot surface in " + delayRemovalTime);
}
}

View File

@@ -57,12 +57,12 @@ import android.view.Display;
import android.view.IWindowSession;
import android.view.InsetsState;
import android.view.Surface;
import android.view.SurfaceControl;
import android.view.View;
import android.view.WindowManager;
import android.view.WindowManagerGlobal;
import android.view.WindowMetrics;
import android.window.StartingWindowInfo;
import android.window.StartingWindowRemovalInfo;
import android.window.TaskSnapshot;
import androidx.test.ext.junit.runners.AndroidJUnit4;
@@ -119,10 +119,9 @@ public class StartingSurfaceDrawerTests {
}
@Override
protected void removeWindowSynced(int taskId, SurfaceControl leash, Rect frame,
boolean playRevealAnimation) {
protected void removeWindowSynced(StartingWindowRemovalInfo removalInfo) {
// listen for removeView
if (mAddWindowForTask == taskId) {
if (mAddWindowForTask == removalInfo.taskId) {
mAddWindowForTask = 0;
}
}
@@ -172,9 +171,11 @@ public class StartingSurfaceDrawerTests {
eq(STARTING_WINDOW_TYPE_SPLASH_SCREEN));
assertEquals(mStartingSurfaceDrawer.mAddWindowForTask, taskId);
mStartingSurfaceDrawer.removeStartingWindow(windowInfo.taskInfo.taskId, null, null, false);
StartingWindowRemovalInfo removalInfo = new StartingWindowRemovalInfo();
removalInfo.taskId = windowInfo.taskInfo.taskId;
mStartingSurfaceDrawer.removeStartingWindow(removalInfo);
waitHandlerIdle(mTestHandler);
verify(mStartingSurfaceDrawer).removeWindowSynced(eq(taskId), any(), any(), eq(false));
verify(mStartingSurfaceDrawer).removeWindowSynced(any());
assertEquals(mStartingSurfaceDrawer.mAddWindowForTask, 0);
}

View File

@@ -83,8 +83,7 @@ public class TaskSnapshotWindowTest {
createTaskDescription(Color.WHITE, Color.RED, Color.BLUE),
0 /* appearance */, windowFlags /* windowFlags */, 0 /* privateWindowFlags */,
taskBounds, ORIENTATION_PORTRAIT, ACTIVITY_TYPE_STANDARD,
100 /* delayRemovalTime */, new InsetsState(),
null /* clearWindow */, new TestShellExecutor());
new InsetsState(), null /* clearWindow */, new TestShellExecutor());
}
private TaskSnapshot createTaskSnapshot(int width, int height, Point taskSize,

View File

@@ -2405,17 +2405,6 @@ final class ActivityRecord extends WindowToken implements WindowManagerService.A
});
}
void removeStartingWindowIfNeeded() {
// Removing the task snapshot after the task is actually focused (see
// Task#onWindowFocusChanged). Since some of the app contents may draw in this time and
// requires more times to draw finish, in case flicking may happen when removing the task
// snapshot too early. (i.e. Showing IME.)
if ((mStartingData instanceof SnapshotStartingData) && !getTask().isFocused()) {
return;
}
removeStartingWindow();
}
void removeStartingWindow() {
if (transferSplashScreenIfNeeded()) {
return;
@@ -6081,13 +6070,13 @@ final class ActivityRecord extends WindowToken implements WindowManagerService.A
final Task associatedTask =
mSharedStartingData != null ? mSharedStartingData.mAssociatedTask : null;
if (associatedTask == null) {
removeStartingWindowIfNeeded();
removeStartingWindow();
} else if (associatedTask.getActivity(
r -> r.mVisibleRequested && !r.firstWindowDrawn) == null) {
// The last drawn activity may not be the one that owns the starting window.
final ActivityRecord r = associatedTask.topActivityContainsStartingWindow();
if (r != null) {
r.removeStartingWindowIfNeeded();
r.removeStartingWindow();
}
}
updateReportedVisibilityLocked();

View File

@@ -1666,7 +1666,7 @@ class DisplayContent extends RootDisplayArea implements WindowManagerPolicy.Disp
}
/** Returns {@code true} if the IME is possible to show on the launching activity. */
private boolean mayImeShowOnLaunchingActivity(@NonNull ActivityRecord r) {
boolean mayImeShowOnLaunchingActivity(@NonNull ActivityRecord r) {
final WindowState win = r.findMainWindow();
if (win == null) {
return false;

View File

@@ -4270,7 +4270,7 @@ class Task extends TaskFragment {
/**
* @return true if the task is currently focused.
*/
boolean isFocused() {
private boolean isFocused() {
if (mDisplayContent == null || mDisplayContent.mFocusedApp == null) {
return false;
}
@@ -4328,14 +4328,10 @@ class Task extends TaskFragment {
}
/**
* Called on the task of a window which gained or lost focus.
* Called on the task when it gained or lost focus.
* @param hasFocus
*/
void onAppFocusChanged(boolean hasFocus) {
final ActivityRecord topAct = getTopVisibleActivity();
if (topAct != null && (topAct.mStartingData instanceof SnapshotStartingData)) {
topAct.removeStartingWindowIfNeeded();
}
updateShadowsRadius(hasFocus, getSyncTransaction());
dispatchTaskInfoChangedIfNeeded(false /* force */);
}

View File

@@ -28,7 +28,6 @@ import android.app.ActivityManager.RunningTaskInfo;
import android.app.WindowConfiguration;
import android.content.Intent;
import android.content.pm.ParceledListSlice;
import android.graphics.Rect;
import android.os.Binder;
import android.os.IBinder;
import android.os.Parcel;
@@ -40,6 +39,7 @@ import android.window.ITaskOrganizer;
import android.window.ITaskOrganizerController;
import android.window.SplashScreenView;
import android.window.StartingWindowInfo;
import android.window.StartingWindowRemovalInfo;
import android.window.TaskAppearedInfo;
import android.window.TaskSnapshot;
import android.window.WindowContainerToken;
@@ -498,12 +498,15 @@ class TaskOrganizerController extends ITaskOrganizerController.Stub {
if (lastOrganizer == null) {
return;
}
SurfaceControl windowAnimationLeash = null;
Rect mainFrame = null;
final StartingWindowRemovalInfo removalInfo = new StartingWindowRemovalInfo();
removalInfo.taskId = task.mTaskId;
removalInfo.playRevealAnimation = prepareAnimation;
final boolean playShiftUpAnimation = !task.inMultiWindowMode();
if (prepareAnimation && playShiftUpAnimation) {
final ActivityRecord topActivity = task.topActivityContainsStartingWindow();
if (topActivity != null) {
final ActivityRecord topActivity = task.topActivityContainsStartingWindow();
if (topActivity != null) {
removalInfo.deferRemoveForIme = topActivity.mDisplayContent
.mayImeShowOnLaunchingActivity(topActivity);
if (prepareAnimation && playShiftUpAnimation) {
final WindowState mainWindow =
topActivity.findMainWindow(false/* includeStartingApp */);
if (mainWindow != null) {
@@ -512,15 +515,15 @@ class TaskOrganizerController extends ITaskOrganizerController.Stub {
final SurfaceControl.Transaction t = mainWindow.getPendingTransaction();
mainWindow.startAnimation(t, adaptor, false,
ANIMATION_TYPE_STARTING_REVEAL);
windowAnimationLeash = adaptor.mAnimationLeash;
mainFrame = mainWindow.getRelativeFrame();
t.setPosition(windowAnimationLeash, mainFrame.left, mainFrame.top);
removalInfo.windowAnimationLeash = adaptor.mAnimationLeash;
removalInfo.mainFrame = mainWindow.getRelativeFrame();
t.setPosition(removalInfo.windowAnimationLeash,
removalInfo.mainFrame.left, removalInfo.mainFrame.top);
}
}
}
try {
lastOrganizer.removeStartingWindow(task.mTaskId, windowAnimationLeash,
mainFrame, prepareAnimation);
lastOrganizer.removeStartingWindow(removalInfo);
} catch (RemoteException e) {
Slog.e(TAG, "Exception sending onStartTaskFinished callback", e);
}

View File

@@ -80,6 +80,7 @@ import android.view.SurfaceControl;
import android.window.ITaskOrganizer;
import android.window.IWindowContainerTransactionCallback;
import android.window.StartingWindowInfo;
import android.window.StartingWindowRemovalInfo;
import android.window.TaskAppearedInfo;
import android.window.WindowContainerToken;
import android.window.WindowContainerTransaction;
@@ -779,8 +780,7 @@ public class WindowOrganizerTests extends WindowTestsBase {
@Override
public void addStartingWindow(StartingWindowInfo info, IBinder appToken) { }
@Override
public void removeStartingWindow(int taskId, SurfaceControl leash, Rect frame,
boolean playRevealAnimation) { }
public void removeStartingWindow(StartingWindowRemovalInfo removalInfo) { }
@Override
public void copySplashScreenView(int taskId) { }
@Override

View File

@@ -77,7 +77,6 @@ import android.content.Context;
import android.content.Intent;
import android.content.pm.ActivityInfo;
import android.content.pm.ApplicationInfo;
import android.graphics.Rect;
import android.hardware.display.DisplayManager;
import android.os.Build;
import android.os.Bundle;
@@ -101,6 +100,7 @@ import android.view.WindowManager;
import android.view.WindowManager.DisplayImePolicy;
import android.window.ITransitionPlayer;
import android.window.StartingWindowInfo;
import android.window.StartingWindowRemovalInfo;
import android.window.TaskFragmentOrganizer;
import android.window.TransitionInfo;
import android.window.TransitionRequestInfo;
@@ -1457,12 +1457,11 @@ class WindowTestsBase extends SystemServiceTestsBase {
}
}
@Override
public void removeStartingWindow(int taskId, SurfaceControl leash, Rect frame,
boolean playRevealAnimation) {
public void removeStartingWindow(StartingWindowRemovalInfo removalInfo) {
synchronized (mWMService.mGlobalLock) {
final IBinder appToken = mTaskAppMap.get(taskId);
final IBinder appToken = mTaskAppMap.get(removalInfo.taskId);
if (appToken != null) {
mTaskAppMap.remove(taskId);
mTaskAppMap.remove(removalInfo.taskId);
final ActivityRecord activity = mWMService.mRoot.getActivityRecord(
appToken);
WindowState win = mAppWindowMap.remove(appToken);