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

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

Merge "Move DozeParameters content provider registrations to bg" into main

parents 8491884c b0f4860e
Loading
Loading
Loading
Loading
+9 −0
Original line number Diff line number Diff line
@@ -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
  }
}
+33 −9
Original line number Diff line number Diff line
@@ -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;
@@ -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;
@@ -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;
@@ -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;
@@ -144,6 +148,7 @@ public class DozeParameters implements
        mUnlockedScreenOffAnimationController = unlockedScreenOffAnimationController;
        mUserTracker = userTracker;
        mDozeInteractor = dozeInteractor;
        mSecureSettings = secureSettings;

        keyguardUpdateMonitor.registerCallback(mKeyguardVisibilityCallback);
        tunerService.addTunable(
@@ -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() {
@@ -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) {
+19 −0
Original line number Diff line number Diff line
@@ -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
@@ -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]
     *
+4 −2
Original line number Diff line number Diff line
@@ -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;
@@ -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;
@@ -130,7 +131,8 @@ public class DozeParametersTest extends SysuiTestCase {
            mConfigurationController,
            mStatusBarStateController,
            mUserTracker,
            mDozeInteractor
            mDozeInteractor,
            new FakeSettings()
        );

        verify(mBatteryController).addCallback(mBatteryStateChangeCallback.capture());
+148 −111
Original line number Diff line number Diff line
@@ -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
@@ -65,7 +67,8 @@ class UserSettingsProxyTest : SysuiTestCase() {
    }

    @Test
    fun registerContentObserverForUser_inputString_success() {
    fun registerContentObserverForUser_inputString_success() =
        testScope.runTest {
            mSettings.registerContentObserverForUserSync(
                TEST_SETTING,
                mContentObserver,
@@ -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),
@@ -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,
@@ -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),
@@ -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,
@@ -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),
@@ -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,
@@ -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),
@@ -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
@@ -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
@@ -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())