Merge "Only allow AM to update display orientation based on app containers" into oc-dev

am: 9304756c28

Change-Id: I81df798a1f2897837c6adbc622ffa64766030a6a
This commit is contained in:
Wale Ogunwale
2017-05-03 16:26:53 +00:00
committed by android-build-merger
2 changed files with 41 additions and 10 deletions

View File

@@ -1503,8 +1503,16 @@ class DisplayContent extends WindowContainer<DisplayContent.DisplayChildWindowCo
return mImeWindowsContainers.forAllWindows(callback, traverseTopToBottom);
}
@Override
int getOrientation() {
/**
* Returns the orientation that this display should be in factoring in its children containers.
*
* @param includeAppContainers True if then app containers (stacks, tasks, ...) should be
* factored in when determining the orientation. If false only
* non-app/system containers will be used to determine the returned
* orientation.
* @return The orientation the display should be in.
*/
int getOrientation(boolean includeAppContainers) {
final WindowManagerPolicy policy = mService.mPolicy;
if (mService.mDisplayFrozen) {
@@ -1533,8 +1541,14 @@ class DisplayContent extends WindowContainer<DisplayContent.DisplayChildWindowCo
}
}
// Top system windows are not requesting an orientation. Start searching from apps.
return mTaskStackContainers.getOrientation();
// Top system windows are not requesting an orientation. Get orientation from app containers
// if allowed. Otherwise, return the last orientation.
return includeAppContainers ? mTaskStackContainers.getOrientation() : mLastOrientation;
}
@Override
int getOrientation() {
return getOrientation(true /* includeAppContainers */);
}
void updateDisplayInfo() {

View File

@@ -2373,7 +2373,7 @@ public class WindowManagerService extends IWindowManager.Stub
try {
synchronized(mWindowMap) {
config = updateOrientationFromAppTokensLocked(currentConfig, freezeThisOneIfNeeded,
displayId);
displayId, true /* includeAppContainers */);
}
} finally {
Binder.restoreCallingIdentity(ident);
@@ -2383,13 +2383,13 @@ public class WindowManagerService extends IWindowManager.Stub
}
private Configuration updateOrientationFromAppTokensLocked(Configuration currentConfig,
IBinder freezeThisOneIfNeeded, int displayId) {
IBinder freezeThisOneIfNeeded, int displayId, boolean includeAppContainers) {
if (!mDisplayReady) {
return null;
}
Configuration config = null;
if (updateOrientationFromAppTokensLocked(false, displayId)) {
if (updateOrientationFromAppTokensLocked(false, displayId, includeAppContainers)) {
// If we changed the orientation but mOrientationChangeComplete is already true,
// we used seamless rotation, and we don't need to freeze the screen.
if (freezeThisOneIfNeeded != null && !mRoot.mOrientationChangeComplete) {
@@ -2427,6 +2427,11 @@ public class WindowManagerService extends IWindowManager.Stub
return config;
}
boolean updateOrientationFromAppTokensLocked(boolean inTransaction, int displayId) {
return updateOrientationFromAppTokensLocked(inTransaction, displayId,
false /* includeAppContainers */);
}
/**
* Determine the new desired orientation of the display, returning a non-null new Configuration
* if it has changed from the current orientation. IF TRUE IS RETURNED SOMEONE MUST CALL
@@ -2437,13 +2442,25 @@ public class WindowManagerService extends IWindowManager.Stub
* The orientation is computed from non-application windows first. If none of the
* non-application windows specify orientation, the orientation is computed from application
* tokens.
*
* @param inTransaction True if we are currently in a surface transaction.
* @param displayId Id of the display to update orientation for.
* @param includeAppContainers True if then app containers (stacks, tasks, ...) should be
* factored in when determining the orientation. If false only
* non-app/system containers will be used to determine the returned
* orientation.
* NOTE: Only call originating from activity manager are expected to
* set this to true as it needs to synchronize several app states
* like visibility with the update of display orientation.
* @return True if the display orientation was updated.
* @see android.view.IWindowManager#updateOrientationFromAppTokens(Configuration, IBinder, int)
*/
boolean updateOrientationFromAppTokensLocked(boolean inTransaction, int displayId) {
long ident = Binder.clearCallingIdentity();
private boolean updateOrientationFromAppTokensLocked(boolean inTransaction, int displayId,
boolean includeAppContainers) {
final long ident = Binder.clearCallingIdentity();
try {
final DisplayContent dc = mRoot.getDisplayContent(displayId);
final int req = dc.getOrientation();
final int req = dc.getOrientation(includeAppContainers);
if (req != dc.getLastOrientation()) {
dc.setLastOrientation(req);
//send a message to Policy indicating orientation change to take