mirror of
https://github.com/LawnchairLauncher/lawnchair.git
synced 2026-03-01 00:06:47 +00:00
Merge "Fix bug with Launcher animation canceling, esp. around OverviewSplitSelect" into tm-qpr-dev am: afff936235
Original change: https://googleplex-android-review.googlesource.com/c/platform/packages/apps/Launcher3/+/19659546 Change-Id: I702f1f3df37757d6c31d23b5812bf48d6a282069 Signed-off-by: Automerger Merge Worker <android-build-automerger-merge-worker@system.gserviceaccount.com>
This commit is contained in:
@@ -28,11 +28,10 @@ import static com.android.launcher3.states.StateAnimationConfig.ANIM_OVERVIEW_SP
|
||||
import static com.android.launcher3.states.StateAnimationConfig.ANIM_OVERVIEW_TRANSLATE_X;
|
||||
import static com.android.launcher3.states.StateAnimationConfig.ANIM_OVERVIEW_TRANSLATE_Y;
|
||||
import static com.android.launcher3.states.StateAnimationConfig.SKIP_OVERVIEW;
|
||||
import static com.android.quickstep.views.FloatingTaskView.PRIMARY_TRANSLATE_OFFSCREEN;
|
||||
import static com.android.quickstep.views.RecentsView.ADJACENT_PAGE_HORIZONTAL_OFFSET;
|
||||
import static com.android.quickstep.views.RecentsView.FIRST_FLOATING_TASK_TRANSLATE_OFFSCREEN;
|
||||
import static com.android.quickstep.views.RecentsView.RECENTS_GRID_PROGRESS;
|
||||
import static com.android.quickstep.views.RecentsView.RECENTS_SCALE_PROPERTY;
|
||||
import static com.android.quickstep.views.RecentsView.SPLIT_INSTRUCTIONS_FADE;
|
||||
import static com.android.quickstep.views.RecentsView.TASK_SECONDARY_TRANSLATION;
|
||||
import static com.android.quickstep.views.RecentsView.TASK_THUMBNAIL_SPLASH_ALPHA;
|
||||
|
||||
@@ -112,6 +111,7 @@ public abstract class BaseRecentsViewStateController<T extends RecentsView>
|
||||
// TODO (b/238651489): Refactor state management to avoid need for double check
|
||||
FloatingTaskView floatingTask = mRecentsView.getFirstFloatingTaskView();
|
||||
if (floatingTask != null) {
|
||||
// We are in split selection state currently, transitioning to another state
|
||||
DragLayer dragLayer = mLauncher.getDragLayer();
|
||||
RectF onScreenRectF = new RectF();
|
||||
Utilities.getBoundsForViewInDragLayer(mLauncher.getDragLayer(), floatingTask,
|
||||
@@ -127,8 +127,8 @@ public abstract class BaseRecentsViewStateController<T extends RecentsView>
|
||||
);
|
||||
|
||||
setter.setFloat(
|
||||
mRecentsView,
|
||||
FIRST_FLOATING_TASK_TRANSLATE_OFFSCREEN,
|
||||
mRecentsView.getFirstFloatingTaskView(),
|
||||
PRIMARY_TRANSLATE_OFFSCREEN,
|
||||
mRecentsView.getPagedOrientationHandler()
|
||||
.getFloatingTaskOffscreenTranslationTarget(
|
||||
floatingTask,
|
||||
@@ -140,14 +140,14 @@ public abstract class BaseRecentsViewStateController<T extends RecentsView>
|
||||
ANIM_OVERVIEW_SPLIT_SELECT_FLOATING_TASK_TRANSLATE_OFFSCREEN,
|
||||
LINEAR
|
||||
));
|
||||
setter.setFloat(
|
||||
mRecentsView,
|
||||
SPLIT_INSTRUCTIONS_FADE,
|
||||
1,
|
||||
setter.setViewAlpha(
|
||||
mRecentsView.getSplitInstructionsView(),
|
||||
0,
|
||||
config.getInterpolator(
|
||||
ANIM_OVERVIEW_SPLIT_SELECT_INSTRUCTIONS_FADE,
|
||||
LINEAR
|
||||
));
|
||||
)
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -226,6 +226,11 @@ public class FallbackRecentsView extends RecentsView<RecentsActivity, RecentsSta
|
||||
setFreezeViewVisibility(true);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onStateTransitionFailed(RecentsState toState) {
|
||||
reset();
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onStateTransitionComplete(RecentsState finalState) {
|
||||
if (finalState == HOME) {
|
||||
|
||||
@@ -14,6 +14,7 @@ import android.graphics.Rect;
|
||||
import android.graphics.RectF;
|
||||
import android.graphics.drawable.Drawable;
|
||||
import android.util.AttributeSet;
|
||||
import android.util.FloatProperty;
|
||||
import android.view.View;
|
||||
import android.view.ViewGroup;
|
||||
import android.widget.FrameLayout;
|
||||
@@ -49,6 +50,29 @@ import com.android.systemui.shared.system.QuickStepContract;
|
||||
*/
|
||||
public class FloatingTaskView extends FrameLayout {
|
||||
|
||||
public static final FloatProperty<FloatingTaskView> PRIMARY_TRANSLATE_OFFSCREEN =
|
||||
new FloatProperty<FloatingTaskView>("floatingTaskPrimaryTranslateOffscreen") {
|
||||
@Override
|
||||
public void setValue(FloatingTaskView view, float translation) {
|
||||
((RecentsView) view.mActivity.getOverviewPanel()).getPagedOrientationHandler()
|
||||
.setFloatingTaskPrimaryTranslation(
|
||||
view,
|
||||
translation,
|
||||
view.mActivity.getDeviceProfile()
|
||||
);
|
||||
}
|
||||
|
||||
@Override
|
||||
public Float get(FloatingTaskView view) {
|
||||
return ((RecentsView) view.mActivity.getOverviewPanel())
|
||||
.getPagedOrientationHandler()
|
||||
.getFloatingTaskPrimaryTranslation(
|
||||
view,
|
||||
view.mActivity.getDeviceProfile()
|
||||
);
|
||||
}
|
||||
};
|
||||
|
||||
private FloatingTaskThumbnailView mThumbnailView;
|
||||
private SplitPlaceholderView mSplitPlaceholderView;
|
||||
private RectF mStartingPosition;
|
||||
|
||||
@@ -319,4 +319,10 @@ public class GroupedTaskView extends TaskView {
|
||||
super.applyThumbnailSplashAlpha();
|
||||
mSnapshotView2.setSplashAlpha(mTaskThumbnailSplashAlpha);
|
||||
}
|
||||
|
||||
@Override
|
||||
void setThumbnailVisibility(int visibility) {
|
||||
super.setThumbnailVisibility(visibility);
|
||||
mSnapshotView2.setVisibility(visibility);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -119,6 +119,11 @@ public class LauncherRecentsView extends RecentsView<QuickstepLauncher, Launcher
|
||||
setFreezeViewVisibility(true);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onStateTransitionFailed(LauncherState toState) {
|
||||
reset();
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onStateTransitionComplete(LauncherState finalState) {
|
||||
if (finalState == NORMAL || finalState == SPRING_LOADED) {
|
||||
|
||||
@@ -397,39 +397,6 @@ public abstract class RecentsView<ACTIVITY_TYPE extends StatefulActivity<STATE_T
|
||||
}
|
||||
};
|
||||
|
||||
public static final FloatProperty<RecentsView> FIRST_FLOATING_TASK_TRANSLATE_OFFSCREEN =
|
||||
new FloatProperty<RecentsView>("firstFloatingTaskTranslateOffscreen") {
|
||||
@Override
|
||||
public void setValue(RecentsView view, float translation) {
|
||||
view.getPagedOrientationHandler().setFloatingTaskPrimaryTranslation(
|
||||
view.mFirstFloatingTaskView,
|
||||
translation,
|
||||
view.mActivity.getDeviceProfile()
|
||||
);
|
||||
}
|
||||
|
||||
@Override
|
||||
public Float get(RecentsView view) {
|
||||
return view.getPagedOrientationHandler().getFloatingTaskPrimaryTranslation(
|
||||
view.mFirstFloatingTaskView,
|
||||
view.mActivity.getDeviceProfile()
|
||||
);
|
||||
}
|
||||
};
|
||||
|
||||
public static final FloatProperty<RecentsView> SPLIT_INSTRUCTIONS_FADE =
|
||||
new FloatProperty<RecentsView>("splitInstructionsFade") {
|
||||
@Override
|
||||
public void setValue(RecentsView view, float fade) {
|
||||
view.mSplitInstructionsView.setAlpha(1 - fade);
|
||||
}
|
||||
|
||||
@Override
|
||||
public Float get(RecentsView view) {
|
||||
return 1 - view.mSplitInstructionsView.getAlpha();
|
||||
}
|
||||
};
|
||||
|
||||
// OverScroll constants
|
||||
private static final int OVERSCROLL_PAGE_SNAP_ANIMATION_DURATION = 270;
|
||||
|
||||
@@ -2827,7 +2794,11 @@ public abstract class RecentsView<ACTIVITY_TYPE extends StatefulActivity<STATE_T
|
||||
|
||||
RectF startingTaskRect = new RectF();
|
||||
if (mSplitHiddenTaskView != null) {
|
||||
mSplitHiddenTaskView.setVisibility(INVISIBLE);
|
||||
// Split staging is initiated, hide the original TaskView thumbnail.
|
||||
// Toggled back on in resetFromSplitSelectionState().
|
||||
mSplitHiddenTaskView.setThumbnailVisibility(INVISIBLE);
|
||||
anim.addFloat(mSplitHiddenTaskView, TaskView.ICON_ALPHA, 1, 0,
|
||||
clampToProgress(LINEAR, 0, 0.167f));
|
||||
mFirstFloatingTaskView = FloatingTaskView.getFloatingTaskView(mActivity,
|
||||
mSplitHiddenTaskView.getThumbnail(),
|
||||
mSplitHiddenTaskView.getThumbnail().getThumbnail(),
|
||||
@@ -2855,6 +2826,8 @@ public abstract class RecentsView<ACTIVITY_TYPE extends StatefulActivity<STATE_T
|
||||
InteractionJankMonitorWrapper.end(
|
||||
InteractionJankMonitorWrapper.CUJ_SPLIT_SCREEN_ENTER);
|
||||
} else {
|
||||
// If transition to split select was interrupted, clean up to prevent glitches
|
||||
resetFromSplitSelectionState();
|
||||
InteractionJankMonitorWrapper.cancel(
|
||||
InteractionJankMonitorWrapper.CUJ_SPLIT_SCREEN_ENTER);
|
||||
}
|
||||
@@ -4222,7 +4195,9 @@ public abstract class RecentsView<ACTIVITY_TYPE extends StatefulActivity<STATE_T
|
||||
resetTaskVisuals();
|
||||
mSplitHiddenTaskViewIndex = -1;
|
||||
if (mSplitHiddenTaskView != null) {
|
||||
mSplitHiddenTaskView.setVisibility(VISIBLE);
|
||||
// Toggle thumbnail visibility back on (turned off in
|
||||
// createInitialSplitSelectAnimation()).
|
||||
mSplitHiddenTaskView.setThumbnailVisibility(VISIBLE);
|
||||
mSplitHiddenTaskView = null;
|
||||
}
|
||||
}
|
||||
@@ -5334,6 +5309,11 @@ public abstract class RecentsView<ACTIVITY_TYPE extends StatefulActivity<STATE_T
|
||||
return mFirstFloatingTaskView;
|
||||
}
|
||||
|
||||
@Nullable
|
||||
public SplitInstructionsView getSplitInstructionsView() {
|
||||
return mSplitInstructionsView;
|
||||
}
|
||||
|
||||
/** Update the current activity locus id to show the enabled state of Overview */
|
||||
public void updateLocusId() {
|
||||
String locusId = "Overview";
|
||||
|
||||
@@ -323,6 +323,19 @@ public class TaskView extends FrameLayout implements Reusable {
|
||||
}
|
||||
};
|
||||
|
||||
public static final FloatProperty<TaskView> ICON_ALPHA =
|
||||
new FloatProperty<TaskView>("iconAlpha") {
|
||||
@Override
|
||||
public void setValue(TaskView taskView, float v) {
|
||||
taskView.mIconView.setAlpha(v);
|
||||
}
|
||||
|
||||
@Override
|
||||
public Float get(TaskView taskView) {
|
||||
return taskView.mIconView.getAlpha();
|
||||
}
|
||||
};
|
||||
|
||||
@Nullable
|
||||
protected Task mTask;
|
||||
protected TaskThumbnailView mSnapshotView;
|
||||
@@ -1488,6 +1501,10 @@ public class TaskView extends FrameLayout implements Reusable {
|
||||
return display != null ? display.getDisplayId() : DEFAULT_DISPLAY;
|
||||
}
|
||||
|
||||
void setThumbnailVisibility(int visibility) {
|
||||
mSnapshotView.setVisibility(visibility);
|
||||
}
|
||||
|
||||
/**
|
||||
* We update and subsequently draw these in {@link #setFullscreenProgress(float)}.
|
||||
*/
|
||||
|
||||
@@ -342,6 +342,11 @@ public class StateManager<STATE_TYPE extends BaseState<STATE_TYPE>> {
|
||||
public void onAnimationSuccess(Animator animator) {
|
||||
onStateTransitionEnd(state);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onAnimationCancel(Animator animation) {
|
||||
onStateTransitionFailed(state);
|
||||
}
|
||||
};
|
||||
}
|
||||
|
||||
@@ -354,6 +359,12 @@ public class StateManager<STATE_TYPE extends BaseState<STATE_TYPE>> {
|
||||
}
|
||||
}
|
||||
|
||||
private void onStateTransitionFailed(STATE_TYPE state) {
|
||||
for (int i = mListeners.size() - 1; i >= 0; i--) {
|
||||
mListeners.get(i).onStateTransitionFailed(state);
|
||||
}
|
||||
}
|
||||
|
||||
private void onStateTransitionEnd(STATE_TYPE state) {
|
||||
// Only change the stable states after the transitions have finished
|
||||
if (state != mCurrentStableState) {
|
||||
@@ -588,6 +599,11 @@ public class StateManager<STATE_TYPE extends BaseState<STATE_TYPE>> {
|
||||
|
||||
default void onStateTransitionStart(STATE_TYPE toState) { }
|
||||
|
||||
/**
|
||||
* If the state transition animation fails (e.g. is canceled by the user), this fires.
|
||||
*/
|
||||
default void onStateTransitionFailed(STATE_TYPE toState) { }
|
||||
|
||||
default void onStateTransitionComplete(STATE_TYPE finalState) { }
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user