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

Commit e071f787 authored by Shivangi Dubey's avatar Shivangi Dubey Committed by dshivangi
Browse files

Decouple auto-rotate issue logging and refactoring code

Currently the logging logic is in trunkfood full while refactor logic is still in developement.
The code is coupled in such a way that some of the refactor logic heavy classes would be instantiated when logging flag is enabled.
It would be best to decouple them and avoid instantiating classes that are still under development.

This change also has moved the instance creation of certain classes to RootWindowContainer from DisplayRotation.
There can be multiple instances of DisplayRotation based on number of display, while we want singleton instances of these classes.
Now that we will have singleton instance of auto-rotate issue logger, it would also solve the issue of duplicate logging of auto-rotate issue.
Next CL: Implement DeviceStateAutoRotateSettingController

Fixes: 402764691
Test: atest DeviceStateAutoRotateSettingIssueLoggerTests
Flag: com.android.window.flags.enable_device_state_auto_rotate_setting_logging
Flag: com.android.window.flags.enable_device_state_auto_rotate_setting_refactor
Change-Id: I0432f0575fc10c038320e9d5c2b41ec5557eca48
parent f54fcb71
Loading
Loading
Loading
Loading
+2 −41
Original line number Diff line number Diff line
@@ -16,15 +16,8 @@

package com.android.server.wm;

import android.annotation.NonNull;
import android.content.Context;
import android.database.ContentObserver;
import android.hardware.devicestate.DeviceState;
import android.os.Handler;
import android.provider.Settings;

import com.android.window.flags.Flags;

/**
 * Syncs ACCELEROMETER_ROTATION and DEVICE_STATE_ROTATION_LOCK setting to consistent values.
 * <ul>
@@ -41,39 +34,7 @@ import com.android.window.flags.Flags;
 */

public class DeviceStateAutoRotateSettingController {
    private final DeviceStateAutoRotateSettingIssueLogger mDeviceStateAutoRotateSettingIssueLogger;
    private final Context mContext;
    private final Handler mHandler;

    public DeviceStateAutoRotateSettingController(Context context,
            DeviceStateAutoRotateSettingIssueLogger deviceStateAutoRotateSettingIssueLogger,
            Handler handler) {
    // TODO(b/350946537) Refactor implementation
        mDeviceStateAutoRotateSettingIssueLogger = deviceStateAutoRotateSettingIssueLogger;
        mContext = context;
        mHandler = handler;
        registerDeviceStateAutoRotateSettingObserver();
    }

    /** Notify controller device state has changed */
    public void onDeviceStateChange(@NonNull DeviceState deviceState) {
        if (Flags.enableDeviceStateAutoRotateSettingLogging()) {
            mDeviceStateAutoRotateSettingIssueLogger.onDeviceStateChange();
        }
    }

    private void registerDeviceStateAutoRotateSettingObserver() {
        mContext.getContentResolver().registerContentObserver(
                Settings.Secure.getUriFor(Settings.Secure.DEVICE_STATE_ROTATION_LOCK),
                false,
                new ContentObserver(mHandler) {
                    @Override
                    public void onChange(boolean selfChange) {
                        if (Flags.enableDeviceStateAutoRotateSettingLogging()) {
                            mDeviceStateAutoRotateSettingIssueLogger
                                    .onDeviceStateAutoRotateSettingChange();
                        }
                    }
                });
    public DeviceStateAutoRotateSettingController() {
    }
}
+27 −5
Original line number Diff line number Diff line
@@ -16,13 +16,20 @@

package com.android.server.wm;

import static android.provider.Settings.Secure.DEVICE_STATE_ROTATION_LOCK;
import static android.util.MathUtils.abs;

import android.annotation.ElapsedRealtimeLong;
import android.annotation.NonNull;
import android.database.ContentObserver;
import android.hardware.devicestate.DeviceState;
import android.os.Handler;
import android.os.HandlerExecutor;
import android.os.UserHandle;

import com.android.internal.annotations.VisibleForTesting;
import com.android.internal.util.FrameworkStatsLog;
import com.android.settingslib.devicestate.SecureSettings;

import java.util.function.LongSupplier;

@@ -55,18 +62,33 @@ public class DeviceStateAutoRotateSettingIssueLogger {
    private long mLastDeviceStateAutoRotateSettingChangeTime = TIME_NOT_SET;

    public DeviceStateAutoRotateSettingIssueLogger(
            @NonNull LongSupplier elapsedTimeMillisSupplier) {
            @NonNull LongSupplier elapsedTimeMillisSupplier, SecureSettings secureSettings,
            DeviceStateController deviceStateController, Handler handler) {
        mElapsedTimeMillisSupplier = elapsedTimeMillisSupplier;

        secureSettings.registerContentObserver(
                DEVICE_STATE_ROTATION_LOCK, /* notifyForDescendants= */ false,
                new ContentObserver(handler) {
                    @Override
                    public void onChange(boolean selfChange) {
                        onDeviceStateAutoRotateSettingChange();
                    }
                }, UserHandle.USER_CURRENT);

        deviceStateController.registerDeviceStateCallback(
                (DeviceStateController.DeviceStateEnum deviceStateEnum,
                        DeviceState deviceState) -> {
                    onDeviceStateChange();
                },
                new HandlerExecutor(handler));
    }

    /** Notify logger that device state has changed. */
    public void onDeviceStateChange() {
    private void onDeviceStateChange() {
        mLastDeviceStateChangeTime = mElapsedTimeMillisSupplier.getAsLong();
        onStateChange();
    }

    /** Notify logger that device state based auto rotate setting has changed. */
    public void onDeviceStateAutoRotateSettingChange() {
    private void onDeviceStateAutoRotateSettingChange() {
        mLastDeviceStateAutoRotateSettingChangeTime = mElapsedTimeMillisSupplier.getAsLong();
        onStateChange();
    }
+1 −1
Original line number Diff line number Diff line
@@ -1203,7 +1203,7 @@ class DisplayContent extends RootDisplayArea implements WindowManagerPolicy.Disp
        mDeviceStateListener =
                (@NonNull DeviceStateController.DeviceStateEnum deviceStateEnum,
                        @NonNull DeviceState deviceState) -> mDisplayRotation.foldStateChanged(
                        deviceStateEnum, deviceState);
                        deviceStateEnum);
        mDeviceStateController.registerDeviceStateCallback(mDeviceStateListener,
                new HandlerExecutor(mWmService.mH));

+56 −18
Original line number Diff line number Diff line
@@ -55,7 +55,7 @@ import android.hardware.Sensor;
import android.hardware.SensorEvent;
import android.hardware.SensorEventListener;
import android.hardware.SensorManager;
import android.hardware.devicestate.DeviceState;
import android.hardware.devicestate.DeviceStateManager;
import android.hardware.power.Boost;
import android.os.Handler;
import android.os.SystemClock;
@@ -75,10 +75,16 @@ import android.window.WindowContainerTransaction;

import com.android.internal.R;
import com.android.internal.annotations.VisibleForTesting;
import com.android.internal.os.BackgroundThread;
import com.android.internal.protolog.ProtoLog;
import com.android.server.UiThread;
import com.android.server.policy.WindowManagerPolicy;
import com.android.server.statusbar.StatusBarManagerInternal;
import com.android.settingslib.devicestate.AndroidSecureSettings;
import com.android.settingslib.devicestate.DeviceStateAutoRotateSettingManager;
import com.android.settingslib.devicestate.DeviceStateAutoRotateSettingManagerImpl;
import com.android.settingslib.devicestate.PostureDeviceStateConverter;
import com.android.settingslib.devicestate.SecureSettings;
import com.android.window.flags.Flags;

import java.io.PrintWriter;
@@ -111,8 +117,6 @@ public class DisplayRotation {
    private final Object mLock;
    @Nullable
    private final DisplayRotationImmersiveAppCompatPolicy mCompatPolicyForImmersiveApps;
    @Nullable
    private DeviceStateAutoRotateSettingController mDeviceStateAutoRotateSettingController;

    public final boolean isDefaultDisplay;
    private final boolean mSupportAutoRotation;
@@ -250,8 +254,7 @@ public class DisplayRotation {
        isDefaultDisplay = displayContent.isDefaultDisplay;
        mCompatPolicyForImmersiveApps = initImmersiveAppCompatPolicy(service, displayContent);

        mSupportAutoRotation =
                mContext.getResources().getBoolean(R.bool.config_supportAutoRotation);
        mSupportAutoRotation = isAutoRotateSupported(mContext);
        mAllowRotationResolver =
                mContext.getResources().getBoolean(R.bool.config_allowRotationResolver);
        mLidOpenRotation = readRotation(R.integer.config_lidOpenRotation);
@@ -290,20 +293,16 @@ public class DisplayRotation {
        } else {
            mFoldController = null;
        }

        if (mFoldController != null && (Flags.enableDeviceStateAutoRotateSettingLogging()
                || Flags.enableDeviceStateAutoRotateSettingRefactor())) {
            mDeviceStateAutoRotateSettingController =
                    new DeviceStateAutoRotateSettingController(mContext,
                            new DeviceStateAutoRotateSettingIssueLogger(
                                    SystemClock::elapsedRealtime), mService.mH);
        }
    }

    private static boolean isFoldable(Context context) {
        return context.getResources().getIntArray(R.array.config_foldedDeviceStates).length > 0;
    }

    private static boolean isAutoRotateSupported(@NonNull Context context) {
        return context.getResources().getBoolean(R.bool.config_supportAutoRotation);
    }

    @VisibleForTesting
    @Nullable
    DisplayRotationImmersiveAppCompatPolicy initImmersiveAppCompatPolicy(
@@ -1594,14 +1593,10 @@ public class DisplayRotation {
     * method will be invoked *after* this one.
     */
    // TODO(b/409761673) Migrate to only using android.hardware.devicestate.DeviceState
    void foldStateChanged(DeviceStateController.DeviceStateEnum deviceStateEnum,
            DeviceState deviceState) {
    void foldStateChanged(DeviceStateController.DeviceStateEnum deviceStateEnum) {
        if (mFoldController != null) {
            synchronized (mLock) {
                mFoldController.foldStateChanged(deviceStateEnum);
                if (mDeviceStateAutoRotateSettingController != null) {
                    mDeviceStateAutoRotateSettingController.onDeviceStateChange(deviceState);
                }
            }
        }
    }
@@ -1653,6 +1648,49 @@ public class DisplayRotation {
        return SystemClock.uptimeMillis();
    }

    /**
     * Initialize dependencies related to Device state auto-rotate setting.
     * <p>
     * Set of dependencies initialized here is:
     * <ul>
     * <li>{@link DeviceStateAutoRotateSettingController}</li>
     * <li>{@link DeviceStateAutoRotateSettingIssueLogger}</li>
     * <li>{@link DeviceStateAutoRotateSettingManager}</li>
     * </ul>
     * @return an instance of {@link DeviceStateAutoRotateSettingController}
     */
    @Nullable
    static DeviceStateAutoRotateSettingController createDeviceStateAutoRotateDependencies(
            Context context, DeviceStateController deviceStateController, Handler handler) {
        if (!isFoldable(context) || !isAutoRotateSupported(context)) return null;
        if (!Flags.enableDeviceStateAutoRotateSettingLogging()
                && !Flags.enableDeviceStateAutoRotateSettingRefactor()) {
            return null;
        }

        DeviceStateAutoRotateSettingController deviceStateAutoRotateSettingController = null;

        final SecureSettings secureSettings = new AndroidSecureSettings(
                context.getContentResolver());

        if (Flags.enableDeviceStateAutoRotateSettingLogging()) {
            new DeviceStateAutoRotateSettingIssueLogger(SystemClock::elapsedRealtime,
                    secureSettings, deviceStateController, handler);
        }

        if (Flags.enableDeviceStateAutoRotateSettingRefactor()) {
            final DeviceStateAutoRotateSettingManager deviceStateAutoRotateSettingManager =
                    new DeviceStateAutoRotateSettingManagerImpl(
                            context, BackgroundThread.getExecutor(), secureSettings, handler,
                            new PostureDeviceStateConverter(context, new DeviceStateManager()));
            // TODO(b/406444989): Manager created in previous line will be passed into controller
            deviceStateAutoRotateSettingController =
                    new DeviceStateAutoRotateSettingController();
        }

        return deviceStateAutoRotateSettingController;
    }

    class FoldController {
        private final boolean mPauseAutorotationDuringUnfolding;
        @Surface.Rotation
+5 −0
Original line number Diff line number Diff line
@@ -255,6 +255,8 @@ class RootWindowContainer extends WindowContainer<DisplayContent>
    /** Root task id of the front root task when user switched, indexed by userId. */
    SparseIntArray mUserRootTaskInFront = new SparseIntArray(2);
    SparseArray<IntArray> mUserVisibleRootTasks = new SparseArray<>();
    @Nullable
    DeviceStateAutoRotateSettingController mDeviceStateAutoRotateSettingController;

    /**
     * A list of tokens that cause the top activity to be put to sleep.
@@ -453,6 +455,9 @@ class RootWindowContainer extends WindowContainer<DisplayContent>
        mDisplayOffTokenAcquirer = mService.new SleepTokenAcquirer(DISPLAY_OFF_SLEEP_TOKEN_TAG);
        mDeviceStateController = new DeviceStateController(service.mContext, service.mGlobalLock);
        mDisplayRotationCoordinator = new DisplayRotationCoordinator();
        mDeviceStateAutoRotateSettingController =
                DisplayRotation.createDeviceStateAutoRotateDependencies(mService.mContext,
                        mDeviceStateController, mService.mH);
    }

    /**
Loading