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

Commit 1ce67a61 authored by Alex Chau's avatar Alex Chau
Browse files

Use SandboxContext in AbstractDeviceProfileTest

- Added a initializeForTesting method to SandboxContext
- Also made SandboxContext non-abstract, so it can be used in tests to inject mock MainThreadInitializedObject into the SandboxContext, this should avoid mocked MainThreadInitializedObject bled into another test

Test: presubmit
Flag: None
Bug: 303328913
Change-Id: I37157d81b08b80f1e90eacca7dc2ce482cd08aa4
parent e0a25fbd
Loading
Loading
Loading
Loading
+10 −1
Original line number Diff line number Diff line
@@ -93,7 +93,7 @@ public class MainThreadInitializedObject<T> {
     * Abstract Context which allows custom implementations for
     * {@link MainThreadInitializedObject} providers
     */
    public static abstract class SandboxContext extends ContextWrapper {
    public static class SandboxContext extends ContextWrapper {

        private static final String TAG = "SandboxContext";

@@ -165,5 +165,14 @@ public class MainThreadInitializedObject<T> {
        protected <T> T createObject(MainThreadInitializedObject<T> object) {
            return object.mProvider.get(this);
        }

        /**
         * Put a value into mObjectMap, can be used to put mocked MainThreadInitializedObject
         * instances into SandboxContext.
         */
        @VisibleForTesting
        public <T> void putObject(MainThreadInitializedObject<T> object, T value) {
            mObjectMap.put(object, value);
        }
    }
}
+15 −21
Original line number Diff line number Diff line
@@ -24,6 +24,7 @@ import android.view.Surface
import androidx.test.core.app.ApplicationProvider
import com.android.launcher3.testing.shared.ResourceUtils
import com.android.launcher3.util.DisplayController
import com.android.launcher3.util.MainThreadInitializedObject.SandboxContext
import com.android.launcher3.util.NavigationMode
import com.android.launcher3.util.WindowBounds
import com.android.launcher3.util.rule.TestStabilityRule
@@ -35,8 +36,6 @@ import java.io.PrintWriter
import java.io.StringWriter
import kotlin.math.max
import kotlin.math.min
import org.junit.After
import org.junit.Before
import org.junit.Rule
import org.mockito.kotlin.any
import org.mockito.kotlin.mock
@@ -50,30 +49,14 @@ import org.mockito.kotlin.whenever
 * For an implementation that mocks InvariantDeviceProfile, use [FakeInvariantDeviceProfileTest]
 */
abstract class AbstractDeviceProfileTest {
    protected var context: Context? = null
    protected lateinit var context: SandboxContext
    protected open val runningContext: Context = ApplicationProvider.getApplicationContext()
    private val displayController: DisplayController = mock()
    private val windowManagerProxy: WindowManagerProxy = mock()
    private lateinit var originalDisplayController: DisplayController
    private lateinit var originalWindowManagerProxy: WindowManagerProxy
    private val launcherPrefs: LauncherPrefs = mock()

    @Rule @JvmField val testStabilityRule = TestStabilityRule()

    @Before
    open fun setUp() {
        val appContext: Context = ApplicationProvider.getApplicationContext()
        originalWindowManagerProxy = WindowManagerProxy.INSTANCE.get(appContext)
        originalDisplayController = DisplayController.INSTANCE.get(appContext)
        WindowManagerProxy.INSTANCE.initializeForTesting(windowManagerProxy)
        DisplayController.INSTANCE.initializeForTesting(displayController)
    }

    @After
    open fun tearDown() {
        WindowManagerProxy.INSTANCE.initializeForTesting(originalWindowManagerProxy)
        DisplayController.INSTANCE.initializeForTesting(originalDisplayController)
    }

    class DeviceSpec(
        val naturalSize: Pair<Int, Int>,
        var densityDpi: Int,
@@ -304,8 +287,19 @@ abstract class AbstractDeviceProfileTest {
                screenHeightDp = (realBounds.bounds.height() / density).toInt()
                smallestScreenWidthDp = min(screenWidthDp, screenHeightDp)
            }
        context = runningContext.createConfigurationContext(config)
        val configurationContext = runningContext.createConfigurationContext(config)
        context =
            SandboxContext(
                configurationContext,
                DisplayController.INSTANCE,
                WindowManagerProxy.INSTANCE,
                LauncherPrefs.INSTANCE
            )
        context.putObject(DisplayController.INSTANCE, displayController)
        context.putObject(WindowManagerProxy.INSTANCE, windowManagerProxy)
        context.putObject(LauncherPrefs.INSTANCE, launcherPrefs)

        whenever(launcherPrefs.get(LauncherPrefs.TASKBAR_PINNING)).thenReturn(false)
        val info = spy(DisplayController.Info(context, windowManagerProxy, perDisplayBoundsCache))
        whenever(displayController.info).thenReturn(info)
        whenever(info.isTransientTaskbar).thenReturn(isGestureMode)