Loading services/core/java/com/android/server/wm/AppCompatConfigurationPersister.java +3 −19 Original line number Diff line number Diff line Loading @@ -16,16 +16,13 @@ package com.android.server.wm; import static android.os.StrictMode.setThreadPolicy; import static com.android.server.wm.WindowManagerDebugConfig.TAG_WITH_CLASS_NAME; import static com.android.server.wm.WindowManagerDebugConfig.TAG_WM; import android.annotation.MainThread; import android.annotation.NonNull; import android.annotation.Nullable; import android.os.Environment; import android.os.StrictMode; import android.os.StrictMode.ThreadPolicy; import android.util.AtomicFile; import android.util.Slog; Loading Loading @@ -122,7 +119,7 @@ class AppCompatConfigurationPersister { final File prefFiles = new File(configFolder, letterboxConfigurationFileName); mConfigurationFile = new AtomicFile(prefFiles); mPersisterQueue = persisterQueue; runWithDiskReadsThreadPolicy(this::readCurrentConfiguration); readCurrentConfiguration(); } /** Loading Loading @@ -212,6 +209,7 @@ class AppCompatConfigurationPersister { mDefaultTabletopModeReachabilitySupplier.get(); } @MainThread private void readCurrentConfiguration() { if (!mConfigurationFile.exists()) { useDefaultValue(); Loading Loading @@ -272,20 +270,6 @@ class AppCompatConfigurationPersister { } } // The LetterboxConfigurationDeviceConfig needs to access the // file with the current reachability position once when the // device boots. Because DisplayThread uses allowIo=false // accessing a file triggers a DiskReadViolation. // Here we use StrictMode to allow the current thread to read // the AtomicFile once in the current thread restoring the // original ThreadPolicy after that. private void runWithDiskReadsThreadPolicy(Runnable runnable) { final ThreadPolicy currentPolicy = StrictMode.getThreadPolicy(); setThreadPolicy(new ThreadPolicy.Builder().permitDiskReads().build()); runnable.run(); setThreadPolicy(currentPolicy); } private static class UpdateValuesCommand implements PersisterQueue.WriteQueueItem<UpdateValuesCommand> { Loading services/core/java/com/android/server/wm/WindowManagerService.java +12 −7 Original line number Diff line number Diff line Loading @@ -1186,9 +1186,13 @@ public class WindowManagerService extends IWindowManager.Stub public static WindowManagerService main(final Context context, final InputManagerService im, final boolean showBootMsgs, WindowManagerPolicy policy, ActivityTaskManagerService atm) { // Using SysUI context to have access to Material colors extracted from Wallpaper. final AppCompatConfiguration appCompat = new AppCompatConfiguration( ActivityThread.currentActivityThread().getSystemUiContext()); final WindowManagerService wms = main(context, im, showBootMsgs, policy, atm, new DisplayWindowSettingsProvider(), SurfaceControl.Transaction::new, SurfaceControl.Builder::new); SurfaceControl.Builder::new, appCompat); WindowManagerGlobal.setWindowManagerServiceForSystemProcess(wms); return wms; } Loading @@ -1202,12 +1206,14 @@ public class WindowManagerService extends IWindowManager.Stub final boolean showBootMsgs, WindowManagerPolicy policy, ActivityTaskManagerService atm, DisplayWindowSettingsProvider displayWindowSettingsProvider, Supplier<SurfaceControl.Transaction> transactionFactory, Supplier<SurfaceControl.Builder> surfaceControlFactory) { Supplier<SurfaceControl.Builder> surfaceControlFactory, AppCompatConfiguration appCompat) { final WindowManagerService[] wms = new WindowManagerService[1]; DisplayThread.getHandler().runWithScissors(() -> wms[0] = new WindowManagerService(context, im, showBootMsgs, policy, atm, displayWindowSettingsProvider, transactionFactory, surfaceControlFactory), 0); surfaceControlFactory, appCompat), 0); return wms[0]; } Loading @@ -1231,7 +1237,8 @@ public class WindowManagerService extends IWindowManager.Stub boolean showBootMsgs, WindowManagerPolicy policy, ActivityTaskManagerService atm, DisplayWindowSettingsProvider displayWindowSettingsProvider, Supplier<SurfaceControl.Transaction> transactionFactory, Supplier<SurfaceControl.Builder> surfaceControlFactory) { Supplier<SurfaceControl.Builder> surfaceControlFactory, AppCompatConfiguration appCompat) { installLock(this, INDEX_WINDOW); mGlobalLock = atm.getGlobalLock(); mAtmService = atm; Loading Loading @@ -1283,9 +1290,7 @@ public class WindowManagerService extends IWindowManager.Stub | WindowInsets.Type.navigationBars(); } mAppCompatConfiguration = new AppCompatConfiguration( // Using SysUI context to have access to Material colors extracted from Wallpaper. ActivityThread.currentActivityThread().getSystemUiContext()); mAppCompatConfiguration = appCompat; mInputManager = inputManager; // Must be before createDisplayContentLocked. mDisplayManagerInternal = LocalServices.getService(DisplayManagerInternal.class); Loading services/tests/wmtests/src/com/android/server/wm/SystemServicesTestRule.java +7 −1 Original line number Diff line number Diff line Loading @@ -133,6 +133,7 @@ public class SystemServicesTestRule implements TestRule { private final ArrayList<DeviceConfig.OnPropertiesChangedListener> mDeviceConfigListeners = new ArrayList<>(); private AppCompatConfiguration mAppCompat; private Description mDescription; private Context mContext; private StaticMockitoSession mMockitoSession; Loading Loading @@ -379,6 +380,11 @@ public class SystemServicesTestRule implements TestRule { mock(ActivityManagerService.class, withSettings().stubOnly()); mAtmService = new TestActivityTaskManagerService(mContext, amService); LocalServices.addService(ActivityTaskManagerInternal.class, mAtmService.getAtmInternal()); // AppCompatConfiguration mAppCompat = new AppCompatConfiguration( ActivityThread.currentActivityThread().getSystemUiContext()); // Create a fake WindowProcessController for the system process. final WindowProcessController wpc = addProcess("android", "system", 1485 /* pid */, 1000 /* uid */); Loading @@ -394,7 +400,7 @@ public class SystemServicesTestRule implements TestRule { mWmService = WindowManagerService.main( mContext, mImService, false, wmPolicy, mAtmService, testDisplayWindowSettingsProvider, StubTransaction::new, MockSurfaceControlBuilder::new); MockSurfaceControlBuilder::new, mAppCompat); spyOn(mWmService); spyOn(mWmService.mRoot); // Invoked during {@link ActivityStack} creation. Loading Loading
services/core/java/com/android/server/wm/AppCompatConfigurationPersister.java +3 −19 Original line number Diff line number Diff line Loading @@ -16,16 +16,13 @@ package com.android.server.wm; import static android.os.StrictMode.setThreadPolicy; import static com.android.server.wm.WindowManagerDebugConfig.TAG_WITH_CLASS_NAME; import static com.android.server.wm.WindowManagerDebugConfig.TAG_WM; import android.annotation.MainThread; import android.annotation.NonNull; import android.annotation.Nullable; import android.os.Environment; import android.os.StrictMode; import android.os.StrictMode.ThreadPolicy; import android.util.AtomicFile; import android.util.Slog; Loading Loading @@ -122,7 +119,7 @@ class AppCompatConfigurationPersister { final File prefFiles = new File(configFolder, letterboxConfigurationFileName); mConfigurationFile = new AtomicFile(prefFiles); mPersisterQueue = persisterQueue; runWithDiskReadsThreadPolicy(this::readCurrentConfiguration); readCurrentConfiguration(); } /** Loading Loading @@ -212,6 +209,7 @@ class AppCompatConfigurationPersister { mDefaultTabletopModeReachabilitySupplier.get(); } @MainThread private void readCurrentConfiguration() { if (!mConfigurationFile.exists()) { useDefaultValue(); Loading Loading @@ -272,20 +270,6 @@ class AppCompatConfigurationPersister { } } // The LetterboxConfigurationDeviceConfig needs to access the // file with the current reachability position once when the // device boots. Because DisplayThread uses allowIo=false // accessing a file triggers a DiskReadViolation. // Here we use StrictMode to allow the current thread to read // the AtomicFile once in the current thread restoring the // original ThreadPolicy after that. private void runWithDiskReadsThreadPolicy(Runnable runnable) { final ThreadPolicy currentPolicy = StrictMode.getThreadPolicy(); setThreadPolicy(new ThreadPolicy.Builder().permitDiskReads().build()); runnable.run(); setThreadPolicy(currentPolicy); } private static class UpdateValuesCommand implements PersisterQueue.WriteQueueItem<UpdateValuesCommand> { Loading
services/core/java/com/android/server/wm/WindowManagerService.java +12 −7 Original line number Diff line number Diff line Loading @@ -1186,9 +1186,13 @@ public class WindowManagerService extends IWindowManager.Stub public static WindowManagerService main(final Context context, final InputManagerService im, final boolean showBootMsgs, WindowManagerPolicy policy, ActivityTaskManagerService atm) { // Using SysUI context to have access to Material colors extracted from Wallpaper. final AppCompatConfiguration appCompat = new AppCompatConfiguration( ActivityThread.currentActivityThread().getSystemUiContext()); final WindowManagerService wms = main(context, im, showBootMsgs, policy, atm, new DisplayWindowSettingsProvider(), SurfaceControl.Transaction::new, SurfaceControl.Builder::new); SurfaceControl.Builder::new, appCompat); WindowManagerGlobal.setWindowManagerServiceForSystemProcess(wms); return wms; } Loading @@ -1202,12 +1206,14 @@ public class WindowManagerService extends IWindowManager.Stub final boolean showBootMsgs, WindowManagerPolicy policy, ActivityTaskManagerService atm, DisplayWindowSettingsProvider displayWindowSettingsProvider, Supplier<SurfaceControl.Transaction> transactionFactory, Supplier<SurfaceControl.Builder> surfaceControlFactory) { Supplier<SurfaceControl.Builder> surfaceControlFactory, AppCompatConfiguration appCompat) { final WindowManagerService[] wms = new WindowManagerService[1]; DisplayThread.getHandler().runWithScissors(() -> wms[0] = new WindowManagerService(context, im, showBootMsgs, policy, atm, displayWindowSettingsProvider, transactionFactory, surfaceControlFactory), 0); surfaceControlFactory, appCompat), 0); return wms[0]; } Loading @@ -1231,7 +1237,8 @@ public class WindowManagerService extends IWindowManager.Stub boolean showBootMsgs, WindowManagerPolicy policy, ActivityTaskManagerService atm, DisplayWindowSettingsProvider displayWindowSettingsProvider, Supplier<SurfaceControl.Transaction> transactionFactory, Supplier<SurfaceControl.Builder> surfaceControlFactory) { Supplier<SurfaceControl.Builder> surfaceControlFactory, AppCompatConfiguration appCompat) { installLock(this, INDEX_WINDOW); mGlobalLock = atm.getGlobalLock(); mAtmService = atm; Loading Loading @@ -1283,9 +1290,7 @@ public class WindowManagerService extends IWindowManager.Stub | WindowInsets.Type.navigationBars(); } mAppCompatConfiguration = new AppCompatConfiguration( // Using SysUI context to have access to Material colors extracted from Wallpaper. ActivityThread.currentActivityThread().getSystemUiContext()); mAppCompatConfiguration = appCompat; mInputManager = inputManager; // Must be before createDisplayContentLocked. mDisplayManagerInternal = LocalServices.getService(DisplayManagerInternal.class); Loading
services/tests/wmtests/src/com/android/server/wm/SystemServicesTestRule.java +7 −1 Original line number Diff line number Diff line Loading @@ -133,6 +133,7 @@ public class SystemServicesTestRule implements TestRule { private final ArrayList<DeviceConfig.OnPropertiesChangedListener> mDeviceConfigListeners = new ArrayList<>(); private AppCompatConfiguration mAppCompat; private Description mDescription; private Context mContext; private StaticMockitoSession mMockitoSession; Loading Loading @@ -379,6 +380,11 @@ public class SystemServicesTestRule implements TestRule { mock(ActivityManagerService.class, withSettings().stubOnly()); mAtmService = new TestActivityTaskManagerService(mContext, amService); LocalServices.addService(ActivityTaskManagerInternal.class, mAtmService.getAtmInternal()); // AppCompatConfiguration mAppCompat = new AppCompatConfiguration( ActivityThread.currentActivityThread().getSystemUiContext()); // Create a fake WindowProcessController for the system process. final WindowProcessController wpc = addProcess("android", "system", 1485 /* pid */, 1000 /* uid */); Loading @@ -394,7 +400,7 @@ public class SystemServicesTestRule implements TestRule { mWmService = WindowManagerService.main( mContext, mImService, false, wmPolicy, mAtmService, testDisplayWindowSettingsProvider, StubTransaction::new, MockSurfaceControlBuilder::new); MockSurfaceControlBuilder::new, mAppCompat); spyOn(mWmService); spyOn(mWmService.mRoot); // Invoked during {@link ActivityStack} creation. Loading