Loading services/core/java/com/android/server/wm/DisplayContent.java +18 −4 Original line number Diff line number Diff line Loading @@ -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) { Loading Loading @@ -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() { Loading services/core/java/com/android/server/wm/WindowManagerService.java +23 −6 Original line number Diff line number Diff line Loading @@ -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); Loading @@ -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) { Loading Loading @@ -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 Loading @@ -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 Loading Loading
services/core/java/com/android/server/wm/DisplayContent.java +18 −4 Original line number Diff line number Diff line Loading @@ -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) { Loading Loading @@ -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() { Loading
services/core/java/com/android/server/wm/WindowManagerService.java +23 −6 Original line number Diff line number Diff line Loading @@ -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); Loading @@ -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) { Loading Loading @@ -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 Loading @@ -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 Loading