Handle split selection when animation is disabled
* Consolidate setState() and setStateWithAnimation() to be handled in the same manner * If no animation, we run the created PendingAnimation right away Fixes: 209935590 Test: Tested w/ and w/o animation Change-Id: I1d6fdba21761b6721e6bd52234016178547cd437
This commit is contained in:
parent
b57235563c
commit
1465a5af7b
|
@ -29,12 +29,9 @@ import static com.android.launcher3.states.StateAnimationConfig.SKIP_OVERVIEW;
|
|||
import static com.android.quickstep.views.RecentsView.ADJACENT_PAGE_HORIZONTAL_OFFSET;
|
||||
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.TASK_PRIMARY_SPLIT_TRANSLATION;
|
||||
import static com.android.quickstep.views.RecentsView.TASK_SECONDARY_SPLIT_TRANSLATION;
|
||||
import static com.android.quickstep.views.RecentsView.TASK_SECONDARY_TRANSLATION;
|
||||
|
||||
import android.util.FloatProperty;
|
||||
import android.util.Pair;
|
||||
|
||||
import androidx.annotation.NonNull;
|
||||
|
||||
|
@ -43,7 +40,6 @@ import com.android.launcher3.LauncherState;
|
|||
import com.android.launcher3.anim.PendingAnimation;
|
||||
import com.android.launcher3.statemanager.StateManager.StateHandler;
|
||||
import com.android.launcher3.states.StateAnimationConfig;
|
||||
import com.android.launcher3.touch.PagedOrientationHandler;
|
||||
import com.android.quickstep.views.RecentsView;
|
||||
|
||||
/**
|
||||
|
@ -100,15 +96,6 @@ public abstract class BaseRecentsViewStateController<T extends RecentsView>
|
|||
config.getInterpolator(ANIM_OVERVIEW_TRANSLATE_X, LINEAR));
|
||||
setter.setFloat(mRecentsView, TASK_SECONDARY_TRANSLATION, 0f,
|
||||
config.getInterpolator(ANIM_OVERVIEW_TRANSLATE_Y, LINEAR));
|
||||
PagedOrientationHandler orientationHandler =
|
||||
((RecentsView) mLauncher.getOverviewPanel()).getPagedOrientationHandler();
|
||||
Pair<FloatProperty, FloatProperty> taskViewsFloat =
|
||||
orientationHandler.getSplitSelectTaskOffset(
|
||||
TASK_PRIMARY_SPLIT_TRANSLATION, TASK_SECONDARY_SPLIT_TRANSLATION,
|
||||
mLauncher.getDeviceProfile());
|
||||
setter.setFloat(mRecentsView, taskViewsFloat.first,
|
||||
toState.getSplitSelectTranslation(mLauncher), LINEAR);
|
||||
setter.setFloat(mRecentsView, taskViewsFloat.second, 0, LINEAR);
|
||||
|
||||
setter.setFloat(mRecentsView, getContentAlphaProperty(), toState.overviewUi ? 1 : 0,
|
||||
config.getInterpolator(ANIM_OVERVIEW_FADE, AGGRESSIVE_EASE_IN_OUT));
|
||||
|
|
|
@ -23,13 +23,17 @@ import static com.android.launcher3.states.StateAnimationConfig.ANIM_OVERVIEW_AC
|
|||
import static com.android.quickstep.views.RecentsView.CONTENT_ALPHA;
|
||||
import static com.android.quickstep.views.RecentsView.FULLSCREEN_PROGRESS;
|
||||
import static com.android.quickstep.views.RecentsView.TASK_MODALNESS;
|
||||
import static com.android.quickstep.views.RecentsView.TASK_PRIMARY_SPLIT_TRANSLATION;
|
||||
import static com.android.quickstep.views.RecentsView.TASK_SECONDARY_SPLIT_TRANSLATION;
|
||||
import static com.android.quickstep.views.TaskView.FLAG_UPDATE_ALL;
|
||||
|
||||
import android.annotation.TargetApi;
|
||||
import android.os.Build;
|
||||
import android.util.FloatProperty;
|
||||
import android.util.Pair;
|
||||
|
||||
import androidx.annotation.NonNull;
|
||||
import androidx.annotation.Nullable;
|
||||
|
||||
import com.android.launcher3.BaseQuickstepLauncher;
|
||||
import com.android.launcher3.LauncherState;
|
||||
|
@ -37,6 +41,7 @@ import com.android.launcher3.anim.AnimatorListeners;
|
|||
import com.android.launcher3.anim.PendingAnimation;
|
||||
import com.android.launcher3.anim.PropertySetter;
|
||||
import com.android.launcher3.states.StateAnimationConfig;
|
||||
import com.android.launcher3.touch.PagedOrientationHandler;
|
||||
import com.android.launcher3.util.MultiValueAlpha;
|
||||
import com.android.quickstep.views.ClearAllButton;
|
||||
import com.android.quickstep.views.LauncherRecentsView;
|
||||
|
@ -67,11 +72,7 @@ public final class RecentsViewStateController extends
|
|||
// DepthController to prevent optimizations which might occlude the layers behind
|
||||
mLauncher.getDepthController().setHasContentBehindLauncher(state.overviewUi);
|
||||
|
||||
if (isSplitSelectionState(state)) {
|
||||
mRecentsView.applySplitPrimaryScrollOffset();
|
||||
} else {
|
||||
mRecentsView.resetSplitPrimaryScrollOffset();
|
||||
}
|
||||
handleSplitSelectionState(state, null);
|
||||
}
|
||||
|
||||
@Override
|
||||
|
@ -92,16 +93,7 @@ public final class RecentsViewStateController extends
|
|||
builder.addListener(AnimatorListeners.forSuccessCallback(() ->
|
||||
mLauncher.getDepthController().setHasContentBehindLauncher(toState.overviewUi)));
|
||||
|
||||
// Create or dismiss split screen select animations
|
||||
LauncherState currentState = mLauncher.getStateManager().getState();
|
||||
if (isSplitSelectionState(toState) && !isSplitSelectionState(currentState)) {
|
||||
builder.add(mRecentsView.createSplitSelectInitAnimation().buildAnim());
|
||||
}
|
||||
if (isSplitSelectionState(toState)) {
|
||||
mRecentsView.applySplitPrimaryScrollOffset();
|
||||
} else {
|
||||
mRecentsView.resetSplitPrimaryScrollOffset();
|
||||
}
|
||||
handleSplitSelectionState(toState, builder);
|
||||
|
||||
setAlphas(builder, config, toState);
|
||||
builder.setFloat(mRecentsView, FULLSCREEN_PROGRESS,
|
||||
|
@ -109,10 +101,52 @@ public final class RecentsViewStateController extends
|
|||
}
|
||||
|
||||
/**
|
||||
* @return true if {@param toState} is {@link LauncherState#OVERVIEW_SPLIT_SELECT}
|
||||
* Create or dismiss split screen select animations.
|
||||
* @param builder if null then this will run the split select animations right away, otherwise
|
||||
* will add animations to builder.
|
||||
*/
|
||||
private boolean isSplitSelectionState(@NonNull LauncherState toState) {
|
||||
return toState == OVERVIEW_SPLIT_SELECT;
|
||||
private void handleSplitSelectionState(@NonNull LauncherState toState,
|
||||
@Nullable PendingAnimation builder) {
|
||||
LauncherState currentState = mLauncher.getStateManager().getState();
|
||||
boolean animate = builder != null;
|
||||
PagedOrientationHandler orientationHandler =
|
||||
((RecentsView) mLauncher.getOverviewPanel()).getPagedOrientationHandler();
|
||||
Pair<FloatProperty, FloatProperty> taskViewsFloat =
|
||||
orientationHandler.getSplitSelectTaskOffset(
|
||||
TASK_PRIMARY_SPLIT_TRANSLATION, TASK_SECONDARY_SPLIT_TRANSLATION,
|
||||
mLauncher.getDeviceProfile());
|
||||
|
||||
if (isSplitSelectionState(currentState, toState)) {
|
||||
// Animation to "dismiss" selected taskView
|
||||
PendingAnimation splitSelectInitAnimation =
|
||||
mRecentsView.createSplitSelectInitAnimation();
|
||||
// Add properties to shift remaining taskViews to get out of placeholder view
|
||||
splitSelectInitAnimation.setFloat(mRecentsView, taskViewsFloat.first,
|
||||
toState.getSplitSelectTranslation(mLauncher), LINEAR);
|
||||
splitSelectInitAnimation.setFloat(mRecentsView, taskViewsFloat.second, 0, LINEAR);
|
||||
|
||||
if (!animate && isSplitSelectionState(currentState, toState)) {
|
||||
splitSelectInitAnimation.buildAnim().start();
|
||||
} else if (animate &&
|
||||
isSplitSelectionState(currentState, toState)) {
|
||||
builder.add(splitSelectInitAnimation.buildAnim());
|
||||
}
|
||||
}
|
||||
|
||||
if (isSplitSelectionState(currentState, toState)) {
|
||||
mRecentsView.applySplitPrimaryScrollOffset();
|
||||
} else {
|
||||
mRecentsView.resetSplitPrimaryScrollOffset();
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* @return true if {@param toState} is {@link LauncherState#OVERVIEW_SPLIT_SELECT}
|
||||
* and {@param fromState} is not {@link LauncherState#OVERVIEW_SPLIT_SELECT}
|
||||
*/
|
||||
private boolean isSplitSelectionState(@NonNull LauncherState fromState,
|
||||
@NonNull LauncherState toState) {
|
||||
return fromState != OVERVIEW_SPLIT_SELECT && toState == OVERVIEW_SPLIT_SELECT;
|
||||
}
|
||||
|
||||
private void setAlphas(PropertySetter propertySetter, StateAnimationConfig config,
|
||||
|
|
|
@ -242,6 +242,7 @@ public interface TaskShortcutFactory {
|
|||
}
|
||||
}
|
||||
|
||||
/** @Deprecated */
|
||||
TaskShortcutFactory SPLIT_SCREEN = new MultiWindowFactory(R.drawable.ic_split_screen,
|
||||
R.string.recent_task_option_split_screen, LAUNCHER_SYSTEM_SHORTCUT_SPLIT_SCREEN_TAP) {
|
||||
|
||||
|
|
|
@ -64,7 +64,6 @@ public class SplitSelectStateController {
|
|||
private @StagePosition int mStagePosition;
|
||||
private Task mInitialTask;
|
||||
private Task mSecondTask;
|
||||
private Rect mInitialBounds;
|
||||
private boolean mRecentsAnimationRunning;
|
||||
/** If not null, this is the TaskView we want to launch from */
|
||||
@Nullable
|
||||
|
@ -86,7 +85,6 @@ public class SplitSelectStateController {
|
|||
Rect initialBounds) {
|
||||
mInitialTask = task;
|
||||
mStagePosition = stagePosition;
|
||||
mInitialBounds = initialBounds;
|
||||
}
|
||||
|
||||
/**
|
||||
|
@ -229,7 +227,6 @@ public class SplitSelectStateController {
|
|||
mInitialTask = null;
|
||||
mSecondTask = null;
|
||||
mStagePosition = SplitConfigurationOptions.STAGE_POSITION_UNDEFINED;
|
||||
mInitialBounds = null;
|
||||
mRecentsAnimationRunning = false;
|
||||
mLaunchingTaskView = null;
|
||||
}
|
||||
|
@ -241,8 +238,4 @@ public class SplitSelectStateController {
|
|||
public boolean isSplitSelectActive() {
|
||||
return mInitialTask != null && mSecondTask == null;
|
||||
}
|
||||
|
||||
public Rect getInitialBounds() {
|
||||
return mInitialBounds;
|
||||
}
|
||||
}
|
||||
|
|
|
@ -3994,7 +3994,7 @@ public abstract class RecentsView<ACTIVITY_TYPE extends StatefulActivity<STATE_T
|
|||
}
|
||||
|
||||
/** TODO(b/181707736) More gracefully handle exiting split selection state */
|
||||
private void resetFromSplitSelectionState() {
|
||||
protected void resetFromSplitSelectionState() {
|
||||
if (mSplitHiddenTaskViewIndex == -1) {
|
||||
return;
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue