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

Commit 1dc809a4 authored by Jernej Virag's avatar Jernej Virag Committed by Android (Google) Code Review
Browse files

Merge "Register user setting observers on bg thread" into main

parents a160a27f 6fdb6cd7
Loading
Loading
Loading
Loading
+14 −3
Original line number Diff line number Diff line
@@ -19,6 +19,7 @@ package com.android.systemui.qs;
import android.database.ContentObserver;
import android.os.Handler;

import com.android.systemui.Flags;
import com.android.systemui.statusbar.policy.Listenable;
import com.android.systemui.util.settings.SecureSettings;
import com.android.systemui.util.settings.SystemSettings;
@@ -76,10 +77,20 @@ public abstract class UserSettingObserver extends ContentObserver implements Lis
        mListening = listening;
        if (listening) {
            mObservedValue = getValueFromProvider();
            if (Flags.qsRegisterSettingObserverOnBgThread()) {
                mSettingsProxy.registerContentObserverForUserAsync(
                        mSettingsProxy.getUriFor(mSettingName), this, mUserId, () ->
                                mObservedValue = getValueFromProvider());
            } else {
                mSettingsProxy.registerContentObserverForUserSync(
                        mSettingsProxy.getUriFor(mSettingName), false, this, mUserId);
            }
        } else {
            if (Flags.qsRegisterSettingObserverOnBgThread()) {
                mSettingsProxy.unregisterContentObserverAsync(this);
            } else {
                mSettingsProxy.unregisterContentObserverSync(this);
            }
            mObservedValue = mDefaultValue;
        }
    }
+103 −64
Original line number Diff line number Diff line
@@ -17,25 +17,34 @@
package com.android.systemui.qs

import android.os.Handler
import android.platform.test.flag.junit.FlagsParameterization
import android.testing.TestableLooper
import androidx.test.ext.junit.runners.AndroidJUnit4
import androidx.test.filters.SmallTest
import com.android.systemui.Flags
import com.android.systemui.SysuiTestCase
import com.android.systemui.util.settings.FakeSettings
import com.android.systemui.kosmos.Kosmos
import com.android.systemui.kosmos.testScope
import com.android.systemui.util.settings.SecureSettings
import com.android.systemui.util.settings.fakeSettings
import com.google.common.truth.Truth.assertThat
import junit.framework.Assert.fail
import kotlinx.coroutines.ExperimentalCoroutinesApi
import kotlinx.coroutines.test.runCurrent
import kotlinx.coroutines.test.runTest
import org.junit.After
import org.junit.Before
import org.junit.Test
import org.junit.runner.RunWith
import platform.test.runner.parameterized.ParameterizedAndroidJunit4
import platform.test.runner.parameterized.Parameters

private typealias Callback = (Int, Boolean) -> Unit

@OptIn(ExperimentalCoroutinesApi::class)
@SmallTest
@RunWith(AndroidJUnit4::class)
@RunWith(ParameterizedAndroidJunit4::class)
@TestableLooper.RunWithLooper
class UserSettingObserverTest : SysuiTestCase() {
class UserSettingObserverTest(flags: FlagsParameterization) : SysuiTestCase() {

    companion object {
        private const val TEST_SETTING = "setting"
@@ -43,8 +52,23 @@ class UserSettingObserverTest : SysuiTestCase() {
        private const val OTHER_USER = 1
        private const val DEFAULT_VALUE = 1
        private val FAIL_CALLBACK: Callback = { _, _ -> fail("Callback should not be called") }

        @JvmStatic
        @Parameters(name = "{0}")
        fun getParams(): List<FlagsParameterization> {
            return FlagsParameterization.allCombinationsOf(
                Flags.FLAG_QS_REGISTER_SETTING_OBSERVER_ON_BG_THREAD
            )
        }
    }

    init {
        mSetFlagsRule.setFlagsParameterization(flags)
    }

    private val kosmos = Kosmos()
    private val testScope = kosmos.testScope

    private lateinit var testableLooper: TestableLooper
    private lateinit var setting: UserSettingObserver
    private lateinit var secureSettings: SecureSettings
@@ -54,7 +78,7 @@ class UserSettingObserverTest : SysuiTestCase() {
    @Before
    fun setUp() {
        testableLooper = TestableLooper.get(this)
        secureSettings = FakeSettings()
        secureSettings = kosmos.fakeSettings

        setting =
            object :
@@ -76,11 +100,12 @@ class UserSettingObserverTest : SysuiTestCase() {

    @After
    fun tearDown() {
        setting.isListening = false
        setListening(false)
    }

    @Test
    fun testNotListeningByDefault() {
    fun testNotListeningByDefault() =
        testScope.runTest {
            callback = FAIL_CALLBACK

            assertThat(setting.isListening).isFalse()
@@ -89,11 +114,12 @@ class UserSettingObserverTest : SysuiTestCase() {
        }

    @Test
    fun testChangedWhenListeningCallsCallback() {
    fun testChangedWhenListeningCallsCallback() =
        testScope.runTest {
            var changed = false
            callback = { _, _ -> changed = true }

        setting.isListening = true
            setListening(true)
            secureSettings.putIntForUser(TEST_SETTING, 2, USER)
            testableLooper.processAllMessages()

@@ -101,16 +127,18 @@ class UserSettingObserverTest : SysuiTestCase() {
        }

    @Test
    fun testListensToCorrectSetting() {
    fun testListensToCorrectSetting() =
        testScope.runTest {
            callback = FAIL_CALLBACK

        setting.isListening = true
            setListening(true)
            secureSettings.putIntForUser("other", 2, USER)
            testableLooper.processAllMessages()
        }

    @Test
    fun testGetCorrectValue() {
    fun testGetCorrectValue() =
        testScope.runTest {
            secureSettings.putIntForUser(TEST_SETTING, 2, USER)
            assertThat(setting.value).isEqualTo(2)

@@ -119,36 +147,41 @@ class UserSettingObserverTest : SysuiTestCase() {
        }

    @Test
    fun testSetValue() {
    fun testSetValue() =
        testScope.runTest {
            setting.value = 5
            assertThat(secureSettings.getIntForUser(TEST_SETTING, USER)).isEqualTo(5)
        }

    @Test
    fun testChangeUser() {
        setting.isListening = true
    fun testChangeUser() =
        testScope.runTest {
            setListening(true)
            setting.setUserId(OTHER_USER)

        setting.isListening = true
            setListening(true)
            assertThat(setting.currentUser).isEqualTo(OTHER_USER)
        }

    @Test
    fun testDoesntListenInOtherUsers() {
    fun testDoesntListenInOtherUsers() =
        testScope.runTest {
            callback = FAIL_CALLBACK
        setting.isListening = true
            setListening(true)

            secureSettings.putIntForUser(TEST_SETTING, 3, OTHER_USER)
            testableLooper.processAllMessages()
        }

    @Test
    fun testListensToCorrectUserAfterChange() {
    fun testListensToCorrectUserAfterChange() =
        testScope.runTest {
            var changed = false
            callback = { _, _ -> changed = true }

        setting.isListening = true
            setListening(true)
            setting.setUserId(OTHER_USER)
            testScope.runCurrent()
            secureSettings.putIntForUser(TEST_SETTING, 2, OTHER_USER)
            testableLooper.processAllMessages()

@@ -156,12 +189,18 @@ class UserSettingObserverTest : SysuiTestCase() {
        }

    @Test
    fun testDefaultValue() {
    fun testDefaultValue() =
        testScope.runTest {
            // Check default value before listening
            assertThat(setting.value).isEqualTo(DEFAULT_VALUE)

            // Check default value if setting is not set
        setting.isListening = true
            setListening(true)
            assertThat(setting.value).isEqualTo(DEFAULT_VALUE)
        }

    fun setListening(listening: Boolean) {
        setting.isListening = listening
        testScope.runCurrent()
    }
}