diff options
3 files changed, 34 insertions, 6 deletions
diff --git a/services/core/java/com/android/server/am/ActivityRecord.java b/services/core/java/com/android/server/am/ActivityRecord.java index 44caaf954d97..18c8b322496c 100644 --- a/services/core/java/com/android/server/am/ActivityRecord.java +++ b/services/core/java/com/android/server/am/ActivityRecord.java @@ -2278,7 +2278,7 @@ final class ActivityRecord extends ConfigurationContainer implements AppWindowCo } /** Returns true if the configuration is compatible with this activity. */ - private boolean isConfigurationCompatible(Configuration config) { + boolean isConfigurationCompatible(Configuration config) { final int orientation = mWindowContainerController != null ? mWindowContainerController.getOrientation() : info.screenOrientation; if (isFixedOrientationPortrait(orientation) diff --git a/services/core/java/com/android/server/am/ActivityStack.java b/services/core/java/com/android/server/am/ActivityStack.java index 39fef4407f0b..912b22c84946 100644 --- a/services/core/java/com/android/server/am/ActivityStack.java +++ b/services/core/java/com/android/server/am/ActivityStack.java @@ -655,11 +655,11 @@ class ActivityStack<T extends StackWindowController> extends ConfigurationContai } } - final ActivityRecord topRunningActivityLocked() { + ActivityRecord topRunningActivityLocked() { return topRunningActivityLocked(false /* focusableOnly */); } - final ActivityRecord topRunningActivityLocked(boolean focusableOnly) { + private ActivityRecord topRunningActivityLocked(boolean focusableOnly) { for (int taskNdx = mTaskHistory.size() - 1; taskNdx >= 0; --taskNdx) { ActivityRecord r = mTaskHistory.get(taskNdx).topRunningActivityLocked(); if (r != null && (!focusableOnly || r.isFocusable())) { @@ -669,7 +669,21 @@ class ActivityStack<T extends StackWindowController> extends ConfigurationContai return null; } - final ActivityRecord topRunningNonDelayedActivityLocked(ActivityRecord notTop) { + ActivityRecord topRunningNonOverlayTaskActivity() { + for (int taskNdx = mTaskHistory.size() - 1; taskNdx >= 0; --taskNdx) { + final TaskRecord task = mTaskHistory.get(taskNdx); + final ArrayList<ActivityRecord> activities = task.mActivities; + for (int activityNdx = activities.size() - 1; activityNdx >= 0; --activityNdx) { + final ActivityRecord r = activities.get(activityNdx); + if (!r.finishing && !r.mTaskOverlay) { + return r; + } + } + } + return null; + } + + ActivityRecord topRunningNonDelayedActivityLocked(ActivityRecord notTop) { for (int taskNdx = mTaskHistory.size() - 1; taskNdx >= 0; --taskNdx) { final TaskRecord task = mTaskHistory.get(taskNdx); final ArrayList<ActivityRecord> activities = task.mActivities; diff --git a/services/core/java/com/android/server/am/PinnedActivityStack.java b/services/core/java/com/android/server/am/PinnedActivityStack.java index 672f563d17ca..34cdb54d0b76 100644 --- a/services/core/java/com/android/server/am/PinnedActivityStack.java +++ b/services/core/java/com/android/server/am/PinnedActivityStack.java @@ -17,6 +17,7 @@ package com.android.server.am; import android.app.RemoteAction; +import android.content.res.Configuration; import android.graphics.Rect; import com.android.server.am.ActivityStackSupervisor.ActivityContainer; @@ -50,8 +51,21 @@ class PinnedActivityStack extends ActivityStack<PinnedStackWindowController> void animateResizePinnedStack(Rect sourceHintBounds, Rect toBounds, int animationDuration, boolean schedulePipModeChangedOnAnimationEnd) { - getWindowContainerController().animateResizePinnedStack(toBounds, sourceHintBounds, - animationDuration, schedulePipModeChangedOnAnimationEnd); + if (skipResizeAnimation(toBounds == null /* toFullscreen */)) { + mService.moveTasksToFullscreenStack(mStackId, true /* onTop */); + } else { + getWindowContainerController().animateResizePinnedStack(toBounds, sourceHintBounds, + animationDuration, schedulePipModeChangedOnAnimationEnd); + } + } + + private boolean skipResizeAnimation(boolean toFullscreen) { + if (!toFullscreen) { + return false; + } + final Configuration parentConfig = getParent().getConfiguration(); + final ActivityRecord top = topRunningNonOverlayTaskActivity(); + return top != null && !top.isConfigurationCompatible(parentConfig); } void setPictureInPictureAspectRatio(float aspectRatio) { |