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

Commit d52e15b3 authored by Brian Isganitis's avatar Brian Isganitis
Browse files

Add subrule for controlling an individual Taskbar preference.

Test: TaskbarPreferenceRuleTest, TaskbarPinningPreferenceRuleTest
Bug: 230027385
Flag: TEST_ONLY
Change-Id: I382c7e17a5739823c25fc8d64c981405af56e3e4
parent e3d3d653
Loading
Loading
Loading
Loading
+8 −26
Original line number Diff line number Diff line
@@ -18,14 +18,11 @@ package com.android.launcher3.taskbar.rules

import android.platform.test.flag.junit.FlagsParameterization
import android.platform.test.flag.junit.SetFlagsRule
import androidx.test.platform.app.InstrumentationRegistry.getInstrumentation
import com.android.launcher3.ConstantItem
import com.android.launcher3.Flags.FLAG_ENABLE_TASKBAR_PINNING
import com.android.launcher3.LauncherPrefs
import com.android.launcher3.LauncherPrefs.Companion.TASKBAR_PINNING
import com.android.launcher3.LauncherPrefs.Companion.TASKBAR_PINNING_IN_DESKTOP_MODE
import com.android.launcher3.util.DisplayController
import kotlin.reflect.KProperty
import org.junit.rules.RuleChain
import org.junit.rules.TestRule
import org.junit.runner.Description
import org.junit.runners.model.Statement
@@ -43,41 +40,26 @@ import org.junit.runners.model.Statement
 */
class TaskbarPinningPreferenceRule(context: TaskbarWindowSandboxContext) : TestRule {

    private val prefs = LauncherPrefs.get(context)
    private val setFlagsRule =
        SetFlagsRule(FlagsParameterization(mapOf(FLAG_ENABLE_TASKBAR_PINNING to true)))
    private val pinningRule = TaskbarPreferenceRule(context, TASKBAR_PINNING)
    private val desktopPinningRule = TaskbarPreferenceRule(context, TASKBAR_PINNING_IN_DESKTOP_MODE)
    private val ruleChain =
        RuleChain.outerRule(setFlagsRule).around(pinningRule).around(desktopPinningRule)

    var isPinned by PinningPreference(TASKBAR_PINNING)
    var isPinnedInDesktopMode by PinningPreference(TASKBAR_PINNING_IN_DESKTOP_MODE)
    var isPinned by pinningRule::value
    var isPinnedInDesktopMode by desktopPinningRule::value

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

    private fun createStatement(base: Statement): Statement {
        return object : Statement() {
            override fun evaluate() {
                DisplayController.enableTaskbarModePreferenceForTests(true)
                val wasPinned = isPinned
                val wasPinnedInDesktopMode = isPinnedInDesktopMode
                try {
                    base.evaluate()
                    ruleChain.apply(base, description).evaluate()
                } finally {
                    isPinned = wasPinned
                    isPinnedInDesktopMode = wasPinnedInDesktopMode
                    DisplayController.enableTaskbarModePreferenceForTests(false)
                }
            }
        }
    }

    private inner class PinningPreference(private val constantItem: ConstantItem<Boolean>) {
        operator fun getValue(thisRef: Any?, property: KProperty<*>): Boolean {
            return prefs.get(constantItem)
        }

        operator fun setValue(thisRef: Any?, property: KProperty<*>, value: Boolean) {
            getInstrumentation().runOnMainSync { prefs.put(constantItem, value) }
        }
    }
}
+54 −0
Original line number Diff line number Diff line
/*
 * Copyright (C) 2024 The Android Open Source Project
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

package com.android.launcher3.taskbar.rules

import androidx.test.platform.app.InstrumentationRegistry.getInstrumentation
import com.android.launcher3.ConstantItem
import com.android.launcher3.LauncherPrefs
import org.junit.rules.TestRule
import org.junit.runner.Description
import org.junit.runners.model.Statement

/**
 * Rule for modifying a Taskbar preference.
 *
 * The original preference value is restored on teardown.
 */
class TaskbarPreferenceRule<T : Any>(
    context: TaskbarWindowSandboxContext,
    private val constantItem: ConstantItem<T>
) : TestRule {

    private val prefs = LauncherPrefs.get(context)

    var value: T
        get() = prefs.get(constantItem)
        set(value) = getInstrumentation().runOnMainSync { prefs.put(constantItem, value) }

    override fun apply(base: Statement, description: Description): Statement {
        return object : Statement() {
            override fun evaluate() {
                val originalValue = value
                try {
                    base.evaluate()
                } finally {
                    value = originalValue
                }
            }
        }
    }
}
+65 −0
Original line number Diff line number Diff line
/*
 * Copyright (C) 2024 The Android Open Source Project
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

package com.android.launcher3.taskbar.rules

import androidx.test.platform.app.InstrumentationRegistry.getInstrumentation
import com.android.launcher3.LauncherPrefs.Companion.TASKBAR_PINNING
import com.android.launcher3.util.LauncherMultivalentJUnit
import com.google.common.truth.Truth.assertThat
import org.junit.Test
import org.junit.runner.Description
import org.junit.runner.RunWith
import org.junit.runners.model.Statement

@RunWith(LauncherMultivalentJUnit::class)
class TaskbarPreferenceRuleTest {

    private val context = TaskbarWindowSandboxContext.create(getInstrumentation().targetContext)
    private val preferenceRule = TaskbarPreferenceRule(context, TASKBAR_PINNING)

    @Test
    fun testSetup_toggleBoolean_updatesPreferences() {
        val originalValue = preferenceRule.value
        onSetup {
            preferenceRule.value = !preferenceRule.value
            assertThat(preferenceRule.value).isNotEqualTo(originalValue)
        }
    }

    @Test
    fun testTeardown_afterTogglingBoolean_preferenceReset() {
        val originalValue = preferenceRule.value
        onSetup { preferenceRule.value = !preferenceRule.value }
        assertThat(preferenceRule.value).isEqualTo(originalValue)
    }

    private fun onSetup(runTest: () -> Unit) {
        preferenceRule
            .apply(
                object : Statement() {
                    override fun evaluate() = runTest()
                },
                DESCRIPTION,
            )
            .evaluate()
    }

    private companion object {
        private val DESCRIPTION =
            Description.createSuiteDescription(TaskbarPreferenceRule::class.java)
    }
}