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