mirror of
https://github.com/LawnchairLauncher/lawnchair.git
synced 2026-03-02 17:06:49 +00:00
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:
@@ -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);
|
||||
|
||||
Reference in New Issue
Block a user