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

This commit is contained in:
Vinit Nayak
2020-05-11 19:07:54 +00:00
committed by Android (Google) Code Review
5 changed files with 87 additions and 59 deletions
@@ -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;
}
@@ -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();
}
}
@@ -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,7 +258,9 @@ public final class RecentsOrientedState implements SharedPreferences.OnSharedPre
@Override
public void onSharedPreferenceChanged(SharedPreferences sharedPreferences, String s) {
updateHomeRotationSetting();
if (ALLOW_ROTATION_PREFERENCE_KEY.equals(s)) {
updateHomeRotationSetting();
}
}
private void updateAutoRotateSetting() {
@@ -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 "["
+ "mDisplayRotation=" + mDisplayRotation
+ "this=" + extractObjectNameAndAddress(super.toString())
+ " mOrientationHandler=" +
extractObjectNameAndAddress(mOrientationHandler.toString())
+ " mDisplayRotation=" + mDisplayRotation
+ " mTouchRotation=" + mTouchRotation
+ " mLauncherRotation=" + mLauncherRotation
+ " mHomeRotation=" + isHomeRotationAllowed()
+ " mSystemRotation=" + systemRotationOn
+ " mFlags=" + mFlags
+ " mOrientationHandler=" + mOrientationHandler
+ "]";
}
}
@@ -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 {
@@ -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];
}
}