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

Commit 160ed1d3 authored by Brian Isganitis's avatar Brian Isganitis
Browse files

Add annotations for manipulating secure settings.

By default, tests will run with user setup complete and kids mode
disabled.

Test: TaskbarUnitTestRuleTest
Flag: TEST_ONLY
Bug: 230027385
Change-Id: If6c74b3b2c07aa0eac5b6bda933b565351d65188
parent 8e5de657
Loading
Loading
Loading
Loading
+4 −1
Original line number Diff line number Diff line
@@ -43,6 +43,8 @@ import static com.android.systemui.shared.system.QuickStepContract.SYSUI_STATE_N
import static com.android.systemui.shared.system.QuickStepContract.SYSUI_STATE_VOICE_INTERACTION_WINDOW_SHOWING;
import static com.android.wm.shell.Flags.enableTinyTaskbar;

import static java.lang.invoke.MethodHandles.Lookup.PROTECTED;

import android.animation.AnimatorSet;
import android.animation.ValueAnimator;
import android.app.ActivityOptions;
@@ -1515,7 +1517,8 @@ public class TaskbarActivityContext extends BaseTaskbarContext {
        return mIsNavBarKidsMode && isThreeButtonNav();
    }

    protected boolean isNavBarForceVisible() {
    @VisibleForTesting(otherwise = PROTECTED)
    public boolean isNavBarForceVisible() {
        return mIsNavBarForceVisible;
    }

+62 −0
Original line number Diff line number Diff line
@@ -20,19 +20,25 @@ import android.app.Instrumentation
import android.app.PendingIntent
import android.content.IIntentSender
import android.content.Intent
import android.provider.Settings
import android.provider.Settings.Secure.NAV_BAR_KIDS_MODE
import android.provider.Settings.Secure.USER_SETUP_COMPLETE
import androidx.test.platform.app.InstrumentationRegistry
import androidx.test.rule.ServiceTestRule
import com.android.launcher3.LauncherAppState
import com.android.launcher3.taskbar.TaskbarActivityContext
import com.android.launcher3.taskbar.TaskbarManager
import com.android.launcher3.taskbar.TaskbarNavButtonController.TaskbarNavButtonCallbacks
import com.android.launcher3.taskbar.rules.TaskbarUnitTestRule.InjectController
import com.android.launcher3.util.Executors.UI_HELPER_EXECUTOR
import com.android.launcher3.util.LauncherMultivalentJUnit.Companion.isRunningInRobolectric
import com.android.launcher3.util.ModelTestExtensions.loadModelSync
import com.android.launcher3.util.TestUtil
import com.android.quickstep.AllAppsActionManager
import com.android.quickstep.TouchInteractionService
import com.android.quickstep.TouchInteractionService.TISBinder
import org.junit.Assume.assumeTrue
import org.junit.rules.RuleChain
import org.junit.rules.TestRule
import org.junit.runner.Description
import org.junit.runners.model.Statement
@@ -71,6 +77,10 @@ class TaskbarUnitTestRule(
    private val instrumentation = InstrumentationRegistry.getInstrumentation()
    private val serviceTestRule = ServiceTestRule()

    private val userSetupCompleteRule = TaskbarSecureSettingRule(USER_SETUP_COMPLETE)
    private val kidsModeRule = TaskbarSecureSettingRule(NAV_BAR_KIDS_MODE)
    private val settingRules = RuleChain.outerRule(userSetupCompleteRule).around(kidsModeRule)

    private lateinit var taskbarManager: TaskbarManager

    val activityContext: TaskbarActivityContext
@@ -80,15 +90,34 @@ class TaskbarUnitTestRule(
        }

    override fun apply(base: Statement, description: Description): Statement {
        return settingRules.apply(createStatement(base, description), description)
    }

    private fun createStatement(base: Statement, description: Description): Statement {
        return object : Statement() {
            override fun evaluate() {

                // Only run test when Taskbar is enabled.
                instrumentation.runOnMainSync {
                    assumeTrue(
                        LauncherAppState.getIDP(context).getDeviceProfile(context).isTaskbarPresent
                    )
                }

                // Process secure setting annotations.
                instrumentation.runOnMainSync {
                    userSetupCompleteRule.putInt(
                        if (description.getAnnotation(UserSetupMode::class.java) != null) {
                            0
                        } else {
                            1
                        }
                    )
                    kidsModeRule.putInt(
                        if (description.getAnnotation(NavBarKidsMode::class.java) != null) 1 else 0
                    )
                }

                // Check for existing Taskbar instance from Launcher process.
                val launcherTaskbarManager: TaskbarManager? =
                    if (!isRunningInRobolectric) {
@@ -117,6 +146,8 @@ class TaskbarUnitTestRule(
                    }

                try {
                    LauncherAppState.getInstance(context).model.loadModelSync()

                    // Replace Launcher Taskbar window with test instance.
                    instrumentation.runOnMainSync {
                        launcherTaskbarManager?.setSuspended(true)
@@ -167,4 +198,35 @@ class TaskbarUnitTestRule(
    @Retention(AnnotationRetention.RUNTIME)
    @Target(AnnotationTarget.FIELD)
    annotation class InjectController

    /** Overrides [USER_SETUP_COMPLETE] to be `false` for tests. */
    @Retention(AnnotationRetention.RUNTIME)
    @Target(AnnotationTarget.CLASS, AnnotationTarget.FUNCTION)
    annotation class UserSetupMode

    /** Overrides [NAV_BAR_KIDS_MODE] to be `true` for tests. */
    @Retention(AnnotationRetention.RUNTIME)
    @Target(AnnotationTarget.CLASS, AnnotationTarget.FUNCTION)
    annotation class NavBarKidsMode

    /** Rule for Taskbar integer-based secure settings. */
    private inner class TaskbarSecureSettingRule(private val settingName: String) : TestRule {

        override fun apply(base: Statement, description: Description): Statement {
            return object : Statement() {
                override fun evaluate() {
                    val originalValue =
                        Settings.Secure.getInt(context.contentResolver, settingName, /* def= */ 0)
                    try {
                        base.evaluate()
                    } finally {
                        instrumentation.runOnMainSync { putInt(originalValue) }
                    }
                }
            }
        }

        /** Puts [value] into secure settings under [settingName]. */
        fun putInt(value: Int) = Settings.Secure.putInt(context.contentResolver, settingName, value)
    }
}
+35 −2
Original line number Diff line number Diff line
@@ -22,6 +22,8 @@ import com.android.launcher3.taskbar.TaskbarKeyguardController
import com.android.launcher3.taskbar.TaskbarManager
import com.android.launcher3.taskbar.TaskbarStashController
import com.android.launcher3.taskbar.rules.TaskbarUnitTestRule.InjectController
import com.android.launcher3.taskbar.rules.TaskbarUnitTestRule.NavBarKidsMode
import com.android.launcher3.taskbar.rules.TaskbarUnitTestRule.UserSetupMode
import com.android.launcher3.util.LauncherMultivalentJUnit
import com.android.launcher3.util.LauncherMultivalentJUnit.EmulatedDevices
import com.google.common.truth.Truth.assertThat
@@ -125,9 +127,40 @@ class TaskbarUnitTestRuleTest {
        }
    }

    /** Executes [runTest] after the [testRule] setup phase completes. */
    @Test
    fun testUserSetupMode_default_isComplete() {
        onSetup { assertThat(activityContext.isUserSetupComplete).isTrue() }
    }

    @Test
    fun testUserSetupMode_withAnnotation_isIncomplete() {
        @UserSetupMode class Mode
        onSetup(description = Description.createSuiteDescription(Mode::class.java)) {
            assertThat(activityContext.isUserSetupComplete).isFalse()
        }
    }

    @Test
    fun testNavBarKidsMode_default_navBarNotForcedVisible() {
        onSetup { assertThat(activityContext.isNavBarForceVisible).isFalse() }
    }

    @Test
    fun testNavBarKidsMode_withAnnotation_navBarForcedVisible() {
        @NavBarKidsMode class Mode
        onSetup(description = Description.createSuiteDescription(Mode::class.java)) {
            assertThat(activityContext.isNavBarForceVisible).isTrue()
        }
    }

    /**
     * Executes [runTest] after the [testRule] setup phase completes.
     *
     * A [description] can also be provided to mimic annotating a test or test class.
     */
    private fun onSetup(
        testRule: TaskbarUnitTestRule = TaskbarUnitTestRule(this, context),
        description: Description = DESCRIPTION,
        runTest: TaskbarUnitTestRule.() -> Unit,
    ) {
        testRule
@@ -135,7 +168,7 @@ class TaskbarUnitTestRuleTest {
                object : Statement() {
                    override fun evaluate() = runTest(testRule)
                },
                DESCRIPTION,
                description,
            )
            .evaluate()
    }