Loading services/core/java/com/android/server/wm/DisplayContent.java +6 −2 Original line number Diff line number Diff line Loading @@ -3554,7 +3554,11 @@ class DisplayContent extends WindowContainer<DisplayContent.DisplayChildWindowCo return false; } return mWmService.mDisplayWindowSettings.shouldShowImeLocked(this) || mWmService.mForceDesktopModeOnExternalDisplays; || forceDesktopMode(); } boolean forceDesktopMode() { return mWmService.mForceDesktopModeOnExternalDisplays && !isDefaultDisplay && !isPrivate(); } private void setInputMethodTarget(WindowState target, boolean targetWaitingAnim) { Loading Loading @@ -4786,7 +4790,7 @@ class DisplayContent extends WindowContainer<DisplayContent.DisplayChildWindowCo boolean supportsSystemDecorations() { return (mWmService.mDisplayWindowSettings.shouldShowSystemDecorsLocked(this) || (mDisplay.getFlags() & FLAG_SHOULD_SHOW_SYSTEM_DECORATIONS) != 0 || mWmService.mForceDesktopModeOnExternalDisplays) || forceDesktopMode()) // VR virtual display will be used to run and render 2D app within a VR experience. && mDisplayId != mWmService.mVr2dDisplayId // Do not show system decorations on untrusted virtual display. Loading services/core/java/com/android/server/wm/DisplayRotation.java +1 −3 Original line number Diff line number Diff line Loading @@ -330,10 +330,8 @@ public class DisplayRotation { // It's also not likely to rotate a TV screen. final boolean isTv = mContext.getPackageManager().hasSystemFeature( PackageManager.FEATURE_LEANBACK); final boolean forceDesktopMode = mService.mForceDesktopModeOnExternalDisplays && !isDefaultDisplay; mDefaultFixedToUserRotation = (isCar || isTv || mService.mIsPc || forceDesktopMode) (isCar || isTv || mService.mIsPc || mDisplayContent.forceDesktopMode()) // For debug purposes the next line turns this feature off with: // $ adb shell setprop config.override_forced_orient true // $ adb shell wm size reset Loading services/core/java/com/android/server/wm/DisplayWindowSettings.java +4 −6 Original line number Diff line number Diff line Loading @@ -248,7 +248,7 @@ class DisplayWindowSettings { writeSettingsIfNeeded(entry, displayInfo); } private int getWindowingModeLocked(Entry entry, int displayId) { private int getWindowingModeLocked(Entry entry, DisplayContent dc) { int windowingMode = entry != null ? entry.mWindowingMode : WindowConfiguration.WINDOWING_MODE_UNDEFINED; // This display used to be in freeform, but we don't support freeform anymore, so fall Loading @@ -259,10 +259,8 @@ class DisplayWindowSettings { } // No record is present so use default windowing mode policy. if (windowingMode == WindowConfiguration.WINDOWING_MODE_UNDEFINED) { final boolean forceDesktopMode = mService.mForceDesktopModeOnExternalDisplays && displayId != Display.DEFAULT_DISPLAY; windowingMode = mService.mAtmService.mSupportsFreeformWindowManagement && (mService.mIsPc || forceDesktopMode) && (mService.mIsPc || dc.forceDesktopMode()) ? WindowConfiguration.WINDOWING_MODE_FREEFORM : WindowConfiguration.WINDOWING_MODE_FULLSCREEN; } Loading @@ -272,7 +270,7 @@ class DisplayWindowSettings { int getWindowingModeLocked(DisplayContent dc) { final DisplayInfo displayInfo = dc.getDisplayInfo(); final Entry entry = getEntry(displayInfo); return getWindowingModeLocked(entry, dc.getDisplayId()); return getWindowingModeLocked(entry, dc); } void setWindowingModeLocked(DisplayContent dc, int mode) { Loading Loading @@ -382,7 +380,7 @@ class DisplayWindowSettings { final Entry entry = getOrCreateEntry(displayInfo); // Setting windowing mode first, because it may override overscan values later. dc.setWindowingMode(getWindowingModeLocked(entry, dc.getDisplayId())); dc.setWindowingMode(getWindowingModeLocked(entry, dc)); dc.getDisplayRotation().restoreSettings(entry.mUserRotationMode, entry.mUserRotation, entry.mFixedToUserRotation); Loading services/tests/wmtests/src/com/android/server/wm/DisplayContentTests.java +25 −0 Original line number Diff line number Diff line Loading @@ -28,6 +28,7 @@ import static android.content.pm.ActivityInfo.SCREEN_ORIENTATION_USER; import static android.os.Build.VERSION_CODES.P; import static android.os.Build.VERSION_CODES.Q; import static android.view.Display.DEFAULT_DISPLAY; import static android.view.Display.FLAG_PRIVATE; import static android.view.DisplayCutout.BOUNDS_POSITION_LEFT; import static android.view.DisplayCutout.BOUNDS_POSITION_TOP; import static android.view.DisplayCutout.fromBoundingRect; Loading Loading @@ -95,6 +96,7 @@ import android.os.SystemClock; import android.platform.test.annotations.Presubmit; import android.util.DisplayMetrics; import android.view.DisplayCutout; import android.view.DisplayInfo; import android.view.Gravity; import android.view.IDisplayWindowRotationCallback; import android.view.IDisplayWindowRotationController; Loading Loading @@ -1439,6 +1441,29 @@ public class DisplayContentTests extends WindowTestsBase { mDisplayContent.ensureActivitiesVisible(null, 0, false, false); } @Test public void testForceDesktopMode() { mWm.mForceDesktopModeOnExternalDisplays = true; // Not applicable for default display final DisplayContent defaultDisplay = mWm.mRoot.getDefaultDisplay(); assertFalse(defaultDisplay.forceDesktopMode()); // Not applicable for private secondary display. final DisplayInfo displayInfo = new DisplayInfo(); displayInfo.copyFrom(mDisplayInfo); displayInfo.flags = FLAG_PRIVATE; final DisplayContent privateDc = createNewDisplay(displayInfo); assertFalse(privateDc.forceDesktopMode()); // Applicable for public secondary display. final DisplayContent publicDc = createNewDisplay(); assertTrue(publicDc.forceDesktopMode()); // Make sure forceDesktopMode() is false when the force config is disabled. mWm.mForceDesktopModeOnExternalDisplays = false; assertFalse(publicDc.forceDesktopMode()); } private boolean isOptionsPanelAtRight(int displayId) { return (mWm.getPreferredOptionsPanelGravity(displayId) & Gravity.RIGHT) == Gravity.RIGHT; } Loading Loading
services/core/java/com/android/server/wm/DisplayContent.java +6 −2 Original line number Diff line number Diff line Loading @@ -3554,7 +3554,11 @@ class DisplayContent extends WindowContainer<DisplayContent.DisplayChildWindowCo return false; } return mWmService.mDisplayWindowSettings.shouldShowImeLocked(this) || mWmService.mForceDesktopModeOnExternalDisplays; || forceDesktopMode(); } boolean forceDesktopMode() { return mWmService.mForceDesktopModeOnExternalDisplays && !isDefaultDisplay && !isPrivate(); } private void setInputMethodTarget(WindowState target, boolean targetWaitingAnim) { Loading Loading @@ -4786,7 +4790,7 @@ class DisplayContent extends WindowContainer<DisplayContent.DisplayChildWindowCo boolean supportsSystemDecorations() { return (mWmService.mDisplayWindowSettings.shouldShowSystemDecorsLocked(this) || (mDisplay.getFlags() & FLAG_SHOULD_SHOW_SYSTEM_DECORATIONS) != 0 || mWmService.mForceDesktopModeOnExternalDisplays) || forceDesktopMode()) // VR virtual display will be used to run and render 2D app within a VR experience. && mDisplayId != mWmService.mVr2dDisplayId // Do not show system decorations on untrusted virtual display. Loading
services/core/java/com/android/server/wm/DisplayRotation.java +1 −3 Original line number Diff line number Diff line Loading @@ -330,10 +330,8 @@ public class DisplayRotation { // It's also not likely to rotate a TV screen. final boolean isTv = mContext.getPackageManager().hasSystemFeature( PackageManager.FEATURE_LEANBACK); final boolean forceDesktopMode = mService.mForceDesktopModeOnExternalDisplays && !isDefaultDisplay; mDefaultFixedToUserRotation = (isCar || isTv || mService.mIsPc || forceDesktopMode) (isCar || isTv || mService.mIsPc || mDisplayContent.forceDesktopMode()) // For debug purposes the next line turns this feature off with: // $ adb shell setprop config.override_forced_orient true // $ adb shell wm size reset Loading
services/core/java/com/android/server/wm/DisplayWindowSettings.java +4 −6 Original line number Diff line number Diff line Loading @@ -248,7 +248,7 @@ class DisplayWindowSettings { writeSettingsIfNeeded(entry, displayInfo); } private int getWindowingModeLocked(Entry entry, int displayId) { private int getWindowingModeLocked(Entry entry, DisplayContent dc) { int windowingMode = entry != null ? entry.mWindowingMode : WindowConfiguration.WINDOWING_MODE_UNDEFINED; // This display used to be in freeform, but we don't support freeform anymore, so fall Loading @@ -259,10 +259,8 @@ class DisplayWindowSettings { } // No record is present so use default windowing mode policy. if (windowingMode == WindowConfiguration.WINDOWING_MODE_UNDEFINED) { final boolean forceDesktopMode = mService.mForceDesktopModeOnExternalDisplays && displayId != Display.DEFAULT_DISPLAY; windowingMode = mService.mAtmService.mSupportsFreeformWindowManagement && (mService.mIsPc || forceDesktopMode) && (mService.mIsPc || dc.forceDesktopMode()) ? WindowConfiguration.WINDOWING_MODE_FREEFORM : WindowConfiguration.WINDOWING_MODE_FULLSCREEN; } Loading @@ -272,7 +270,7 @@ class DisplayWindowSettings { int getWindowingModeLocked(DisplayContent dc) { final DisplayInfo displayInfo = dc.getDisplayInfo(); final Entry entry = getEntry(displayInfo); return getWindowingModeLocked(entry, dc.getDisplayId()); return getWindowingModeLocked(entry, dc); } void setWindowingModeLocked(DisplayContent dc, int mode) { Loading Loading @@ -382,7 +380,7 @@ class DisplayWindowSettings { final Entry entry = getOrCreateEntry(displayInfo); // Setting windowing mode first, because it may override overscan values later. dc.setWindowingMode(getWindowingModeLocked(entry, dc.getDisplayId())); dc.setWindowingMode(getWindowingModeLocked(entry, dc)); dc.getDisplayRotation().restoreSettings(entry.mUserRotationMode, entry.mUserRotation, entry.mFixedToUserRotation); Loading
services/tests/wmtests/src/com/android/server/wm/DisplayContentTests.java +25 −0 Original line number Diff line number Diff line Loading @@ -28,6 +28,7 @@ import static android.content.pm.ActivityInfo.SCREEN_ORIENTATION_USER; import static android.os.Build.VERSION_CODES.P; import static android.os.Build.VERSION_CODES.Q; import static android.view.Display.DEFAULT_DISPLAY; import static android.view.Display.FLAG_PRIVATE; import static android.view.DisplayCutout.BOUNDS_POSITION_LEFT; import static android.view.DisplayCutout.BOUNDS_POSITION_TOP; import static android.view.DisplayCutout.fromBoundingRect; Loading Loading @@ -95,6 +96,7 @@ import android.os.SystemClock; import android.platform.test.annotations.Presubmit; import android.util.DisplayMetrics; import android.view.DisplayCutout; import android.view.DisplayInfo; import android.view.Gravity; import android.view.IDisplayWindowRotationCallback; import android.view.IDisplayWindowRotationController; Loading Loading @@ -1439,6 +1441,29 @@ public class DisplayContentTests extends WindowTestsBase { mDisplayContent.ensureActivitiesVisible(null, 0, false, false); } @Test public void testForceDesktopMode() { mWm.mForceDesktopModeOnExternalDisplays = true; // Not applicable for default display final DisplayContent defaultDisplay = mWm.mRoot.getDefaultDisplay(); assertFalse(defaultDisplay.forceDesktopMode()); // Not applicable for private secondary display. final DisplayInfo displayInfo = new DisplayInfo(); displayInfo.copyFrom(mDisplayInfo); displayInfo.flags = FLAG_PRIVATE; final DisplayContent privateDc = createNewDisplay(displayInfo); assertFalse(privateDc.forceDesktopMode()); // Applicable for public secondary display. final DisplayContent publicDc = createNewDisplay(); assertTrue(publicDc.forceDesktopMode()); // Make sure forceDesktopMode() is false when the force config is disabled. mWm.mForceDesktopModeOnExternalDisplays = false; assertFalse(publicDc.forceDesktopMode()); } private boolean isOptionsPanelAtRight(int displayId) { return (mWm.getPreferredOptionsPanelGravity(displayId) & Gravity.RIGHT) == Gravity.RIGHT; } Loading