diff options
author | Hongwei Wang <hwwang@google.com> | 2021-07-14 23:52:42 +0000 |
---|---|---|
committer | Android (Google) Code Review <android-gerrit@google.com> | 2021-07-14 23:52:42 +0000 |
commit | 5a5907201851f7fd2ed1337e8da39d3a487832b6 (patch) | |
tree | 4e268b82f4d83127d0c2dd76e2be3e21815e3461 | |
parent | 9d0ddef67b6bfabac10b0c6ea07df36f037eb0cf (diff) | |
parent | ebe8550d03d953076fa6b1e5ba415172008d6ee6 (diff) | |
download | base-5a5907201851f7fd2ed1337e8da39d3a487832b6.tar.gz |
Merge "Fix letterbox issue when auto-enter-pip from landscape" into sc-dev
6 files changed, 40 insertions, 67 deletions
diff --git a/core/java/android/app/TaskInfo.java b/core/java/android/app/TaskInfo.java index 444cc4eedcb1..85758a92fa98 100644 --- a/core/java/android/app/TaskInfo.java +++ b/core/java/android/app/TaskInfo.java @@ -28,11 +28,13 @@ import android.content.LocusId; import android.content.pm.ActivityInfo; import android.content.res.Configuration; import android.graphics.Point; +import android.graphics.Rect; import android.os.Build; import android.os.IBinder; import android.os.Parcel; import android.os.RemoteException; import android.util.Log; +import android.view.DisplayCutout; import android.window.TaskSnapshot; import android.window.WindowContainerToken; @@ -174,6 +176,15 @@ public class TaskInfo { public PictureInPictureParams pictureInPictureParams; /** + * The {@link Rect} copied from {@link DisplayCutout#getSafeInsets()} if the cutout is not of + * (LAYOUT_IN_DISPLAY_CUTOUT_MODE_SHORT_EDGES, LAYOUT_IN_DISPLAY_CUTOUT_MODE_ALWAYS), + * {@code null} otherwise. + * @hide + */ + @Nullable + public Rect displayCutoutInsets; + + /** * The activity type of the top activity in this task. * @hide */ @@ -332,6 +343,7 @@ public class TaskInfo { && supportsMultiWindow == that.supportsMultiWindow && Objects.equals(positionInParent, that.positionInParent) && Objects.equals(pictureInPictureParams, that.pictureInPictureParams) + && Objects.equals(displayCutoutInsets, that.displayCutoutInsets) && getWindowingMode() == that.getWindowingMode() && Objects.equals(taskDescription, that.taskDescription) && isFocused == that.isFocused @@ -382,6 +394,7 @@ public class TaskInfo { token = WindowContainerToken.CREATOR.createFromParcel(source); topActivityType = source.readInt(); pictureInPictureParams = source.readTypedObject(PictureInPictureParams.CREATOR); + displayCutoutInsets = source.readTypedObject(Rect.CREATOR); topActivityInfo = source.readTypedObject(ActivityInfo.CREATOR); isResizeable = source.readBoolean(); source.readBinderList(launchCookies); @@ -419,6 +432,7 @@ public class TaskInfo { token.writeToParcel(dest, flags); dest.writeInt(topActivityType); dest.writeTypedObject(pictureInPictureParams, flags); + dest.writeTypedObject(displayCutoutInsets, flags); dest.writeTypedObject(topActivityInfo, flags); dest.writeBoolean(isResizeable); dest.writeBinderList(launchCookies); @@ -447,6 +461,7 @@ public class TaskInfo { + " token=" + token + " topActivityType=" + topActivityType + " pictureInPictureParams=" + pictureInPictureParams + + " displayCutoutSafeInsets=" + displayCutoutInsets + " topActivityInfo=" + topActivityInfo + " launchCookies=" + launchCookies + " positionInParent=" + positionInParent diff --git a/packages/SystemUI/shared/src/com/android/systemui/shared/system/TaskInfoCompat.java b/packages/SystemUI/shared/src/com/android/systemui/shared/system/TaskInfoCompat.java deleted file mode 100644 index 7b9ebc0d4656..000000000000 --- a/packages/SystemUI/shared/src/com/android/systemui/shared/system/TaskInfoCompat.java +++ /dev/null @@ -1,67 +0,0 @@ -/* - * Copyright (C) 2018 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 com.android.systemui.shared.system; - -import android.app.ActivityManager; -import android.app.PictureInPictureParams; -import android.app.TaskInfo; -import android.content.ComponentName; -import android.content.pm.ActivityInfo; -import android.graphics.Rect; - -public class TaskInfoCompat { - - public static int getUserId(TaskInfo info) { - return info.userId; - } - - public static int getActivityType(TaskInfo info) { - return info.configuration.windowConfiguration.getActivityType(); - } - - public static int getWindowingMode(TaskInfo info) { - return info.configuration.windowConfiguration.getWindowingMode(); - } - - public static Rect getWindowConfigurationBounds(TaskInfo info) { - return info.configuration.windowConfiguration.getBounds(); - } - - public static boolean supportsSplitScreenMultiWindow(TaskInfo info) { - return info.supportsSplitScreenMultiWindow; - } - - public static ComponentName getTopActivity(TaskInfo info) { - return info.topActivity; - } - - public static ActivityManager.TaskDescription getTaskDescription(TaskInfo info) { - return info.taskDescription; - } - - public static ActivityInfo getTopActivityInfo(TaskInfo info) { - return info.topActivityInfo; - } - - public static boolean isAutoEnterPipEnabled(PictureInPictureParams params) { - return params.isAutoEnterEnabled(); - } - - public static Rect getPipSourceRectHint(PictureInPictureParams params) { - return params.getSourceRectHint(); - } -} diff --git a/services/core/java/com/android/server/wm/ActivityRecord.java b/services/core/java/com/android/server/wm/ActivityRecord.java index f3dbed574b06..44682525edd2 100644 --- a/services/core/java/com/android/server/wm/ActivityRecord.java +++ b/services/core/java/com/android/server/wm/ActivityRecord.java @@ -801,6 +801,10 @@ final class ActivityRecord extends WindowToken implements WindowManagerService.A // Tracking cookie for the launch of this activity and it's task. IBinder mLaunchCookie; + // Entering PiP is usually done in two phases, we put the task into pinned mode first and + // SystemUi sets the pinned mode on activity after transition is done. + boolean mWaitForEnteringPinnedMode; + private final Runnable mPauseTimeoutRunnable = new Runnable() { @Override public void run() { @@ -7705,6 +7709,7 @@ final class ActivityRecord extends WindowToken implements WindowManagerService.A // mode (see RootWindowContainer#moveActivityToPinnedRootTask). So once the windowing mode // of activity is changed, it is the signal of the last step to update the PiP states. if (!wasInPictureInPicture && inPinnedWindowingMode() && task != null) { + mWaitForEnteringPinnedMode = false; mTaskSupervisor.scheduleUpdatePictureInPictureModeIfNeeded(task, task.getBounds()); } diff --git a/services/core/java/com/android/server/wm/DisplayPolicy.java b/services/core/java/com/android/server/wm/DisplayPolicy.java index 97c19ab72918..73d31bf7e0c8 100644 --- a/services/core/java/com/android/server/wm/DisplayPolicy.java +++ b/services/core/java/com/android/server/wm/DisplayPolicy.java @@ -1568,6 +1568,10 @@ public class DisplayPolicy { layoutStatusBar(displayFrames, mBarContentFrames.get(TYPE_STATUS_BAR)); return; } + if (win.mActivityRecord != null && win.mActivityRecord.mWaitForEnteringPinnedMode) { + // Skip layout of the window when in transition to pip mode. + return; + } final WindowManager.LayoutParams attrs = win.getAttrs(); final int type = attrs.type; diff --git a/services/core/java/com/android/server/wm/RootWindowContainer.java b/services/core/java/com/android/server/wm/RootWindowContainer.java index 9a6a51848317..32147215834f 100644 --- a/services/core/java/com/android/server/wm/RootWindowContainer.java +++ b/services/core/java/com/android/server/wm/RootWindowContainer.java @@ -2191,6 +2191,7 @@ class RootWindowContainer extends WindowContainer<DisplayContent> // from doing work and changing the activity visuals while animating // TODO(task-org): Figure-out more structured way to do this long term. r.setWindowingMode(intermediateWindowingMode); + r.mWaitForEnteringPinnedMode = true; rootTask.setWindowingMode(WINDOWING_MODE_PINNED); rootTask.setDeferTaskAppear(false); diff --git a/services/core/java/com/android/server/wm/Task.java b/services/core/java/com/android/server/wm/Task.java index 777306aa13c5..936b2efa00ad 100644 --- a/services/core/java/com/android/server/wm/Task.java +++ b/services/core/java/com/android/server/wm/Task.java @@ -61,6 +61,8 @@ import static android.provider.Settings.Secure.USER_SETUP_COMPLETE; import static android.view.Display.DEFAULT_DISPLAY; import static android.view.Display.INVALID_DISPLAY; import static android.view.SurfaceControl.METADATA_TASK_ID; +import static android.view.WindowManager.LayoutParams.LAYOUT_IN_DISPLAY_CUTOUT_MODE_ALWAYS; +import static android.view.WindowManager.LayoutParams.LAYOUT_IN_DISPLAY_CUTOUT_MODE_SHORT_EDGES; import static android.view.WindowManager.LayoutParams.TYPE_APPLICATION_STARTING; import static android.view.WindowManager.TRANSIT_CHANGE; import static android.view.WindowManager.TRANSIT_CLOSE; @@ -4105,6 +4107,7 @@ class Task extends WindowContainer<WindowContainer> { info.positionInParent = getRelativePosition(); info.pictureInPictureParams = getPictureInPictureParams(top); + info.displayCutoutInsets = getDisplayCutoutInsets(top); info.topActivityInfo = mReuseActivitiesReport.top != null ? mReuseActivitiesReport.top.info : null; @@ -4139,6 +4142,18 @@ class Task extends WindowContainer<WindowContainer> { ? null : new PictureInPictureParams(topVisibleActivity.pictureInPictureArgs); } + private Rect getDisplayCutoutInsets(Task top) { + if (top == null || top.mDisplayContent == null + || top.getDisplayInfo().displayCutout == null) return null; + final WindowState w = top.getTopVisibleAppMainWindow(); + final int displayCutoutMode = w == null + ? WindowManager.LayoutParams.LAYOUT_IN_DISPLAY_CUTOUT_MODE_DEFAULT + : w.getAttrs().layoutInDisplayCutoutMode; + return (displayCutoutMode == LAYOUT_IN_DISPLAY_CUTOUT_MODE_ALWAYS + || displayCutoutMode == LAYOUT_IN_DISPLAY_CUTOUT_MODE_SHORT_EDGES) + ? null : top.getDisplayInfo().displayCutout.getSafeInsets(); + } + /** * Returns a {@link TaskInfo} with information from this task. */ |