Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit f5782de3 authored by Robin Lee's avatar Robin Lee
Browse files

Inject AppCompatConfiguration to WindowManager

AppCompatConfiguration reads real values from the device, and tries to
access actual files during startup and when settings change. This works
for instrumentation tests but should be avoided when writing unit tests.

Flag: EXEMPT mechanical refactor
Test: atest WmTests
Bug: 362981229
Change-Id: I493eb9e0cc111c69556c7589d905cdc43abb588d
parent 6f0adf13
Loading
Loading
Loading
Loading
+3 −19
Original line number Diff line number Diff line
@@ -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> {

+12 −7
Original line number Diff line number Diff line
@@ -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);
+7 −1
Original line number Diff line number Diff line
@@ -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.