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

Commit 115e70dd authored by Vinit Nayak's avatar Vinit Nayak Committed by Android (Google) Code Review
Browse files

Merge "Infer launcher rotation when initializing RecentsOrientedState" into ub-launcher3-rvc-dev

parents 17d3fe81 b9522d33
Loading
Loading
Loading
Loading
+1 −12
Original line number Diff line number Diff line
@@ -88,9 +88,6 @@ public class TaskViewSimulator implements TransformParams.BuilderProxy {
        mSizeStrategy = sizeStrategy;

        mOrientationState = new RecentsOrientedState(context, sizeStrategy, i -> { });
        // We do not need to attach listeners as the simulator is created just for the gesture
        // duration, and any settings are unlikely to change during this
        mOrientationState.initWithoutListeners();

        mCurrentFullscreenParams = new FullscreenDrawParams(context);
        mPageSpacing = context.getResources().getDimensionPixelSize(R.dimen.recents_page_spacing);
@@ -109,15 +106,7 @@ public class TaskViewSimulator implements TransformParams.BuilderProxy {
     * @see com.android.quickstep.views.RecentsView#setLayoutRotation(int, int)
     */
    public void setLayoutRotation(int touchRotation, int displayRotation) {
        int launcherRotation;
        if (!mOrientationState.isMultipleOrientationSupportedByDevice()
                || mOrientationState.isHomeRotationAllowed()) {
            launcherRotation = displayRotation;
        } else {
            launcherRotation = ROTATION_0;
        }

        mOrientationState.update(touchRotation, displayRotation, launcherRotation);
        mOrientationState.update(touchRotation, displayRotation);
        mLayoutValid = false;
    }

+5 −19
Original line number Diff line number Diff line
@@ -16,6 +16,7 @@

package com.android.quickstep.views;

import static android.view.Surface.ROTATION_0;
import static com.android.launcher3.BaseActivity.STATE_HANDLER_INVISIBILITY_FLAGS;
import static com.android.launcher3.InvariantDeviceProfile.CHANGE_FLAG_ICON_PARAMS;
import static com.android.launcher3.LauncherAnimUtils.SCALE_PROPERTY;
@@ -55,7 +56,6 @@ import android.app.ActivityManager;
import android.content.ComponentName;
import android.content.Context;
import android.content.Intent;
import android.content.res.Configuration;
import android.graphics.Canvas;
import android.graphics.Point;
import android.graphics.PointF;
@@ -509,7 +509,7 @@ public abstract class RecentsView<T extends BaseActivity> extends PagedView impl
        mIPinnedStackAnimationListener.setActivity(mActivity);
        SystemUiProxy.INSTANCE.get(getContext()).setPinnedStackAnimationListener(
                mIPinnedStackAnimationListener);
        mOrientationState.init();
        mOrientationState.initListeners();
    }

    @Override
@@ -524,7 +524,7 @@ public abstract class RecentsView<T extends BaseActivity> extends PagedView impl
        mIdp.removeOnChangeListener(this);
        SystemUiProxy.INSTANCE.get(getContext()).setPinnedStackAnimationListener(null);
        mIPinnedStackAnimationListener.setActivity(null);
        mOrientationState.destroy();
        mOrientationState.destroyListeners();
    }

    @Override
@@ -616,15 +616,6 @@ public abstract class RecentsView<T extends BaseActivity> extends PagedView impl
        }
    }

    @Override
    protected void onConfigurationChanged(Configuration newConfig) {
        super.onConfigurationChanged(newConfig);
        int windowConfigurationRotation = ConfigurationCompat
                .getWindowConfigurationRotation(getResources().getConfiguration());
        setLayoutInternal(mOrientationState.getTouchRotation(),
                mOrientationState.getDisplayRotation(), windowConfigurationRotation);
    }

    @Override
    public boolean onTouchEvent(MotionEvent ev) {
        super.onTouchEvent(ev);
@@ -1595,19 +1586,14 @@ public abstract class RecentsView<T extends BaseActivity> extends PagedView impl
    }

    public void setLayoutRotation(int touchRotation, int displayRotation) {
        int launcherRotation = mOrientationState.getLauncherRotation();
        setLayoutInternal(touchRotation, displayRotation, launcherRotation);
    }

    private void setLayoutInternal(int touchRotation, int displayRotation, int launcherRotation) {
        if (mOrientationState.update(touchRotation, displayRotation, launcherRotation)) {
        if (mOrientationState.update(touchRotation, displayRotation)) {
            mOrientationHandler = mOrientationState.getOrientationHandler();
            mIsRtl = mOrientationHandler.getRecentsRtlSetting(getResources());
            setLayoutDirection(mIsRtl ? View.LAYOUT_DIRECTION_RTL : View.LAYOUT_DIRECTION_LTR);
            mClearAllButton.setRotation(mOrientationHandler.getDegreesRotated());
            mActivity.getDragLayer().recreateControllers();
            mActionsView.updateHiddenFlags(HIDDEN_NON_ZERO_ROTATION,
                    touchRotation != 0 || launcherRotation != 0);
                    touchRotation != 0 || mOrientationState.getLauncherRotation() != ROTATION_0);
            requestLayout();
        }
    }
+54 −28
Original line number Diff line number Diff line
@@ -23,6 +23,7 @@ import static android.view.Surface.ROTATION_180;
import static android.view.Surface.ROTATION_270;
import static android.view.Surface.ROTATION_90;

import static com.android.launcher3.logging.LoggerUtils.extractObjectNameAndAddress;
import static com.android.launcher3.states.RotationHelper.ALLOW_ROTATION_PREFERENCE_KEY;
import static com.android.launcher3.util.Executors.UI_HELPER_EXECUTOR;

@@ -84,7 +85,7 @@ public final class RecentsOrientedState implements SharedPreferences.OnSharedPre

    private @SurfaceRotation int mTouchRotation = ROTATION_0;
    private @SurfaceRotation int mDisplayRotation = ROTATION_0;
    private @SurfaceRotation int mLauncherRotation = Surface.ROTATION_0;
    private @SurfaceRotation int mLauncherRotation = ROTATION_0;

    // Launcher activity supports multiple orientation, but fallback activity does not
    private static final int FLAG_MULTIPLE_ORIENTATION_SUPPORTED_BY_ACTIVITY = 1 << 0;
@@ -102,6 +103,8 @@ public final class RecentsOrientedState implements SharedPreferences.OnSharedPre
    private static final int FLAG_ROTATION_WATCHER_SUPPORTED = 1 << 6;
    // Whether to enable rotation watcher when multi-rotation is supported
    private static final int FLAG_ROTATION_WATCHER_ENABLED = 1 << 7;
    // Enable home rotation for UI tests, ignoring home rotation value from prefs
    private static final int FLAG_HOME_ROTATION_FORCE_ENABLED_FOR_TESTING = 1 << 8;

    private static final int MASK_MULTIPLE_ORIENTATION_SUPPORTED_BY_DEVICE =
            FLAG_MULTIPLE_ORIENTATION_SUPPORTED_BY_ACTIVITY
@@ -163,6 +166,10 @@ public final class RecentsOrientedState implements SharedPreferences.OnSharedPre
        if (mOrientationListener.canDetectOrientation()) {
            mFlags |= FLAG_ROTATION_WATCHER_SUPPORTED;
        }

        // initialize external flags
        updateAutoRotateSetting();
        updateHomeRotationSetting();
    }

    /**
@@ -181,13 +188,15 @@ public final class RecentsOrientedState implements SharedPreferences.OnSharedPre
     *         false otherwise
     */
    public boolean update(
            @SurfaceRotation int touchRotation, @SurfaceRotation int displayRotation,
            @SurfaceRotation int launcherRotation) {
            @SurfaceRotation int touchRotation, @SurfaceRotation int displayRotation) {
        if (!isMultipleOrientationSupportedByDevice()) {
            return false;
        }
        if (mDisplayRotation == displayRotation && mTouchRotation == touchRotation
                && launcherRotation == mLauncherRotation) {

        int launcherRotation = inferLauncherRotation(displayRotation);
        if (mDisplayRotation == displayRotation
                && mTouchRotation == touchRotation
                && mLauncherRotation == launcherRotation) {
            return false;
        }

@@ -195,11 +204,10 @@ public final class RecentsOrientedState implements SharedPreferences.OnSharedPre
        mDisplayRotation = displayRotation;
        mTouchRotation = touchRotation;

        if (canLauncherRotate() || mLauncherRotation == mTouchRotation) {
            // TODO(b/153476489) Need to determine when launcher is rotated
        if (mLauncherRotation == mTouchRotation) {
            mOrientationHandler = PagedOrientationHandler.HOME_ROTATED;
            if (DEBUG) {
                Log.d(TAG, "Set Orientation Handler: " + mOrientationHandler);
                Log.d(TAG, "current RecentsOrientedState: " + this);
            }
            return true;
        }
@@ -212,11 +220,20 @@ public final class RecentsOrientedState implements SharedPreferences.OnSharedPre
            mOrientationHandler = PagedOrientationHandler.PORTRAIT;
        }
        if (DEBUG) {
            Log.d(TAG, "Set Orientation Handler: " + mOrientationHandler);
            Log.d(TAG, "current RecentsOrientedState: " + this);
        }
        return true;
    }

    @SurfaceRotation
    private int inferLauncherRotation(@SurfaceRotation int displayRotation) {
        if (!isMultipleOrientationSupportedByDevice() || isHomeRotationAllowed()) {
            return displayRotation;
        } else {
            return ROTATION_0;
        }
    }

    private void setFlag(int mask, boolean enabled) {
        boolean wasRotationEnabled = !TestProtocol.sDisableSensorRotation
                && mFlags == VALUE_ROTATION_WATCHER_ENABLED;
@@ -241,8 +258,10 @@ public final class RecentsOrientedState implements SharedPreferences.OnSharedPre

    @Override
    public void onSharedPreferenceChanged(SharedPreferences sharedPreferences, String s) {
        if (ALLOW_ROTATION_PREFERENCE_KEY.equals(s)) {
            updateHomeRotationSetting();
        }
    }

    private void updateAutoRotateSetting() {
        setFlag(FLAG_SYSTEM_ROTATION_ALLOWED, Settings.System.getInt(mContentResolver,
@@ -255,23 +274,24 @@ public final class RecentsOrientedState implements SharedPreferences.OnSharedPre
    }

    /**
     * Initializes aany system values and registers corresponding change listeners. It must be
     * paired with {@link #destroy()} call
     * Initializes any system values and registers corresponding change listeners. It must be
     * paired with {@link #destroyListeners()} call
     */
    public void init() {
    public void initListeners() {
        if (isMultipleOrientationSupportedByDevice()) {
            mSharedPrefs.registerOnSharedPreferenceChangeListener(this);
            mContentResolver.registerContentObserver(
                    Settings.System.getUriFor(Settings.System.ACCELEROMETER_ROTATION),
                    false, mSystemAutoRotateObserver);
        }
        initWithoutListeners();
        updateAutoRotateSetting();
        updateHomeRotationSetting();
    }

    /**
     * Unregisters any previously registered listeners.
     */
    public void destroy() {
    public void destroyListeners() {
        if (isMultipleOrientationSupportedByDevice()) {
            mSharedPrefs.unregisterOnSharedPreferenceChangeListener(this);
            mContentResolver.unregisterContentObserver(mSystemAutoRotateObserver);
@@ -279,13 +299,8 @@ public final class RecentsOrientedState implements SharedPreferences.OnSharedPre
        setRotationWatcherEnabled(false);
    }

    /**
     * Initializes the OrientationState without attaching any listeners. This can be used when
     * the object is short lived.
     */
    public void initWithoutListeners() {
        updateAutoRotateSetting();
        updateHomeRotationSetting();
    public void forceAllowRotationForTesting(boolean forceAllow) {
        setFlag(FLAG_HOME_ROTATION_FORCE_ENABLED_FOR_TESTING, forceAllow);
    }

    @SurfaceRotation
@@ -310,7 +325,8 @@ public final class RecentsOrientedState implements SharedPreferences.OnSharedPre

    public boolean isHomeRotationAllowed() {
        return (mFlags & (FLAG_HOME_ROTATION_ALLOWED_IN_PREFS | FLAG_MULTIWINDOW_ROTATION_ALLOWED))
                != 0;
                != 0 ||
                (mFlags & FLAG_HOME_ROTATION_FORCE_ENABLED_FOR_TESTING) != 0;
    }

    public boolean canLauncherRotate() {
@@ -440,9 +456,13 @@ public final class RecentsOrientedState implements SharedPreferences.OnSharedPre
                if (degrees < (90 - threshold)) {
                    return ROTATION_0;
                }
                if (degrees > (90 + threshold)) {
                if (degrees > (90 + threshold) && degrees < 180) {
                    return ROTATION_180;
                }
                // flip from seascape to landscape
                if (degrees > (180 + threshold) && degrees < 360) {
                    return ROTATION_90;
                }
                break;
            case ROTATION_180:
                if (degrees < (180 - threshold)) {
@@ -453,12 +473,16 @@ public final class RecentsOrientedState implements SharedPreferences.OnSharedPre
                }
                break;
            case ROTATION_90:
                if (degrees < (270 - threshold)) {
                if (degrees < (270 - threshold) && degrees > 90) {
                    return ROTATION_180;
                }
                if (degrees > (270 + threshold)) {
                if (degrees > (270 + threshold) && degrees < 360) {
                    return ROTATION_0;
                }
                // flip from landscape to seascape
                if (degrees > threshold && degrees < 180) {
                    return ROTATION_270;
                }
                break;
        }

@@ -506,13 +530,15 @@ public final class RecentsOrientedState implements SharedPreferences.OnSharedPre
    public String toString() {
        boolean systemRotationOn = (mFlags & FLAG_SYSTEM_ROTATION_ALLOWED) != 0;
        return "["
                + "this=" + extractObjectNameAndAddress(super.toString())
                + " mOrientationHandler=" +
                    extractObjectNameAndAddress(mOrientationHandler.toString())
                + " mDisplayRotation=" + mDisplayRotation
                + " mTouchRotation=" + mTouchRotation
                + " mLauncherRotation=" + mLauncherRotation
                + " mHomeRotation=" + isHomeRotationAllowed()
                + " mSystemRotation=" + systemRotationOn
                + " mFlags=" + mFlags
                + " mOrientationHandler=" + mOrientationHandler
                + "]";
    }
}
+13 −0
Original line number Diff line number Diff line
@@ -42,6 +42,7 @@ import com.android.launcher3.ui.TaplTestsLauncher3;
import com.android.quickstep.NavigationModeSwitchRule.NavigationModeSwitch;
import com.android.quickstep.views.RecentsView;

import org.junit.After;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
@@ -53,6 +54,18 @@ public class TaplTestsQuickstep extends AbstractQuickStepTest {
    public void setUp() throws Exception {
        super.setUp();
        TaplTestsLauncher3.initialize(this);
        executeOnLauncher(launcher -> {
            RecentsView recentsView = launcher.getOverviewPanel();
            recentsView.getPagedViewOrientedState().forceAllowRotationForTesting(true);
        });
    }

    @After
    public void tearDown() {
        executeOnLauncher(launcher -> {
            RecentsView recentsView = launcher.getOverviewPanel();
            recentsView.getPagedViewOrientedState().forceAllowRotationForTesting(false);
        });
    }

    private void startTestApps() throws Exception {
+14 −0
Original line number Diff line number Diff line
@@ -41,6 +41,7 @@ public class LoggerUtils {
    private static final ArrayMap<Class, SparseArray<String>> sNameCache = new ArrayMap<>();
    private static final String UNKNOWN = "UNKNOWN";
    private static final int DEFAULT_PREDICTED_RANK = 10000;
    private static final String DELIMITER_DOT = "\\.";

    public static String getFieldName(int value, Class c) {
        SparseArray<String> cache;
@@ -173,4 +174,17 @@ public class LoggerUtils {
        targets.toArray(targetsArray);
        return newLauncherEvent(action, targetsArray);
    }

    /**
     * String conversion for only the helpful parts of {@link Object#toString()} method
     * @param stringToExtract "foo.bar.baz.MyObject@1234"
     * @return "MyObject@1234"
     */
    public static String extractObjectNameAndAddress(String stringToExtract) {
        String[] superStringParts = stringToExtract.split(DELIMITER_DOT);
        if (superStringParts.length == 0) {
            return "";
        }
        return superStringParts[superStringParts.length - 1];
    }
}