Merge "[DO NOT MERGE] Sync app requested orientation on PiP exit" into rvc-qpr-dev

This commit is contained in:
Hongwei Wang
2020-08-27 01:29:35 +00:00
committed by Android (Google) Code Review
5 changed files with 112 additions and 13 deletions

View File

@@ -176,6 +176,13 @@ public class TaskInfo {
*/
public boolean isResizeable;
/**
* Screen orientation set by {@link #baseActivity} via
* {@link Activity#setRequestedOrientation(int)}.
* @hide
*/
public @ActivityInfo.ScreenOrientation int requestedOrientation;
TaskInfo() {
// Do nothing
}
@@ -247,6 +254,7 @@ public class TaskInfo {
? ActivityInfo.CREATOR.createFromParcel(source)
: null;
isResizeable = source.readBoolean();
requestedOrientation = source.readInt();
}
/**
@@ -297,6 +305,7 @@ public class TaskInfo {
topActivityInfo.writeToParcel(dest, flags);
}
dest.writeBoolean(isResizeable);
dest.writeInt(requestedOrientation);
}
@Override
@@ -315,6 +324,7 @@ public class TaskInfo {
+ " token=" + token
+ " topActivityType=" + topActivityType
+ " pictureInPictureParams=" + pictureInPictureParams
+ " topActivityInfo=" + topActivityInfo;
+ " topActivityInfo=" + topActivityInfo
+ " requestedOrientation=" + requestedOrientation;
}
}

View File

@@ -40,7 +40,6 @@ import android.app.PictureInPictureParams;
import android.content.ComponentName;
import android.content.Context;
import android.content.pm.ActivityInfo;
import android.content.res.Configuration;
import android.graphics.Rect;
import android.os.Handler;
import android.os.IBinder;
@@ -104,7 +103,7 @@ public class PipTaskOrganizer extends TaskOrganizer implements
private final Rect mLastReportedBounds = new Rect();
private final int mEnterExitAnimationDuration;
private final PipSurfaceTransactionHelper mSurfaceTransactionHelper;
private final Map<IBinder, Configuration> mInitialState = new HashMap<>();
private final Map<IBinder, PipWindowConfigurationCompact> mCompactState = new HashMap<>();
private final Divider mSplitDivider;
// These callbacks are called on the update thread
@@ -202,6 +201,8 @@ public class PipTaskOrganizer extends TaskOrganizer implements
*/
private boolean mShouldDeferEnteringPip;
private @ActivityInfo.ScreenOrientation int mRequestedOrientation;
@Inject
public PipTaskOrganizer(Context context, @NonNull PipBoundsHandler boundsHandler,
@NonNull PipSurfaceTransactionHelper surfaceTransactionHelper,
@@ -281,11 +282,13 @@ public class PipTaskOrganizer extends TaskOrganizer implements
mPipUiEventLoggerLogger.log(
PipUiEventLogger.PipUiEventEnum.PICTURE_IN_PICTURE_EXPAND_TO_FULLSCREEN);
final Configuration initialConfig = mInitialState.remove(mToken.asBinder());
final boolean orientationDiffers = initialConfig.windowConfiguration.getRotation()
final PipWindowConfigurationCompact config = mCompactState.remove(mToken.asBinder());
config.syncWithScreenOrientation(mRequestedOrientation,
mPipBoundsHandler.getDisplayRotation());
final boolean orientationDiffers = config.getRotation()
!= mPipBoundsHandler.getDisplayRotation();
final WindowContainerTransaction wct = new WindowContainerTransaction();
final Rect destinationBounds = initialConfig.windowConfiguration.getBounds();
final Rect destinationBounds = config.getBounds();
final int direction = syncWithSplitScreenBounds(destinationBounds)
? TRANSITION_DIRECTION_TO_SPLIT_SCREEN
: TRANSITION_DIRECTION_TO_FULLSCREEN;
@@ -351,7 +354,7 @@ public class PipTaskOrganizer extends TaskOrganizer implements
.setPipAnimationCallback(mPipAnimationCallback)
.setDuration(mEnterExitAnimationDuration)
.start());
mInitialState.remove(mToken.asBinder());
mCompactState.remove(mToken.asBinder());
mExitingPip = true;
}
@@ -377,8 +380,10 @@ public class PipTaskOrganizer extends TaskOrganizer implements
mInPip = true;
mExitingPip = false;
mLeash = leash;
mInitialState.put(mToken.asBinder(), new Configuration(mTaskInfo.configuration));
mCompactState.put(mToken.asBinder(),
new PipWindowConfigurationCompact(mTaskInfo.configuration.windowConfiguration));
mPictureInPictureParams = mTaskInfo.pictureInPictureParams;
mRequestedOrientation = info.requestedOrientation;
mPipUiEventLoggerLogger.setTaskInfo(mTaskInfo);
mPipUiEventLoggerLogger.log(PipUiEventLogger.PipUiEventEnum.PICTURE_IN_PICTURE_ENTER);
@@ -521,6 +526,8 @@ public class PipTaskOrganizer extends TaskOrganizer implements
@Override
public void onTaskInfoChanged(ActivityManager.RunningTaskInfo info) {
Objects.requireNonNull(mToken, "onTaskInfoChanged requires valid existing mToken");
mRequestedOrientation = info.requestedOrientation;
// check PictureInPictureParams for aspect ratio change.
final PictureInPictureParams newParams = info.pictureInPictureParams;
if (newParams == null || !applyPictureInPictureParams(newParams)) {
Log.d(TAG, "Ignored onTaskInfoChanged with PiP param: " + newParams);
@@ -558,8 +565,6 @@ public class PipTaskOrganizer extends TaskOrganizer implements
}
/**
* TODO(b/152809058): consolidate the display info handling logic in SysUI
*
* @param destinationBoundsOut the current destination bounds will be populated to this param
*/
@SuppressWarnings("unchecked")
@@ -963,9 +968,9 @@ public class PipTaskOrganizer extends TaskOrganizer implements
pw.println(innerPrefix + "mPictureInPictureParams=" + mPictureInPictureParams);
pw.println(innerPrefix + "mLastReportedBounds=" + mLastReportedBounds);
pw.println(innerPrefix + "mInitialState:");
for (Map.Entry<IBinder, Configuration> e : mInitialState.entrySet()) {
for (Map.Entry<IBinder, PipWindowConfigurationCompact> e : mCompactState.entrySet()) {
pw.println(innerPrefix + " binder=" + e.getKey()
+ " winConfig=" + e.getValue().windowConfiguration);
+ " config=" + e.getValue());
}
}

View File

@@ -0,0 +1,80 @@
/*
* Copyright (C) 2020 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.pip;
import static android.content.pm.ActivityInfo.SCREEN_ORIENTATION_UNSPECIFIED;
import static android.view.Surface.ROTATION_0;
import static android.view.Surface.ROTATION_180;
import static android.view.Surface.ROTATION_270;
import static android.view.Surface.ROTATION_90;
import android.app.WindowConfiguration;
import android.content.pm.ActivityInfo;
import android.graphics.Rect;
import android.view.Surface;
/**
* Compact {@link WindowConfiguration} for PiP usage and supports operations such as rotate.
*/
class PipWindowConfigurationCompact {
private @Surface.Rotation int mRotation;
private Rect mBounds;
PipWindowConfigurationCompact(WindowConfiguration windowConfiguration) {
mRotation = windowConfiguration.getRotation();
mBounds = windowConfiguration.getBounds();
}
@Surface.Rotation int getRotation() {
return mRotation;
}
Rect getBounds() {
return mBounds;
}
void syncWithScreenOrientation(@ActivityInfo.ScreenOrientation int screenOrientation,
@Surface.Rotation int displayRotation) {
if (mBounds.top != 0 || mBounds.left != 0) {
// Supports fullscreen bounds like (0, 0, width, height) only now.
return;
}
boolean rotateNeeded = false;
if (ActivityInfo.isFixedOrientationPortrait(screenOrientation)
&& (mRotation == ROTATION_90 || mRotation == ROTATION_270)) {
mRotation = ROTATION_0;
rotateNeeded = true;
} else if (ActivityInfo.isFixedOrientationLandscape(screenOrientation)
&& (mRotation == ROTATION_0 || mRotation == ROTATION_180)) {
mRotation = ROTATION_90;
rotateNeeded = true;
} else if (screenOrientation == SCREEN_ORIENTATION_UNSPECIFIED
&& mRotation != displayRotation) {
mRotation = displayRotation;
rotateNeeded = true;
}
if (rotateNeeded) {
mBounds.set(0, 0, mBounds.height(), mBounds.width());
}
}
@Override
public String toString() {
return "PipWindowConfigurationCompact(rotation=" + mRotation
+ " bounds=" + mBounds + ")";
}
}

View File

@@ -3627,6 +3627,9 @@ class Task extends WindowContainer<WindowContainer> {
info.topActivityInfo = mReuseActivitiesReport.top != null
? mReuseActivitiesReport.top.info
: null;
info.requestedOrientation = mReuseActivitiesReport.base != null
? mReuseActivitiesReport.base.getRequestedOrientation()
: SCREEN_ORIENTATION_UNSET;
}
/**

View File

@@ -458,7 +458,8 @@ class TaskOrganizerController extends ITaskOrganizerController.Stub {
|| mTmpTaskInfo.topActivityType != lastInfo.topActivityType
|| mTmpTaskInfo.isResizeable != lastInfo.isResizeable
|| mTmpTaskInfo.pictureInPictureParams != lastInfo.pictureInPictureParams
|| !TaskDescription.equals(mTmpTaskInfo.taskDescription, lastInfo.taskDescription);
|| !TaskDescription.equals(mTmpTaskInfo.taskDescription, lastInfo.taskDescription)
|| mTmpTaskInfo.requestedOrientation != lastInfo.requestedOrientation;
if (!changed) {
int cfgChanges = mTmpTaskInfo.configuration.diff(lastInfo.configuration);
final int winCfgChanges = (cfgChanges & ActivityInfo.CONFIG_WINDOW_CONFIGURATION) != 0