Loading packages/SystemUI/aconfig/systemui.aconfig +9 −0 Original line number Diff line number Diff line Loading @@ -1171,3 +1171,12 @@ flag { bug: "345227709" } flag { namespace: "systemui" name: "register_content_observers_async" description: "Use new Async API to register content observers" bug: "316922634" metadata { purpose: PURPOSE_BUGFIX } } packages/SystemUI/src/com/android/systemui/statusbar/phone/DozeParameters.java +33 −9 Original line number Diff line number Diff line Loading @@ -37,6 +37,7 @@ import androidx.annotation.VisibleForTesting; import com.android.keyguard.KeyguardUpdateMonitor; import com.android.keyguard.KeyguardUpdateMonitorCallback; import com.android.systemui.Dumpable; import com.android.systemui.Flags; import com.android.systemui.dagger.SysUISingleton; import com.android.systemui.dagger.qualifiers.Background; import com.android.systemui.dagger.qualifiers.Main; Loading @@ -54,6 +55,7 @@ import com.android.systemui.statusbar.policy.DevicePostureController; import com.android.systemui.tuner.TunerService; import com.android.systemui.unfold.FoldAodAnimationController; import com.android.systemui.unfold.SysUIUnfoldComponent; import com.android.systemui.util.settings.SecureSettings; import java.io.PrintWriter; import java.util.Optional; Loading Loading @@ -86,6 +88,7 @@ public class DozeParameters implements private final FoldAodAnimationController mFoldAodAnimationController; private final UnlockedScreenOffAnimationController mUnlockedScreenOffAnimationController; private final UserTracker mUserTracker; private final SecureSettings mSecureSettings; private boolean mDozeAlwaysOn; private boolean mControlScreenOffAnimation; Loading Loading @@ -130,7 +133,8 @@ public class DozeParameters implements ConfigurationController configurationController, StatusBarStateController statusBarStateController, UserTracker userTracker, DozeInteractor dozeInteractor) { DozeInteractor dozeInteractor, SecureSettings secureSettings) { mResources = resources; mAmbientDisplayConfiguration = ambientDisplayConfiguration; mAlwaysOnPolicy = alwaysOnDisplayPolicy; Loading @@ -144,6 +148,7 @@ public class DozeParameters implements mUnlockedScreenOffAnimationController = unlockedScreenOffAnimationController; mUserTracker = userTracker; mDozeInteractor = dozeInteractor; mSecureSettings = secureSettings; keyguardUpdateMonitor.registerCallback(mKeyguardVisibilityCallback); tunerService.addTunable( Loading @@ -160,7 +165,8 @@ public class DozeParameters implements mFoldAodAnimationController.addCallback(this); } SettingsObserver quickPickupSettingsObserver = new SettingsObserver(context, handler); SettingsObserver quickPickupSettingsObserver = new SettingsObserver(context, handler, mSecureSettings); quickPickupSettingsObserver.observe(); batteryController.addCallback(new BatteryStateChangeCallback() { Loading Loading @@ -479,19 +485,37 @@ public class DozeParameters implements Settings.Secure.getUriFor(Settings.Secure.DOZE_ALWAYS_ON); private final Context mContext; SettingsObserver(Context context, Handler handler) { private final Handler mHandler; private final SecureSettings mSecureSettings; SettingsObserver(Context context, Handler handler, SecureSettings secureSettings) { super(handler); mContext = context; mHandler = handler; mSecureSettings = secureSettings; } void observe() { if (Flags.registerContentObserversAsync()) { mSecureSettings.registerContentObserverForUserAsync(mQuickPickupGesture, this, UserHandle.USER_ALL); mSecureSettings.registerContentObserverForUserAsync(mPickupGesture, this, UserHandle.USER_ALL); mSecureSettings.registerContentObserverForUserAsync(mAlwaysOnEnabled, this, UserHandle.USER_ALL, // The register calls are called in order, so this ensures that update() // is called after them all and value retrieval isn't racy. () -> mHandler.post(() -> update(null))); } else { ContentResolver resolver = mContext.getContentResolver(); resolver.registerContentObserver(mQuickPickupGesture, false, this, UserHandle.USER_ALL); resolver.registerContentObserver(mPickupGesture, false, this, UserHandle.USER_ALL); resolver.registerContentObserver(mAlwaysOnEnabled, false, this, UserHandle.USER_ALL); resolver.registerContentObserver(mAlwaysOnEnabled, false, this, UserHandle.USER_ALL); update(null); } } @Override public void onChange(boolean selfChange, Uri uri) { Loading packages/SystemUI/src/com/android/systemui/util/settings/UserSettingsProxy.kt +19 −0 Original line number Diff line number Diff line Loading @@ -21,6 +21,7 @@ import android.database.ContentObserver import android.net.Uri import android.os.UserHandle import android.provider.Settings.SettingNotFoundException import androidx.annotation.WorkerThread import com.android.app.tracing.TraceUtils.trace import com.android.systemui.settings.UserTracker import com.android.systemui.util.settings.SettingsProxy.Companion.parseFloat Loading Loading @@ -198,6 +199,24 @@ interface UserSettingsProxy : SettingsProxy { registerContentObserverForUserSync(uri, settingsObserver, userHandle) } /** * Convenience wrapper around [ContentResolver.registerContentObserver].' * * API corresponding to [registerContentObserverForUser] for Java usage. After registration is * complete, the callback block is called on the <b>background thread</b> to allow for update of * value. */ fun registerContentObserverForUserAsync( uri: Uri, settingsObserver: ContentObserver, userHandle: Int, @WorkerThread registered: Runnable ) = CoroutineScope(backgroundDispatcher).launch { registerContentObserverForUserSync(uri, settingsObserver, userHandle) registered.run() } /** * Convenience wrapper around [ContentResolver.registerContentObserver] * Loading packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/DozeParametersTest.java +4 −2 Original line number Diff line number Diff line Loading @@ -35,8 +35,8 @@ import android.os.Handler; import android.os.PowerManager; import android.provider.Settings; import androidx.test.ext.junit.runners.AndroidJUnit4; import androidx.test.filters.SmallTest; import androidx.test.runner.AndroidJUnit4; import com.android.keyguard.KeyguardUpdateMonitor; import com.android.systemui.SysuiTestCase; Loading @@ -52,6 +52,7 @@ import com.android.systemui.statusbar.policy.ConfigurationController; import com.android.systemui.tuner.TunerService; import com.android.systemui.unfold.FoldAodAnimationController; import com.android.systemui.unfold.SysUIUnfoldComponent; import com.android.systemui.util.settings.FakeSettings; import org.junit.Assert; import org.junit.Before; Loading Loading @@ -130,7 +131,8 @@ public class DozeParametersTest extends SysuiTestCase { mConfigurationController, mStatusBarStateController, mUserTracker, mDozeInteractor mDozeInteractor, new FakeSettings() ); verify(mBatteryController).addCallback(mBatteryStateChangeCallback.capture()); Loading packages/SystemUI/tests/src/com/android/systemui/util/settings/UserSettingsProxyTest.kt +148 −111 Original line number Diff line number Diff line Loading @@ -31,9 +31,11 @@ import com.android.systemui.settings.FakeUserTracker import com.android.systemui.settings.UserTracker import com.google.common.truth.Truth.assertThat import kotlinx.coroutines.CoroutineDispatcher import kotlinx.coroutines.ExperimentalCoroutinesApi import kotlinx.coroutines.launch import kotlinx.coroutines.test.StandardTestDispatcher import kotlinx.coroutines.test.TestScope import kotlinx.coroutines.test.advanceUntilIdle import kotlinx.coroutines.test.runTest import org.junit.Assert.assertThrows import org.junit.Before Loading Loading @@ -65,7 +67,8 @@ class UserSettingsProxyTest : SysuiTestCase() { } @Test fun registerContentObserverForUser_inputString_success() { fun registerContentObserverForUser_inputString_success() = testScope.runTest { mSettings.registerContentObserverForUserSync( TEST_SETTING, mContentObserver, Loading Loading @@ -98,13 +101,14 @@ class UserSettingsProxyTest : SysuiTestCase() { } @Test fun registerContentObserverForUserAsync_inputString_success() { fun registerContentObserverForUserAsync_inputString_success() = testScope.runTest { mSettings.registerContentObserverForUserAsync( TEST_SETTING, mContentObserver, mUserTracker.userId ) testScope.launch { testScope.advanceUntilIdle() verify(mSettings.getContentResolver()) .registerContentObserver( eq(TEST_SETTING_URI), Loading @@ -113,10 +117,10 @@ class UserSettingsProxyTest : SysuiTestCase() { eq(MAIN_USER_ID) ) } } @Test fun registerContentObserverForUser_inputString_notifyForDescendants_true() { fun registerContentObserverForUser_inputString_notifyForDescendants_true() = testScope.runTest { mSettings.registerContentObserverForUserSync( TEST_SETTING, notifyForDescendants = true, Loading Loading @@ -153,14 +157,15 @@ class UserSettingsProxyTest : SysuiTestCase() { } @Test fun registerContentObserverForUserAsync_inputString_notifyForDescendants_true() { fun registerContentObserverForUserAsync_inputString_notifyForDescendants_true() = testScope.runTest { mSettings.registerContentObserverForUserAsync( TEST_SETTING, notifyForDescendants = true, mContentObserver, mUserTracker.userId ) testScope.launch { testScope.advanceUntilIdle() verify(mSettings.getContentResolver()) .registerContentObserver( eq(TEST_SETTING_URI), Loading @@ -169,10 +174,10 @@ class UserSettingsProxyTest : SysuiTestCase() { eq(MAIN_USER_ID) ) } } @Test fun registerContentObserverForUser_inputUri_success() { fun registerContentObserverForUser_inputUri_success() = testScope.runTest { mSettings.registerContentObserverForUserSync( TEST_SETTING_URI, mContentObserver, Loading Loading @@ -205,13 +210,15 @@ class UserSettingsProxyTest : SysuiTestCase() { } @Test fun registerContentObserverForUserAsync_inputUri_success() { fun registerContentObserverForUserAsync_inputUri_success() = testScope.runTest { mSettings.registerContentObserverForUserAsync( TEST_SETTING_URI, mContentObserver, mUserTracker.userId ) testScope.launch { testScope.advanceUntilIdle() verify(mSettings.getContentResolver()) .registerContentObserver( eq(TEST_SETTING_URI), Loading @@ -220,10 +227,27 @@ class UserSettingsProxyTest : SysuiTestCase() { eq(MAIN_USER_ID) ) } @OptIn(ExperimentalCoroutinesApi::class) @Test fun registerContentObserverForUserAsync_callbackAfterRegister() = testScope.runTest { var callbackCalled = false val runnable = { callbackCalled = true } mSettings.registerContentObserverForUserAsync( TEST_SETTING_URI, mContentObserver, mUserTracker.userId, runnable ) testScope.advanceUntilIdle() assertThat(callbackCalled).isTrue() } @Test fun registerContentObserverForUser_inputUri_notifyForDescendants_true() { fun registerContentObserverForUser_inputUri_notifyForDescendants_true() = testScope.runTest { mSettings.registerContentObserverForUserSync( TEST_SETTING_URI, notifyForDescendants = true, Loading Loading @@ -260,14 +284,15 @@ class UserSettingsProxyTest : SysuiTestCase() { } @Test fun registerContentObserverForUserAsync_inputUri_notifyForDescendants_true() { fun registerContentObserverForUserAsync_inputUri_notifyForDescendants_true() = testScope.runTest { mSettings.registerContentObserverForUserAsync( TEST_SETTING_URI, notifyForDescendants = true, mContentObserver, mUserTracker.userId ) testScope.launch { testScope.advanceUntilIdle() verify(mSettings.getContentResolver()) .registerContentObserver( eq(TEST_SETTING_URI), Loading @@ -276,13 +301,18 @@ class UserSettingsProxyTest : SysuiTestCase() { eq(MAIN_USER_ID) ) } } @Test fun registerContentObserver_inputUri_success() { fun registerContentObserver_inputUri_success() = testScope.runTest { mSettings.registerContentObserverSync(TEST_SETTING_URI, mContentObserver) verify(mSettings.getContentResolver()) .registerContentObserver(eq(TEST_SETTING_URI), eq(false), eq(mContentObserver), eq(0)) .registerContentObserver( eq(TEST_SETTING_URI), eq(false), eq(mContentObserver), eq(0) ) } @Test Loading Loading @@ -313,14 +343,20 @@ class UserSettingsProxyTest : SysuiTestCase() { } @Test fun registerContentObserver_inputUri_notifyForDescendants_true() { fun registerContentObserver_inputUri_notifyForDescendants_true() = testScope.runTest { mSettings.registerContentObserverSync( TEST_SETTING_URI, notifyForDescendants = true, mContentObserver ) verify(mSettings.getContentResolver()) .registerContentObserver(eq(TEST_SETTING_URI), eq(true), eq(mContentObserver), eq(0)) .registerContentObserver( eq(TEST_SETTING_URI), eq(true), eq(mContentObserver), eq(0) ) } @Test Loading @@ -337,7 +373,8 @@ class UserSettingsProxyTest : SysuiTestCase() { } @Test fun registerContentObserverAsync_inputUri_notifyForDescendants_true() { fun registerContentObserverAsync_inputUri_notifyForDescendants_true() = testScope.runTest { mSettings.registerContentObserverAsync(TEST_SETTING_URI, mContentObserver) testScope.launch { verify(mSettings.getContentResolver()) Loading Loading
packages/SystemUI/aconfig/systemui.aconfig +9 −0 Original line number Diff line number Diff line Loading @@ -1171,3 +1171,12 @@ flag { bug: "345227709" } flag { namespace: "systemui" name: "register_content_observers_async" description: "Use new Async API to register content observers" bug: "316922634" metadata { purpose: PURPOSE_BUGFIX } }
packages/SystemUI/src/com/android/systemui/statusbar/phone/DozeParameters.java +33 −9 Original line number Diff line number Diff line Loading @@ -37,6 +37,7 @@ import androidx.annotation.VisibleForTesting; import com.android.keyguard.KeyguardUpdateMonitor; import com.android.keyguard.KeyguardUpdateMonitorCallback; import com.android.systemui.Dumpable; import com.android.systemui.Flags; import com.android.systemui.dagger.SysUISingleton; import com.android.systemui.dagger.qualifiers.Background; import com.android.systemui.dagger.qualifiers.Main; Loading @@ -54,6 +55,7 @@ import com.android.systemui.statusbar.policy.DevicePostureController; import com.android.systemui.tuner.TunerService; import com.android.systemui.unfold.FoldAodAnimationController; import com.android.systemui.unfold.SysUIUnfoldComponent; import com.android.systemui.util.settings.SecureSettings; import java.io.PrintWriter; import java.util.Optional; Loading Loading @@ -86,6 +88,7 @@ public class DozeParameters implements private final FoldAodAnimationController mFoldAodAnimationController; private final UnlockedScreenOffAnimationController mUnlockedScreenOffAnimationController; private final UserTracker mUserTracker; private final SecureSettings mSecureSettings; private boolean mDozeAlwaysOn; private boolean mControlScreenOffAnimation; Loading Loading @@ -130,7 +133,8 @@ public class DozeParameters implements ConfigurationController configurationController, StatusBarStateController statusBarStateController, UserTracker userTracker, DozeInteractor dozeInteractor) { DozeInteractor dozeInteractor, SecureSettings secureSettings) { mResources = resources; mAmbientDisplayConfiguration = ambientDisplayConfiguration; mAlwaysOnPolicy = alwaysOnDisplayPolicy; Loading @@ -144,6 +148,7 @@ public class DozeParameters implements mUnlockedScreenOffAnimationController = unlockedScreenOffAnimationController; mUserTracker = userTracker; mDozeInteractor = dozeInteractor; mSecureSettings = secureSettings; keyguardUpdateMonitor.registerCallback(mKeyguardVisibilityCallback); tunerService.addTunable( Loading @@ -160,7 +165,8 @@ public class DozeParameters implements mFoldAodAnimationController.addCallback(this); } SettingsObserver quickPickupSettingsObserver = new SettingsObserver(context, handler); SettingsObserver quickPickupSettingsObserver = new SettingsObserver(context, handler, mSecureSettings); quickPickupSettingsObserver.observe(); batteryController.addCallback(new BatteryStateChangeCallback() { Loading Loading @@ -479,19 +485,37 @@ public class DozeParameters implements Settings.Secure.getUriFor(Settings.Secure.DOZE_ALWAYS_ON); private final Context mContext; SettingsObserver(Context context, Handler handler) { private final Handler mHandler; private final SecureSettings mSecureSettings; SettingsObserver(Context context, Handler handler, SecureSettings secureSettings) { super(handler); mContext = context; mHandler = handler; mSecureSettings = secureSettings; } void observe() { if (Flags.registerContentObserversAsync()) { mSecureSettings.registerContentObserverForUserAsync(mQuickPickupGesture, this, UserHandle.USER_ALL); mSecureSettings.registerContentObserverForUserAsync(mPickupGesture, this, UserHandle.USER_ALL); mSecureSettings.registerContentObserverForUserAsync(mAlwaysOnEnabled, this, UserHandle.USER_ALL, // The register calls are called in order, so this ensures that update() // is called after them all and value retrieval isn't racy. () -> mHandler.post(() -> update(null))); } else { ContentResolver resolver = mContext.getContentResolver(); resolver.registerContentObserver(mQuickPickupGesture, false, this, UserHandle.USER_ALL); resolver.registerContentObserver(mPickupGesture, false, this, UserHandle.USER_ALL); resolver.registerContentObserver(mAlwaysOnEnabled, false, this, UserHandle.USER_ALL); resolver.registerContentObserver(mAlwaysOnEnabled, false, this, UserHandle.USER_ALL); update(null); } } @Override public void onChange(boolean selfChange, Uri uri) { Loading
packages/SystemUI/src/com/android/systemui/util/settings/UserSettingsProxy.kt +19 −0 Original line number Diff line number Diff line Loading @@ -21,6 +21,7 @@ import android.database.ContentObserver import android.net.Uri import android.os.UserHandle import android.provider.Settings.SettingNotFoundException import androidx.annotation.WorkerThread import com.android.app.tracing.TraceUtils.trace import com.android.systemui.settings.UserTracker import com.android.systemui.util.settings.SettingsProxy.Companion.parseFloat Loading Loading @@ -198,6 +199,24 @@ interface UserSettingsProxy : SettingsProxy { registerContentObserverForUserSync(uri, settingsObserver, userHandle) } /** * Convenience wrapper around [ContentResolver.registerContentObserver].' * * API corresponding to [registerContentObserverForUser] for Java usage. After registration is * complete, the callback block is called on the <b>background thread</b> to allow for update of * value. */ fun registerContentObserverForUserAsync( uri: Uri, settingsObserver: ContentObserver, userHandle: Int, @WorkerThread registered: Runnable ) = CoroutineScope(backgroundDispatcher).launch { registerContentObserverForUserSync(uri, settingsObserver, userHandle) registered.run() } /** * Convenience wrapper around [ContentResolver.registerContentObserver] * Loading
packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/DozeParametersTest.java +4 −2 Original line number Diff line number Diff line Loading @@ -35,8 +35,8 @@ import android.os.Handler; import android.os.PowerManager; import android.provider.Settings; import androidx.test.ext.junit.runners.AndroidJUnit4; import androidx.test.filters.SmallTest; import androidx.test.runner.AndroidJUnit4; import com.android.keyguard.KeyguardUpdateMonitor; import com.android.systemui.SysuiTestCase; Loading @@ -52,6 +52,7 @@ import com.android.systemui.statusbar.policy.ConfigurationController; import com.android.systemui.tuner.TunerService; import com.android.systemui.unfold.FoldAodAnimationController; import com.android.systemui.unfold.SysUIUnfoldComponent; import com.android.systemui.util.settings.FakeSettings; import org.junit.Assert; import org.junit.Before; Loading Loading @@ -130,7 +131,8 @@ public class DozeParametersTest extends SysuiTestCase { mConfigurationController, mStatusBarStateController, mUserTracker, mDozeInteractor mDozeInteractor, new FakeSettings() ); verify(mBatteryController).addCallback(mBatteryStateChangeCallback.capture()); Loading
packages/SystemUI/tests/src/com/android/systemui/util/settings/UserSettingsProxyTest.kt +148 −111 Original line number Diff line number Diff line Loading @@ -31,9 +31,11 @@ import com.android.systemui.settings.FakeUserTracker import com.android.systemui.settings.UserTracker import com.google.common.truth.Truth.assertThat import kotlinx.coroutines.CoroutineDispatcher import kotlinx.coroutines.ExperimentalCoroutinesApi import kotlinx.coroutines.launch import kotlinx.coroutines.test.StandardTestDispatcher import kotlinx.coroutines.test.TestScope import kotlinx.coroutines.test.advanceUntilIdle import kotlinx.coroutines.test.runTest import org.junit.Assert.assertThrows import org.junit.Before Loading Loading @@ -65,7 +67,8 @@ class UserSettingsProxyTest : SysuiTestCase() { } @Test fun registerContentObserverForUser_inputString_success() { fun registerContentObserverForUser_inputString_success() = testScope.runTest { mSettings.registerContentObserverForUserSync( TEST_SETTING, mContentObserver, Loading Loading @@ -98,13 +101,14 @@ class UserSettingsProxyTest : SysuiTestCase() { } @Test fun registerContentObserverForUserAsync_inputString_success() { fun registerContentObserverForUserAsync_inputString_success() = testScope.runTest { mSettings.registerContentObserverForUserAsync( TEST_SETTING, mContentObserver, mUserTracker.userId ) testScope.launch { testScope.advanceUntilIdle() verify(mSettings.getContentResolver()) .registerContentObserver( eq(TEST_SETTING_URI), Loading @@ -113,10 +117,10 @@ class UserSettingsProxyTest : SysuiTestCase() { eq(MAIN_USER_ID) ) } } @Test fun registerContentObserverForUser_inputString_notifyForDescendants_true() { fun registerContentObserverForUser_inputString_notifyForDescendants_true() = testScope.runTest { mSettings.registerContentObserverForUserSync( TEST_SETTING, notifyForDescendants = true, Loading Loading @@ -153,14 +157,15 @@ class UserSettingsProxyTest : SysuiTestCase() { } @Test fun registerContentObserverForUserAsync_inputString_notifyForDescendants_true() { fun registerContentObserverForUserAsync_inputString_notifyForDescendants_true() = testScope.runTest { mSettings.registerContentObserverForUserAsync( TEST_SETTING, notifyForDescendants = true, mContentObserver, mUserTracker.userId ) testScope.launch { testScope.advanceUntilIdle() verify(mSettings.getContentResolver()) .registerContentObserver( eq(TEST_SETTING_URI), Loading @@ -169,10 +174,10 @@ class UserSettingsProxyTest : SysuiTestCase() { eq(MAIN_USER_ID) ) } } @Test fun registerContentObserverForUser_inputUri_success() { fun registerContentObserverForUser_inputUri_success() = testScope.runTest { mSettings.registerContentObserverForUserSync( TEST_SETTING_URI, mContentObserver, Loading Loading @@ -205,13 +210,15 @@ class UserSettingsProxyTest : SysuiTestCase() { } @Test fun registerContentObserverForUserAsync_inputUri_success() { fun registerContentObserverForUserAsync_inputUri_success() = testScope.runTest { mSettings.registerContentObserverForUserAsync( TEST_SETTING_URI, mContentObserver, mUserTracker.userId ) testScope.launch { testScope.advanceUntilIdle() verify(mSettings.getContentResolver()) .registerContentObserver( eq(TEST_SETTING_URI), Loading @@ -220,10 +227,27 @@ class UserSettingsProxyTest : SysuiTestCase() { eq(MAIN_USER_ID) ) } @OptIn(ExperimentalCoroutinesApi::class) @Test fun registerContentObserverForUserAsync_callbackAfterRegister() = testScope.runTest { var callbackCalled = false val runnable = { callbackCalled = true } mSettings.registerContentObserverForUserAsync( TEST_SETTING_URI, mContentObserver, mUserTracker.userId, runnable ) testScope.advanceUntilIdle() assertThat(callbackCalled).isTrue() } @Test fun registerContentObserverForUser_inputUri_notifyForDescendants_true() { fun registerContentObserverForUser_inputUri_notifyForDescendants_true() = testScope.runTest { mSettings.registerContentObserverForUserSync( TEST_SETTING_URI, notifyForDescendants = true, Loading Loading @@ -260,14 +284,15 @@ class UserSettingsProxyTest : SysuiTestCase() { } @Test fun registerContentObserverForUserAsync_inputUri_notifyForDescendants_true() { fun registerContentObserverForUserAsync_inputUri_notifyForDescendants_true() = testScope.runTest { mSettings.registerContentObserverForUserAsync( TEST_SETTING_URI, notifyForDescendants = true, mContentObserver, mUserTracker.userId ) testScope.launch { testScope.advanceUntilIdle() verify(mSettings.getContentResolver()) .registerContentObserver( eq(TEST_SETTING_URI), Loading @@ -276,13 +301,18 @@ class UserSettingsProxyTest : SysuiTestCase() { eq(MAIN_USER_ID) ) } } @Test fun registerContentObserver_inputUri_success() { fun registerContentObserver_inputUri_success() = testScope.runTest { mSettings.registerContentObserverSync(TEST_SETTING_URI, mContentObserver) verify(mSettings.getContentResolver()) .registerContentObserver(eq(TEST_SETTING_URI), eq(false), eq(mContentObserver), eq(0)) .registerContentObserver( eq(TEST_SETTING_URI), eq(false), eq(mContentObserver), eq(0) ) } @Test Loading Loading @@ -313,14 +343,20 @@ class UserSettingsProxyTest : SysuiTestCase() { } @Test fun registerContentObserver_inputUri_notifyForDescendants_true() { fun registerContentObserver_inputUri_notifyForDescendants_true() = testScope.runTest { mSettings.registerContentObserverSync( TEST_SETTING_URI, notifyForDescendants = true, mContentObserver ) verify(mSettings.getContentResolver()) .registerContentObserver(eq(TEST_SETTING_URI), eq(true), eq(mContentObserver), eq(0)) .registerContentObserver( eq(TEST_SETTING_URI), eq(true), eq(mContentObserver), eq(0) ) } @Test Loading @@ -337,7 +373,8 @@ class UserSettingsProxyTest : SysuiTestCase() { } @Test fun registerContentObserverAsync_inputUri_notifyForDescendants_true() { fun registerContentObserverAsync_inputUri_notifyForDescendants_true() = testScope.runTest { mSettings.registerContentObserverAsync(TEST_SETTING_URI, mContentObserver) testScope.launch { verify(mSettings.getContentResolver()) Loading