Merge changes Ibdecabd1,If330dc9e into main

* changes:
  Added scale animation for taskbar pinning transition.
  Animate the bubble bar Y for task bar pinned/unpinned switches.
This commit is contained in:
Mykola Podolian
2024-10-25 19:48:55 +00:00
committed by Android (Google) Code Review
3 changed files with 95 additions and 6 deletions
@@ -30,6 +30,7 @@ import com.android.launcher3.logging.StatsLogManager.LauncherEvent.LAUNCHER_TASK
import com.android.launcher3.logging.StatsLogManager.LauncherEvent.LAUNCHER_TASKBAR_UNPINNED
import com.android.launcher3.taskbar.TaskbarDividerPopupView.Companion.createAndPopulate
import java.io.PrintWriter
import kotlin.jvm.optionals.getOrNull
/** Controls taskbar pinning through a popup view. */
class TaskbarPinningController(private val context: TaskbarActivityContext) :
@@ -119,7 +120,11 @@ class TaskbarPinningController(private val context: TaskbarActivityContext) :
taskbarViewController.taskbarIconScaleForPinning.animateToValue(animateToValue),
taskbarViewController.taskbarIconTranslationXForPinning.animateToValue(animateToValue),
)
controllers.bubbleControllers.getOrNull()?.bubbleBarViewController?.let {
// if bubble bar is not visible no need to add it`s animations
if (!it.isBubbleBarVisible) return@let
animatorSet.playTogether(it.bubbleBarPinning.animateToValue(animateToValue))
}
animatorSet.interpolator = Interpolators.EMPHASIZED
return animatorSet
}
@@ -303,6 +303,17 @@ public class BubbleBarView extends FrameLayout {
}
}
/**
* Set the bubble icons size and spacing between the bubbles and the borders of the bubble
* bar.
*/
public void setIconSizeAndPaddingForPinning(float newIconSize, float newBubbleBarPadding) {
mBubbleBarPadding = newBubbleBarPadding;
mIconScale = newIconSize / mIconSize;
updateBubblesLayoutProperties(mBubbleBarLocation);
invalidate();
}
/**
* Sets new icon sizes and newBubbleBarPadding between icons and bubble bar borders.
*
@@ -18,6 +18,10 @@ package com.android.launcher3.taskbar.bubbles;
import static android.view.View.INVISIBLE;
import static android.view.View.VISIBLE;
import static com.android.launcher3.Utilities.mapRange;
import static com.android.launcher3.taskbar.TaskbarPinningController.PINNING_PERSISTENT;
import static com.android.launcher3.taskbar.TaskbarPinningController.PINNING_TRANSIENT;
import android.animation.Animator;
import android.animation.AnimatorSet;
import android.content.res.Resources;
@@ -42,12 +46,14 @@ import com.android.launcher3.anim.RoundedRectRevealOutlineProvider;
import com.android.launcher3.taskbar.TaskbarActivityContext;
import com.android.launcher3.taskbar.TaskbarControllers;
import com.android.launcher3.taskbar.TaskbarInsetsController;
import com.android.launcher3.taskbar.TaskbarSharedState;
import com.android.launcher3.taskbar.TaskbarStashController;
import com.android.launcher3.taskbar.bubbles.animation.BubbleBarViewAnimator;
import com.android.launcher3.taskbar.bubbles.flyout.BubbleBarFlyoutController;
import com.android.launcher3.taskbar.bubbles.flyout.BubbleBarFlyoutPositioner;
import com.android.launcher3.taskbar.bubbles.flyout.FlyoutCallbacks;
import com.android.launcher3.taskbar.bubbles.stashing.BubbleStashController;
import com.android.launcher3.util.DisplayController;
import com.android.launcher3.util.MultiPropertyFactory;
import com.android.launcher3.util.MultiValueAlpha;
import com.android.quickstep.SystemUiProxy;
@@ -106,6 +112,10 @@ public class BubbleBarViewController {
this::updateTranslationY);
private final AnimatedFloat mBubbleOffsetY = new AnimatedFloat(
this::updateBubbleOffsetY);
private final AnimatedFloat mBubbleBarPinning = new AnimatedFloat(pinningProgress -> {
updateTranslationY();
setBubbleBarScaleAndPadding(pinningProgress);
});
// Modified when swipe up is happening on the bubble bar or task bar.
private float mBubbleBarSwipeUpTranslationY;
@@ -125,8 +135,9 @@ public class BubbleBarViewController {
private BubbleBarViewAnimator mBubbleBarViewAnimator;
private final FrameLayout mBubbleBarContainer;
private BubbleBarFlyoutController mBubbleBarFlyoutController;
private TaskbarSharedState mTaskbarSharedState;
private final TimeSource mTimeSource = System::currentTimeMillis;
private final int mTaskbarTranslationDelta;
@Nullable
private BubbleBarBoundsChangeListener mBoundsChangeListener;
@@ -140,11 +151,13 @@ public class BubbleBarViewController {
mBubbleBarAlpha = new MultiValueAlpha(mBarView, 1 /* num alpha channels */);
mIconSize = activity.getResources().getDimensionPixelSize(
R.dimen.bubblebar_icon_size);
mTaskbarTranslationDelta = getBubbleBarTranslationDeltaForTaskbar(activity);
}
/** Initializes controller. */
public void init(TaskbarControllers controllers, BubbleControllers bubbleControllers,
TaskbarViewPropertiesProvider taskbarViewPropertiesProvider) {
mTaskbarSharedState = controllers.getSharedState();
mBubbleStashController = bubbleControllers.bubbleStashController;
mBubbleBarController = bubbleControllers.bubbleBarController;
mBubbleDragController = bubbleControllers.bubbleDragController;
@@ -172,6 +185,10 @@ public class BubbleBarViewController {
mBoundsChangeListener.onBoundsChanged();
}
});
float pinningValue = DisplayController.isTransientTaskbar(mActivity)
? PINNING_TRANSIENT
: PINNING_PERSISTENT;
mBubbleBarPinning.updateValue(pinningValue);
mBarView.setController(new BubbleBarView.Controller() {
@Override
public float getBubbleBarTranslationY() {
@@ -227,6 +244,11 @@ public class BubbleBarViewController {
};
}
/** Returns animated float property responsible for pinning transition animation. */
public AnimatedFloat getBubbleBarPinning() {
return mBubbleBarPinning;
}
private BubbleBarFlyoutPositioner createFlyoutPositioner() {
return new BubbleBarFlyoutPositioner() {
@@ -605,9 +627,11 @@ public class BubbleBarViewController {
updateBubbleBarIconSizeAndPadding(newIconSize, newPadding, animate);
}
private int getBubbleBarIconSizeFromDeviceProfile(Resources res) {
DeviceProfile deviceProfile = mActivity.getDeviceProfile();
return getBubbleBarIconSizeFromDeviceProfile(res, mActivity.getDeviceProfile());
}
private int getBubbleBarIconSizeFromDeviceProfile(Resources res, DeviceProfile deviceProfile) {
DisplayMetrics dm = res.getDisplayMetrics();
float smallIconSize = TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP,
APP_ICON_SMALL_DP, dm);
@@ -622,7 +646,10 @@ public class BubbleBarViewController {
}
private int getBubbleBarPaddingFromDeviceProfile(Resources res) {
DeviceProfile deviceProfile = mActivity.getDeviceProfile();
return getBubbleBarPaddingFromDeviceProfile(res, mActivity.getDeviceProfile());
}
private int getBubbleBarPaddingFromDeviceProfile(Resources res, DeviceProfile deviceProfile) {
DisplayMetrics dm = res.getDisplayMetrics();
float mediumIconSize = TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP,
APP_ICON_MEDIUM_DP, dm);
@@ -663,7 +690,53 @@ public class BubbleBarViewController {
private void updateTranslationY() {
mBarView.setTranslationY(mBubbleBarTranslationY.value + mBubbleBarSwipeUpTranslationY
+ mBubbleBarStashTranslationY);
+ mBubbleBarStashTranslationY + getBubbleBarTranslationYForTaskbarPinning());
}
/** Computes translation y for taskbar pinning. */
private float getBubbleBarTranslationYForTaskbarPinning() {
if (mTaskbarSharedState == null) return 0f;
float pinningProgress = mBubbleBarPinning.value;
if (mTaskbarSharedState.startTaskbarVariantIsTransient) {
return mapRange(pinningProgress, /* min = */ 0f, mTaskbarTranslationDelta);
} else {
return mapRange(pinningProgress, -mTaskbarTranslationDelta, /* max = */ 0f);
}
}
private void setBubbleBarScaleAndPadding(float pinningProgress) {
Resources res = mActivity.getResources();
// determine icon scale for pinning
int persistentIconSize = res.getDimensionPixelSize(
R.dimen.bubblebar_icon_size_persistent_taskbar);
int transientIconSize = getBubbleBarIconSizeFromDeviceProfile(res,
mActivity.getTransientTaskbarDeviceProfile());
float pinningIconSize = mapRange(pinningProgress, transientIconSize, persistentIconSize);
// determine bubble bar padding for pinning
int persistentPadding = res.getDimensionPixelSize(
R.dimen.bubblebar_icon_spacing_persistent_taskbar);
int transientPadding = getBubbleBarPaddingFromDeviceProfile(res,
mActivity.getTransientTaskbarDeviceProfile());
float pinningPadding = mapRange(pinningProgress, transientPadding, persistentPadding);
mBarView.setIconSizeAndPaddingForPinning(pinningIconSize, pinningPadding);
}
/**
* Calculates the vertical difference in the bubble bar positions for pinned and transient
* taskbar modes.
*/
private int getBubbleBarTranslationDeltaForTaskbar(TaskbarActivityContext activity) {
Resources res = activity.getResources();
int persistentBubbleSize = res
.getDimensionPixelSize(R.dimen.bubblebar_icon_size_persistent_taskbar);
int persistentSpacingSize = res
.getDimensionPixelSize(R.dimen.bubblebar_icon_spacing_persistent_taskbar);
int persistentBubbleBarSize = persistentBubbleSize + persistentSpacingSize * 2;
int persistentTaskbarHeight = activity.getPersistentTaskbarDeviceProfile().taskbarHeight;
int persistentBubbleBarY = (persistentTaskbarHeight - persistentBubbleBarSize) / 2;
int transientBubbleBarY = activity.getTransientTaskbarDeviceProfile().taskbarBottomMargin;
return transientBubbleBarY - persistentBubbleBarY;
}
private void updateScaleX(float scale) {