diff --git a/packages/SystemUI/src/com/android/systemui/util/settings/GlobalSettingsImpl.java b/packages/SystemUI/src/com/android/systemui/util/settings/GlobalSettingsImpl.java
index 4438763..42389f0 100644
--- a/packages/SystemUI/src/com/android/systemui/util/settings/GlobalSettingsImpl.java
+++ b/packages/SystemUI/src/com/android/systemui/util/settings/GlobalSettingsImpl.java
@@ -23,23 +23,16 @@
 import android.net.Uri;
 import android.provider.Settings;
 
-import com.android.systemui.dagger.qualifiers.Background;
-
-import kotlinx.coroutines.CoroutineDispatcher;
-
 import javax.inject.Inject;
 
 // use UserHandle.USER_SYSTEM everywhere
 @SuppressLint("StaticSettingsProvider")
 class GlobalSettingsImpl implements GlobalSettings {
     private final ContentResolver mContentResolver;
-    private final CoroutineDispatcher mBgDispatcher;
 
     @Inject
-    GlobalSettingsImpl(ContentResolver contentResolver,
-            @Background CoroutineDispatcher bgDispatcher) {
+    GlobalSettingsImpl(ContentResolver contentResolver) {
         mContentResolver = contentResolver;
-        mBgDispatcher = bgDispatcher;
     }
 
     @Override
@@ -53,11 +46,6 @@
     }
 
     @Override
-    public CoroutineDispatcher getBackgroundDispatcher() {
-        return mBgDispatcher;
-    }
-
-    @Override
     public String getString(String name) {
         return Settings.Global.getString(mContentResolver, name);
     }
diff --git a/packages/SystemUI/src/com/android/systemui/util/settings/SecureSettingsImpl.java b/packages/SystemUI/src/com/android/systemui/util/settings/SecureSettingsImpl.java
index 38ad5d0..6532ce8 100644
--- a/packages/SystemUI/src/com/android/systemui/util/settings/SecureSettingsImpl.java
+++ b/packages/SystemUI/src/com/android/systemui/util/settings/SecureSettingsImpl.java
@@ -22,24 +22,18 @@
 
 import androidx.annotation.NonNull;
 
-import com.android.systemui.dagger.qualifiers.Background;
 import com.android.systemui.settings.UserTracker;
 
-import kotlinx.coroutines.CoroutineDispatcher;
-
 import javax.inject.Inject;
 
 class SecureSettingsImpl implements SecureSettings {
     private final ContentResolver mContentResolver;
     private final UserTracker mUserTracker;
-    private final CoroutineDispatcher mBgDispatcher;
 
     @Inject
-    SecureSettingsImpl(ContentResolver contentResolver, UserTracker userTracker,
-            @Background CoroutineDispatcher bgDispatcher) {
+    SecureSettingsImpl(ContentResolver contentResolver, UserTracker userTracker) {
         mContentResolver = contentResolver;
         mUserTracker = userTracker;
-        mBgDispatcher = bgDispatcher;
     }
 
     @Override
@@ -58,11 +52,6 @@
     }
 
     @Override
-    public CoroutineDispatcher getBackgroundDispatcher() {
-        return mBgDispatcher;
-    }
-
-    @Override
     public String getStringForUser(String name, int userHandle) {
         return Settings.Secure.getStringForUser(mContentResolver, name,
                 getRealUserHandle(userHandle));
diff --git a/packages/SystemUI/src/com/android/systemui/util/settings/SettingsProxy.kt b/packages/SystemUI/src/com/android/systemui/util/settings/SettingsProxy.kt
index 8f5f4bb..d92127c 100644
--- a/packages/SystemUI/src/com/android/systemui/util/settings/SettingsProxy.kt
+++ b/packages/SystemUI/src/com/android/systemui/util/settings/SettingsProxy.kt
@@ -20,10 +20,6 @@
 import android.net.Uri
 import android.provider.Settings.SettingNotFoundException
 import com.android.app.tracing.TraceUtils.trace
-import kotlinx.coroutines.CoroutineDispatcher
-import kotlinx.coroutines.CoroutineScope
-import kotlinx.coroutines.launch
-import kotlinx.coroutines.withContext
 
 /**
  * Used to interact with mainly with Settings.Global, but can also be used for Settings.System and
@@ -44,12 +40,6 @@
     fun getContentResolver(): ContentResolver
 
     /**
-     * Returns the background [CoroutineDispatcher] that the async APIs will use for a specific
-     * implementation.
-     */
-    fun getBackgroundDispatcher(): CoroutineDispatcher
-
-    /**
      * Construct the content URI for a particular name/value pair, useful for monitoring changes
      * with a ContentObserver.
      *
@@ -67,28 +57,6 @@
         registerContentObserverSync(getUriFor(name), settingsObserver)
     }
 
-    /**
-     * Convenience wrapper around [ContentResolver.registerContentObserver].'
-     *
-     * suspend API corresponding to [registerContentObserver] to ensure that [ContentObserver]
-     * registration happens on a worker thread. Caller may wrap the API in an async block if they
-     * wish to synchronize execution.
-     */
-    suspend fun registerContentObserver(name: String, settingsObserver: ContentObserver) =
-        withContext(getBackgroundDispatcher()) {
-            registerContentObserverSync(getUriFor(name), settingsObserver)
-        }
-
-    /**
-     * Convenience wrapper around [ContentResolver.registerContentObserver].'
-     *
-     * API corresponding to [registerContentObserver] for Java usage.
-     */
-    fun registerContentObserverAsync(name: String, settingsObserver: ContentObserver) =
-        CoroutineScope(getBackgroundDispatcher()).launch {
-            registerContentObserverSync(getUriFor(name), settingsObserver)
-        }
-
     /** Convenience wrapper around [ContentResolver.registerContentObserver].' */
     fun registerContentObserverSync(uri: Uri, settingsObserver: ContentObserver) =
         registerContentObserverSync(uri, false, settingsObserver)
@@ -96,28 +64,6 @@
     /**
      * Convenience wrapper around [ContentResolver.registerContentObserver].'
      *
-     * suspend API corresponding to [registerContentObserver] to ensure that [ContentObserver]
-     * registration happens on a worker thread. Caller may wrap the API in an async block if they
-     * wish to synchronize execution.
-     */
-    suspend fun registerContentObserver(uri: Uri, settingsObserver: ContentObserver) =
-        withContext(getBackgroundDispatcher()) {
-            registerContentObserverSync(uri, settingsObserver)
-        }
-
-    /**
-     * Convenience wrapper around [ContentResolver.registerContentObserver].'
-     *
-     * API corresponding to [registerContentObserver] for Java usage.
-     */
-    fun registerContentObserverAsync(uri: Uri, settingsObserver: ContentObserver) =
-        CoroutineScope(getBackgroundDispatcher()).launch {
-            registerContentObserverSync(uri, settingsObserver)
-        }
-
-    /**
-     * Convenience wrapper around [ContentResolver.registerContentObserver].'
-     *
      * Implicitly calls [getUriFor] on the passed in name.
      */
     fun registerContentObserverSync(
@@ -126,36 +72,6 @@
         settingsObserver: ContentObserver
     ) = registerContentObserverSync(getUriFor(name), notifyForDescendants, settingsObserver)
 
-    /**
-     * Convenience wrapper around [ContentResolver.registerContentObserver].'
-     *
-     * suspend API corresponding to [registerContentObserver] to ensure that [ContentObserver]
-     * registration happens on a worker thread. Caller may wrap the API in an async block if they
-     * wish to synchronize execution.
-     */
-    suspend fun registerContentObserver(
-        name: String,
-        notifyForDescendants: Boolean,
-        settingsObserver: ContentObserver
-    ) =
-        withContext(getBackgroundDispatcher()) {
-            registerContentObserverSync(getUriFor(name), notifyForDescendants, settingsObserver)
-        }
-
-    /**
-     * Convenience wrapper around [ContentResolver.registerContentObserver].'
-     *
-     * API corresponding to [registerContentObserver] for Java usage.
-     */
-    fun registerContentObserverAsync(
-        name: String,
-        notifyForDescendants: Boolean,
-        settingsObserver: ContentObserver
-    ) =
-        CoroutineScope(getBackgroundDispatcher()).launch {
-            registerContentObserverSync(getUriFor(name), notifyForDescendants, settingsObserver)
-        }
-
     /** Convenience wrapper around [ContentResolver.registerContentObserver].' */
     fun registerContentObserverSync(
         uri: Uri,
@@ -168,36 +84,6 @@
         }
     }
 
-    /**
-     * Convenience wrapper around [ContentResolver.registerContentObserver].'
-     *
-     * suspend API corresponding to [registerContentObserver] to ensure that [ContentObserver]
-     * registration happens on a worker thread. Caller may wrap the API in an async block if they
-     * wish to synchronize execution.
-     */
-    suspend fun registerContentObserver(
-        uri: Uri,
-        notifyForDescendants: Boolean,
-        settingsObserver: ContentObserver
-    ) =
-        withContext(getBackgroundDispatcher()) {
-            registerContentObserverSync(uri, notifyForDescendants, settingsObserver)
-        }
-
-    /**
-     * Convenience wrapper around [ContentResolver.registerContentObserver].'
-     *
-     * API corresponding to [registerContentObserver] for Java usage.
-     */
-    fun registerContentObserverAsync(
-        uri: Uri,
-        notifyForDescendants: Boolean,
-        settingsObserver: ContentObserver
-    ) =
-        CoroutineScope(getBackgroundDispatcher()).launch {
-            registerContentObserverSync(uri, notifyForDescendants, settingsObserver)
-        }
-
     /** See [ContentResolver.unregisterContentObserver]. */
     fun unregisterContentObserverSync(settingsObserver: ContentObserver) {
         trace({ "SP#unregisterObserver" }) {
@@ -206,27 +92,6 @@
     }
 
     /**
-     * Convenience wrapper around [ContentResolver.unregisterContentObserver].'
-     *
-     * API corresponding to [unregisterContentObserver] for Java usage to ensure that
-     * [ContentObserver] un-registration happens on a worker thread. Caller may wrap the API in an
-     * async block if they wish to synchronize execution.
-     */
-    suspend fun unregisterContentObserver(settingsObserver: ContentObserver) =
-        withContext(getBackgroundDispatcher()) { unregisterContentObserverSync(settingsObserver) }
-
-    /**
-     * Convenience wrapper around [ContentResolver.unregisterContentObserver].'
-     *
-     * API corresponding to [unregisterContentObserver] for Java usage to ensure that
-     * [ContentObserver] registration happens on a worker thread.
-     */
-    fun unregisterContentObserverAsync(settingsObserver: ContentObserver) =
-        CoroutineScope(getBackgroundDispatcher()).launch {
-            unregisterContentObserverSync(settingsObserver)
-        }
-
-    /**
      * Look up a name in the database.
      *
      * @param name to look up in the table
diff --git a/packages/SystemUI/src/com/android/systemui/util/settings/SystemSettingsImpl.java b/packages/SystemUI/src/com/android/systemui/util/settings/SystemSettingsImpl.java
index 68cc753..658b299 100644
--- a/packages/SystemUI/src/com/android/systemui/util/settings/SystemSettingsImpl.java
+++ b/packages/SystemUI/src/com/android/systemui/util/settings/SystemSettingsImpl.java
@@ -22,24 +22,18 @@
 
 import androidx.annotation.NonNull;
 
-import com.android.systemui.dagger.qualifiers.Background;
 import com.android.systemui.settings.UserTracker;
 
-import kotlinx.coroutines.CoroutineDispatcher;
-
 import javax.inject.Inject;
 
 class SystemSettingsImpl implements SystemSettings {
     private final ContentResolver mContentResolver;
     private final UserTracker mUserTracker;
-    private final CoroutineDispatcher mBgCoroutineDispatcher;
 
     @Inject
-    SystemSettingsImpl(ContentResolver contentResolver, UserTracker userTracker,
-            @Background CoroutineDispatcher bgDispatcher) {
+    SystemSettingsImpl(ContentResolver contentResolver, UserTracker userTracker) {
         mContentResolver = contentResolver;
         mUserTracker = userTracker;
-        mBgCoroutineDispatcher = bgDispatcher;
     }
 
     @Override
@@ -58,11 +52,6 @@
     }
 
     @Override
-    public CoroutineDispatcher getBackgroundDispatcher() {
-        return mBgCoroutineDispatcher;
-    }
-
-    @Override
     public String getStringForUser(String name, int userHandle) {
         return Settings.System.getStringForUser(mContentResolver, name,
                 getRealUserHandle(userHandle));
diff --git a/packages/SystemUI/src/com/android/systemui/util/settings/UserSettingsProxy.kt b/packages/SystemUI/src/com/android/systemui/util/settings/UserSettingsProxy.kt
index 9133fbb..ed65f1a 100644
--- a/packages/SystemUI/src/com/android/systemui/util/settings/UserSettingsProxy.kt
+++ b/packages/SystemUI/src/com/android/systemui/util/settings/UserSettingsProxy.kt
@@ -16,7 +16,6 @@
 package com.android.systemui.util.settings
 
 import android.annotation.UserIdInt
-import android.content.ContentResolver
 import android.database.ContentObserver
 import android.net.Uri
 import android.os.UserHandle
@@ -27,9 +26,6 @@
 import com.android.systemui.util.settings.SettingsProxy.Companion.parseFloatOrThrow
 import com.android.systemui.util.settings.SettingsProxy.Companion.parseLongOrThrow
 import com.android.systemui.util.settings.SettingsProxy.Companion.parseLongOrUseDefault
-import kotlinx.coroutines.CoroutineScope
-import kotlinx.coroutines.launch
-import kotlinx.coroutines.withContext
 
 /**
  * Used to interact with per-user Settings.Secure and Settings.System settings (but not
@@ -70,16 +66,6 @@
         registerContentObserverForUserSync(uri, settingsObserver, userId)
     }
 
-    override suspend fun registerContentObserver(uri: Uri, settingsObserver: ContentObserver) =
-        withContext(getBackgroundDispatcher()) {
-            registerContentObserverForUserSync(uri, settingsObserver, userId)
-        }
-
-    override fun registerContentObserverAsync(uri: Uri, settingsObserver: ContentObserver) =
-        CoroutineScope(getBackgroundDispatcher()).launch {
-            registerContentObserverForUserSync(uri, settingsObserver, userId)
-        }
-
     /** Convenience wrapper around [ContentResolver.registerContentObserver].' */
     override fun registerContentObserverSync(
         uri: Uri,
@@ -89,29 +75,6 @@
         registerContentObserverForUserSync(uri, notifyForDescendants, settingsObserver, userId)
     }
 
-    override suspend fun registerContentObserver(
-        uri: Uri,
-        notifyForDescendants: Boolean,
-        settingsObserver: ContentObserver
-    ) =
-        withContext(getBackgroundDispatcher()) {
-            registerContentObserverForUserSync(uri, notifyForDescendants, settingsObserver, userId)
-        }
-
-    /**
-     * Convenience wrapper around [ContentResolver.registerContentObserver].'
-     *
-     * API corresponding to [registerContentObserverForUser] for Java usage.
-     */
-    override fun registerContentObserverAsync(
-        uri: Uri,
-        notifyForDescendants: Boolean,
-        settingsObserver: ContentObserver
-    ) =
-        CoroutineScope(getBackgroundDispatcher()).launch {
-            registerContentObserverForUserSync(uri, notifyForDescendants, settingsObserver, userId)
-        }
-
     /**
      * Convenience wrapper around [ContentResolver.registerContentObserver]
      *
@@ -125,36 +88,6 @@
         registerContentObserverForUserSync(getUriFor(name), settingsObserver, userHandle)
     }
 
-    /**
-     * Convenience wrapper around [ContentResolver.registerContentObserver].'
-     *
-     * suspend API corresponding to [registerContentObserverForUser] to ensure that
-     * [ContentObserver] registration happens on a worker thread. Caller may wrap the API in an
-     * async block if they wish to synchronize execution.
-     */
-    suspend fun registerContentObserverForUser(
-        name: String,
-        settingsObserver: ContentObserver,
-        userHandle: Int
-    ) =
-        withContext(getBackgroundDispatcher()) {
-            registerContentObserverForUserSync(name, settingsObserver, userHandle)
-        }
-
-    /**
-     * Convenience wrapper around [ContentResolver.registerContentObserver].'
-     *
-     * API corresponding to [registerContentObserverForUser] for Java usage.
-     */
-    fun registerContentObserverForUserAsync(
-        name: String,
-        settingsObserver: ContentObserver,
-        userHandle: Int
-    ) =
-        CoroutineScope(getBackgroundDispatcher()).launch {
-            registerContentObserverForUserSync(getUriFor(name), settingsObserver, userHandle)
-        }
-
     /** Convenience wrapper around [ContentResolver.registerContentObserver] */
     fun registerContentObserverForUserSync(
         uri: Uri,
@@ -165,36 +98,6 @@
     }
 
     /**
-     * Convenience wrapper around [ContentResolver.registerContentObserver].'
-     *
-     * suspend API corresponding to [registerContentObserverForUser] to ensure that
-     * [ContentObserver] registration happens on a worker thread. Caller may wrap the API in an
-     * async block if they wish to synchronize execution.
-     */
-    suspend fun registerContentObserverForUser(
-        uri: Uri,
-        settingsObserver: ContentObserver,
-        userHandle: Int
-    ) =
-        withContext(getBackgroundDispatcher()) {
-            registerContentObserverForUserSync(uri, settingsObserver, userHandle)
-        }
-
-    /**
-     * Convenience wrapper around [ContentResolver.registerContentObserver].'
-     *
-     * API corresponding to [registerContentObserverForUser] for Java usage.
-     */
-    fun registerContentObserverForUserAsync(
-        uri: Uri,
-        settingsObserver: ContentObserver,
-        userHandle: Int
-    ) =
-        CoroutineScope(getBackgroundDispatcher()).launch {
-            registerContentObserverForUserSync(uri, settingsObserver, userHandle)
-        }
-
-    /**
      * Convenience wrapper around [ContentResolver.registerContentObserver]
      *
      * Implicitly calls [getUriFor] on the passed in name.
@@ -213,49 +116,6 @@
         )
     }
 
-    /**
-     * Convenience wrapper around [ContentResolver.registerContentObserver].'
-     *
-     * suspend API corresponding to [registerContentObserverForUser] to ensure that
-     * [ContentObserver] registration happens on a worker thread. Caller may wrap the API in an
-     * async block if they wish to synchronize execution.
-     */
-    suspend fun registerContentObserverForUser(
-        name: String,
-        notifyForDescendants: Boolean,
-        settingsObserver: ContentObserver,
-        userHandle: Int
-    ) =
-        withContext(getBackgroundDispatcher()) {
-            registerContentObserverForUserSync(
-                name,
-                notifyForDescendants,
-                settingsObserver,
-                userHandle
-            )
-        }
-
-    /**
-     * Convenience wrapper around [ContentResolver.registerContentObserver].'
-     *
-     * API corresponding to [registerContentObserverForUser] for Java usage.
-     */
-    fun registerContentObserverForUserAsync(
-        name: String,
-        notifyForDescendants: Boolean,
-        settingsObserver: ContentObserver,
-        userHandle: Int
-    ) {
-        CoroutineScope(getBackgroundDispatcher()).launch {
-            registerContentObserverForUserSync(
-                getUriFor(name),
-                notifyForDescendants,
-                settingsObserver,
-                userHandle
-            )
-        }
-    }
-
     /** Convenience wrapper around [ContentResolver.registerContentObserver] */
     fun registerContentObserverForUserSync(
         uri: Uri,
@@ -276,48 +136,6 @@
     }
 
     /**
-     * Convenience wrapper around [ContentResolver.registerContentObserver].'
-     *
-     * suspend API corresponding to [registerContentObserverForUser] to ensure that
-     * [ContentObserver] registration happens on a worker thread. Caller may wrap the API in an
-     * async block if they wish to synchronize execution.
-     */
-    suspend fun registerContentObserverForUser(
-        uri: Uri,
-        notifyForDescendants: Boolean,
-        settingsObserver: ContentObserver,
-        userHandle: Int
-    ) =
-        withContext(getBackgroundDispatcher()) {
-            registerContentObserverForUserSync(
-                uri,
-                notifyForDescendants,
-                settingsObserver,
-                getRealUserHandle(userHandle)
-            )
-        }
-
-    /**
-     * Convenience wrapper around [ContentResolver.registerContentObserver].'
-     *
-     * API corresponding to [registerContentObserverForUser] for Java usage.
-     */
-    fun registerContentObserverForUserAsync(
-        uri: Uri,
-        notifyForDescendants: Boolean,
-        settingsObserver: ContentObserver,
-        userHandle: Int
-    ) =
-        CoroutineScope(getBackgroundDispatcher()).launch {
-            registerContentObserverForUserSync(
-                uri,
-                notifyForDescendants,
-                settingsObserver,
-                userHandle
-            )
-        }
-
-    /**
      * Look up a name in the database.
      *
      * @param name to look up in the table
diff --git a/packages/SystemUI/tests/src/com/android/systemui/util/settings/SettingsProxyTest.kt b/packages/SystemUI/tests/src/com/android/systemui/util/settings/SettingsProxyTest.kt
index 92dd391..eb11e38 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/util/settings/SettingsProxyTest.kt
+++ b/packages/SystemUI/tests/src/com/android/systemui/util/settings/SettingsProxyTest.kt
@@ -27,12 +27,6 @@
 import androidx.test.filters.SmallTest
 import com.android.systemui.SysuiTestCase
 import com.google.common.truth.Truth.assertThat
-import kotlinx.coroutines.Dispatchers
-import kotlinx.coroutines.launch
-import kotlinx.coroutines.test.StandardTestDispatcher
-import kotlinx.coroutines.test.TestScope
-import kotlinx.coroutines.test.runTest
-import kotlinx.coroutines.test.setMain
 import org.junit.Assert.assertThrows
 import org.junit.Before
 import org.junit.Test
@@ -47,16 +41,11 @@
 @TestableLooper.RunWithLooper
 class SettingsProxyTest : SysuiTestCase() {
 
-    private val testDispatcher = StandardTestDispatcher()
-
     private lateinit var mSettings: SettingsProxy
     private lateinit var mContentObserver: ContentObserver
-    private lateinit var testScope: TestScope
 
     @Before
     fun setUp() {
-        testScope = TestScope(testDispatcher)
-        Dispatchers.setMain(testDispatcher)
         mSettings = FakeSettingsProxy()
         mContentObserver = object : ContentObserver(Handler(Looper.getMainLooper())) {}
     }
@@ -69,23 +58,6 @@
     }
 
     @Test
-    fun registerContentObserverSuspend_inputString_success() =
-        testScope.runTest {
-            mSettings.registerContentObserver(TEST_SETTING, mContentObserver)
-            verify(mSettings.getContentResolver())
-                .registerContentObserver(eq(TEST_SETTING_URI), eq(false), eq(mContentObserver))
-        }
-
-    @Test
-    fun registerContentObserverAsync_inputString_success() {
-        mSettings.registerContentObserverAsync(TEST_SETTING, mContentObserver)
-        testScope.launch {
-            verify(mSettings.getContentResolver())
-                .registerContentObserver(eq(TEST_SETTING_URI), eq(false), eq(mContentObserver))
-        }
-    }
-
-    @Test
     fun registerContentObserver_inputString_notifyForDescendants_true() {
         mSettings.registerContentObserverSync(
             TEST_SETTING,
@@ -97,31 +69,6 @@
     }
 
     @Test
-    fun registerContentObserverSuspend_inputString_notifyForDescendants_true() =
-        testScope.runTest {
-            mSettings.registerContentObserver(
-                TEST_SETTING,
-                notifyForDescendants = true,
-                mContentObserver
-            )
-            verify(mSettings.getContentResolver())
-                .registerContentObserver(eq(TEST_SETTING_URI), eq(true), eq(mContentObserver))
-        }
-
-    @Test
-    fun registerContentObserverAsync_inputString_notifyForDescendants_true() {
-        mSettings.registerContentObserverAsync(
-            TEST_SETTING,
-            notifyForDescendants = true,
-            mContentObserver
-        )
-        testScope.launch {
-            verify(mSettings.getContentResolver())
-                .registerContentObserver(eq(TEST_SETTING_URI), eq(true), eq(mContentObserver))
-        }
-    }
-
-    @Test
     fun registerContentObserver_inputUri_success() {
         mSettings.registerContentObserverSync(TEST_SETTING_URI, mContentObserver)
         verify(mSettings.getContentResolver())
@@ -129,23 +76,6 @@
     }
 
     @Test
-    fun registerContentObserverSuspend_inputUri_success() =
-        testScope.runTest {
-            mSettings.registerContentObserver(TEST_SETTING_URI, mContentObserver)
-            verify(mSettings.getContentResolver())
-                .registerContentObserver(eq(TEST_SETTING_URI), eq(false), eq(mContentObserver))
-        }
-
-    @Test
-    fun registerContentObserverAsync_inputUri_success() {
-        mSettings.registerContentObserverAsync(TEST_SETTING_URI, mContentObserver)
-        testScope.launch {
-            verify(mSettings.getContentResolver())
-                .registerContentObserver(eq(TEST_SETTING_URI), eq(false), eq(mContentObserver))
-        }
-    }
-
-    @Test
     fun registerContentObserver_inputUri_notifyForDescendants_true() {
         mSettings.registerContentObserverSync(
             TEST_SETTING_URI,
@@ -157,52 +87,12 @@
     }
 
     @Test
-    fun registerContentObserverSuspend_inputUri_notifyForDescendants_true() =
-        testScope.runTest {
-            mSettings.registerContentObserver(
-                TEST_SETTING_URI,
-                notifyForDescendants = true,
-                mContentObserver
-            )
-            verify(mSettings.getContentResolver())
-                .registerContentObserver(eq(TEST_SETTING_URI), eq(true), eq(mContentObserver))
-        }
-
-    @Test
-    fun registerContentObserverAsync_inputUri_notifyForDescendants_true() {
-        mSettings.registerContentObserverAsync(
-            TEST_SETTING_URI,
-            notifyForDescendants = true,
-            mContentObserver
-        )
-        testScope.launch {
-            verify(mSettings.getContentResolver())
-                .registerContentObserver(eq(TEST_SETTING_URI), eq(true), eq(mContentObserver))
-        }
-    }
-
-    @Test
-    fun unregisterContentObserverSync() {
+    fun unregisterContentObserver() {
         mSettings.unregisterContentObserverSync(mContentObserver)
         verify(mSettings.getContentResolver()).unregisterContentObserver(eq(mContentObserver))
     }
 
     @Test
-    fun unregisterContentObserverSuspend_inputString_success() =
-        testScope.runTest {
-            mSettings.unregisterContentObserver(mContentObserver)
-            verify(mSettings.getContentResolver()).unregisterContentObserver(eq(mContentObserver))
-        }
-
-    @Test
-    fun unregisterContentObserverAsync_inputString_success() {
-        mSettings.unregisterContentObserverAsync(mContentObserver)
-        testScope.launch {
-            verify(mSettings.getContentResolver()).unregisterContentObserver(eq(mContentObserver))
-        }
-    }
-
-    @Test
     fun getString_keyPresent_returnValidValue() {
         mSettings.putString(TEST_SETTING, "test")
         assertThat(mSettings.getString(TEST_SETTING)).isEqualTo("test")
@@ -313,15 +203,12 @@
 
         private val mContentResolver = mock(ContentResolver::class.java)
         private val settingToValueMap: MutableMap<String, String> = mutableMapOf()
-        private val testDispatcher = StandardTestDispatcher()
 
         override fun getContentResolver() = mContentResolver
 
         override fun getUriFor(name: String) =
             Uri.parse(StringBuilder().append("content://settings/").append(name).toString())
 
-        override fun getBackgroundDispatcher() = testDispatcher
-
         override fun getString(name: String): String {
             return settingToValueMap[name] ?: ""
         }
diff --git a/packages/SystemUI/tests/src/com/android/systemui/util/settings/UserSettingsProxyTest.kt b/packages/SystemUI/tests/src/com/android/systemui/util/settings/UserSettingsProxyTest.kt
index 4cb5fa9..38469ee 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/util/settings/UserSettingsProxyTest.kt
+++ b/packages/SystemUI/tests/src/com/android/systemui/util/settings/UserSettingsProxyTest.kt
@@ -30,12 +30,6 @@
 import com.android.systemui.settings.FakeUserTracker
 import com.android.systemui.settings.UserTracker
 import com.google.common.truth.Truth.assertThat
-import kotlinx.coroutines.Dispatchers
-import kotlinx.coroutines.launch
-import kotlinx.coroutines.test.StandardTestDispatcher
-import kotlinx.coroutines.test.TestScope
-import kotlinx.coroutines.test.runTest
-import kotlinx.coroutines.test.setMain
 import org.junit.Assert.assertThrows
 import org.junit.Before
 import org.junit.Test
@@ -53,7 +47,6 @@
     private var mUserTracker = FakeUserTracker()
     private var mSettings: UserSettingsProxy = FakeUserSettingsProxy(mUserTracker)
     private var mContentObserver = object : ContentObserver(Handler(Looper.getMainLooper())) {}
-    private lateinit var testScope: TestScope
 
     @Before
     fun setUp() {
@@ -61,9 +54,6 @@
             listOf(UserInfo(MAIN_USER_ID, "main", UserInfo.FLAG_MAIN)),
             selectedUserIndex = 0
         )
-        val testDispatcher = StandardTestDispatcher()
-        testScope = TestScope(testDispatcher)
-        Dispatchers.setMain(testDispatcher)
     }
 
     @Test
@@ -83,41 +73,6 @@
     }
 
     @Test
-    fun registerContentObserverForUserSuspend_inputString_success() =
-        testScope.runTest {
-            mSettings.registerContentObserverForUser(
-                TEST_SETTING,
-                mContentObserver,
-                mUserTracker.userId
-            )
-            verify(mSettings.getContentResolver())
-                .registerContentObserver(
-                    eq(TEST_SETTING_URI),
-                    eq(false),
-                    eq(mContentObserver),
-                    eq(MAIN_USER_ID)
-                )
-        }
-
-    @Test
-    fun registerContentObserverForUserAsync_inputString_success() {
-        mSettings.registerContentObserverForUserAsync(
-            TEST_SETTING,
-            mContentObserver,
-            mUserTracker.userId
-        )
-        testScope.launch {
-            verify(mSettings.getContentResolver())
-                .registerContentObserver(
-                    eq(TEST_SETTING_URI),
-                    eq(false),
-                    eq(mContentObserver),
-                    eq(MAIN_USER_ID)
-                )
-        }
-    }
-
-    @Test
     fun registerContentObserverForUser_inputString_notifyForDescendants_true() {
         mSettings.registerContentObserverForUserSync(
             TEST_SETTING,
@@ -135,45 +90,6 @@
     }
 
     @Test
-    fun registerContentObserverForUserSuspend_inputString_notifyForDescendants_true() =
-        testScope.runTest {
-            mSettings.registerContentObserverForUser(
-                TEST_SETTING,
-                notifyForDescendants = true,
-                mContentObserver,
-                mUserTracker.userId
-            )
-            verify(mSettings.getContentResolver())
-                .registerContentObserver(
-                    eq(TEST_SETTING_URI),
-                    eq(
-                        true,
-                    ),
-                    eq(mContentObserver),
-                    eq(MAIN_USER_ID)
-                )
-        }
-
-    @Test
-    fun registerContentObserverForUserAsync_inputString_notifyForDescendants_true() {
-        mSettings.registerContentObserverForUserAsync(
-            TEST_SETTING,
-            notifyForDescendants = true,
-            mContentObserver,
-            mUserTracker.userId
-        )
-        testScope.launch {
-            verify(mSettings.getContentResolver())
-                .registerContentObserver(
-                    eq(TEST_SETTING_URI),
-                    eq(true),
-                    eq(mContentObserver),
-                    eq(MAIN_USER_ID)
-                )
-        }
-    }
-
-    @Test
     fun registerContentObserverForUser_inputUri_success() {
         mSettings.registerContentObserverForUserSync(
             TEST_SETTING_URI,
@@ -190,41 +106,6 @@
     }
 
     @Test
-    fun registerContentObserverForUserSuspend_inputUri_success() =
-        testScope.runTest {
-            mSettings.registerContentObserverForUser(
-                TEST_SETTING_URI,
-                mContentObserver,
-                mUserTracker.userId
-            )
-            verify(mSettings.getContentResolver())
-                .registerContentObserver(
-                    eq(TEST_SETTING_URI),
-                    eq(false),
-                    eq(mContentObserver),
-                    eq(MAIN_USER_ID)
-                )
-        }
-
-    @Test
-    fun registerContentObserverForUserAsync_inputUri_success() {
-        mSettings.registerContentObserverForUserAsync(
-            TEST_SETTING_URI,
-            mContentObserver,
-            mUserTracker.userId
-        )
-        testScope.launch {
-            verify(mSettings.getContentResolver())
-                .registerContentObserver(
-                    eq(TEST_SETTING_URI),
-                    eq(false),
-                    eq(mContentObserver),
-                    eq(MAIN_USER_ID)
-                )
-        }
-    }
-
-    @Test
     fun registerContentObserverForUser_inputUri_notifyForDescendants_true() {
         mSettings.registerContentObserverForUserSync(
             TEST_SETTING_URI,
@@ -242,45 +123,6 @@
     }
 
     @Test
-    fun registerContentObserverForUserSuspend_inputUri_notifyForDescendants_true() =
-        testScope.runTest {
-            mSettings.registerContentObserverForUser(
-                TEST_SETTING_URI,
-                notifyForDescendants = true,
-                mContentObserver,
-                mUserTracker.userId
-            )
-            verify(mSettings.getContentResolver())
-                .registerContentObserver(
-                    eq(TEST_SETTING_URI),
-                    eq(
-                        true,
-                    ),
-                    eq(mContentObserver),
-                    eq(MAIN_USER_ID)
-                )
-        }
-
-    @Test
-    fun registerContentObserverForUserAsync_inputUri_notifyForDescendants_true() {
-        mSettings.registerContentObserverForUserAsync(
-            TEST_SETTING_URI,
-            notifyForDescendants = true,
-            mContentObserver,
-            mUserTracker.userId
-        )
-        testScope.launch {
-            verify(mSettings.getContentResolver())
-                .registerContentObserver(
-                    eq(TEST_SETTING_URI),
-                    eq(true),
-                    eq(mContentObserver),
-                    eq(MAIN_USER_ID)
-                )
-        }
-    }
-
-    @Test
     fun registerContentObserver_inputUri_success() {
         mSettings.registerContentObserverSync(TEST_SETTING_URI, mContentObserver)
         verify(mSettings.getContentResolver())
@@ -288,33 +130,6 @@
     }
 
     @Test
-    fun registerContentObserverSuspend_inputUri_success() =
-        testScope.runTest {
-            mSettings.registerContentObserver(TEST_SETTING_URI, mContentObserver)
-            verify(mSettings.getContentResolver())
-                .registerContentObserver(
-                    eq(TEST_SETTING_URI),
-                    eq(false),
-                    eq(mContentObserver),
-                    eq(0)
-                )
-        }
-
-    @Test
-    fun registerContentObserverAsync_inputUri_success() {
-        mSettings.registerContentObserverAsync(TEST_SETTING_URI, mContentObserver)
-        testScope.launch {
-            verify(mSettings.getContentResolver())
-                .registerContentObserver(
-                    eq(TEST_SETTING_URI),
-                    eq(false),
-                    eq(mContentObserver),
-                    eq(0)
-                )
-        }
-    }
-
-    @Test
     fun registerContentObserver_inputUri_notifyForDescendants_true() {
         mSettings.registerContentObserverSync(
             TEST_SETTING_URI,
@@ -326,33 +141,6 @@
     }
 
     @Test
-    fun registerContentObserverSuspend_inputUri_notifyForDescendants_true() =
-        testScope.runTest {
-            mSettings.registerContentObserver(TEST_SETTING_URI, mContentObserver)
-            verify(mSettings.getContentResolver())
-                .registerContentObserver(
-                    eq(TEST_SETTING_URI),
-                    eq(false),
-                    eq(mContentObserver),
-                    eq(0)
-                )
-        }
-
-    @Test
-    fun registerContentObserverAsync_inputUri_notifyForDescendants_true() {
-        mSettings.registerContentObserverAsync(TEST_SETTING_URI, mContentObserver)
-        testScope.launch {
-            verify(mSettings.getContentResolver())
-                .registerContentObserver(
-                    eq(TEST_SETTING_URI),
-                    eq(false),
-                    eq(mContentObserver),
-                    eq(0)
-                )
-        }
-    }
-
-    @Test
     fun getString_keyPresent_returnValidValue() {
         mSettings.putString(TEST_SETTING, "test")
         assertThat(mSettings.getString(TEST_SETTING)).isEqualTo("test")
@@ -517,15 +305,12 @@
         private val mContentResolver = mock(ContentResolver::class.java)
         private val userIdToSettingsValueMap: MutableMap<Int, MutableMap<String, String>> =
             mutableMapOf()
-        private val testDispatcher = StandardTestDispatcher()
 
         override fun getContentResolver() = mContentResolver
 
         override fun getUriFor(name: String) =
             Uri.parse(StringBuilder().append(URI_PREFIX).append(name).toString())
 
-        override fun getBackgroundDispatcher() = testDispatcher
-
         override fun getStringForUser(name: String, userHandle: Int) =
             userIdToSettingsValueMap[userHandle]?.get(name) ?: ""
 
diff --git a/packages/SystemUI/tests/utils/src/com/android/systemui/util/settings/FakeGlobalSettings.java b/packages/SystemUI/tests/utils/src/com/android/systemui/util/settings/FakeGlobalSettings.java
index 136b129..3a70cdf 100644
--- a/packages/SystemUI/tests/utils/src/com/android/systemui/util/settings/FakeGlobalSettings.java
+++ b/packages/SystemUI/tests/utils/src/com/android/systemui/util/settings/FakeGlobalSettings.java
@@ -22,8 +22,6 @@
 import android.database.ContentObserver;
 import android.net.Uri;
 
-import kotlinx.coroutines.CoroutineDispatcher;
-
 import java.util.ArrayList;
 import java.util.HashMap;
 import java.util.List;
@@ -46,13 +44,6 @@
     }
 
     @Override
-    public CoroutineDispatcher getBackgroundDispatcher() {
-        throw new UnsupportedOperationException(
-                "GlobalSettings.getBackgroundDispatcher is not implemented, but you may find "
-                        + "GlobalSettings.getBackgroundDispatcher helpful instead.");
-    }
-
-    @Override
     public void registerContentObserverSync(Uri uri, boolean notifyDescendants,
             ContentObserver settingsObserver) {
         List<ContentObserver> observers;
diff --git a/packages/SystemUI/tests/utils/src/com/android/systemui/util/settings/FakeSettings.java b/packages/SystemUI/tests/utils/src/com/android/systemui/util/settings/FakeSettings.java
index 6cefa34..cd219ec 100644
--- a/packages/SystemUI/tests/utils/src/com/android/systemui/util/settings/FakeSettings.java
+++ b/packages/SystemUI/tests/utils/src/com/android/systemui/util/settings/FakeSettings.java
@@ -27,8 +27,6 @@
 
 import com.android.systemui.settings.UserTracker;
 
-import kotlinx.coroutines.CoroutineDispatcher;
-
 import java.util.ArrayList;
 import java.util.HashMap;
 import java.util.List;
@@ -68,11 +66,6 @@
     }
 
     @Override
-    public CoroutineDispatcher getBackgroundDispatcher() {
-        return null;
-    }
-
-    @Override
     public void registerContentObserverForUserSync(Uri uri, boolean notifyDescendants,
             ContentObserver settingsObserver, int userHandle) {
         List<ContentObserver> observers;
