Track LauncherState for task bar stashing better

- Animate in onStateTransitionStart
- Commit in onStateTransitionComplete

Fixes: 193938970
Fixes: 200765631
Fixes: 201644899
Test: Go home from overview; Go to all apps from home; Go to overview from home
Change-Id: I393022c86f09806fea29fb5bc7191304b473f231
This commit is contained in:
Tracy Zhou
2021-09-30 10:14:34 -07:00
parent 32f3616f0c
commit ae88197e5f
4 changed files with 104 additions and 17 deletions

View File

@@ -16,9 +16,11 @@
package com.android.launcher3.taskbar;
import static com.android.launcher3.LauncherState.HOTSEAT_ICONS;
import static com.android.launcher3.anim.Interpolators.FAST_OUT_SLOW_IN;
import static com.android.launcher3.taskbar.TaskbarStashController.FLAG_IN_APP;
import static com.android.launcher3.taskbar.TaskbarStashController.FLAG_IN_STASHED_LAUNCHER_STATE;
import static com.android.launcher3.taskbar.TaskbarStashController.FLAG_STASHED_IN_APP_SETUP;
import static com.android.launcher3.taskbar.TaskbarStashController.TASKBAR_STASH_DURATION;
import static com.android.launcher3.taskbar.TaskbarViewController.ALPHA_INDEX_HOME;
import android.animation.Animator;
@@ -38,6 +40,7 @@ import com.android.launcher3.QuickstepTransitionManager;
import com.android.launcher3.R;
import com.android.launcher3.Utilities;
import com.android.launcher3.anim.AnimatorListeners;
import com.android.launcher3.anim.PendingAnimation;
import com.android.launcher3.config.FeatureFlags;
import com.android.launcher3.logging.InstanceId;
import com.android.launcher3.logging.InstanceIdSequence;
@@ -55,6 +58,7 @@ import com.android.quickstep.views.RecentsView;
import com.android.systemui.shared.recents.model.ThumbnailData;
import java.util.Arrays;
import java.util.function.Supplier;
import java.util.stream.Stream;
/**
@@ -72,17 +76,64 @@ public class LauncherTaskbarUIController extends TaskbarUIController {
new AnimatedFloat(this::onIconAlignmentRatioChanged);
private final AnimatedFloat mIconAlignmentForGestureState =
new AnimatedFloat(this::onIconAlignmentRatioChanged);
private final AnimatedFloat mIconAlignmentForLauncherState =
new AnimatedFloat(this::onIconAlignmentRatioChangedForStateTransition);
private final DeviceProfile.OnDeviceProfileChangeListener mOnDeviceProfileChangeListener =
this::onStashedInAppChanged;
private final StateManager.StateListener<LauncherState> mStateListener =
new StateManager.StateListener<LauncherState>() {
private Animator mAnimator;
@Override
public void onStateTransitionStart(LauncherState toState) {
// Stash animation from going to launcher should be already handled in
// createAnimToLauncher.
TaskbarStashController controller = mControllers.taskbarStashController;
long duration = TASKBAR_STASH_DURATION;
controller.updateStateForFlag(FLAG_IN_STASHED_LAUNCHER_STATE,
toState.isTaskbarStashed());
Animator stashAnimator = controller.applyStateWithoutStart(duration);
if (stashAnimator != null) {
if (mAnimator != null) {
mAnimator.cancel();
}
PendingAnimation pendingAnimation = new PendingAnimation(duration);
pendingAnimation.add(stashAnimator);
pendingAnimation.setFloat(mIconAlignmentForLauncherState,
AnimatedFloat.VALUE, toState.isTaskbarStashed() ? 0 : 1,
FAST_OUT_SLOW_IN);
pendingAnimation.addListener(new AnimatorListenerAdapter() {
@Override
public void onAnimationStart(Animator animator) {
mTargetStateOverrideForStateTransition = toState;
// Copy hotseat alpha over to taskbar icons
mIconAlphaForHome.setValue(mLauncher.getHotseat().getIconsAlpha());
mLauncher.getHotseat().setIconsAlpha(0);
}
@Override
public void onAnimationEnd(Animator animator) {
if (toState.isTaskbarStashed()) {
// Reset hotseat alpha to default
mLauncher.getHotseat().setIconsAlpha(1);
}
mTargetStateOverrideForStateTransition = null;
mAnimator = null;
}
});
mAnimator = pendingAnimation.buildAnim();
mAnimator.start();
}
}
@Override
public void onStateTransitionComplete(LauncherState finalState) {
TaskbarStashController controller = mControllers.taskbarStashController;
controller.updateStateForFlag(FLAG_IN_STASHED_LAUNCHER_STATE,
finalState.isTaskbarStashed());
controller.applyState();
}
};
@@ -96,6 +147,8 @@ public class LauncherTaskbarUIController extends TaskbarUIController {
private TaskbarKeyguardController mKeyguardController;
private LauncherState mTargetStateOverride = null;
private LauncherState mTargetStateOverrideForStateTransition = null;
private final DeviceProfile.OnDeviceProfileChangeListener mProfileChangeListener =
new DeviceProfile.OnDeviceProfileChangeListener() {
@Override
@@ -144,6 +197,7 @@ public class LauncherTaskbarUIController extends TaskbarUIController {
onLauncherResumedOrPaused(false);
mIconAlignmentForResumedState.finishAnimation();
mIconAlignmentForGestureState.finishAnimation();
mIconAlignmentForLauncherState.finishAnimation();
mLauncher.removeOnDeviceProfileChangeListener(mOnDeviceProfileChangeListener);
mLauncher.getStateManager().removeStateListener(mStateListener);
@@ -258,25 +312,35 @@ public class LauncherTaskbarUIController extends TaskbarUIController {
return Math.max(mIconAlignmentForResumedState.value, mIconAlignmentForGestureState.value);
}
private float getCurrentIconAlignmentRatioForLauncherState() {
return mIconAlignmentForLauncherState.value;
}
private void onIconAlignmentRatioChangedForStateTransition() {
onIconAlignmentRatioChanged(
mTargetStateOverrideForStateTransition != null
? mTargetStateOverrideForStateTransition
: mLauncher.getStateManager().getState(),
this::getCurrentIconAlignmentRatioForLauncherState);
}
private void onIconAlignmentRatioChanged() {
onIconAlignmentRatioChanged(mTargetStateOverride != null ? mTargetStateOverride
: mLauncher.getStateManager().getState(), this::getCurrentIconAlignmentRatio);
}
private void onIconAlignmentRatioChanged(LauncherState state,
Supplier<Float> alignmentSupplier) {
if (mControllers == null) {
return;
}
float alignment = getCurrentIconAlignmentRatio();
float alignment = alignmentSupplier.get();
mControllers.taskbarViewController.setLauncherIconAlignment(
alignment, mLauncher.getDeviceProfile());
mTaskbarBackgroundAlpha.updateValue(1 - alignment);
LauncherState state = mTargetStateOverride != null ? mTargetStateOverride
: mLauncher.getStateManager().getState();
if ((state.getVisibleElements(mLauncher) & HOTSEAT_ICONS) != 0) {
// If the hotseat icons are visible, then switch taskbar in last frame
setTaskbarViewVisible(alignment < 1);
} else {
mLauncher.getHotseat().setIconsAlpha(1);
mIconAlphaForHome.setValue(1 - alignment);
}
setIconAlpha(state, alignment);
}
/**
@@ -295,6 +359,15 @@ public class LauncherTaskbarUIController extends TaskbarUIController {
return mTaskbarDragLayer;
}
private void setIconAlpha(LauncherState state, float progress) {
if ((state.getVisibleElements(mLauncher) & HOTSEAT_ICONS) != 0) {
// If the hotseat icons are visible, then switch taskbar in last frame
setTaskbarViewVisible(progress < 1);
} else {
mIconAlphaForHome.setValue(1 - progress);
}
}
private void setTaskbarViewVisible(boolean isVisible) {
mIconAlphaForHome.setValue(isVisible ? 1 : 0);
mLauncher.getHotseat().setIconsAlpha(isVisible ? 0f : 1f);