Merging ub-launcher3-master, build 5437471
Test: Manual
Bug:129423457 PluginCoreLib is not built from source code in master
Bug:129873705 Launcher crashes with Permission denial: writing to settings requires:android.permission.WRITE_SECURE_SETTINGS
Change-Id: Ib95d4de181eb70a30171c6ef511e803816b88dbf
diff --git a/Android.mk b/Android.mk
index 06ee66f..a817415 100644
--- a/Android.mk
+++ b/Android.mk
@@ -16,15 +16,6 @@
LOCAL_PATH := $(call my-dir)
-include $(CLEAR_VARS)
-LOCAL_MODULE := libPluginCore
-LOCAL_MODULE_TAGS := optional
-LOCAL_MODULE_CLASS := JAVA_LIBRARIES
-LOCAL_SRC_FILES := libs/plugin_core.jar
-LOCAL_UNINSTALLABLE_MODULE := true
-LOCAL_SDK_VERSION := current
-include $(BUILD_PREBUILT)
-
#
# Build rule for plugin lib (needed to write a plugin).
#
@@ -33,7 +24,11 @@
LOCAL_AAPT2_ONLY := true
LOCAL_MODULE_TAGS := optional
-LOCAL_STATIC_JAVA_LIBRARIES:= libPluginCore
+ifneq (,$(wildcard frameworks/base))
+ LOCAL_STATIC_JAVA_LIBRARIES:= PluginCoreLib
+else
+ LOCAL_STATIC_JAVA_LIBRARIES:= libPluginCore
+endif
LOCAL_SRC_FILES := \
$(call all-java-files-under, src_plugins)
diff --git a/libs/plugin_core.jar b/libs/plugin_core.jar
deleted file mode 100644
index dd27f86..0000000
--- a/libs/plugin_core.jar
+++ /dev/null
Binary files differ
diff --git a/quickstep/recents_ui_overrides/src/com/android/launcher3/uioverrides/RecentsUiFactory.java b/quickstep/recents_ui_overrides/src/com/android/launcher3/uioverrides/RecentsUiFactory.java
index f507d0f..518a2a6 100644
--- a/quickstep/recents_ui_overrides/src/com/android/launcher3/uioverrides/RecentsUiFactory.java
+++ b/quickstep/recents_ui_overrides/src/com/android/launcher3/uioverrides/RecentsUiFactory.java
@@ -59,7 +59,7 @@
private static final float RECENTS_PREPARE_SCALE = 1.33f;
public static TouchController[] createTouchControllers(Launcher launcher) {
- Mode mode = SysUINavigationMode.INSTANCE.get(launcher).getMode();
+ Mode mode = SysUINavigationMode.getMode(launcher);
ArrayList<TouchController> list = new ArrayList<>();
list.add(launcher.getDragController());
@@ -106,7 +106,7 @@
* @param launcher the launcher activity
*/
public static void prepareToShowOverview(Launcher launcher) {
- if (FeatureFlags.SWIPE_HOME.get()) {
+ if (SysUINavigationMode.getMode(launcher) == Mode.NO_BUTTON) {
// Overview lives on the side, so doesn't scale in from above.
return;
}
diff --git a/quickstep/recents_ui_overrides/src/com/android/launcher3/uioverrides/states/BackgroundAppState.java b/quickstep/recents_ui_overrides/src/com/android/launcher3/uioverrides/states/BackgroundAppState.java
index d8f1628..225ae84 100644
--- a/quickstep/recents_ui_overrides/src/com/android/launcher3/uioverrides/states/BackgroundAppState.java
+++ b/quickstep/recents_ui_overrides/src/com/android/launcher3/uioverrides/states/BackgroundAppState.java
@@ -20,8 +20,9 @@
import android.os.RemoteException;
import com.android.launcher3.Launcher;
import com.android.launcher3.allapps.AllAppsTransitionController;
-import com.android.launcher3.config.FeatureFlags;
import com.android.quickstep.RecentsModel;
+import com.android.quickstep.SysUINavigationMode;
+import com.android.quickstep.SysUINavigationMode.Mode;
import com.android.quickstep.util.LayoutUtils;
import com.android.quickstep.views.RecentsView;
import com.android.systemui.shared.recents.ISystemUiProxy;
@@ -76,7 +77,7 @@
@Override
public int getVisibleElements(Launcher launcher) {
- if (FeatureFlags.SWIPE_HOME.get()) {
+ if (SysUINavigationMode.getMode(launcher) == Mode.NO_BUTTON) {
return super.getVisibleElements(launcher);
}
// Hide shelf content (e.g. QSB) because we fade it in when swiping up.
diff --git a/quickstep/recents_ui_overrides/src/com/android/launcher3/uioverrides/touchcontrollers/QuickSwitchTouchController.java b/quickstep/recents_ui_overrides/src/com/android/launcher3/uioverrides/touchcontrollers/QuickSwitchTouchController.java
index 91a31dd..81090c1 100644
--- a/quickstep/recents_ui_overrides/src/com/android/launcher3/uioverrides/touchcontrollers/QuickSwitchTouchController.java
+++ b/quickstep/recents_ui_overrides/src/com/android/launcher3/uioverrides/touchcontrollers/QuickSwitchTouchController.java
@@ -36,11 +36,12 @@
import com.android.launcher3.LauncherStateManager;
import com.android.launcher3.Utilities;
import com.android.launcher3.anim.AnimatorSetBuilder;
-import com.android.launcher3.config.FeatureFlags;
import com.android.launcher3.touch.AbstractStateChangeTouchController;
import com.android.launcher3.touch.SwipeDetector;
import com.android.launcher3.userevent.nano.LauncherLogProto;
import com.android.launcher3.userevent.nano.LauncherLogProto.Action.Direction;
+import com.android.quickstep.SysUINavigationMode;
+import com.android.quickstep.SysUINavigationMode.Mode;
import com.android.quickstep.views.RecentsView;
import com.android.quickstep.views.TaskView;
@@ -105,7 +106,7 @@
private void setupInterpolators(AnimatorSetBuilder animatorSetBuilder) {
animatorSetBuilder.setInterpolator(ANIM_WORKSPACE_FADE, DEACCEL_2);
animatorSetBuilder.setInterpolator(ANIM_ALL_APPS_FADE, DEACCEL_2);
- if (FeatureFlags.SWIPE_HOME.get()) {
+ if (SysUINavigationMode.getMode(mLauncher) == Mode.NO_BUTTON) {
// Overview lives to the left of workspace, so translate down later than over
animatorSetBuilder.setInterpolator(ANIM_WORKSPACE_TRANSLATE, ACCEL_2);
animatorSetBuilder.setInterpolator(ANIM_VERTICAL_PROGRESS, ACCEL_2);
diff --git a/quickstep/recents_ui_overrides/src/com/android/launcher3/uioverrides/touchcontrollers/TaskViewTouchController.java b/quickstep/recents_ui_overrides/src/com/android/launcher3/uioverrides/touchcontrollers/TaskViewTouchController.java
index 62d954b..8b4aa07 100644
--- a/quickstep/recents_ui_overrides/src/com/android/launcher3/uioverrides/touchcontrollers/TaskViewTouchController.java
+++ b/quickstep/recents_ui_overrides/src/com/android/launcher3/uioverrides/touchcontrollers/TaskViewTouchController.java
@@ -123,7 +123,7 @@
if (mRecentsView.isTaskViewVisible(view) && mActivity.getDragLayer()
.isEventOverView(view, ev)) {
mTaskBeingDragged = view;
- if (!SysUINavigationMode.INSTANCE.get(mActivity).getMode().hasGestures) {
+ if (!SysUINavigationMode.getMode(mActivity).hasGestures) {
// Don't allow swipe down to open if we don't support swipe up
// to enter overview.
directionsToDetectScroll = SwipeDetector.DIRECTION_POSITIVE;
diff --git a/quickstep/recents_ui_overrides/src/com/android/quickstep/LauncherActivityControllerHelper.java b/quickstep/recents_ui_overrides/src/com/android/quickstep/LauncherActivityControllerHelper.java
index 766f484..e903b6f 100644
--- a/quickstep/recents_ui_overrides/src/com/android/quickstep/LauncherActivityControllerHelper.java
+++ b/quickstep/recents_ui_overrides/src/com/android/quickstep/LauncherActivityControllerHelper.java
@@ -16,6 +16,7 @@
package com.android.quickstep;
import static android.view.View.TRANSLATION_Y;
+
import static com.android.launcher3.LauncherAnimUtils.SCALE_PROPERTY;
import static com.android.launcher3.LauncherState.BACKGROUND_APP;
import static com.android.launcher3.LauncherState.NORMAL;
@@ -24,7 +25,6 @@
import static com.android.launcher3.allapps.AllAppsTransitionController.SPRING_STIFFNESS;
import static com.android.launcher3.anim.Interpolators.DEACCEL_3;
import static com.android.launcher3.anim.Interpolators.LINEAR;
-import static com.android.quickstep.SysUINavigationMode.Mode.NO_BUTTON;
import android.animation.Animator;
import android.animation.AnimatorListenerAdapter;
@@ -45,16 +45,15 @@
import com.android.launcher3.LauncherInitListener;
import com.android.launcher3.LauncherState;
import com.android.launcher3.LauncherStateManager;
-import com.android.launcher3.Workspace;
import com.android.launcher3.allapps.AllAppsTransitionController;
import com.android.launcher3.allapps.DiscoveryBounce;
import com.android.launcher3.anim.AnimatorPlaybackController;
import com.android.launcher3.anim.AnimatorSetBuilder;
import com.android.launcher3.anim.SpringObjectAnimator;
import com.android.launcher3.compat.AccessibilityManagerCompat;
-import com.android.launcher3.config.FeatureFlags;
import com.android.launcher3.userevent.nano.LauncherLogProto;
import com.android.launcher3.views.FloatingIconView;
+import com.android.quickstep.SysUINavigationMode.Mode;
import com.android.quickstep.util.ClipAnimationHelper;
import com.android.quickstep.util.LayoutUtils;
import com.android.quickstep.views.RecentsView;
@@ -76,8 +75,7 @@
@Override
public int getSwipeUpDestinationAndLength(DeviceProfile dp, Context context, Rect outRect) {
LayoutUtils.calculateLauncherTaskSize(context, dp, outRect);
- if (dp.isVerticalBarLayout()
- && SysUINavigationMode.INSTANCE.get(context).getMode() != NO_BUTTON) {
+ if (dp.isVerticalBarLayout() && SysUINavigationMode.getMode(context) != Mode.NO_BUTTON) {
Rect targetInsets = dp.getInsets();
int hotseatInset = dp.isSeascape() ? targetInsets.left : targetInsets.right;
return dp.hotseatBarSizePx + hotseatInset;
@@ -254,8 +252,8 @@
AnimatorSet anim = new AnimatorSet();
if (!activity.getDeviceProfile().isVerticalBarLayout()
- && !FeatureFlags.SWIPE_HOME.get()) {
- // Don't animate the shelf when SWIPE_HOME is true, because we update it atomically.
+ && SysUINavigationMode.getMode(activity) != Mode.NO_BUTTON) {
+ // Don't animate the shelf when the mode is NO_BUTTON, because we update it atomically.
Animator shiftAnim = createShelfProgressAnim(activity,
fromState.getVerticalProgress(activity),
endState.getVerticalProgress(activity));
diff --git a/quickstep/recents_ui_overrides/src/com/android/quickstep/OtherActivityInputConsumer.java b/quickstep/recents_ui_overrides/src/com/android/quickstep/OtherActivityInputConsumer.java
index aada84f..990bcff 100644
--- a/quickstep/recents_ui_overrides/src/com/android/quickstep/OtherActivityInputConsumer.java
+++ b/quickstep/recents_ui_overrides/src/com/android/quickstep/OtherActivityInputConsumer.java
@@ -45,10 +45,10 @@
import android.view.ViewConfiguration;
import android.view.WindowManager;
-import com.android.launcher3.config.FeatureFlags;
import com.android.launcher3.util.Preconditions;
import com.android.launcher3.util.RaceConditionTracker;
import com.android.launcher3.util.TraceHelper;
+import com.android.quickstep.SysUINavigationMode.Mode;
import com.android.quickstep.WindowTransformSwipeHandler.GestureEndTarget;
import com.android.quickstep.util.CachedEventDispatcher;
import com.android.quickstep.util.MotionPauseDetector;
@@ -83,6 +83,7 @@
private final InputConsumerController mInputConsumer;
private final SwipeSharedState mSwipeSharedState;
private final InputMonitorCompat mInputMonitorCompat;
+ private final SysUINavigationMode.Mode mMode;
private final int mDisplayRotation;
private final Rect mStableInsets = new Rect();
@@ -127,6 +128,7 @@
mRunningTask = runningTaskInfo;
mRecentsModel = recentsModel;
mHomeIntent = homeIntent;
+ mMode = SysUINavigationMode.getMode(base);
mMotionPauseDetector = new MotionPauseDetector(base);
mOnCompleteCallback = onCompleteCallback;
@@ -250,7 +252,7 @@
// Move
mInteractionHandler.updateDisplacement(displacement - mStartDisplacement);
- if (FeatureFlags.SWIPE_HOME.get()) {
+ if (mMode == Mode.NO_BUTTON) {
boolean isLandscape = isNavBarOnLeft() || isNavBarOnRight();
float orthogonalDisplacement = !isLandscape
? ev.getX() - mDownPos.x
diff --git a/quickstep/recents_ui_overrides/src/com/android/quickstep/WindowTransformSwipeHandler.java b/quickstep/recents_ui_overrides/src/com/android/quickstep/WindowTransformSwipeHandler.java
index b1db780..a974135 100644
--- a/quickstep/recents_ui_overrides/src/com/android/quickstep/WindowTransformSwipeHandler.java
+++ b/quickstep/recents_ui_overrides/src/com/android/quickstep/WindowTransformSwipeHandler.java
@@ -25,7 +25,6 @@
import static com.android.launcher3.anim.Interpolators.OVERSHOOT_1_2;
import static com.android.launcher3.config.FeatureFlags.ENABLE_QUICKSTEP_LIVE_TILE;
import static com.android.launcher3.config.FeatureFlags.QUICKSTEP_SPRINGS;
-import static com.android.launcher3.config.FeatureFlags.SWIPE_HOME;
import static com.android.launcher3.util.RaceConditionTracker.ENTER;
import static com.android.launcher3.util.RaceConditionTracker.EXIT;
import static com.android.launcher3.views.FloatingIconView.SHAPE_PROGRESS_DURATION;
@@ -85,6 +84,7 @@
import com.android.quickstep.ActivityControlHelper.AnimationFactory;
import com.android.quickstep.ActivityControlHelper.AnimationFactory.ShelfAnimState;
import com.android.quickstep.ActivityControlHelper.HomeAnimationFactory;
+import com.android.quickstep.SysUINavigationMode.Mode;
import com.android.quickstep.util.ClipAnimationHelper;
import com.android.quickstep.util.RectFSpringAnim;
import com.android.quickstep.util.RemoteAnimationTargetSet;
@@ -232,6 +232,8 @@
private final ActivityControlHelper<T> mActivityControlHelper;
private final ActivityInitListener mActivityInitListener;
+ private final SysUINavigationMode.Mode mMode;
+
private final int mRunningTaskId;
private ThumbnailData mTaskSnapshot;
@@ -272,6 +274,7 @@
mClipAnimationHelper = new ClipAnimationHelper(context);
mTransformParams = new ClipAnimationHelper.TransformParams();
+ mMode = SysUINavigationMode.getMode(context);
initStateCallbacks();
}
@@ -584,7 +587,7 @@
final boolean passed = mCurrentShift.value >= MIN_PROGRESS_FOR_OVERVIEW;
if (passed != mPassedOverviewThreshold) {
mPassedOverviewThreshold = passed;
- if (mRecentsView != null && !SWIPE_HOME.get()) {
+ if (mRecentsView != null && mMode != Mode.NO_BUTTON) {
mRecentsView.performHapticFeedback(HapticFeedbackConstants.VIRTUAL_KEY,
HapticFeedbackConstants.FLAG_IGNORE_VIEW_SETTING);
}
@@ -744,7 +747,7 @@
}
final boolean reachedOverviewThreshold = currentShift >= MIN_PROGRESS_FOR_OVERVIEW;
if (!isFling) {
- if (SWIPE_HOME.get()) {
+ if (mMode == Mode.NO_BUTTON) {
if (mIsShelfPeeking) {
endTarget = RECENTS;
} else if (goingToNewTask) {
@@ -766,7 +769,7 @@
startShift = currentShift;
interpolator = endTarget == RECENTS ? OVERSHOOT_1_2 : DEACCEL;
} else {
- if (SWIPE_HOME.get() && endVelocity < 0 && !mIsShelfPeeking) {
+ if (mMode == Mode.NO_BUTTON && endVelocity < 0 && !mIsShelfPeeking) {
// If swiping at a diagonal, base end target on the faster velocity.
endTarget = goingToNewTask && Math.abs(velocity.x) > Math.abs(endVelocity)
? NEW_TASK : HOME;
@@ -817,7 +820,7 @@
if (mRecentsView != null) {
duration = Math.max(duration, mRecentsView.getScroller().getDuration());
}
- if (SWIPE_HOME.get()) {
+ if (mMode == Mode.NO_BUTTON) {
setShelfState(ShelfAnimState.OVERVIEW, interpolator, duration);
}
} else if (endTarget == NEW_TASK || endTarget == LAST_TASK) {
diff --git a/quickstep/recents_ui_overrides/src/com/android/quickstep/views/LauncherRecentsView.java b/quickstep/recents_ui_overrides/src/com/android/quickstep/views/LauncherRecentsView.java
index 329436b..1ccc3f1 100644
--- a/quickstep/recents_ui_overrides/src/com/android/quickstep/views/LauncherRecentsView.java
+++ b/quickstep/recents_ui_overrides/src/com/android/quickstep/views/LauncherRecentsView.java
@@ -130,7 +130,7 @@
ClipAnimationHelper helper) {
AnimatorSet anim = super.createAdjacentPageAnimForTaskLaunch(tv, helper);
- if (!SysUINavigationMode.INSTANCE.get(mActivity).getMode().hasGestures) {
+ if (!SysUINavigationMode.getMode(mActivity).hasGestures) {
// Hotseat doesn't move when opening recents with the button,
// so don't animate it here either.
return anim;
diff --git a/quickstep/src/com/android/launcher3/uioverrides/UiFactory.java b/quickstep/src/com/android/launcher3/uioverrides/UiFactory.java
index 6d730b6..482bbde 100644
--- a/quickstep/src/com/android/launcher3/uioverrides/UiFactory.java
+++ b/quickstep/src/com/android/launcher3/uioverrides/UiFactory.java
@@ -37,14 +37,17 @@
import com.android.launcher3.AbstractFloatingView;
import com.android.launcher3.Launcher;
import com.android.launcher3.LauncherState;
+import com.android.launcher3.LauncherState.ScaleAndTranslation;
import com.android.launcher3.LauncherStateManager;
import com.android.launcher3.LauncherStateManager.StateHandler;
import com.android.launcher3.QuickstepAppTransitionManagerImpl;
import com.android.launcher3.Utilities;
+import com.android.launcher3.config.FeatureFlags;
import com.android.launcher3.dragndrop.DragLayer;
import com.android.quickstep.OverviewInteractionState;
import com.android.quickstep.RecentsModel;
import com.android.quickstep.SysUINavigationMode;
+import com.android.quickstep.SysUINavigationMode.Mode;
import com.android.quickstep.SysUINavigationMode.NavigationModeChangeListener;
import com.android.quickstep.util.RemoteFadeOutAnimationListener;
import com.android.systemui.shared.system.ActivityCompat;
@@ -186,4 +189,13 @@
out.toByteArray(), Base64.NO_WRAP | Base64.NO_PADDING));
return true;
}
+
+ public static ScaleAndTranslation getOverviewScaleAndTranslationForNormalState(Launcher l) {
+ if (SysUINavigationMode.getMode(l) == Mode.NO_BUTTON) {
+ float offscreenTranslationX = l.getDragLayer().getWidth()
+ - l.getOverviewPanel().getPaddingStart();
+ return new ScaleAndTranslation(1f, offscreenTranslationX, 0f);
+ }
+ return new ScaleAndTranslation(1.1f, 0f, 0f);
+ }
}
diff --git a/quickstep/src/com/android/quickstep/OverviewInteractionState.java b/quickstep/src/com/android/quickstep/OverviewInteractionState.java
index ce472c6..286ddc0 100644
--- a/quickstep/src/com/android/quickstep/OverviewInteractionState.java
+++ b/quickstep/src/com/android/quickstep/OverviewInteractionState.java
@@ -27,10 +27,8 @@
import com.android.launcher3.Utilities;
import com.android.launcher3.allapps.DiscoveryBounce;
-import com.android.launcher3.config.FeatureFlags;
import com.android.launcher3.util.MainThreadInitializedObject;
import com.android.launcher3.util.UiThreadHelper;
-import com.android.quickstep.SysUINavigationMode.Mode;
import com.android.systemui.shared.recents.ISystemUiProxy;
import androidx.annotation.WorkerThread;
@@ -150,8 +148,6 @@
}
private void onNavigationModeChanged(SysUINavigationMode.Mode mode) {
- FeatureFlags.SWIPE_HOME.updateStorage(mContext, mode == Mode.NO_BUTTON);
-
mSwipeUpEnabled = mode.hasGestures;
resetHomeBounceSeenOnQuickstepEnabledFirstTime();
mBgHandler.obtainMessage(MSG_APPLY_FLAGS).sendToTarget();
diff --git a/quickstep/src/com/android/quickstep/SysUINavigationMode.java b/quickstep/src/com/android/quickstep/SysUINavigationMode.java
index 1953ecb..dbae794 100644
--- a/quickstep/src/com/android/quickstep/SysUINavigationMode.java
+++ b/quickstep/src/com/android/quickstep/SysUINavigationMode.java
@@ -48,6 +48,10 @@
}
}
+ public static Mode getMode(Context context) {
+ return INSTANCE.get(context).getMode();
+ }
+
public static MainThreadInitializedObject<SysUINavigationMode> INSTANCE =
new MainThreadInitializedObject<>(SysUINavigationMode::new);
diff --git a/quickstep/src/com/android/quickstep/util/LayoutUtils.java b/quickstep/src/com/android/quickstep/util/LayoutUtils.java
index a06209a..bfe31d1 100644
--- a/quickstep/src/com/android/quickstep/util/LayoutUtils.java
+++ b/quickstep/src/com/android/quickstep/util/LayoutUtils.java
@@ -27,6 +27,8 @@
import com.android.launcher3.DeviceProfile;
import com.android.launcher3.R;
import com.android.launcher3.config.FeatureFlags;
+import com.android.quickstep.SysUINavigationMode;
+import com.android.quickstep.SysUINavigationMode.Mode;
import java.lang.annotation.Retention;
@@ -116,7 +118,7 @@
}
public static int getShelfTrackingDistance(Context context, DeviceProfile dp) {
- if (FeatureFlags.SWIPE_HOME.get()) {
+ if (SysUINavigationMode.getMode(context) == Mode.NO_BUTTON) {
// Track the bottom of the window rather than the top of the shelf.
int shelfHeight = dp.hotseatBarSizePx + dp.getInsets().bottom;
int spaceBetweenShelfAndRecents = (int) context.getResources().getDimension(
diff --git a/quickstep/src/com/android/quickstep/views/ShelfScrimView.java b/quickstep/src/com/android/quickstep/views/ShelfScrimView.java
index fe05c4f..d74e880 100644
--- a/quickstep/src/com/android/quickstep/views/ShelfScrimView.java
+++ b/quickstep/src/com/android/quickstep/views/ShelfScrimView.java
@@ -34,9 +34,11 @@
import com.android.launcher3.R;
import com.android.launcher3.Utilities;
import com.android.launcher3.anim.Interpolators;
-import com.android.launcher3.config.FeatureFlags;
import com.android.launcher3.util.Themes;
import com.android.launcher3.views.ScrimView;
+import com.android.quickstep.SysUINavigationMode;
+import com.android.quickstep.SysUINavigationMode.Mode;
+import com.android.quickstep.SysUINavigationMode.NavigationModeChangeListener;
/**
* Scrim used for all-apps and shelf in Overview
@@ -45,7 +47,7 @@
* From normal state to overview state, the shelf just fades in and does not move
* From overview state to all-apps state the shelf moves up and fades in to cover the screen
*/
-public class ShelfScrimView extends ScrimView {
+public class ShelfScrimView extends ScrimView implements NavigationModeChangeListener {
// If the progress is more than this, shelf follows the finger, otherwise it moves faster to
// cover the whole screen
@@ -78,6 +80,8 @@
private final Path mRemainingScreenPath = new Path();
private boolean mRemainingScreenPathValid = false;
+ private Mode mSysUINavigationMode;
+
public ShelfScrimView(Context context, AttributeSet attrs) {
super(context, attrs);
mMaxScrimAlpha = Math.round(OVERVIEW.getWorkspaceScrimAlpha(mLauncher) * 255);
@@ -98,6 +102,24 @@
}
@Override
+ protected void onAttachedToWindow() {
+ super.onAttachedToWindow();
+ onNavigationModeChanged(SysUINavigationMode.INSTANCE.get(getContext())
+ .addModeChangeListener(this));
+ }
+
+ @Override
+ protected void onDetachedFromWindow() {
+ super.onDetachedFromWindow();
+ SysUINavigationMode.INSTANCE.get(getContext()).removeModeChangeListener(this);
+ }
+
+ @Override
+ public void onNavigationModeChanged(Mode newMode) {
+ mSysUINavigationMode = newMode;
+ }
+
+ @Override
public void reInitUi() {
DeviceProfile dp = mLauncher.getDeviceProfile();
mDrawingFlatColor = dp.isVerticalBarLayout();
@@ -137,7 +159,7 @@
if (mProgress >= 1) {
mRemainingScreenColor = 0;
mShelfColor = 0;
- if (FeatureFlags.SWIPE_HOME.get()
+ if (mSysUINavigationMode == Mode.NO_BUTTON
&& mLauncher.getStateManager().getState() == BACKGROUND_APP) {
// Show the shelf background when peeking during swipe up.
mShelfColor = setColorAlphaBound(mEndScrim, mMidAlpha);
diff --git a/quickstep/tests/src/com/android/quickstep/NavigationModeSwitchRule.java b/quickstep/tests/src/com/android/quickstep/NavigationModeSwitchRule.java
index f5ac9c9..895485d 100644
--- a/quickstep/tests/src/com/android/quickstep/NavigationModeSwitchRule.java
+++ b/quickstep/tests/src/com/android/quickstep/NavigationModeSwitchRule.java
@@ -17,6 +17,7 @@
package com.android.quickstep;
import static androidx.test.InstrumentationRegistry.getInstrumentation;
+
import static com.android.quickstep.NavigationModeSwitchRule.Mode.ALL;
import static com.android.quickstep.NavigationModeSwitchRule.Mode.THREE_BUTTON;
import static com.android.quickstep.NavigationModeSwitchRule.Mode.TWO_BUTTON;
@@ -26,18 +27,23 @@
import android.content.Context;
import android.util.Log;
+
import androidx.test.uiautomator.UiDevice;
+
import com.android.launcher3.tapl.LauncherInstrumentation;
import com.android.launcher3.tapl.TestHelpers;
-import java.lang.annotation.ElementType;
-import java.lang.annotation.Retention;
-import java.lang.annotation.RetentionPolicy;
-import java.lang.annotation.Target;
+import com.android.systemui.shared.system.QuickStepContract;
+
import org.junit.Assert;
import org.junit.rules.TestRule;
import org.junit.runner.Description;
import org.junit.runners.model.Statement;
+import java.lang.annotation.ElementType;
+import java.lang.annotation.Retention;
+import java.lang.annotation.RetentionPolicy;
+import java.lang.annotation.Target;
+
/**
* Test rule that allows executing a test with Quickstep on and then Quickstep off.
* The test should be annotated with @QuickstepOnOff.
@@ -72,9 +78,9 @@
@Override
public void evaluate() throws Throwable {
final Context context = getInstrumentation().getContext();
- final String prevOverlayPkg = LauncherInstrumentation.isGesturalMode(context)
+ final String prevOverlayPkg = QuickStepContract.isGesturalMode(context)
? NAV_BAR_MODE_GESTURAL_OVERLAY
- : LauncherInstrumentation.isSwipeUpMode(context)
+ : QuickStepContract.isSwipeUpMode(context)
? NAV_BAR_MODE_2BUTTON_OVERLAY
: NAV_BAR_MODE_3BUTTON_OVERLAY;
final LauncherInstrumentation.NavigationModel originalMode =
@@ -144,4 +150,4 @@
return base;
}
}
-}
+}
\ No newline at end of file
diff --git a/quickstep/tests/src/com/android/quickstep/TaplTestsQuickstep.java b/quickstep/tests/src/com/android/quickstep/TaplTestsQuickstep.java
index 4112ccf..1709516 100644
--- a/quickstep/tests/src/com/android/quickstep/TaplTestsQuickstep.java
+++ b/quickstep/tests/src/com/android/quickstep/TaplTestsQuickstep.java
@@ -60,7 +60,7 @@
}
private void startTestApps() throws Exception {
- startAppFast(resolveSystemApp(Intent.CATEGORY_APP_MARKET));
+ startAppFast(resolveSystemApp(Intent.CATEGORY_APP_BROWSER));
startAppFast(resolveSystemApp(Intent.CATEGORY_APP_CALCULATOR));
startAppFast(resolveSystemApp(Intent.CATEGORY_APP_CONTACTS));
diff --git a/src/com/android/launcher3/LauncherState.java b/src/com/android/launcher3/LauncherState.java
index c65a871..124574c 100644
--- a/src/com/android/launcher3/LauncherState.java
+++ b/src/com/android/launcher3/LauncherState.java
@@ -199,12 +199,7 @@
}
public ScaleAndTranslation getOverviewScaleAndTranslation(Launcher launcher) {
- if (FeatureFlags.SWIPE_HOME.get()) {
- float offscreenTranslationX = launcher.getDragLayer().getWidth()
- - launcher.getOverviewPanel().getPaddingStart();
- return new ScaleAndTranslation(1f, offscreenTranslationX, 0f);
- }
- return new ScaleAndTranslation(1.1f, 0f, 0f);
+ return UiFactory.getOverviewScaleAndTranslationForNormalState(launcher);
}
public void onStateEnabled(Launcher launcher) {
diff --git a/src/com/android/launcher3/config/BaseFlags.java b/src/com/android/launcher3/config/BaseFlags.java
index 656151f..5150b7c 100644
--- a/src/com/android/launcher3/config/BaseFlags.java
+++ b/src/com/android/launcher3/config/BaseFlags.java
@@ -110,10 +110,6 @@
public static final TogglableFlag ENABLE_QUICKSTEP_LIVE_TILE = new TogglableFlag(
"ENABLE_QUICKSTEP_LIVE_TILE", false, "Enable live tile in Quickstep overview");
- public static final ToggleableGlobalSettingsFlag SWIPE_HOME
- = new ToggleableGlobalSettingsFlag("SWIPE_HOME", false,
- "Swiping up on the nav bar goes home. Swipe and hold goes to recent apps.");
-
public static final TogglableFlag ENABLE_HINTS_IN_OVERVIEW = new TogglableFlag(
"ENABLE_HINTS_IN_OVERVIEW", false,
"Show chip hints and gleams on the overview screen");
diff --git a/src_ui_overrides/com/android/launcher3/uioverrides/UiFactory.java b/src_ui_overrides/com/android/launcher3/uioverrides/UiFactory.java
index 9939c25..c01b54a 100644
--- a/src_ui_overrides/com/android/launcher3/uioverrides/UiFactory.java
+++ b/src_ui_overrides/com/android/launcher3/uioverrides/UiFactory.java
@@ -21,6 +21,7 @@
import android.os.CancellationSignal;
import com.android.launcher3.Launcher;
+import com.android.launcher3.LauncherState.ScaleAndTranslation;
import com.android.launcher3.LauncherStateManager.StateHandler;
import com.android.launcher3.dragndrop.DragLayer;
import com.android.launcher3.util.TouchController;
@@ -67,4 +68,9 @@
public static void prepareToShowOverview(Launcher launcher) { }
public static void setBackButtonAlpha(Launcher launcher, float alpha, boolean animate) { }
+
+
+ public static ScaleAndTranslation getOverviewScaleAndTranslationForNormalState(Launcher l) {
+ return new ScaleAndTranslation(1.1f, 0f, 0f);
+ }
}
diff --git a/tests/src/com/android/launcher3/touch/SwipeDetectorTest.java b/tests/src/com/android/launcher3/touch/SwipeDetectorTest.java
index 4ebf54c..e042357 100644
--- a/tests/src/com/android/launcher3/touch/SwipeDetectorTest.java
+++ b/tests/src/com/android/launcher3/touch/SwipeDetectorTest.java
@@ -17,6 +17,7 @@
import static org.mockito.Matchers.anyBoolean;
import static org.mockito.Matchers.anyFloat;
+import static org.mockito.Matchers.anyObject;
import static org.mockito.Mockito.doReturn;
import static org.mockito.Mockito.never;
import static org.mockito.Mockito.verify;
@@ -149,7 +150,7 @@
mGenerator.put(0, 100, 100);
mGenerator.move(0, 100, 100 + mTouchSlop);
// TODO: actually calculate the following parameters and do exact value checks.
- verify(mMockListener).onDrag(anyFloat());
+ verify(mMockListener).onDrag(anyFloat(), anyObject());
}
@Test
diff --git a/tests/src/com/android/launcher3/ui/AbstractLauncherUiTest.java b/tests/src/com/android/launcher3/ui/AbstractLauncherUiTest.java
index dd768fd..8a2e816 100644
--- a/tests/src/com/android/launcher3/ui/AbstractLauncherUiTest.java
+++ b/tests/src/com/android/launcher3/ui/AbstractLauncherUiTest.java
@@ -20,6 +20,8 @@
import static org.junit.Assert.assertTrue;
import static org.junit.Assert.fail;
+import static java.lang.System.exit;
+
import android.app.Instrumentation;
import android.content.BroadcastReceiver;
import android.content.Context;
@@ -29,6 +31,7 @@
import android.content.pm.PackageManager;
import android.os.Process;
import android.os.RemoteException;
+import android.util.Log;
import android.view.Surface;
import androidx.test.InstrumentationRegistry;
@@ -78,9 +81,10 @@
public static final long DEFAULT_ACTIVITY_TIMEOUT = TimeUnit.SECONDS.toMillis(10);
public static final long DEFAULT_BROADCAST_TIMEOUT_SECS = 5;
- public static final long SHORT_UI_TIMEOUT= 300;
+ public static final long SHORT_UI_TIMEOUT = 300;
public static final long DEFAULT_UI_TIMEOUT = 10000;
protected static final int LONG_WAIT_TIME_MS = 60000;
+ private static final String TAG = "AbstractLauncherUiTest";
protected MainThreadExecutor mMainThreadExecutor = new MainThreadExecutor();
protected final UiDevice mDevice;
@@ -107,10 +111,12 @@
@Rule
public LauncherActivityRule mActivityMonitor = new LauncherActivityRule();
- @Rule public ShellCommandRule mDefaultLauncherRule =
+ @Rule
+ public ShellCommandRule mDefaultLauncherRule =
TestHelpers.isInLauncherProcess() ? ShellCommandRule.setDefaultLauncher() : null;
- @Rule public ShellCommandRule mDisableHeadsUpNotification =
+ @Rule
+ public ShellCommandRule mDisableHeadsUpNotification =
ShellCommandRule.disableHeadsUpNotification();
// Annotation for tests that need to be run in portrait and landscape modes.
@@ -164,9 +170,17 @@
}
@After
- public void tearDown() throws Exception {
- // Limits UI tests affecting tests running after them.
- waitForModelLoaded();
+ public void tearDown() {
+ try {
+ // Limits UI tests affecting tests running after them.
+ waitForModelLoaded();
+ } catch (Throwable t) {
+ Log.e(TAG,
+ "Couldn't deinit after a test, exiting tests, see logs for failures that "
+ + "could have caused this",
+ t);
+ exit(1);
+ }
}
protected void lockRotation(boolean naturalOrientation) throws RemoteException {
@@ -189,6 +203,7 @@
/**
* Scrolls the {@param container} until it finds an object matching {@param condition}.
+ *
* @return the matching object.
*/
protected UiObject2 scrollAndFind(UiObject2 container, BySelector condition) {
diff --git a/tests/src/com/android/launcher3/ui/TaplTestsLauncher3.java b/tests/src/com/android/launcher3/ui/TaplTestsLauncher3.java
index d29d29c..c2e6749 100644
--- a/tests/src/com/android/launcher3/ui/TaplTestsLauncher3.java
+++ b/tests/src/com/android/launcher3/ui/TaplTestsLauncher3.java
@@ -207,8 +207,8 @@
// Test that ensureWorkspaceIsScrollable adds a page by dragging an icon there.
executeOnLauncher(launcher -> assertFalse("Initial workspace state is scrollable",
isWorkspaceScrollable(launcher)));
- assertNull("Play Store app was found on empty workspace",
- workspace.tryGetWorkspaceAppIcon("Play Store"));
+ assertNull("Chrome app was found on empty workspace",
+ workspace.tryGetWorkspaceAppIcon("Chrome"));
workspace.ensureWorkspaceIsScrollable();
@@ -218,8 +218,8 @@
executeOnLauncher(
launcher -> assertTrue("ensureScrollable didn't make workspace scrollable",
isWorkspaceScrollable(launcher)));
- assertNotNull("ensureScrollable didn't add Play Store app",
- workspace.tryGetWorkspaceAppIcon("Play Store"));
+ assertNotNull("ensureScrollable didn't add Chrome app",
+ workspace.tryGetWorkspaceAppIcon("Chrome"));
// Test flinging workspace.
workspace.flingBackward();
@@ -235,10 +235,10 @@
assertTrue("Launcher internal state is not Home", isInState(LauncherState.NORMAL));
// Test starting a workspace app.
- final AppIcon app = workspace.tryGetWorkspaceAppIcon("Play Store");
- assertNotNull("No Play Store app in workspace", app);
+ final AppIcon app = workspace.tryGetWorkspaceAppIcon("Chrome");
+ assertNotNull("No Chrome app in workspace", app);
assertNotNull("AppIcon.launch returned null",
- app.launch(resolveSystemApp(Intent.CATEGORY_APP_MARKET)));
+ app.launch(resolveSystemApp(Intent.CATEGORY_APP_BROWSER)));
executeOnLauncher(launcher -> assertTrue(
"Launcher activity is the top activity; expecting another activity to be the top "
+ "one",
diff --git a/tests/src/com/android/launcher3/ui/widget/BindWidgetTest.java b/tests/src/com/android/launcher3/ui/widget/BindWidgetTest.java
index 68b16d6..c8e7786 100644
--- a/tests/src/com/android/launcher3/ui/widget/BindWidgetTest.java
+++ b/tests/src/com/android/launcher3/ui/widget/BindWidgetTest.java
@@ -95,7 +95,7 @@
}
@After
- public void tearDown() throws Exception {
+ public void tearDown() {
if (mCursor != null) {
mCursor.close();
}
diff --git a/tests/tapl/com/android/launcher3/tapl/BaseOverview.java b/tests/tapl/com/android/launcher3/tapl/BaseOverview.java
index 4205188..74a17ce 100644
--- a/tests/tapl/com/android/launcher3/tapl/BaseOverview.java
+++ b/tests/tapl/com/android/launcher3/tapl/BaseOverview.java
@@ -48,8 +48,7 @@
mLauncher.addContextLayer("want to fling forward in overview")) {
LauncherInstrumentation.log("Overview.flingForward before fling");
final UiObject2 overview = verifyActiveContainer();
- final int margin = (int) (50 * mLauncher.getDisplayDensity()) + 1;
- overview.setGestureMargins(margin, 0, 0, 0);
+ overview.setGestureMargins(mLauncher.getEdgeSensitivityWidth(), 0, 0, 0);
overview.fling(Direction.LEFT, (int) (FLING_SPEED * mLauncher.getDisplayDensity()));
mLauncher.waitForIdle();
verifyActiveContainer();
@@ -86,8 +85,7 @@
mLauncher.addContextLayer("want to fling backward in overview")) {
LauncherInstrumentation.log("Overview.flingBackward before fling");
final UiObject2 overview = verifyActiveContainer();
- final int margin = (int) (50 * mLauncher.getDisplayDensity()) + 1;
- overview.setGestureMargins(0, 0, margin, 0);
+ overview.setGestureMargins(0, 0, mLauncher.getEdgeSensitivityWidth(), 0);
overview.fling(Direction.RIGHT, (int) (FLING_SPEED * mLauncher.getDisplayDensity()));
mLauncher.waitForIdle();
verifyActiveContainer();
diff --git a/tests/tapl/com/android/launcher3/tapl/LauncherInstrumentation.java b/tests/tapl/com/android/launcher3/tapl/LauncherInstrumentation.java
index a4b4171..c72f7d0 100644
--- a/tests/tapl/com/android/launcher3/tapl/LauncherInstrumentation.java
+++ b/tests/tapl/com/android/launcher3/tapl/LauncherInstrumentation.java
@@ -22,7 +22,6 @@
import android.content.ContentResolver;
import android.content.Context;
import android.content.pm.PackageManager;
-import android.content.res.Resources;
import android.graphics.Point;
import android.net.Uri;
import android.os.Build;
@@ -36,6 +35,7 @@
import android.view.Surface;
import android.view.ViewConfiguration;
import android.view.accessibility.AccessibilityEvent;
+
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.test.uiautomator.By;
@@ -44,15 +44,18 @@
import androidx.test.uiautomator.UiDevice;
import androidx.test.uiautomator.UiObject2;
import androidx.test.uiautomator.Until;
+
import com.android.launcher3.TestProtocol;
import com.android.systemui.shared.system.QuickStepContract;
+
+import org.junit.Assert;
+
import java.io.IOException;
import java.lang.ref.WeakReference;
import java.util.Deque;
import java.util.LinkedList;
import java.util.List;
import java.util.concurrent.TimeoutException;
-import org.junit.Assert;
/**
* The main tapl object. The only object that can be explicitly constructed by the using code. It
@@ -61,8 +64,6 @@
public final class LauncherInstrumentation {
private static final String TAG = "Tapl";
- private static final String NAV_BAR_INTERACTION_MODE_RES_NAME =
- "config_navBarInteractionMode";
private static final int ZERO_BUTTON_STEPS_FROM_BACKGROUND_TO_HOME = 20;
// Types for launcher containers that the user is interacting with. "Background" is a
@@ -149,6 +150,8 @@
} catch (IOException e) {
fail(e.toString());
}
+
+ assertTrue("Phone is locked", !hasSystemUiObject("keyguard_status_view"));
}
Context getContext() {
@@ -169,11 +172,11 @@
// Workaround, use constructed context because both the instrumentation context and the
// app context are not constructed with resources that take overlays into account
final Context ctx = baseContext.createPackageContext("android", 0);
- if (isGesturalMode(ctx)) {
+ if (QuickStepContract.isGesturalMode(ctx)) {
return NavigationModel.ZERO_BUTTON;
- } else if (isSwipeUpMode(ctx)) {
+ } else if (QuickStepContract.isSwipeUpMode(ctx)) {
return NavigationModel.TWO_BUTTON;
- } else if (isLegacyMode(ctx)) {
+ } else if (QuickStepContract.isLegacyMode(ctx)) {
return NavigationModel.THREE_BUTTON;
} else {
fail("Can't detect navigation mode");
@@ -245,10 +248,10 @@
final NavigationModel navigationModel = getNavigationModel();
assertTrue("Presence of recents button doesn't match the interaction mode",
(navigationModel == NavigationModel.THREE_BUTTON) ==
- mDevice.hasObject(By.res(SYSTEMUI_PACKAGE, "recent_apps")));
+ hasSystemUiObject("recent_apps"));
assertTrue("Presence of home button doesn't match the interaction mode",
(navigationModel != NavigationModel.ZERO_BUTTON) ==
- mDevice.hasObject(By.res(SYSTEMUI_PACKAGE, "home")));
+ hasSystemUiObject("home"));
log("verifyContainerType: " + containerType);
try (Closable c = addContextLayer(
@@ -477,6 +480,10 @@
WAIT_TIME_MS));
}
+ private boolean hasSystemUiObject(String resId) {
+ return mDevice.hasObject(By.res(SYSTEMUI_PACKAGE, resId));
+ }
+
@NonNull
UiObject2 waitForSystemUiObject(String resId) {
final UiObject2 object = mDevice.wait(
@@ -600,37 +607,20 @@
}
}
- public static boolean isGesturalMode(Context context) {
- return QuickStepContract.isGesturalMode(
- getSystemIntegerRes(context, NAV_BAR_INTERACTION_MODE_RES_NAME));
- }
-
- public static boolean isSwipeUpMode(Context context) {
- return QuickStepContract.isSwipeUpMode(
- getSystemIntegerRes(context, NAV_BAR_INTERACTION_MODE_RES_NAME));
- }
-
- public static boolean isLegacyMode(Context context) {
- return QuickStepContract.isLegacyMode(
- getSystemIntegerRes(context, NAV_BAR_INTERACTION_MODE_RES_NAME));
- }
-
- private static int getSystemIntegerRes(Context context, String resName) {
- Resources res = context.getResources();
- int resId = res.getIdentifier(resName, "integer", "android");
-
- if (resId != 0) {
- return res.getInteger(resId);
- } else {
- Log.e(TAG, "Failed to get system resource ID. Incompatible framework version?");
- return -1;
- }
- }
-
static void sleep(int duration) {
try {
Thread.sleep(duration);
} catch (InterruptedException e) {
}
}
+
+ int getEdgeSensitivityWidth() {
+ try {
+ return QuickStepContract.getEdgeSensitivityWidth(
+ mInstrumentation.getTargetContext().createPackageContext("android", 0)) + 1;
+ } catch (PackageManager.NameNotFoundException e) {
+ fail("Can't get edge sensitivity: " + e);
+ return 0;
+ }
+ }
}
\ No newline at end of file
diff --git a/tests/tapl/com/android/launcher3/tapl/Workspace.java b/tests/tapl/com/android/launcher3/tapl/Workspace.java
index 91443d0..f04afa0 100644
--- a/tests/tapl/com/android/launcher3/tapl/Workspace.java
+++ b/tests/tapl/com/android/launcher3/tapl/Workspace.java
@@ -114,7 +114,7 @@
if (!isWorkspaceScrollable(workspace)) {
dragIconToWorkspace(
mLauncher,
- getHotseatAppIcon("Play Store"),
+ getHotseatAppIcon("Chrome"),
new Point(mLauncher.getDevice().getDisplayWidth(),
workspace.getVisibleBounds().centerY()),
(int) (ICON_DRAG_SPEED * mLauncher.getDisplayDensity()));
@@ -148,8 +148,7 @@
*/
public void flingForward() {
final UiObject2 workspace = verifyActiveContainer();
- final int margin = (int) (50 * mLauncher.getDisplayDensity()) + 1;
- workspace.setGestureMargins(0, 0, margin, 0);
+ workspace.setGestureMargins(0, 0, mLauncher.getEdgeSensitivityWidth(), 0);
workspace.fling(Direction.RIGHT, (int) (FLING_SPEED * mLauncher.getDisplayDensity()));
mLauncher.waitForIdle();
verifyActiveContainer();
@@ -161,8 +160,7 @@
*/
public void flingBackward() {
final UiObject2 workspace = verifyActiveContainer();
- final int margin = (int) (50 * mLauncher.getDisplayDensity()) + 1;
- workspace.setGestureMargins(margin, 0, 0, 0);
+ workspace.setGestureMargins(mLauncher.getEdgeSensitivityWidth(), 0, 0, 0);
workspace.fling(Direction.LEFT, (int) (FLING_SPEED * mLauncher.getDisplayDensity()));
mLauncher.waitForIdle();
verifyActiveContainer();