diff --git a/Android.mk b/Android.mk index aff12c5e5f..2c595505ff 100644 --- a/Android.mk +++ b/Android.mk @@ -91,9 +91,6 @@ LOCAL_FULL_LIBS_MANIFEST_FILES := $(LOCAL_PATH)/AndroidManifest-common.xml LOCAL_JACK_COVERAGE_INCLUDE_FILTER := com.android.launcher3.* -LOCAL_LICENSE_KINDS := SPDX-license-identifier-Apache-2.0 -LOCAL_LICENSE_CONDITIONS := notice -LOCAL_NOTICE_FILE := $(LOCAL_PATH)/NOTICE include $(BUILD_PACKAGE) # @@ -127,9 +124,6 @@ LOCAL_FULL_LIBS_MANIFEST_FILES := \ LOCAL_MANIFEST_FILE := go/AndroidManifest.xml LOCAL_JACK_COVERAGE_INCLUDE_FILTER := com.android.launcher3.* -LOCAL_LICENSE_KINDS := SPDX-license-identifier-Apache-2.0 -LOCAL_LICENSE_CONDITIONS := notice -LOCAL_NOTICE_FILE := $(LOCAL_PATH)/NOTICE include $(BUILD_PACKAGE) # @@ -206,9 +200,6 @@ LOCAL_FULL_LIBS_MANIFEST_FILES := \ LOCAL_MANIFEST_FILE := quickstep/AndroidManifest.xml LOCAL_JACK_COVERAGE_INCLUDE_FILTER := com.android.launcher3.* -LOCAL_LICENSE_KINDS := SPDX-license-identifier-Apache-2.0 -LOCAL_LICENSE_CONDITIONS := notice -LOCAL_NOTICE_FILE := $(LOCAL_PATH)/NOTICE include $(BUILD_PACKAGE) @@ -259,9 +250,6 @@ LOCAL_FULL_LIBS_MANIFEST_FILES := \ LOCAL_MANIFEST_FILE := quickstep/AndroidManifest.xml LOCAL_JACK_COVERAGE_INCLUDE_FILTER := com.android.launcher3.* -LOCAL_LICENSE_KINDS := SPDX-license-identifier-Apache-2.0 -LOCAL_LICENSE_CONDITIONS := notice -LOCAL_NOTICE_FILE := $(LOCAL_PATH)/NOTICE include $(BUILD_PACKAGE) diff --git a/quickstep/recents_ui_overrides/src/com/android/quickstep/TaskOverlayFactory.java b/quickstep/recents_ui_overrides/src/com/android/quickstep/TaskOverlayFactory.java index 36579ec736..a59584787c 100644 --- a/quickstep/recents_ui_overrides/src/com/android/quickstep/TaskOverlayFactory.java +++ b/quickstep/recents_ui_overrides/src/com/android/quickstep/TaskOverlayFactory.java @@ -147,10 +147,10 @@ public class TaskOverlayFactory implements ResourceBasedOverride { public void initOverlay(Task task, ThumbnailData thumbnail, Matrix matrix, boolean rotated) { getActionsView().updateDisabledFlags(DISABLED_NO_THUMBNAIL, thumbnail == null); + final boolean isAllowedByPolicy = mThumbnailView.isRealSnapshot(); if (thumbnail != null) { getActionsView().updateDisabledFlags(DISABLED_ROTATED, rotated); - final boolean isAllowedByPolicy = thumbnail.isRealSnapshot; getActionsView().setCallbacks(new OverlayUICallbacks() { @Override diff --git a/quickstep/recents_ui_overrides/src/com/android/quickstep/views/RecentsView.java b/quickstep/recents_ui_overrides/src/com/android/quickstep/views/RecentsView.java index 0130cae47b..23941fadc7 100644 --- a/quickstep/recents_ui_overrides/src/com/android/quickstep/views/RecentsView.java +++ b/quickstep/recents_ui_overrides/src/com/android/quickstep/views/RecentsView.java @@ -73,7 +73,6 @@ import android.text.StaticLayout; import android.text.TextPaint; import android.util.AttributeSet; import android.util.FloatProperty; -import android.util.Property; import android.util.SparseBooleanArray; import android.view.HapticFeedbackConstants; import android.view.KeyEvent; @@ -1488,7 +1487,9 @@ public abstract class RecentsView extends PagedView } int scrollDiff = newScroll[i] - oldScroll[i] + offset; if (scrollDiff != 0) { - Property translationProperty = mOrientationHandler.getPrimaryViewTranslate(); + FloatProperty translationProperty = child instanceof TaskView + ? ((TaskView) child).getPrimaryFillDismissGapTranslationProperty() + : mOrientationHandler.getPrimaryViewTranslate(); ResourceProvider rp = DynamicResource.provider(mActivity); SpringProperty sp = new SpringProperty(SpringProperty.FLAG_CAN_SPRING_ON_END) @@ -1883,7 +1884,11 @@ public abstract class RecentsView extends PagedView ? modalLeftOffsetSize : modalRightOffsetSize; float totalTranslation = translation + modalTranslation; - mOrientationHandler.getPrimaryViewTranslate().set(getChildAt(i), + View child = getChildAt(i); + FloatProperty translationProperty = child instanceof TaskView + ? ((TaskView) child).getPrimaryTaskOffsetTranslationProperty() + : mOrientationHandler.getPrimaryViewTranslate(); + translationProperty.set(child, totalTranslation * mOrientationHandler.getPrimaryTranslationDirectionFactor()); } updateCurveProperties(); diff --git a/quickstep/recents_ui_overrides/src/com/android/quickstep/views/TaskThumbnailView.java b/quickstep/recents_ui_overrides/src/com/android/quickstep/views/TaskThumbnailView.java index 607672a751..9e97a695ad 100644 --- a/quickstep/recents_ui_overrides/src/com/android/quickstep/views/TaskThumbnailView.java +++ b/quickstep/recents_ui_overrides/src/com/android/quickstep/views/TaskThumbnailView.java @@ -447,13 +447,14 @@ public class TaskThumbnailView extends View implements PluginListener FILL_DISMISS_GAP_TRANSLATION_X = + new FloatProperty("fillDismissGapTranslationX") { + @Override + public void setValue(TaskView taskView, float v) { + taskView.setFillDismissGapTranslationX(v); + } + + @Override + public Float get(TaskView taskView) { + return taskView.mFillDismissGapTranslationX; + } + }; + + private static final FloatProperty FILL_DISMISS_GAP_TRANSLATION_Y = + new FloatProperty("fillDismissGapTranslationY") { + @Override + public void setValue(TaskView taskView, float v) { + taskView.setFillDismissGapTranslationY(v); + } + + @Override + public Float get(TaskView taskView) { + return taskView.mFillDismissGapTranslationY; + } + }; + + private static final FloatProperty TASK_OFFSET_TRANSLATION_X = + new FloatProperty("taskOffsetTranslationX") { + @Override + public void setValue(TaskView taskView, float v) { + taskView.setTaskOffsetTranslationX(v); + } + + @Override + public Float get(TaskView taskView) { + return taskView.mTaskOffsetTranslationX; + } + }; + + private static final FloatProperty TASK_OFFSET_TRANSLATION_Y = + new FloatProperty("taskOffsetTranslationY") { + @Override + public void setValue(TaskView taskView, float v) { + taskView.setTaskOffsetTranslationY(v); + } + + @Override + public Float get(TaskView taskView) { + return taskView.mTaskOffsetTranslationY; + } + }; + private final OnAttachStateChangeListener mTaskMenuStateListener = new OnAttachStateChangeListener() { @Override @@ -180,6 +232,13 @@ public class TaskView extends FrameLayout implements PageCallbacks, Reusable { private final FullscreenDrawParams mCurrentFullscreenParams; private final BaseDraggingActivity mActivity; + // Various causes of changing primary translation, which we aggregate to setTranslationX/Y(). + // TODO: We should do this for secondary translation properties as well. + private float mFillDismissGapTranslationX; + private float mFillDismissGapTranslationY; + private float mTaskOffsetTranslationX; + private float mTaskOffsetTranslationY; + private ObjectAnimator mIconAndDimAnimator; private float mIconScaleAnimStartProgress = 0; private float mFocusTransitionProgress = 1; @@ -619,6 +678,8 @@ public class TaskView extends FrameLayout implements PageCallbacks, Reusable { protected void resetViewTransforms() { setCurveScale(1); + mFillDismissGapTranslationX = mTaskOffsetTranslationX = 0f; + mFillDismissGapTranslationY = mTaskOffsetTranslationY = 0f; setTranslationX(0f); setTranslationY(0f); setTranslationZ(0); @@ -835,6 +896,44 @@ public class TaskView extends FrameLayout implements PageCallbacks, Reusable { return mCurveScale; } + private void setFillDismissGapTranslationX(float x) { + mFillDismissGapTranslationX = x; + applyTranslationX(); + } + + private void setFillDismissGapTranslationY(float y) { + mFillDismissGapTranslationY = y; + applyTranslationY(); + } + + private void setTaskOffsetTranslationX(float x) { + mTaskOffsetTranslationX = x; + applyTranslationX(); + } + + private void setTaskOffsetTranslationY(float y) { + mTaskOffsetTranslationY = y; + applyTranslationY(); + } + + private void applyTranslationX() { + setTranslationX(mFillDismissGapTranslationX + mTaskOffsetTranslationX); + } + + private void applyTranslationY() { + setTranslationY(mFillDismissGapTranslationY + mTaskOffsetTranslationY); + } + + public FloatProperty getPrimaryFillDismissGapTranslationProperty() { + return getPagedOrientationHandler().getPrimaryValue( + FILL_DISMISS_GAP_TRANSLATION_X, FILL_DISMISS_GAP_TRANSLATION_Y); + } + + public FloatProperty getPrimaryTaskOffsetTranslationProperty() { + return getPagedOrientationHandler().getPrimaryValue( + TASK_OFFSET_TRANSLATION_X, TASK_OFFSET_TRANSLATION_Y); + } + @Override public boolean hasOverlappingRendering() { // TODO: Clip-out the icon region from the thumbnail, since they are overlapping. diff --git a/src/com/android/launcher3/CheckLongPressHelper.java b/src/com/android/launcher3/CheckLongPressHelper.java index ff405ece3e..c707df04c0 100644 --- a/src/com/android/launcher3/CheckLongPressHelper.java +++ b/src/com/android/launcher3/CheckLongPressHelper.java @@ -115,7 +115,7 @@ public class CheckLongPressHelper { private void triggerLongPress() { if ((mView.getParent() != null) && mView.hasWindowFocus() - && (!mView.isPressed() || mListener == null) + && (!mView.isPressed() || mListener != null) && !mHasPerformedLongPress) { boolean handled; if (mListener != null) { diff --git a/src/com/android/launcher3/touch/LandscapePagedViewHandler.java b/src/com/android/launcher3/touch/LandscapePagedViewHandler.java index e64d2bb0f9..bfa24ebf35 100644 --- a/src/com/android/launcher3/touch/LandscapePagedViewHandler.java +++ b/src/com/android/launcher3/touch/LandscapePagedViewHandler.java @@ -42,12 +42,12 @@ import com.android.launcher3.util.OverScroller; public class LandscapePagedViewHandler implements PagedOrientationHandler { @Override - public int getPrimaryValue(int x, int y) { + public T getPrimaryValue(T x, T y) { return y; } @Override - public int getSecondaryValue(int x, int y) { + public T getSecondaryValue(T x, T y) { return x; } diff --git a/src/com/android/launcher3/touch/PagedOrientationHandler.java b/src/com/android/launcher3/touch/PagedOrientationHandler.java index e4a24072f0..e7d2ad5c3d 100644 --- a/src/com/android/launcher3/touch/PagedOrientationHandler.java +++ b/src/com/android/launcher3/touch/PagedOrientationHandler.java @@ -83,8 +83,8 @@ public interface PagedOrientationHandler { boolean getRecentsRtlSetting(Resources resources); float getDegreesRotated(); int getRotation(); - int getPrimaryValue(int x, int y); - int getSecondaryValue(int x, int y); + T getPrimaryValue(T x, T y); + T getSecondaryValue(T x, T y); void delegateScrollTo(PagedView pagedView, int secondaryScroll, int primaryScroll); /** Uses {@params pagedView}.getScroll[X|Y]() method for the secondary amount*/ void delegateScrollTo(PagedView pagedView, int primaryScroll); diff --git a/src/com/android/launcher3/touch/PortraitPagedViewHandler.java b/src/com/android/launcher3/touch/PortraitPagedViewHandler.java index e4662de3b3..e5a89679e2 100644 --- a/src/com/android/launcher3/touch/PortraitPagedViewHandler.java +++ b/src/com/android/launcher3/touch/PortraitPagedViewHandler.java @@ -40,12 +40,12 @@ import com.android.launcher3.util.OverScroller; public class PortraitPagedViewHandler implements PagedOrientationHandler { @Override - public int getPrimaryValue(int x, int y) { + public T getPrimaryValue(T x, T y) { return x; } @Override - public int getSecondaryValue(int x, int y) { + public T getSecondaryValue(T x, T y) { return y; } diff --git a/tests/tapl/com/android/launcher3/tapl/Background.java b/tests/tapl/com/android/launcher3/tapl/Background.java index 0c4e5a9461..816cd7d3eb 100644 --- a/tests/tapl/com/android/launcher3/tapl/Background.java +++ b/tests/tapl/com/android/launcher3/tapl/Background.java @@ -210,6 +210,64 @@ public class Background extends LauncherInstrumentation.VisibleContainer { } mLauncher.expectEvent(TestProtocol.SEQUENCE_MAIN, TASK_START_EVENT); } + /** Swipes left to switch to the previous app. */ + public Background quickSwitchToPreviousAppSwipeLeft() { + try (LauncherInstrumentation.Closable e = mLauncher.eventsCheck(); + LauncherInstrumentation.Closable c = + mLauncher.addContextLayer("want to quick switch to the previous app")) { + verifyActiveContainer(); + quickSwitchToPreviousAppSwipeLeft(getExpectedStateForQuickSwitch()); + return new Background(mLauncher); + } + } + + protected void quickSwitchToPreviousAppSwipeLeft(int expectedState) { + final boolean launcherWasVisible = mLauncher.isLauncherVisible(); + boolean transposeInLandscape = false; + switch (mLauncher.getNavigationModel()) { + case TWO_BUTTON: + transposeInLandscape = true; + // Fall through, zero button and two button modes behave the same. + case ZERO_BUTTON: { + final int startX; + final int startY; + final int endX; + final int endY; + if (mLauncher.getDevice().isNaturalOrientation() || !transposeInLandscape) { + // Swipe from the bottom right to the bottom left of the screen. + startX = mLauncher.getDevice().getDisplayWidth(); + startY = getSwipeStartY(); + endX = 0; + endY = startY; + } else { + // Swipe from the bottom right to the top right of the screen. + startX = getSwipeStartX(); + startY = mLauncher.getRealDisplaySize().y - 1; + endX = startX; + endY = 0; + } + final boolean isZeroButton = + mLauncher.getNavigationModel() + == LauncherInstrumentation.NavigationModel.ZERO_BUTTON; + mLauncher.swipeToState(startX, startY, endX, endY, 20, expectedState, + launcherWasVisible && isZeroButton + ? LauncherInstrumentation.GestureScope.INSIDE_TO_OUTSIDE + : LauncherInstrumentation.GestureScope.OUTSIDE_WITH_PILFER); + break; + } + + case THREE_BUTTON: + // Double press the recents button. + UiObject2 recentsButton = mLauncher.waitForSystemUiObject("recent_apps"); + mLauncher.expectEvent(TestProtocol.SEQUENCE_MAIN, SQUARE_BUTTON_EVENT); + mLauncher.runToState(() -> recentsButton.click(), OVERVIEW_STATE_ORDINAL); + mLauncher.getOverview(); + mLauncher.expectEvent(TestProtocol.SEQUENCE_MAIN, SQUARE_BUTTON_EVENT); + recentsButton.click(); + break; + } + mLauncher.expectEvent(TestProtocol.SEQUENCE_MAIN, TASK_START_EVENT); + } protected String getSwipeHeightRequestName() { return TestProtocol.REQUEST_BACKGROUND_TO_OVERVIEW_SWIPE_HEIGHT;