Loading packages/SystemUI/src/com/android/systemui/qs/UserSettingObserver.java +14 −3 Original line number Diff line number Diff line Loading @@ -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; Loading Loading @@ -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; } } Loading packages/SystemUI/tests/src/com/android/systemui/qs/UserSettingObserverTest.kt +103 −64 Original line number Diff line number Diff line Loading @@ -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" Loading @@ -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 Loading @@ -54,7 +78,7 @@ class UserSettingObserverTest : SysuiTestCase() { @Before fun setUp() { testableLooper = TestableLooper.get(this) secureSettings = FakeSettings() secureSettings = kosmos.fakeSettings setting = object : Loading @@ -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() Loading @@ -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() Loading @@ -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) Loading @@ -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() Loading @@ -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() } } Loading
packages/SystemUI/src/com/android/systemui/qs/UserSettingObserver.java +14 −3 Original line number Diff line number Diff line Loading @@ -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; Loading Loading @@ -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; } } Loading
packages/SystemUI/tests/src/com/android/systemui/qs/UserSettingObserverTest.kt +103 −64 Original line number Diff line number Diff line Loading @@ -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" Loading @@ -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 Loading @@ -54,7 +78,7 @@ class UserSettingObserverTest : SysuiTestCase() { @Before fun setUp() { testableLooper = TestableLooper.get(this) secureSettings = FakeSettings() secureSettings = kosmos.fakeSettings setting = object : Loading @@ -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() Loading @@ -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() Loading @@ -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) Loading @@ -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() Loading @@ -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() } }