Loading core/java/android/view/IWindowManager.aidl +14 −0 Original line number Diff line number Diff line Loading @@ -61,6 +61,7 @@ import android.view.InputChannel; import android.view.InputDevice; import android.view.IInputFilter; import android.view.AppTransitionAnimationSpec; import android.view.TaskTransitionSpec; import android.view.WindowContentFrameStats; import android.view.WindowManager; import android.view.SurfaceControl; Loading Loading @@ -896,4 +897,17 @@ interface IWindowManager * @see android.window.WindowProviderService#getLaunchedDisplayId */ int getImeDisplayId(); /** * 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(); } core/java/android/view/TaskTransitionSpec.aidl 0 → 100644 +20 −0 Original line number Diff line number Diff line /* ** 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; core/java/android/view/TaskTransitionSpec.java 0 → 100644 +91 −0 Original line number Diff line number Diff line /* * 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]; } }; } services/core/java/com/android/server/wm/WindowManagerService.java +25 −0 Original line number Diff line number Diff line Loading @@ -19,6 +19,7 @@ package com.android.server.wm; import static android.Manifest.permission.CONTROL_REMOTE_APP_TRANSITION_ANIMATIONS; import static android.Manifest.permission.INPUT_CONSUMER; 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.READ_FRAME_BUFFER; import static android.Manifest.permission.REGISTER_WINDOW_MANAGER_LISTENERS; Loading Loading @@ -266,6 +267,7 @@ import android.view.ScrollCaptureResponse; import android.view.Surface; import android.view.SurfaceControl; import android.view.SurfaceSession; import android.view.TaskTransitionSpec; import android.view.View; import android.view.WindowContentFrameStats; import android.view.WindowInsets; Loading Loading @@ -755,6 +757,11 @@ public class WindowManagerService extends IWindowManager.Stub */ 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; WindowManagerInternal.OnHardKeyboardStatusChangeListener mHardKeyboardStatusChangeListener; SettingsObserver mSettingsObserver; Loading Loading @@ -8777,4 +8784,22 @@ public class WindowManagerService extends IWindowManager.Stub : DEFAULT_DISPLAY; } } @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; } } Loading
core/java/android/view/IWindowManager.aidl +14 −0 Original line number Diff line number Diff line Loading @@ -61,6 +61,7 @@ import android.view.InputChannel; import android.view.InputDevice; import android.view.IInputFilter; import android.view.AppTransitionAnimationSpec; import android.view.TaskTransitionSpec; import android.view.WindowContentFrameStats; import android.view.WindowManager; import android.view.SurfaceControl; Loading Loading @@ -896,4 +897,17 @@ interface IWindowManager * @see android.window.WindowProviderService#getLaunchedDisplayId */ int getImeDisplayId(); /** * 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(); }
core/java/android/view/TaskTransitionSpec.aidl 0 → 100644 +20 −0 Original line number Diff line number Diff line /* ** 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;
core/java/android/view/TaskTransitionSpec.java 0 → 100644 +91 −0 Original line number Diff line number Diff line /* * 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]; } }; }
services/core/java/com/android/server/wm/WindowManagerService.java +25 −0 Original line number Diff line number Diff line Loading @@ -19,6 +19,7 @@ package com.android.server.wm; import static android.Manifest.permission.CONTROL_REMOTE_APP_TRANSITION_ANIMATIONS; import static android.Manifest.permission.INPUT_CONSUMER; 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.READ_FRAME_BUFFER; import static android.Manifest.permission.REGISTER_WINDOW_MANAGER_LISTENERS; Loading Loading @@ -266,6 +267,7 @@ import android.view.ScrollCaptureResponse; import android.view.Surface; import android.view.SurfaceControl; import android.view.SurfaceSession; import android.view.TaskTransitionSpec; import android.view.View; import android.view.WindowContentFrameStats; import android.view.WindowInsets; Loading Loading @@ -755,6 +757,11 @@ public class WindowManagerService extends IWindowManager.Stub */ 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; WindowManagerInternal.OnHardKeyboardStatusChangeListener mHardKeyboardStatusChangeListener; SettingsObserver mSettingsObserver; Loading Loading @@ -8777,4 +8784,22 @@ public class WindowManagerService extends IWindowManager.Stub : DEFAULT_DISPLAY; } } @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; } }