Add API to allow SysUI/launcher to customize legacy task transition animations

Launcher needs to be able to customize the task transition to:

1. set the background color during task transitions to the taskbar color when the taskbar is visible.

and, temporarily, at least until tasks have rounded corners rather than being an overlay in the taskbar, we need:

2. a way to specify how much to crop the task by so that the task's rounded corners are visible above the taskbar during animation

3. a way to specify how much to crop the taskbar by so that the taskbar's rounded corners overlay is not visible over the tasks during the animation

Test: None
Bug: 200675009
Bug: 196387647
Change-Id: Ifb7f89e7fde47155eb987161fbbe30e7144103ab
This commit is contained in:
Pablo Gamito
2021-10-01 16:08:00 +02:00
parent ea975a7786
commit d95860a707
4 changed files with 150 additions and 0 deletions

View File

@@ -61,6 +61,7 @@ import android.view.InputChannel;
import android.view.InputDevice; import android.view.InputDevice;
import android.view.IInputFilter; import android.view.IInputFilter;
import android.view.AppTransitionAnimationSpec; import android.view.AppTransitionAnimationSpec;
import android.view.TaskTransitionSpec;
import android.view.WindowContentFrameStats; import android.view.WindowContentFrameStats;
import android.view.WindowManager; import android.view.WindowManager;
import android.view.SurfaceControl; import android.view.SurfaceControl;
@@ -884,4 +885,17 @@ interface IWindowManager
* @hide * @hide
*/ */
void setTaskSnapshotEnabled(boolean enabled); void setTaskSnapshotEnabled(boolean enabled);
/**
* Customized the task transition animation with a task transition spec.
*
* @param spec the spec that will be used to customize the task animations
*/
void setTaskTransitionSpec(in TaskTransitionSpec spec);
/**
* Clears any task transition spec that has been previously set and
* reverts to using the default task transition with no spec changes.
*/
void clearTaskTransitionSpec();
} }

View File

@@ -0,0 +1,20 @@
/*
** Copyright 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.view;
/** @hide */
parcelable TaskTransitionSpec;

View File

@@ -0,0 +1,91 @@
/*
* 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.view;
import android.os.Parcel;
import android.os.Parcelable;
import android.util.ArraySet;
import java.util.Set;
/**
* Holds information about how to execute task transition animations.
*
* This class is intended to be used with IWindowManager.setTaskTransitionSpec methods when
* we want more customization over the way default task transitions are executed.
*
* @hide
*/
public class TaskTransitionSpec implements Parcelable {
/**
* The background color to use during task animations (override the default background color)
*/
public final int backgroundColor;
/**
* TEMPORARY FIELD (b/202383002)
* TODO: Remove once we use surfaceflinger rounded corners on tasks rather than taskbar overlays
*
* A set of {@InsetsState.InternalInsetsType}s we want to use as the source to set the bounds
* of the task during the animation. Used to make sure that task animate above the taskbar.
* Will also be used to crop to the frame size of the inset source to the inset size to prevent
* the taskbar rounded corners overlay from being invisible during task transition animation.
*/
public final Set<Integer> animationBoundInsets;
public TaskTransitionSpec(
int backgroundColor, Set<Integer> animationBoundInsets) {
this.backgroundColor = backgroundColor;
this.animationBoundInsets = animationBoundInsets;
}
public TaskTransitionSpec(Parcel in) {
this.backgroundColor = in.readInt();
int animationBoundInsetsSize = in.readInt();
this.animationBoundInsets = new ArraySet<>(animationBoundInsetsSize);
for (int i = 0; i < animationBoundInsetsSize; i++) {
this.animationBoundInsets.add(in.readInt());
}
}
@Override
public int describeContents() {
return 0;
}
@Override
public void writeToParcel(Parcel dest, int flags) {
dest.writeInt(backgroundColor);
dest.writeInt(animationBoundInsets.size());
for (int insetType : animationBoundInsets) {
dest.writeInt(insetType);
}
}
public static final @android.annotation.NonNull Parcelable.Creator<TaskTransitionSpec>
CREATOR = new Parcelable.Creator<TaskTransitionSpec>() {
public TaskTransitionSpec createFromParcel(Parcel in) {
return new TaskTransitionSpec(in);
}
public TaskTransitionSpec[] newArray(int size) {
return new TaskTransitionSpec[size];
}
};
}

View File

@@ -19,6 +19,7 @@ package com.android.server.wm;
import static android.Manifest.permission.CONTROL_REMOTE_APP_TRANSITION_ANIMATIONS; import static android.Manifest.permission.CONTROL_REMOTE_APP_TRANSITION_ANIMATIONS;
import static android.Manifest.permission.INPUT_CONSUMER; import static android.Manifest.permission.INPUT_CONSUMER;
import static android.Manifest.permission.INTERNAL_SYSTEM_WINDOW; import static android.Manifest.permission.INTERNAL_SYSTEM_WINDOW;
import static android.Manifest.permission.MANAGE_ACTIVITY_TASKS;
import static android.Manifest.permission.MANAGE_APP_TOKENS; import static android.Manifest.permission.MANAGE_APP_TOKENS;
import static android.Manifest.permission.READ_FRAME_BUFFER; import static android.Manifest.permission.READ_FRAME_BUFFER;
import static android.Manifest.permission.REGISTER_WINDOW_MANAGER_LISTENERS; import static android.Manifest.permission.REGISTER_WINDOW_MANAGER_LISTENERS;
@@ -268,6 +269,7 @@ import android.view.ScrollCaptureResponse;
import android.view.Surface; import android.view.Surface;
import android.view.SurfaceControl; import android.view.SurfaceControl;
import android.view.SurfaceSession; import android.view.SurfaceSession;
import android.view.TaskTransitionSpec;
import android.view.View; import android.view.View;
import android.view.WindowContentFrameStats; import android.view.WindowContentFrameStats;
import android.view.WindowInsets; import android.view.WindowInsets;
@@ -756,6 +758,11 @@ public class WindowManagerService extends IWindowManager.Stub
*/ */
final Handler mAnimationHandler = new Handler(AnimationThread.getHandler().getLooper()); final Handler mAnimationHandler = new Handler(AnimationThread.getHandler().getLooper());
/**
* Used during task transitions to allow SysUI and launcher to customize task transitions.
*/
TaskTransitionSpec mTaskTransitionSpec;
boolean mHardKeyboardAvailable; boolean mHardKeyboardAvailable;
WindowManagerInternal.OnHardKeyboardStatusChangeListener mHardKeyboardStatusChangeListener; WindowManagerInternal.OnHardKeyboardStatusChangeListener mHardKeyboardStatusChangeListener;
SettingsObserver mSettingsObserver; SettingsObserver mSettingsObserver;
@@ -8714,4 +8721,22 @@ public class WindowManagerService extends IWindowManager.Stub
public void setTaskSnapshotEnabled(boolean enabled) { public void setTaskSnapshotEnabled(boolean enabled) {
mTaskSnapshotController.setTaskSnapshotEnabled(enabled); mTaskSnapshotController.setTaskSnapshotEnabled(enabled);
} }
@Override
public void setTaskTransitionSpec(TaskTransitionSpec spec) {
if (!checkCallingPermission(MANAGE_ACTIVITY_TASKS, "setTaskTransitionSpec()")) {
throw new SecurityException("Requires MANAGE_ACTIVITY_TASKS permission");
}
mTaskTransitionSpec = spec;
}
@Override
public void clearTaskTransitionSpec() {
if (!checkCallingPermission(MANAGE_ACTIVITY_TASKS, "clearTaskTransitionSpec()")) {
throw new SecurityException("Requires MANAGE_ACTIVITY_TASKS permission");
}
mTaskTransitionSpec = null;
}
} }