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

Commit 4044f94d authored by Treehugger Robot's avatar Treehugger Robot Committed by Android (Google) Code Review
Browse files

Merge changes from topic "settings-proxy-coroutinescope" into main

* changes:
  Cache CoroutineScope for settings APIs
  Apply new code formatting to SettingsProxy
parents ed111738 f33c3584
Loading
Loading
Loading
Loading
+13 −13
Original line number Diff line number Diff line
@@ -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
@@ -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())) {}
    }

@@ -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))
@@ -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))
@@ -116,7 +116,7 @@ class SettingsProxyTest : SysuiTestCase() {
            mSettings.registerContentObserverAsync(
                TEST_SETTING,
                notifyForDescendants = true,
                mContentObserver
                mContentObserver,
            )
            testScope.advanceUntilIdle()
            verify(mSettings.getContentResolver())
@@ -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))
@@ -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))
@@ -178,7 +178,7 @@ class SettingsProxyTest : SysuiTestCase() {
            mSettings.registerContentObserverAsync(
                TEST_SETTING_URI,
                notifyForDescendants = true,
                mContentObserver
                mContentObserver,
            )
            testScope.advanceUntilIdle()
            verify(mSettings.getContentResolver())
@@ -202,7 +202,7 @@ class SettingsProxyTest : SysuiTestCase() {
                    TEST_SETTING_URI,
                    false,
                    mContentObserver,
                    it
                    it,
                )
            }
        }
@@ -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())
@@ -408,7 +408,7 @@ class SettingsProxyTest : SysuiTestCase() {
            name: String,
            value: String?,
            tag: String?,
            makeDefault: Boolean
            makeDefault: Boolean,
        ): Boolean {
            settingToValueMap[name] = value
            return true
+37 −45
Original line number Diff line number Diff line
@@ -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
@@ -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
@@ -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() =
@@ -69,7 +63,7 @@ class UserSettingsProxyTest : SysuiTestCase() {
                    eq(TEST_SETTING_URI),
                    eq(false),
                    eq(mContentObserver),
                    eq(MAIN_USER_ID)
                    eq(MAIN_USER_ID),
                )
        }

@@ -82,7 +76,7 @@ class UserSettingsProxyTest : SysuiTestCase() {
                    eq(TEST_SETTING_URI),
                    eq(false),
                    eq(mContentObserver),
                    eq(MAIN_USER_ID)
                    eq(MAIN_USER_ID),
                )
        }

@@ -96,7 +90,7 @@ class UserSettingsProxyTest : SysuiTestCase() {
                    eq(TEST_SETTING_URI),
                    eq(false),
                    eq(mContentObserver),
                    eq(MAIN_USER_ID)
                    eq(MAIN_USER_ID),
                )
        }

@@ -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),
                )
        }

@@ -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),
                )
        }

@@ -145,7 +137,7 @@ class UserSettingsProxyTest : SysuiTestCase() {
                TEST_SETTING,
                notifyForDescendants = true,
                mContentObserver,
                userId
                userId,
            )
            testScope.advanceUntilIdle()
            verify(mSettings.getContentResolver())
@@ -153,7 +145,7 @@ class UserSettingsProxyTest : SysuiTestCase() {
                    eq(TEST_SETTING_URI),
                    eq(true),
                    eq(mContentObserver),
                    eq(MAIN_USER_ID)
                    eq(MAIN_USER_ID),
                )
        }

@@ -166,7 +158,7 @@ class UserSettingsProxyTest : SysuiTestCase() {
                    eq(TEST_SETTING_URI),
                    eq(false),
                    eq(mContentObserver),
                    eq(MAIN_USER_ID)
                    eq(MAIN_USER_ID),
                )
        }

@@ -179,7 +171,7 @@ class UserSettingsProxyTest : SysuiTestCase() {
                    eq(TEST_SETTING_URI),
                    eq(false),
                    eq(mContentObserver),
                    eq(MAIN_USER_ID)
                    eq(MAIN_USER_ID),
                )
        }

@@ -189,7 +181,7 @@ class UserSettingsProxyTest : SysuiTestCase() {
            mSettings.registerContentObserverForUserAsync(
                TEST_SETTING_URI,
                mContentObserver,
                userId
                userId,
            )
            testScope.advanceUntilIdle()

@@ -198,7 +190,7 @@ class UserSettingsProxyTest : SysuiTestCase() {
                    eq(TEST_SETTING_URI),
                    eq(false),
                    eq(mContentObserver),
                    eq(MAIN_USER_ID)
                    eq(MAIN_USER_ID),
                )
        }

@@ -213,7 +205,7 @@ class UserSettingsProxyTest : SysuiTestCase() {
                TEST_SETTING_URI,
                mContentObserver,
                userId,
                runnable
                runnable,
            )
            testScope.advanceUntilIdle()
            assertThat(callbackCalled).isTrue()
@@ -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),
                )
        }

@@ -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),
                )
        }

@@ -262,7 +254,7 @@ class UserSettingsProxyTest : SysuiTestCase() {
                TEST_SETTING_URI,
                notifyForDescendants = true,
                mContentObserver,
                userId
                userId,
            )
            testScope.advanceUntilIdle()
            verify(mSettings.getContentResolver())
@@ -270,7 +262,7 @@ class UserSettingsProxyTest : SysuiTestCase() {
                    eq(TEST_SETTING_URI),
                    eq(true),
                    eq(mContentObserver),
                    eq(MAIN_USER_ID)
                    eq(MAIN_USER_ID),
                )
        }

@@ -283,7 +275,7 @@ class UserSettingsProxyTest : SysuiTestCase() {
                    eq(TEST_SETTING_URI),
                    eq(false),
                    eq(mContentObserver),
                    eq(0)
                    eq(0),
                )
        }

@@ -296,7 +288,7 @@ class UserSettingsProxyTest : SysuiTestCase() {
                    eq(TEST_SETTING_URI),
                    eq(false),
                    eq(mContentObserver),
                    eq(0)
                    eq(0),
                )
        }

@@ -309,7 +301,7 @@ class UserSettingsProxyTest : SysuiTestCase() {
                    eq(TEST_SETTING_URI),
                    eq(false),
                    eq(mContentObserver),
                    eq(0)
                    eq(0),
                )
        }
    }
@@ -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),
                )
        }

@@ -340,7 +332,7 @@ class UserSettingsProxyTest : SysuiTestCase() {
                    eq(TEST_SETTING_URI),
                    eq(false),
                    eq(mContentObserver),
                    eq(0)
                    eq(0),
                )
        }

@@ -354,7 +346,7 @@ class UserSettingsProxyTest : SysuiTestCase() {
                        eq(TEST_SETTING_URI),
                        eq(false),
                        eq(mContentObserver),
                        eq(0)
                        eq(0),
                    )
            }
        }
@@ -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)
@@ -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) ?: ""
@@ -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
@@ -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
@@ -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
+6 −6
Original line number Diff line number Diff line
@@ -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;

@@ -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
@@ -56,8 +56,8 @@ class GlobalSettingsImpl implements GlobalSettings {

    @NonNull
    @Override
    public CoroutineDispatcher getBackgroundDispatcher() {
        return mBgDispatcher;
    public CoroutineScope getSettingsScope() {
        return mSettingsScope;
    }

    @Override
+6 −6
Original line number Diff line number Diff line
@@ -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
@@ -62,8 +62,8 @@ class SecureSettingsImpl implements SecureSettings {

    @NonNull
    @Override
    public CoroutineDispatcher getBackgroundDispatcher() {
        return mBgDispatcher;
    public CoroutineScope getSettingsScope() {
        return mSettingsScope;
    }

    @Override
+33 −24
Original line number Diff line number Diff line
@@ -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

/**
@@ -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
@@ -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)
        }
    }
@@ -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)
        }

@@ -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()
        }
@@ -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)
        }
    }

    /**
@@ -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)
        }

@@ -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()
        }
@@ -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)
        }
    }
@@ -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)
        }

@@ -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()
        }
@@ -239,7 +246,7 @@ interface SettingsProxy {
    fun registerContentObserverSync(
        uri: Uri,
        notifyForDescendants: Boolean,
        settingsObserver: ContentObserver
        settingsObserver: ContentObserver,
    ) {
        trace({ "SP#registerObserver#[$uri]" }) {
            getContentResolver()
@@ -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)
        }
    }
@@ -275,7 +282,7 @@ interface SettingsProxy {
        notifyForDescendants: Boolean,
        settingsObserver: ContentObserver,
    ) =
        CoroutineScope(backgroundDispatcher + newTracingContext("SettingsProxy-G")).launch {
        settingsScope.launch("registerContentObserverAsync-G") {
            registerContentObserverSync(uri, notifyForDescendants, settingsObserver)
        }

@@ -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()
        }
@@ -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)
        }
    }

    /**
@@ -330,7 +339,7 @@ interface SettingsProxy {
     */
    @AnyThread
    fun unregisterContentObserverAsync(settingsObserver: ContentObserver) =
        CoroutineScope(backgroundDispatcher + newTracingContext("SettingsProxy-I")).launch {
        settingsScope.launch("unregisterContentObserverAsync") {
            unregisterContentObserver(settingsObserver)
        }

Loading