Loading packages/SystemUI/multivalentTests/src/com/android/systemui/util/settings/SettingsProxyTest.kt +13 −13 Original line number Diff line number Diff line Loading @@ -27,7 +27,7 @@ import androidx.test.ext.junit.runners.AndroidJUnit4 import androidx.test.filters.SmallTest import com.android.systemui.SysuiTestCase import com.google.common.truth.Truth.assertThat import kotlinx.coroutines.CoroutineDispatcher import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.ExperimentalCoroutinesApi import kotlinx.coroutines.test.StandardTestDispatcher import kotlinx.coroutines.test.TestScope Loading Loading @@ -57,7 +57,7 @@ class SettingsProxyTest : SysuiTestCase() { @Before fun setUp() { testScope = TestScope(testDispatcher) mSettings = FakeSettingsProxy(testDispatcher) mSettings = FakeSettingsProxy(testScope) mContentObserver = object : ContentObserver(Handler(Looper.getMainLooper())) {} } Loading Loading @@ -92,7 +92,7 @@ class SettingsProxyTest : SysuiTestCase() { mSettings.registerContentObserverSync( TEST_SETTING, notifyForDescendants = true, mContentObserver mContentObserver, ) verify(mSettings.getContentResolver()) .registerContentObserver(eq(TEST_SETTING_URI), eq(true), eq(mContentObserver)) Loading @@ -104,7 +104,7 @@ class SettingsProxyTest : SysuiTestCase() { mSettings.registerContentObserver( TEST_SETTING, notifyForDescendants = true, mContentObserver mContentObserver, ) verify(mSettings.getContentResolver()) .registerContentObserver(eq(TEST_SETTING_URI), eq(true), eq(mContentObserver)) Loading @@ -116,7 +116,7 @@ class SettingsProxyTest : SysuiTestCase() { mSettings.registerContentObserverAsync( TEST_SETTING, notifyForDescendants = true, mContentObserver mContentObserver, ) testScope.advanceUntilIdle() verify(mSettings.getContentResolver()) Loading Loading @@ -154,7 +154,7 @@ class SettingsProxyTest : SysuiTestCase() { mSettings.registerContentObserverSync( TEST_SETTING_URI, notifyForDescendants = true, mContentObserver mContentObserver, ) verify(mSettings.getContentResolver()) .registerContentObserver(eq(TEST_SETTING_URI), eq(true), eq(mContentObserver)) Loading @@ -166,7 +166,7 @@ class SettingsProxyTest : SysuiTestCase() { mSettings.registerContentObserver( TEST_SETTING_URI, notifyForDescendants = true, mContentObserver mContentObserver, ) verify(mSettings.getContentResolver()) .registerContentObserver(eq(TEST_SETTING_URI), eq(true), eq(mContentObserver)) Loading @@ -178,7 +178,7 @@ class SettingsProxyTest : SysuiTestCase() { mSettings.registerContentObserverAsync( TEST_SETTING_URI, notifyForDescendants = true, mContentObserver mContentObserver, ) testScope.advanceUntilIdle() verify(mSettings.getContentResolver()) Loading @@ -202,7 +202,7 @@ class SettingsProxyTest : SysuiTestCase() { TEST_SETTING_URI, false, mContentObserver, it it, ) } } Loading Loading @@ -382,15 +382,15 @@ class SettingsProxyTest : SysuiTestCase() { assertThat(mSettings.getFloat(TEST_SETTING, 2.5F)).isEqualTo(2.5F) } private class FakeSettingsProxy(val testDispatcher: CoroutineDispatcher) : SettingsProxy { private class FakeSettingsProxy(val testScope: CoroutineScope) : SettingsProxy { private val mContentResolver = mock(ContentResolver::class.java) private val settingToValueMap: MutableMap<String, String?> = mutableMapOf() override fun getContentResolver() = mContentResolver override val backgroundDispatcher: CoroutineDispatcher get() = testDispatcher override val settingsScope: CoroutineScope get() = testScope override fun getUriFor(name: String) = Uri.parse(StringBuilder().append("content://settings/").append(name).toString()) Loading @@ -408,7 +408,7 @@ class SettingsProxyTest : SysuiTestCase() { name: String, value: String?, tag: String?, makeDefault: Boolean makeDefault: Boolean, ): Boolean { settingToValueMap[name] = value return true Loading packages/SystemUI/multivalentTests/src/com/android/systemui/util/settings/UserSettingsProxyTest.kt +37 −45 Original line number Diff line number Diff line Loading @@ -28,7 +28,7 @@ import androidx.test.ext.junit.runners.AndroidJUnit4 import androidx.test.filters.SmallTest import com.android.systemui.SysuiTestCase import com.google.common.truth.Truth.assertThat import kotlinx.coroutines.CoroutineDispatcher import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.ExperimentalCoroutinesApi import kotlinx.coroutines.launch import kotlinx.coroutines.test.StandardTestDispatcher Loading @@ -36,7 +36,6 @@ import kotlinx.coroutines.test.TestScope import kotlinx.coroutines.test.advanceUntilIdle import kotlinx.coroutines.test.runTest import org.junit.Assert.assertThrows import org.junit.Before import org.junit.Test import org.junit.runner.RunWith import org.mockito.Mockito.mock Loading @@ -51,14 +50,9 @@ class UserSettingsProxyTest : SysuiTestCase() { private var userId = MAIN_USER_ID private val testDispatcher = StandardTestDispatcher() private var mSettings: UserSettingsProxy = FakeUserSettingsProxy({ userId }, testDispatcher) private val testScope = TestScope(testDispatcher) private var mSettings: UserSettingsProxy = FakeUserSettingsProxy({ userId }, testScope) private var mContentObserver = object : ContentObserver(Handler(Looper.getMainLooper())) {} private lateinit var testScope: TestScope @Before fun setUp() { testScope = TestScope(testDispatcher) } @Test fun registerContentObserverForUser_inputString_success() = Loading @@ -69,7 +63,7 @@ class UserSettingsProxyTest : SysuiTestCase() { eq(TEST_SETTING_URI), eq(false), eq(mContentObserver), eq(MAIN_USER_ID) eq(MAIN_USER_ID), ) } Loading @@ -82,7 +76,7 @@ class UserSettingsProxyTest : SysuiTestCase() { eq(TEST_SETTING_URI), eq(false), eq(mContentObserver), eq(MAIN_USER_ID) eq(MAIN_USER_ID), ) } Loading @@ -96,7 +90,7 @@ class UserSettingsProxyTest : SysuiTestCase() { eq(TEST_SETTING_URI), eq(false), eq(mContentObserver), eq(MAIN_USER_ID) eq(MAIN_USER_ID), ) } Loading @@ -107,14 +101,14 @@ class UserSettingsProxyTest : SysuiTestCase() { TEST_SETTING, notifyForDescendants = true, mContentObserver, userId userId, ) verify(mSettings.getContentResolver()) .registerContentObserver( eq(TEST_SETTING_URI), eq(true), eq(mContentObserver), eq(MAIN_USER_ID) eq(MAIN_USER_ID), ) } Loading @@ -125,16 +119,14 @@ class UserSettingsProxyTest : SysuiTestCase() { TEST_SETTING, notifyForDescendants = true, mContentObserver, userId userId, ) verify(mSettings.getContentResolver()) .registerContentObserver( eq(TEST_SETTING_URI), eq( true, ), eq(true), eq(mContentObserver), eq(MAIN_USER_ID) eq(MAIN_USER_ID), ) } Loading @@ -145,7 +137,7 @@ class UserSettingsProxyTest : SysuiTestCase() { TEST_SETTING, notifyForDescendants = true, mContentObserver, userId userId, ) testScope.advanceUntilIdle() verify(mSettings.getContentResolver()) Loading @@ -153,7 +145,7 @@ class UserSettingsProxyTest : SysuiTestCase() { eq(TEST_SETTING_URI), eq(true), eq(mContentObserver), eq(MAIN_USER_ID) eq(MAIN_USER_ID), ) } Loading @@ -166,7 +158,7 @@ class UserSettingsProxyTest : SysuiTestCase() { eq(TEST_SETTING_URI), eq(false), eq(mContentObserver), eq(MAIN_USER_ID) eq(MAIN_USER_ID), ) } Loading @@ -179,7 +171,7 @@ class UserSettingsProxyTest : SysuiTestCase() { eq(TEST_SETTING_URI), eq(false), eq(mContentObserver), eq(MAIN_USER_ID) eq(MAIN_USER_ID), ) } Loading @@ -189,7 +181,7 @@ class UserSettingsProxyTest : SysuiTestCase() { mSettings.registerContentObserverForUserAsync( TEST_SETTING_URI, mContentObserver, userId userId, ) testScope.advanceUntilIdle() Loading @@ -198,7 +190,7 @@ class UserSettingsProxyTest : SysuiTestCase() { eq(TEST_SETTING_URI), eq(false), eq(mContentObserver), eq(MAIN_USER_ID) eq(MAIN_USER_ID), ) } Loading @@ -213,7 +205,7 @@ class UserSettingsProxyTest : SysuiTestCase() { TEST_SETTING_URI, mContentObserver, userId, runnable runnable, ) testScope.advanceUntilIdle() assertThat(callbackCalled).isTrue() Loading @@ -226,14 +218,14 @@ class UserSettingsProxyTest : SysuiTestCase() { TEST_SETTING_URI, notifyForDescendants = true, mContentObserver, userId userId, ) verify(mSettings.getContentResolver()) .registerContentObserver( eq(TEST_SETTING_URI), eq(true), eq(mContentObserver), eq(MAIN_USER_ID) eq(MAIN_USER_ID), ) } Loading @@ -244,14 +236,14 @@ class UserSettingsProxyTest : SysuiTestCase() { TEST_SETTING_URI, notifyForDescendants = true, mContentObserver, userId userId, ) verify(mSettings.getContentResolver()) .registerContentObserver( eq(TEST_SETTING_URI), eq(true), eq(mContentObserver), eq(MAIN_USER_ID) eq(MAIN_USER_ID), ) } Loading @@ -262,7 +254,7 @@ class UserSettingsProxyTest : SysuiTestCase() { TEST_SETTING_URI, notifyForDescendants = true, mContentObserver, userId userId, ) testScope.advanceUntilIdle() verify(mSettings.getContentResolver()) Loading @@ -270,7 +262,7 @@ class UserSettingsProxyTest : SysuiTestCase() { eq(TEST_SETTING_URI), eq(true), eq(mContentObserver), eq(MAIN_USER_ID) eq(MAIN_USER_ID), ) } Loading @@ -283,7 +275,7 @@ class UserSettingsProxyTest : SysuiTestCase() { eq(TEST_SETTING_URI), eq(false), eq(mContentObserver), eq(0) eq(0), ) } Loading @@ -296,7 +288,7 @@ class UserSettingsProxyTest : SysuiTestCase() { eq(TEST_SETTING_URI), eq(false), eq(mContentObserver), eq(0) eq(0), ) } Loading @@ -309,7 +301,7 @@ class UserSettingsProxyTest : SysuiTestCase() { eq(TEST_SETTING_URI), eq(false), eq(mContentObserver), eq(0) eq(0), ) } } Loading @@ -320,14 +312,14 @@ class UserSettingsProxyTest : SysuiTestCase() { mSettings.registerContentObserverSync( TEST_SETTING_URI, notifyForDescendants = true, mContentObserver mContentObserver, ) verify(mSettings.getContentResolver()) .registerContentObserver( eq(TEST_SETTING_URI), eq(true), eq(mContentObserver), eq(0) eq(0), ) } Loading @@ -340,7 +332,7 @@ class UserSettingsProxyTest : SysuiTestCase() { eq(TEST_SETTING_URI), eq(false), eq(mContentObserver), eq(0) eq(0), ) } Loading @@ -354,7 +346,7 @@ class UserSettingsProxyTest : SysuiTestCase() { eq(TEST_SETTING_URI), eq(false), eq(mContentObserver), eq(0) eq(0), ) } } Loading Loading @@ -557,7 +549,7 @@ class UserSettingsProxyTest : SysuiTestCase() { */ private class FakeUserSettingsProxy( override val currentUserProvider: SettingsProxy.CurrentUserIdProvider, val testDispatcher: CoroutineDispatcher val testScope: CoroutineScope, ) : UserSettingsProxy { private val mContentResolver = mock(ContentResolver::class.java) Loading @@ -569,8 +561,8 @@ class UserSettingsProxyTest : SysuiTestCase() { override fun getUriFor(name: String) = Uri.parse(StringBuilder().append(URI_PREFIX).append(name).toString()) override val backgroundDispatcher: CoroutineDispatcher get() = testDispatcher override val settingsScope: CoroutineScope get() = testScope override fun getStringForUser(name: String, userHandle: Int) = userIdToSettingsValueMap[userHandle]?.get(name) ?: "" Loading @@ -578,7 +570,7 @@ class UserSettingsProxyTest : SysuiTestCase() { override fun putString( name: String, value: String?, overrideableByRestore: Boolean overrideableByRestore: Boolean, ): Boolean { userIdToSettingsValueMap[DEFAULT_USER_ID]?.put(name, value) return true Loading @@ -588,7 +580,7 @@ class UserSettingsProxyTest : SysuiTestCase() { name: String, value: String?, tag: String?, makeDefault: Boolean makeDefault: Boolean, ): Boolean { putStringForUser(name, value, DEFAULT_USER_ID) return true Loading @@ -605,7 +597,7 @@ class UserSettingsProxyTest : SysuiTestCase() { tag: String?, makeDefault: Boolean, userHandle: Int, overrideableByRestore: Boolean overrideableByRestore: Boolean, ): Boolean { userIdToSettingsValueMap[userHandle]?.set(name, value) return true Loading packages/SystemUI/pods/com/android/systemui/util/settings/GlobalSettingsImpl.java +6 −6 Original line number Diff line number Diff line Loading @@ -25,7 +25,7 @@ import android.provider.Settings; import com.android.systemui.util.settings.SettingsSingleThreadBackground; import kotlinx.coroutines.CoroutineDispatcher; import kotlinx.coroutines.CoroutineScope; import javax.inject.Inject; Loading @@ -33,13 +33,13 @@ import javax.inject.Inject; @SuppressLint("StaticSettingsProvider") class GlobalSettingsImpl implements GlobalSettings { private final ContentResolver mContentResolver; private final CoroutineDispatcher mBgDispatcher; private final CoroutineScope mSettingsScope; @Inject GlobalSettingsImpl(ContentResolver contentResolver, @SettingsSingleThreadBackground CoroutineDispatcher bgDispatcher) { @SettingsSingleThreadBackground CoroutineScope settingsScope) { mContentResolver = contentResolver; mBgDispatcher = bgDispatcher; mSettingsScope = settingsScope; } @NonNull Loading @@ -56,8 +56,8 @@ class GlobalSettingsImpl implements GlobalSettings { @NonNull @Override public CoroutineDispatcher getBackgroundDispatcher() { return mBgDispatcher; public CoroutineScope getSettingsScope() { return mSettingsScope; } @Override Loading packages/SystemUI/pods/com/android/systemui/util/settings/SecureSettingsImpl.java +6 −6 Original line number Diff line number Diff line Loading @@ -23,23 +23,23 @@ import android.provider.Settings; import com.android.systemui.util.settings.SettingsSingleThreadBackground; import kotlinx.coroutines.CoroutineDispatcher; import kotlinx.coroutines.CoroutineScope; import javax.inject.Inject; class SecureSettingsImpl implements SecureSettings { private final ContentResolver mContentResolver; private final CurrentUserIdProvider mCurrentUserProvider; private final CoroutineDispatcher mBgDispatcher; private final CoroutineScope mSettingsScope; @Inject SecureSettingsImpl( ContentResolver contentResolver, CurrentUserIdProvider currentUserProvider, @SettingsSingleThreadBackground CoroutineDispatcher bgDispatcher) { @SettingsSingleThreadBackground CoroutineScope settingsScope) { mContentResolver = contentResolver; mCurrentUserProvider = currentUserProvider; mBgDispatcher = bgDispatcher; mSettingsScope = settingsScope; } @NonNull Loading @@ -62,8 +62,8 @@ class SecureSettingsImpl implements SecureSettings { @NonNull @Override public CoroutineDispatcher getBackgroundDispatcher() { return mBgDispatcher; public CoroutineScope getSettingsScope() { return mSettingsScope; } @Override Loading packages/SystemUI/pods/com/android/systemui/util/settings/SettingsProxy.kt +33 −24 Original line number Diff line number Diff line Loading @@ -23,10 +23,12 @@ import android.provider.Settings.SettingNotFoundException import androidx.annotation.AnyThread import androidx.annotation.WorkerThread import com.android.app.tracing.TraceUtils.trace import com.android.systemui.coroutines.newTracingContext import com.android.app.tracing.coroutines.launchTraced as launch import com.android.app.tracing.coroutines.nameCoroutine import kotlin.coroutines.CoroutineContext import kotlin.coroutines.EmptyCoroutineContext import kotlinx.coroutines.CoroutineDispatcher import kotlinx.coroutines.CoroutineScope import com.android.app.tracing.coroutines.launchTraced as launch import kotlinx.coroutines.withContext /** Loading @@ -47,11 +49,14 @@ interface SettingsProxy { /** Returns the [ContentResolver] this instance was constructed with. */ fun getContentResolver(): ContentResolver /** * Returns the background [CoroutineDispatcher] that the async APIs will use for a specific * implementation. */ val backgroundDispatcher: CoroutineDispatcher /** Returns the [CoroutineScope] that the async APIs will use. */ val settingsScope: CoroutineScope @OptIn(ExperimentalStdlibApi::class) fun settingsDispatcherContext(name: String): CoroutineContext { return (settingsScope.coroutineContext[CoroutineDispatcher] ?: EmptyCoroutineContext) + nameCoroutine(name) } /** * Construct the content URI for a particular name/value pair, useful for monitoring changes Loading Loading @@ -82,7 +87,7 @@ interface SettingsProxy { * wish to synchronize execution. */ suspend fun registerContentObserver(name: String, settingsObserver: ContentObserver) { withContext(backgroundDispatcher) { withContext(settingsDispatcherContext("registerContentObserver-A")) { registerContentObserverSync(getUriFor(name), settingsObserver) } } Loading @@ -94,7 +99,7 @@ interface SettingsProxy { */ @AnyThread fun registerContentObserverAsync(name: String, settingsObserver: ContentObserver) = CoroutineScope(backgroundDispatcher + newTracingContext("SettingsProxy-A")).launch { settingsScope.launch("registerContentObserverAsync-A") { registerContentObserverSync(getUriFor(name), settingsObserver) } Loading @@ -111,7 +116,7 @@ interface SettingsProxy { settingsObserver: ContentObserver, @WorkerThread registered: Runnable, ) = CoroutineScope(backgroundDispatcher + newTracingContext("SettingsProxy-B")).launch { settingsScope.launch("registerContentObserverAsync-B") { registerContentObserverSync(getUriFor(name), settingsObserver) registered.run() } Loading @@ -134,7 +139,9 @@ interface SettingsProxy { * wish to synchronize execution. */ suspend fun registerContentObserver(uri: Uri, settingsObserver: ContentObserver) { withContext(backgroundDispatcher) { registerContentObserverSync(uri, settingsObserver) } withContext(settingsDispatcherContext("registerContentObserver-B")) { registerContentObserverSync(uri, settingsObserver) } } /** Loading @@ -144,7 +151,7 @@ interface SettingsProxy { */ @AnyThread fun registerContentObserverAsync(uri: Uri, settingsObserver: ContentObserver) = CoroutineScope(backgroundDispatcher + newTracingContext("SettingsProxy-C")).launch { settingsScope.launch("registerContentObserverAsync-C") { registerContentObserverSync(uri, settingsObserver) } Loading @@ -161,7 +168,7 @@ interface SettingsProxy { settingsObserver: ContentObserver, @WorkerThread registered: Runnable, ) = CoroutineScope(backgroundDispatcher + newTracingContext("SettingsProxy-D")).launch { settingsScope.launch("registerContentObserverAsync-D") { registerContentObserverSync(uri, settingsObserver) registered.run() } Loading @@ -188,9 +195,9 @@ interface SettingsProxy { suspend fun registerContentObserver( name: String, notifyForDescendants: Boolean, settingsObserver: ContentObserver settingsObserver: ContentObserver, ) { withContext(backgroundDispatcher) { withContext(settingsDispatcherContext("registerContentObserver-C")) { registerContentObserverSync(getUriFor(name), notifyForDescendants, settingsObserver) } } Loading @@ -206,7 +213,7 @@ interface SettingsProxy { notifyForDescendants: Boolean, settingsObserver: ContentObserver, ) = CoroutineScope(backgroundDispatcher + newTracingContext("SettingsProxy-E")).launch { settingsScope.launch("registerContentObserverAsync-E") { registerContentObserverSync(getUriFor(name), notifyForDescendants, settingsObserver) } Loading @@ -224,7 +231,7 @@ interface SettingsProxy { settingsObserver: ContentObserver, @WorkerThread registered: Runnable, ) = CoroutineScope(backgroundDispatcher + newTracingContext("SettingsProxy-F")).launch { settingsScope.launch("registerContentObserverAsync-F") { registerContentObserverSync(getUriFor(name), notifyForDescendants, settingsObserver) registered.run() } Loading @@ -239,7 +246,7 @@ interface SettingsProxy { fun registerContentObserverSync( uri: Uri, notifyForDescendants: Boolean, settingsObserver: ContentObserver settingsObserver: ContentObserver, ) { trace({ "SP#registerObserver#[$uri]" }) { getContentResolver() Loading @@ -257,9 +264,9 @@ interface SettingsProxy { suspend fun registerContentObserver( uri: Uri, notifyForDescendants: Boolean, settingsObserver: ContentObserver settingsObserver: ContentObserver, ) { withContext(backgroundDispatcher) { withContext(settingsDispatcherContext("registerContentObserver-D")) { registerContentObserverSync(uri, notifyForDescendants, settingsObserver) } } Loading @@ -275,7 +282,7 @@ interface SettingsProxy { notifyForDescendants: Boolean, settingsObserver: ContentObserver, ) = CoroutineScope(backgroundDispatcher + newTracingContext("SettingsProxy-G")).launch { settingsScope.launch("registerContentObserverAsync-G") { registerContentObserverSync(uri, notifyForDescendants, settingsObserver) } Loading @@ -293,7 +300,7 @@ interface SettingsProxy { settingsObserver: ContentObserver, @WorkerThread registered: Runnable, ) = CoroutineScope(backgroundDispatcher + newTracingContext("SettingsProxy-H")).launch { settingsScope.launch("registerContentObserverAsync-H") { registerContentObserverSync(uri, notifyForDescendants, settingsObserver) registered.run() } Loading @@ -319,7 +326,9 @@ interface SettingsProxy { * async block if they wish to synchronize execution. */ suspend fun unregisterContentObserver(settingsObserver: ContentObserver) { withContext(backgroundDispatcher) { unregisterContentObserverSync(settingsObserver) } withContext(settingsDispatcherContext("unregisterContentObserver")) { unregisterContentObserverSync(settingsObserver) } } /** Loading @@ -330,7 +339,7 @@ interface SettingsProxy { */ @AnyThread fun unregisterContentObserverAsync(settingsObserver: ContentObserver) = CoroutineScope(backgroundDispatcher + newTracingContext("SettingsProxy-I")).launch { settingsScope.launch("unregisterContentObserverAsync") { unregisterContentObserver(settingsObserver) } Loading Loading
packages/SystemUI/multivalentTests/src/com/android/systemui/util/settings/SettingsProxyTest.kt +13 −13 Original line number Diff line number Diff line Loading @@ -27,7 +27,7 @@ import androidx.test.ext.junit.runners.AndroidJUnit4 import androidx.test.filters.SmallTest import com.android.systemui.SysuiTestCase import com.google.common.truth.Truth.assertThat import kotlinx.coroutines.CoroutineDispatcher import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.ExperimentalCoroutinesApi import kotlinx.coroutines.test.StandardTestDispatcher import kotlinx.coroutines.test.TestScope Loading Loading @@ -57,7 +57,7 @@ class SettingsProxyTest : SysuiTestCase() { @Before fun setUp() { testScope = TestScope(testDispatcher) mSettings = FakeSettingsProxy(testDispatcher) mSettings = FakeSettingsProxy(testScope) mContentObserver = object : ContentObserver(Handler(Looper.getMainLooper())) {} } Loading Loading @@ -92,7 +92,7 @@ class SettingsProxyTest : SysuiTestCase() { mSettings.registerContentObserverSync( TEST_SETTING, notifyForDescendants = true, mContentObserver mContentObserver, ) verify(mSettings.getContentResolver()) .registerContentObserver(eq(TEST_SETTING_URI), eq(true), eq(mContentObserver)) Loading @@ -104,7 +104,7 @@ class SettingsProxyTest : SysuiTestCase() { mSettings.registerContentObserver( TEST_SETTING, notifyForDescendants = true, mContentObserver mContentObserver, ) verify(mSettings.getContentResolver()) .registerContentObserver(eq(TEST_SETTING_URI), eq(true), eq(mContentObserver)) Loading @@ -116,7 +116,7 @@ class SettingsProxyTest : SysuiTestCase() { mSettings.registerContentObserverAsync( TEST_SETTING, notifyForDescendants = true, mContentObserver mContentObserver, ) testScope.advanceUntilIdle() verify(mSettings.getContentResolver()) Loading Loading @@ -154,7 +154,7 @@ class SettingsProxyTest : SysuiTestCase() { mSettings.registerContentObserverSync( TEST_SETTING_URI, notifyForDescendants = true, mContentObserver mContentObserver, ) verify(mSettings.getContentResolver()) .registerContentObserver(eq(TEST_SETTING_URI), eq(true), eq(mContentObserver)) Loading @@ -166,7 +166,7 @@ class SettingsProxyTest : SysuiTestCase() { mSettings.registerContentObserver( TEST_SETTING_URI, notifyForDescendants = true, mContentObserver mContentObserver, ) verify(mSettings.getContentResolver()) .registerContentObserver(eq(TEST_SETTING_URI), eq(true), eq(mContentObserver)) Loading @@ -178,7 +178,7 @@ class SettingsProxyTest : SysuiTestCase() { mSettings.registerContentObserverAsync( TEST_SETTING_URI, notifyForDescendants = true, mContentObserver mContentObserver, ) testScope.advanceUntilIdle() verify(mSettings.getContentResolver()) Loading @@ -202,7 +202,7 @@ class SettingsProxyTest : SysuiTestCase() { TEST_SETTING_URI, false, mContentObserver, it it, ) } } Loading Loading @@ -382,15 +382,15 @@ class SettingsProxyTest : SysuiTestCase() { assertThat(mSettings.getFloat(TEST_SETTING, 2.5F)).isEqualTo(2.5F) } private class FakeSettingsProxy(val testDispatcher: CoroutineDispatcher) : SettingsProxy { private class FakeSettingsProxy(val testScope: CoroutineScope) : SettingsProxy { private val mContentResolver = mock(ContentResolver::class.java) private val settingToValueMap: MutableMap<String, String?> = mutableMapOf() override fun getContentResolver() = mContentResolver override val backgroundDispatcher: CoroutineDispatcher get() = testDispatcher override val settingsScope: CoroutineScope get() = testScope override fun getUriFor(name: String) = Uri.parse(StringBuilder().append("content://settings/").append(name).toString()) Loading @@ -408,7 +408,7 @@ class SettingsProxyTest : SysuiTestCase() { name: String, value: String?, tag: String?, makeDefault: Boolean makeDefault: Boolean, ): Boolean { settingToValueMap[name] = value return true Loading
packages/SystemUI/multivalentTests/src/com/android/systemui/util/settings/UserSettingsProxyTest.kt +37 −45 Original line number Diff line number Diff line Loading @@ -28,7 +28,7 @@ import androidx.test.ext.junit.runners.AndroidJUnit4 import androidx.test.filters.SmallTest import com.android.systemui.SysuiTestCase import com.google.common.truth.Truth.assertThat import kotlinx.coroutines.CoroutineDispatcher import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.ExperimentalCoroutinesApi import kotlinx.coroutines.launch import kotlinx.coroutines.test.StandardTestDispatcher Loading @@ -36,7 +36,6 @@ import kotlinx.coroutines.test.TestScope import kotlinx.coroutines.test.advanceUntilIdle import kotlinx.coroutines.test.runTest import org.junit.Assert.assertThrows import org.junit.Before import org.junit.Test import org.junit.runner.RunWith import org.mockito.Mockito.mock Loading @@ -51,14 +50,9 @@ class UserSettingsProxyTest : SysuiTestCase() { private var userId = MAIN_USER_ID private val testDispatcher = StandardTestDispatcher() private var mSettings: UserSettingsProxy = FakeUserSettingsProxy({ userId }, testDispatcher) private val testScope = TestScope(testDispatcher) private var mSettings: UserSettingsProxy = FakeUserSettingsProxy({ userId }, testScope) private var mContentObserver = object : ContentObserver(Handler(Looper.getMainLooper())) {} private lateinit var testScope: TestScope @Before fun setUp() { testScope = TestScope(testDispatcher) } @Test fun registerContentObserverForUser_inputString_success() = Loading @@ -69,7 +63,7 @@ class UserSettingsProxyTest : SysuiTestCase() { eq(TEST_SETTING_URI), eq(false), eq(mContentObserver), eq(MAIN_USER_ID) eq(MAIN_USER_ID), ) } Loading @@ -82,7 +76,7 @@ class UserSettingsProxyTest : SysuiTestCase() { eq(TEST_SETTING_URI), eq(false), eq(mContentObserver), eq(MAIN_USER_ID) eq(MAIN_USER_ID), ) } Loading @@ -96,7 +90,7 @@ class UserSettingsProxyTest : SysuiTestCase() { eq(TEST_SETTING_URI), eq(false), eq(mContentObserver), eq(MAIN_USER_ID) eq(MAIN_USER_ID), ) } Loading @@ -107,14 +101,14 @@ class UserSettingsProxyTest : SysuiTestCase() { TEST_SETTING, notifyForDescendants = true, mContentObserver, userId userId, ) verify(mSettings.getContentResolver()) .registerContentObserver( eq(TEST_SETTING_URI), eq(true), eq(mContentObserver), eq(MAIN_USER_ID) eq(MAIN_USER_ID), ) } Loading @@ -125,16 +119,14 @@ class UserSettingsProxyTest : SysuiTestCase() { TEST_SETTING, notifyForDescendants = true, mContentObserver, userId userId, ) verify(mSettings.getContentResolver()) .registerContentObserver( eq(TEST_SETTING_URI), eq( true, ), eq(true), eq(mContentObserver), eq(MAIN_USER_ID) eq(MAIN_USER_ID), ) } Loading @@ -145,7 +137,7 @@ class UserSettingsProxyTest : SysuiTestCase() { TEST_SETTING, notifyForDescendants = true, mContentObserver, userId userId, ) testScope.advanceUntilIdle() verify(mSettings.getContentResolver()) Loading @@ -153,7 +145,7 @@ class UserSettingsProxyTest : SysuiTestCase() { eq(TEST_SETTING_URI), eq(true), eq(mContentObserver), eq(MAIN_USER_ID) eq(MAIN_USER_ID), ) } Loading @@ -166,7 +158,7 @@ class UserSettingsProxyTest : SysuiTestCase() { eq(TEST_SETTING_URI), eq(false), eq(mContentObserver), eq(MAIN_USER_ID) eq(MAIN_USER_ID), ) } Loading @@ -179,7 +171,7 @@ class UserSettingsProxyTest : SysuiTestCase() { eq(TEST_SETTING_URI), eq(false), eq(mContentObserver), eq(MAIN_USER_ID) eq(MAIN_USER_ID), ) } Loading @@ -189,7 +181,7 @@ class UserSettingsProxyTest : SysuiTestCase() { mSettings.registerContentObserverForUserAsync( TEST_SETTING_URI, mContentObserver, userId userId, ) testScope.advanceUntilIdle() Loading @@ -198,7 +190,7 @@ class UserSettingsProxyTest : SysuiTestCase() { eq(TEST_SETTING_URI), eq(false), eq(mContentObserver), eq(MAIN_USER_ID) eq(MAIN_USER_ID), ) } Loading @@ -213,7 +205,7 @@ class UserSettingsProxyTest : SysuiTestCase() { TEST_SETTING_URI, mContentObserver, userId, runnable runnable, ) testScope.advanceUntilIdle() assertThat(callbackCalled).isTrue() Loading @@ -226,14 +218,14 @@ class UserSettingsProxyTest : SysuiTestCase() { TEST_SETTING_URI, notifyForDescendants = true, mContentObserver, userId userId, ) verify(mSettings.getContentResolver()) .registerContentObserver( eq(TEST_SETTING_URI), eq(true), eq(mContentObserver), eq(MAIN_USER_ID) eq(MAIN_USER_ID), ) } Loading @@ -244,14 +236,14 @@ class UserSettingsProxyTest : SysuiTestCase() { TEST_SETTING_URI, notifyForDescendants = true, mContentObserver, userId userId, ) verify(mSettings.getContentResolver()) .registerContentObserver( eq(TEST_SETTING_URI), eq(true), eq(mContentObserver), eq(MAIN_USER_ID) eq(MAIN_USER_ID), ) } Loading @@ -262,7 +254,7 @@ class UserSettingsProxyTest : SysuiTestCase() { TEST_SETTING_URI, notifyForDescendants = true, mContentObserver, userId userId, ) testScope.advanceUntilIdle() verify(mSettings.getContentResolver()) Loading @@ -270,7 +262,7 @@ class UserSettingsProxyTest : SysuiTestCase() { eq(TEST_SETTING_URI), eq(true), eq(mContentObserver), eq(MAIN_USER_ID) eq(MAIN_USER_ID), ) } Loading @@ -283,7 +275,7 @@ class UserSettingsProxyTest : SysuiTestCase() { eq(TEST_SETTING_URI), eq(false), eq(mContentObserver), eq(0) eq(0), ) } Loading @@ -296,7 +288,7 @@ class UserSettingsProxyTest : SysuiTestCase() { eq(TEST_SETTING_URI), eq(false), eq(mContentObserver), eq(0) eq(0), ) } Loading @@ -309,7 +301,7 @@ class UserSettingsProxyTest : SysuiTestCase() { eq(TEST_SETTING_URI), eq(false), eq(mContentObserver), eq(0) eq(0), ) } } Loading @@ -320,14 +312,14 @@ class UserSettingsProxyTest : SysuiTestCase() { mSettings.registerContentObserverSync( TEST_SETTING_URI, notifyForDescendants = true, mContentObserver mContentObserver, ) verify(mSettings.getContentResolver()) .registerContentObserver( eq(TEST_SETTING_URI), eq(true), eq(mContentObserver), eq(0) eq(0), ) } Loading @@ -340,7 +332,7 @@ class UserSettingsProxyTest : SysuiTestCase() { eq(TEST_SETTING_URI), eq(false), eq(mContentObserver), eq(0) eq(0), ) } Loading @@ -354,7 +346,7 @@ class UserSettingsProxyTest : SysuiTestCase() { eq(TEST_SETTING_URI), eq(false), eq(mContentObserver), eq(0) eq(0), ) } } Loading Loading @@ -557,7 +549,7 @@ class UserSettingsProxyTest : SysuiTestCase() { */ private class FakeUserSettingsProxy( override val currentUserProvider: SettingsProxy.CurrentUserIdProvider, val testDispatcher: CoroutineDispatcher val testScope: CoroutineScope, ) : UserSettingsProxy { private val mContentResolver = mock(ContentResolver::class.java) Loading @@ -569,8 +561,8 @@ class UserSettingsProxyTest : SysuiTestCase() { override fun getUriFor(name: String) = Uri.parse(StringBuilder().append(URI_PREFIX).append(name).toString()) override val backgroundDispatcher: CoroutineDispatcher get() = testDispatcher override val settingsScope: CoroutineScope get() = testScope override fun getStringForUser(name: String, userHandle: Int) = userIdToSettingsValueMap[userHandle]?.get(name) ?: "" Loading @@ -578,7 +570,7 @@ class UserSettingsProxyTest : SysuiTestCase() { override fun putString( name: String, value: String?, overrideableByRestore: Boolean overrideableByRestore: Boolean, ): Boolean { userIdToSettingsValueMap[DEFAULT_USER_ID]?.put(name, value) return true Loading @@ -588,7 +580,7 @@ class UserSettingsProxyTest : SysuiTestCase() { name: String, value: String?, tag: String?, makeDefault: Boolean makeDefault: Boolean, ): Boolean { putStringForUser(name, value, DEFAULT_USER_ID) return true Loading @@ -605,7 +597,7 @@ class UserSettingsProxyTest : SysuiTestCase() { tag: String?, makeDefault: Boolean, userHandle: Int, overrideableByRestore: Boolean overrideableByRestore: Boolean, ): Boolean { userIdToSettingsValueMap[userHandle]?.set(name, value) return true Loading
packages/SystemUI/pods/com/android/systemui/util/settings/GlobalSettingsImpl.java +6 −6 Original line number Diff line number Diff line Loading @@ -25,7 +25,7 @@ import android.provider.Settings; import com.android.systemui.util.settings.SettingsSingleThreadBackground; import kotlinx.coroutines.CoroutineDispatcher; import kotlinx.coroutines.CoroutineScope; import javax.inject.Inject; Loading @@ -33,13 +33,13 @@ import javax.inject.Inject; @SuppressLint("StaticSettingsProvider") class GlobalSettingsImpl implements GlobalSettings { private final ContentResolver mContentResolver; private final CoroutineDispatcher mBgDispatcher; private final CoroutineScope mSettingsScope; @Inject GlobalSettingsImpl(ContentResolver contentResolver, @SettingsSingleThreadBackground CoroutineDispatcher bgDispatcher) { @SettingsSingleThreadBackground CoroutineScope settingsScope) { mContentResolver = contentResolver; mBgDispatcher = bgDispatcher; mSettingsScope = settingsScope; } @NonNull Loading @@ -56,8 +56,8 @@ class GlobalSettingsImpl implements GlobalSettings { @NonNull @Override public CoroutineDispatcher getBackgroundDispatcher() { return mBgDispatcher; public CoroutineScope getSettingsScope() { return mSettingsScope; } @Override Loading
packages/SystemUI/pods/com/android/systemui/util/settings/SecureSettingsImpl.java +6 −6 Original line number Diff line number Diff line Loading @@ -23,23 +23,23 @@ import android.provider.Settings; import com.android.systemui.util.settings.SettingsSingleThreadBackground; import kotlinx.coroutines.CoroutineDispatcher; import kotlinx.coroutines.CoroutineScope; import javax.inject.Inject; class SecureSettingsImpl implements SecureSettings { private final ContentResolver mContentResolver; private final CurrentUserIdProvider mCurrentUserProvider; private final CoroutineDispatcher mBgDispatcher; private final CoroutineScope mSettingsScope; @Inject SecureSettingsImpl( ContentResolver contentResolver, CurrentUserIdProvider currentUserProvider, @SettingsSingleThreadBackground CoroutineDispatcher bgDispatcher) { @SettingsSingleThreadBackground CoroutineScope settingsScope) { mContentResolver = contentResolver; mCurrentUserProvider = currentUserProvider; mBgDispatcher = bgDispatcher; mSettingsScope = settingsScope; } @NonNull Loading @@ -62,8 +62,8 @@ class SecureSettingsImpl implements SecureSettings { @NonNull @Override public CoroutineDispatcher getBackgroundDispatcher() { return mBgDispatcher; public CoroutineScope getSettingsScope() { return mSettingsScope; } @Override Loading
packages/SystemUI/pods/com/android/systemui/util/settings/SettingsProxy.kt +33 −24 Original line number Diff line number Diff line Loading @@ -23,10 +23,12 @@ import android.provider.Settings.SettingNotFoundException import androidx.annotation.AnyThread import androidx.annotation.WorkerThread import com.android.app.tracing.TraceUtils.trace import com.android.systemui.coroutines.newTracingContext import com.android.app.tracing.coroutines.launchTraced as launch import com.android.app.tracing.coroutines.nameCoroutine import kotlin.coroutines.CoroutineContext import kotlin.coroutines.EmptyCoroutineContext import kotlinx.coroutines.CoroutineDispatcher import kotlinx.coroutines.CoroutineScope import com.android.app.tracing.coroutines.launchTraced as launch import kotlinx.coroutines.withContext /** Loading @@ -47,11 +49,14 @@ interface SettingsProxy { /** Returns the [ContentResolver] this instance was constructed with. */ fun getContentResolver(): ContentResolver /** * Returns the background [CoroutineDispatcher] that the async APIs will use for a specific * implementation. */ val backgroundDispatcher: CoroutineDispatcher /** Returns the [CoroutineScope] that the async APIs will use. */ val settingsScope: CoroutineScope @OptIn(ExperimentalStdlibApi::class) fun settingsDispatcherContext(name: String): CoroutineContext { return (settingsScope.coroutineContext[CoroutineDispatcher] ?: EmptyCoroutineContext) + nameCoroutine(name) } /** * Construct the content URI for a particular name/value pair, useful for monitoring changes Loading Loading @@ -82,7 +87,7 @@ interface SettingsProxy { * wish to synchronize execution. */ suspend fun registerContentObserver(name: String, settingsObserver: ContentObserver) { withContext(backgroundDispatcher) { withContext(settingsDispatcherContext("registerContentObserver-A")) { registerContentObserverSync(getUriFor(name), settingsObserver) } } Loading @@ -94,7 +99,7 @@ interface SettingsProxy { */ @AnyThread fun registerContentObserverAsync(name: String, settingsObserver: ContentObserver) = CoroutineScope(backgroundDispatcher + newTracingContext("SettingsProxy-A")).launch { settingsScope.launch("registerContentObserverAsync-A") { registerContentObserverSync(getUriFor(name), settingsObserver) } Loading @@ -111,7 +116,7 @@ interface SettingsProxy { settingsObserver: ContentObserver, @WorkerThread registered: Runnable, ) = CoroutineScope(backgroundDispatcher + newTracingContext("SettingsProxy-B")).launch { settingsScope.launch("registerContentObserverAsync-B") { registerContentObserverSync(getUriFor(name), settingsObserver) registered.run() } Loading @@ -134,7 +139,9 @@ interface SettingsProxy { * wish to synchronize execution. */ suspend fun registerContentObserver(uri: Uri, settingsObserver: ContentObserver) { withContext(backgroundDispatcher) { registerContentObserverSync(uri, settingsObserver) } withContext(settingsDispatcherContext("registerContentObserver-B")) { registerContentObserverSync(uri, settingsObserver) } } /** Loading @@ -144,7 +151,7 @@ interface SettingsProxy { */ @AnyThread fun registerContentObserverAsync(uri: Uri, settingsObserver: ContentObserver) = CoroutineScope(backgroundDispatcher + newTracingContext("SettingsProxy-C")).launch { settingsScope.launch("registerContentObserverAsync-C") { registerContentObserverSync(uri, settingsObserver) } Loading @@ -161,7 +168,7 @@ interface SettingsProxy { settingsObserver: ContentObserver, @WorkerThread registered: Runnable, ) = CoroutineScope(backgroundDispatcher + newTracingContext("SettingsProxy-D")).launch { settingsScope.launch("registerContentObserverAsync-D") { registerContentObserverSync(uri, settingsObserver) registered.run() } Loading @@ -188,9 +195,9 @@ interface SettingsProxy { suspend fun registerContentObserver( name: String, notifyForDescendants: Boolean, settingsObserver: ContentObserver settingsObserver: ContentObserver, ) { withContext(backgroundDispatcher) { withContext(settingsDispatcherContext("registerContentObserver-C")) { registerContentObserverSync(getUriFor(name), notifyForDescendants, settingsObserver) } } Loading @@ -206,7 +213,7 @@ interface SettingsProxy { notifyForDescendants: Boolean, settingsObserver: ContentObserver, ) = CoroutineScope(backgroundDispatcher + newTracingContext("SettingsProxy-E")).launch { settingsScope.launch("registerContentObserverAsync-E") { registerContentObserverSync(getUriFor(name), notifyForDescendants, settingsObserver) } Loading @@ -224,7 +231,7 @@ interface SettingsProxy { settingsObserver: ContentObserver, @WorkerThread registered: Runnable, ) = CoroutineScope(backgroundDispatcher + newTracingContext("SettingsProxy-F")).launch { settingsScope.launch("registerContentObserverAsync-F") { registerContentObserverSync(getUriFor(name), notifyForDescendants, settingsObserver) registered.run() } Loading @@ -239,7 +246,7 @@ interface SettingsProxy { fun registerContentObserverSync( uri: Uri, notifyForDescendants: Boolean, settingsObserver: ContentObserver settingsObserver: ContentObserver, ) { trace({ "SP#registerObserver#[$uri]" }) { getContentResolver() Loading @@ -257,9 +264,9 @@ interface SettingsProxy { suspend fun registerContentObserver( uri: Uri, notifyForDescendants: Boolean, settingsObserver: ContentObserver settingsObserver: ContentObserver, ) { withContext(backgroundDispatcher) { withContext(settingsDispatcherContext("registerContentObserver-D")) { registerContentObserverSync(uri, notifyForDescendants, settingsObserver) } } Loading @@ -275,7 +282,7 @@ interface SettingsProxy { notifyForDescendants: Boolean, settingsObserver: ContentObserver, ) = CoroutineScope(backgroundDispatcher + newTracingContext("SettingsProxy-G")).launch { settingsScope.launch("registerContentObserverAsync-G") { registerContentObserverSync(uri, notifyForDescendants, settingsObserver) } Loading @@ -293,7 +300,7 @@ interface SettingsProxy { settingsObserver: ContentObserver, @WorkerThread registered: Runnable, ) = CoroutineScope(backgroundDispatcher + newTracingContext("SettingsProxy-H")).launch { settingsScope.launch("registerContentObserverAsync-H") { registerContentObserverSync(uri, notifyForDescendants, settingsObserver) registered.run() } Loading @@ -319,7 +326,9 @@ interface SettingsProxy { * async block if they wish to synchronize execution. */ suspend fun unregisterContentObserver(settingsObserver: ContentObserver) { withContext(backgroundDispatcher) { unregisterContentObserverSync(settingsObserver) } withContext(settingsDispatcherContext("unregisterContentObserver")) { unregisterContentObserverSync(settingsObserver) } } /** Loading @@ -330,7 +339,7 @@ interface SettingsProxy { */ @AnyThread fun unregisterContentObserverAsync(settingsObserver: ContentObserver) = CoroutineScope(backgroundDispatcher + newTracingContext("SettingsProxy-I")).launch { settingsScope.launch("unregisterContentObserverAsync") { unregisterContentObserver(settingsObserver) } Loading