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

Commit 17559edb authored by Fabian Kozynski's avatar Fabian Kozynski Committed by Android (Google) Code Review
Browse files

Merge "Move calls to RotationPolicy to bg" into main

parents e6c3de23 003012bf
Loading
Loading
Loading
Loading
+10 −2
Original line number Diff line number Diff line
@@ -52,7 +52,9 @@ import com.android.systemui.statusbar.policy.BatteryController;
import com.android.systemui.statusbar.policy.DeviceStateRotationLockSettingController;
import com.android.systemui.statusbar.policy.RotationLockController;
import com.android.systemui.statusbar.policy.RotationLockControllerImpl;
import com.android.systemui.util.concurrency.FakeExecutor;
import com.android.systemui.util.settings.FakeSettings;
import com.android.systemui.util.time.FakeSystemClock;
import com.android.systemui.util.wrapper.RotationPolicyWrapper;

import org.junit.After;
@@ -111,6 +113,7 @@ public class RotationLockTileTest extends SysuiTestCase {
    private TestableLooper mTestableLooper;
    private RotationLockTile mLockTile;
    private TestableResources mTestableResources;
    private FakeExecutor mFakeExecutor = new FakeExecutor(new FakeSystemClock());

    public RotationLockTileTest(FlagsParameterization flags) {
        super();
@@ -128,8 +131,13 @@ public class RotationLockTileTest extends SysuiTestCase {
        mTestableResources.addOverride(com.android.internal.R.bool.config_allowRotationResolver,
                true);

        mController = new RotationLockControllerImpl(mRotationPolicyWrapper,
                mDeviceStateRotationLockSettingController, DEFAULT_SETTINGS);
        mController = new RotationLockControllerImpl(
                mRotationPolicyWrapper,
                mDeviceStateRotationLockSettingController,
                DEFAULT_SETTINGS,
                mFakeExecutor,
                mFakeExecutor
        );

        mLockTile = new RotationLockTile(
                mHost,
+9 −1
Original line number Diff line number Diff line
@@ -28,6 +28,8 @@ import androidx.test.filters.SmallTest;

import com.android.internal.view.RotationPolicy;
import com.android.systemui.SysuiTestCase;
import com.android.systemui.util.concurrency.FakeExecutor;
import com.android.systemui.util.time.FakeSystemClock;
import com.android.systemui.util.wrapper.RotationPolicyWrapper;

import org.junit.Before;
@@ -53,6 +55,8 @@ public class RotationLockControllerImplTest extends SysuiTestCase {

    private ArgumentCaptor<RotationPolicy.RotationPolicyListener> mRotationPolicyListenerCaptor;

    private FakeExecutor mFakeExecutor = new FakeExecutor(new FakeSystemClock());

    @Before
    public void setUp() {
        MockitoAnnotations.initMocks(/* testClass= */ this);
@@ -79,6 +83,7 @@ public class RotationLockControllerImplTest extends SysuiTestCase {
    public void whenFlagOn_deviceStateRotationControllerAddedToCallbacks() {
        createRotationLockController();
        captureRotationPolicyListener().onChange();
        mFakeExecutor.runAllReady();

        verify(mDeviceStateRotationLockSettingController)
                .onRotationLockStateChanged(anyBoolean(), anyBoolean());
@@ -98,6 +103,9 @@ public class RotationLockControllerImplTest extends SysuiTestCase {
        new RotationLockControllerImpl(
                mRotationPolicyWrapper,
                Optional.of(mDeviceStateRotationLockSettingController),
                deviceStateRotationLockDefaults);
                deviceStateRotationLockDefaults,
                mFakeExecutor,
                mFakeExecutor
        );
    }
}
+37 −7
Original line number Diff line number Diff line
@@ -23,15 +23,18 @@ import android.content.Context;
import android.content.pm.PackageManager;
import android.os.UserHandle;

import androidx.annotation.MainThread;
import androidx.annotation.NonNull;

import com.android.internal.view.RotationPolicy.RotationPolicyListener;
import com.android.systemui.dagger.SysUISingleton;
import com.android.systemui.rotationlock.DeviceStateAutoRotateModule.BoundsDeviceStateAutoRotateModule;
import com.android.systemui.dagger.qualifiers.Background;
import com.android.systemui.dagger.qualifiers.Main;
import com.android.systemui.util.wrapper.RotationPolicyWrapper;

import java.util.Optional;
import java.util.concurrent.CopyOnWriteArrayList;
import java.util.concurrent.Executor;

import javax.inject.Inject;
import javax.inject.Named;
@@ -55,13 +58,17 @@ public final class RotationLockControllerImpl implements RotationLockController
    private final Optional<DeviceStateRotationLockSettingController>
            mDeviceStateRotationLockSettingController;
    private final boolean mIsPerDeviceStateRotationLockEnabled;
    private final Executor mBgExecutor;
    private final Executor mMainExecutor;

    @Inject
    public RotationLockControllerImpl(
            RotationPolicyWrapper rotationPolicyWrapper,
            Optional<DeviceStateRotationLockSettingController>
                    deviceStateRotationLockSettingController,
            @Named(DEVICE_STATE_ROTATION_LOCK_DEFAULTS) String[] deviceStateRotationLockDefaults
            @Named(DEVICE_STATE_ROTATION_LOCK_DEFAULTS) String[] deviceStateRotationLockDefaults,
            @Background Executor bgExecutor,
            @Main Executor mainExecutor
    ) {
        mRotationPolicy = rotationPolicyWrapper;
        mIsPerDeviceStateRotationLockEnabled = deviceStateRotationLockDefaults.length > 0;
@@ -72,6 +79,8 @@ public final class RotationLockControllerImpl implements RotationLockController
                && mDeviceStateRotationLockSettingController.isPresent()) {
            mCallbacks.add(mDeviceStateRotationLockSettingController.get());
        }
        mBgExecutor = bgExecutor;
        mMainExecutor = mainExecutor;

        setListening(true);
    }
@@ -126,14 +135,35 @@ public final class RotationLockControllerImpl implements RotationLockController
    }

    private void notifyChanged() {
        mBgExecutor.execute(() -> {
            boolean isRotationLocked = mRotationPolicy.isRotationLocked();
            boolean isRotationLockToggleVisible = mRotationPolicy.isRotationLockToggleVisible();
            for (RotationLockControllerCallback callback : mCallbacks) {
            notifyChanged(callback);
                mMainExecutor.execute(
                        () -> notifyChanged(callback, isRotationLocked, isRotationLockToggleVisible)
                );
            }
        });
    }

    private void notifyChanged(RotationLockControllerCallback callback) {
        callback.onRotationLockStateChanged(mRotationPolicy.isRotationLocked(),
                mRotationPolicy.isRotationLockToggleVisible());
        mBgExecutor.execute(() -> {
            boolean isRotationLocked = mRotationPolicy.isRotationLocked();
            boolean isRotationLockToggleVisible = mRotationPolicy.isRotationLockToggleVisible();
            mMainExecutor.execute(
                    () -> notifyChanged(callback, isRotationLocked, isRotationLockToggleVisible)
            );
        });
    }

    @MainThread
    // This should be called in main thread as consumers expect it.
    private void notifyChanged(
            RotationLockControllerCallback callback,
            boolean isRotationLocked,
            boolean isRotationLockToggleVisible
    ) {
        callback.onRotationLockStateChanged(isRotationLocked, isRotationLockToggleVisible);
    }

    public static boolean hasSufficientPermission(Context context) {