diff options
3 files changed, 22 insertions, 27 deletions
diff --git a/services/core/java/com/android/server/wm/AppCompatConfigurationPersister.java b/services/core/java/com/android/server/wm/AppCompatConfigurationPersister.java index 852ce0401e2c..9c861feba141 100644 --- a/services/core/java/com/android/server/wm/AppCompatConfigurationPersister.java +++ b/services/core/java/com/android/server/wm/AppCompatConfigurationPersister.java @@ -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; @@ -122,7 +119,7 @@ class AppCompatConfigurationPersister { final File prefFiles = new File(configFolder, letterboxConfigurationFileName); mConfigurationFile = new AtomicFile(prefFiles); mPersisterQueue = persisterQueue; - runWithDiskReadsThreadPolicy(this::readCurrentConfiguration); + readCurrentConfiguration(); } /** @@ -212,6 +209,7 @@ class AppCompatConfigurationPersister { mDefaultTabletopModeReachabilitySupplier.get(); } + @MainThread private void readCurrentConfiguration() { if (!mConfigurationFile.exists()) { useDefaultValue(); @@ -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> { diff --git a/services/core/java/com/android/server/wm/WindowManagerService.java b/services/core/java/com/android/server/wm/WindowManagerService.java index 459a509a3b3c..33f2dd103c2e 100644 --- a/services/core/java/com/android/server/wm/WindowManagerService.java +++ b/services/core/java/com/android/server/wm/WindowManagerService.java @@ -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; } @@ -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]; } @@ -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; @@ -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); diff --git a/services/tests/wmtests/src/com/android/server/wm/SystemServicesTestRule.java b/services/tests/wmtests/src/com/android/server/wm/SystemServicesTestRule.java index 71cfbfd94a53..08622e68629a 100644 --- a/services/tests/wmtests/src/com/android/server/wm/SystemServicesTestRule.java +++ b/services/tests/wmtests/src/com/android/server/wm/SystemServicesTestRule.java @@ -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; @@ -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 */); @@ -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. |