Loading quickstep/res/values/dimens.xml +6 −3 Original line number Diff line number Diff line Loading @@ -427,11 +427,14 @@ <dimen name="bubblebar_drag_elevation">2dp</dimen> <dimen name="bubblebar_hotseat_adjustment_threshold">90dp</dimen> <dimen name="bubblebar_icon_size">50dp</dimen> <dimen name="bubblebar_icon_size_small">32dp</dimen> <dimen name="bubblebar_icon_size">36dp</dimen> <dimen name="bubblebar_badge_size">24dp</dimen> <dimen name="bubblebar_icon_overlap">12dp</dimen> <dimen name="bubblebar_overflow_inset">24dp</dimen> <dimen name="bubblebar_icon_spacing">3dp</dimen> <dimen name="bubblebar_overflow_inset">16dp</dimen> <dimen name="bubblebar_icon_spacing">6dp</dimen> <dimen name="bubblebar_icon_spacing_large">8dp</dimen> <dimen name="bubblebar_expanded_icon_spacing">12dp</dimen> <dimen name="bubblebar_icon_elevation">1dp</dimen> <!-- Bubble bar dismiss view --> Loading quickstep/src/com/android/launcher3/taskbar/bubbles/BubbleBarBackground.kt +5 −1 Original line number Diff line number Diff line Loading @@ -31,7 +31,7 @@ import com.android.launcher3.icons.GraphicsUtils.setColorAlphaBound import com.android.wm.shell.common.TriangleShape /** Drawable for the background of the bubble bar. */ class BubbleBarBackground(context: Context, private val backgroundHeight: Float) : Drawable() { class BubbleBarBackground(context: Context, private var backgroundHeight: Float) : Drawable() { private val DARK_THEME_SHADOW_ALPHA = 51f private val LIGHT_THEME_SHADOW_ALPHA = 25f Loading Loading @@ -171,4 +171,8 @@ class BubbleBarBackground(context: Context, private val backgroundHeight: Float) fun setArrowAlpha(alpha: Int) { arrowDrawable.paint.alpha = alpha } fun setHeight(newHeight: Float) { backgroundHeight = newHeight } } quickstep/src/com/android/launcher3/taskbar/bubbles/BubbleBarView.java +54 −14 Original line number Diff line number Diff line Loading @@ -106,10 +106,12 @@ public class BubbleBarView extends FrameLayout { private final Rect mBubbleBarBounds = new Rect(); // The amount the bubbles overlap when they are stacked in the bubble bar private final float mIconOverlapAmount; // The spacing between the bubbles when they are expanded in the bubble bar private final float mIconSpacing; // The spacing between the bubbles when bubble bar is expanded private final float mExpandedBarIconsSpacing; // The spacing between the bubbles and the borders of the bubble bar private float mBubbleBarPadding; // The size of a bubble in the bar private final float mIconSize; private float mIconSize; // The elevation of the bubbles within the bar private final float mBubbleElevation; private final float mDragElevation; Loading Loading @@ -169,16 +171,17 @@ public class BubbleBarView extends FrameLayout { setAlpha(0); setVisibility(INVISIBLE); mIconOverlapAmount = getResources().getDimensionPixelSize(R.dimen.bubblebar_icon_overlap); mIconSpacing = getResources().getDimensionPixelSize(R.dimen.bubblebar_icon_spacing); mBubbleBarPadding = getResources().getDimensionPixelSize(R.dimen.bubblebar_icon_spacing); mIconSize = getResources().getDimensionPixelSize(R.dimen.bubblebar_icon_size); mExpandedBarIconsSpacing = getResources().getDimensionPixelSize( R.dimen.bubblebar_expanded_icon_spacing); mBubbleElevation = getResources().getDimensionPixelSize(R.dimen.bubblebar_icon_elevation); mDragElevation = getResources().getDimensionPixelSize(R.dimen.bubblebar_drag_elevation); mPointerSize = getResources().getDimensionPixelSize(R.dimen.bubblebar_pointer_size); setClipToPadding(false); mBubbleBarBackground = new BubbleBarBackground(context, getResources().getDimensionPixelSize(R.dimen.bubblebar_size)); mBubbleBarBackground = new BubbleBarBackground(context, getBubbleBarHeight()); setBackgroundDrawable(mBubbleBarBackground); mWidthAnimator.setDuration(WIDTH_ANIMATION_DURATION_MS); Loading Loading @@ -219,6 +222,29 @@ public class BubbleBarView extends FrameLayout { }); } /** * Sets new icon size and spacing between icons and bubble bar borders. * * @param newIconSize new icon size * @param spacing spacing between icons and bubble bar borders. */ // TODO(b/335575529): animate bubble bar icons size change public void setIconSizeAndPadding(float newIconSize, float spacing) { // TODO(b/335457839): handle new bubble animation during the size change mBubbleBarPadding = spacing; mIconSize = newIconSize; int childCount = getChildCount(); for (int i = 0; i < childCount; i++) { View childView = getChildAt(i); FrameLayout.LayoutParams params = (LayoutParams) childView.getLayoutParams(); params.height = (int) mIconSize; params.width = (int) mIconSize; childView.setLayoutParams(params); } mBubbleBarBackground.setHeight(getBubbleBarHeight()); updateLayoutParams(); } @Override protected void onLayout(boolean changed, int left, int top, int right, int bottom) { super.onLayout(changed, left, top, right, bottom); Loading Loading @@ -516,6 +542,13 @@ public class BubbleBarView extends FrameLayout { setLayoutParams(lp); } private void updateLayoutParams() { LayoutParams lp = (FrameLayout.LayoutParams) getLayoutParams(); lp.height = getBubbleBarHeight(); lp.width = (int) (mIsBarExpanded ? expandedWidth() : collapsedWidth()); setLayoutParams(lp); } /** @return the horizontal margin between the bubble bar and the edge of the screen. */ int getHorizontalMargin() { LayoutParams lp = (FrameLayout.LayoutParams) getLayoutParams(); Loading Loading @@ -551,12 +584,12 @@ public class BubbleBarView extends FrameLayout { final float collapsedX; if (onLeft) { // If bar is on the left, bubbles are ordered right to left expandedX = (bubbleCount - i - 1) * (mIconSize + mIconSpacing); expandedX = (bubbleCount - i - 1) * (mIconSize + mExpandedBarIconsSpacing); // Shift the first bubble only if there are more bubbles in addition to overflow collapsedX = i == 0 && bubbleCount > 2 ? mIconOverlapAmount : 0; } else { // Bubbles ordered left to right, don't move the first bubble expandedX = i * (mIconSize + mIconSpacing); expandedX = i * (mIconSize + mExpandedBarIconsSpacing); collapsedX = i == 0 ? 0 : mIconOverlapAmount; } Loading Loading @@ -599,14 +632,14 @@ public class BubbleBarView extends FrameLayout { final float interpolatedWidth = widthState * (expandedWidth - collapsedWidth) + collapsedWidth; final float arrowPosition; if (onLeft) { float interpolatedShift = (expandedArrowPosition - collapsedArrowPosition) * widthState; if (onLeft) { arrowPosition = collapsedArrowPosition + interpolatedShift; } else { if (mIsBarExpanded) { // when the bar is expanding, the selected bubble is always the first, so the arrow // always shifts with the interpolated width. arrowPosition = currentWidth - interpolatedWidth + collapsedArrowPosition; arrowPosition = currentWidth - interpolatedWidth + collapsedArrowPosition + interpolatedShift; } else { final float targetPosition = currentWidth - collapsedWidth + collapsedArrowPosition; arrowPosition = Loading Loading @@ -709,7 +742,8 @@ public class BubbleBarView extends FrameLayout { } else { bubblePosition = index; } return getPaddingStart() + bubblePosition * (mIconSize + mIconSpacing) + mIconSize / 2f; return getPaddingStart() + bubblePosition * (mIconSize + mExpandedBarIconsSpacing) + mIconSize / 2f; } private float arrowPositionForSelectedWhenCollapsed() { Loading Loading @@ -770,7 +804,9 @@ public class BubbleBarView extends FrameLayout { public float expandedWidth() { final int childCount = getChildCount(); final int horizontalPadding = getPaddingStart() + getPaddingEnd(); return childCount * (mIconSize + mIconSpacing) + horizontalPadding; // spaces amount is less than child count by 1, or 0 if no child views int spacesCount = Math.max(childCount - 1, 0); return childCount * mIconSize + spacesCount * mExpandedBarIconsSpacing + horizontalPadding; } private float collapsedWidth() { Loading @@ -783,6 +819,10 @@ public class BubbleBarView extends FrameLayout { : mIconSize + horizontalPadding; } private int getBubbleBarHeight() { return (int) (mIconSize + mBubbleBarPadding * 2 + mPointerSize); } /** * Returns whether the given MotionEvent, *in screen coordinates*, is within bubble bar * touch bounds. Loading quickstep/src/com/android/launcher3/taskbar/bubbles/BubbleBarViewController.java +38 −12 Original line number Diff line number Diff line Loading @@ -18,9 +18,12 @@ package com.android.launcher3.taskbar.bubbles; import static android.view.View.INVISIBLE; import static android.view.View.VISIBLE; import android.content.res.Resources; import android.graphics.Point; import android.graphics.Rect; import android.util.DisplayMetrics; import android.util.Log; import android.util.TypedValue; import android.view.Gravity; import android.view.MotionEvent; import android.view.View; Loading Loading @@ -52,12 +55,13 @@ import java.util.function.Consumer; public class BubbleBarViewController { private static final String TAG = BubbleBarViewController.class.getSimpleName(); private static final float APP_ICON_SMALL_DP = 44f; private static final float APP_ICON_MEDIUM_DP = 48f; private static final float APP_ICON_LARGE_DP = 52f; private final SystemUiProxy mSystemUiProxy; private final TaskbarActivityContext mActivity; private final BubbleBarView mBarView; private final int mIconSize; private final int mPointerSize; private int mIconSize; // Initialized in init. private BubbleStashController mBubbleStashController; Loading Loading @@ -96,9 +100,8 @@ public class BubbleBarViewController { mSystemUiProxy = SystemUiProxy.INSTANCE.get(mActivity); mBubbleBarAlpha = new MultiValueAlpha(mBarView, 1 /* num alpha channels */); mBubbleBarAlpha.setUpdateVisibility(true); mIconSize = activity.getResources().getDimensionPixelSize(R.dimen.bubblebar_icon_size); mPointerSize = activity.getResources().getDimensionPixelSize( R.dimen.bubblebar_pointer_size); mIconSize = activity.getResources().getDimensionPixelSize( R.dimen.bubblebar_icon_size); } public void init(TaskbarControllers controllers, BubbleControllers bubbleControllers) { Loading @@ -108,12 +111,8 @@ public class BubbleBarViewController { mTaskbarStashController = controllers.taskbarStashController; mTaskbarInsetsController = controllers.taskbarInsetsController; mActivity.addOnDeviceProfileChangeListener(dp -> mBarView.getLayoutParams().height = mActivity.getDeviceProfile().taskbarHeight + mPointerSize ); mBarView.getLayoutParams().height = mActivity.getDeviceProfile().taskbarHeight + mPointerSize; mActivity.addOnDeviceProfileChangeListener(dp -> setBubbleBarIconSize(dp.taskbarIconSize)); setBubbleBarIconSize(mActivity.getDeviceProfile().taskbarIconSize); mBubbleBarScale.updateValue(1f); mBubbleClickListener = v -> onBubbleClicked(v); mBubbleBarClickListener = v -> onBubbleBarClicked(); Loading Loading @@ -260,6 +259,33 @@ public class BubbleBarViewController { } } private void setBubbleBarIconSize(int newIconSize) { if (newIconSize == mIconSize) { return; } Resources res = mActivity.getResources(); DisplayMetrics dm = res.getDisplayMetrics(); float smallIconSize = TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, APP_ICON_SMALL_DP, dm); float mediumIconSize = TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, APP_ICON_MEDIUM_DP, dm); float largeIconSize = TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, APP_ICON_LARGE_DP, dm); float smallMediumThreshold = (smallIconSize + mediumIconSize) / 2f; float mediumLargeThreshold = (mediumIconSize + largeIconSize) / 2f; mIconSize = newIconSize <= smallMediumThreshold ? res.getDimensionPixelSize(R.dimen.bubblebar_icon_size_small) : res.getDimensionPixelSize(R.dimen.bubblebar_icon_size); float bubbleBarPadding = newIconSize >= mediumLargeThreshold ? res.getDimensionPixelSize(R.dimen.bubblebar_icon_spacing_large) : res.getDimensionPixelSize(R.dimen.bubblebar_icon_spacing); mBarView.setIconSizeAndPadding(mIconSize, bubbleBarPadding); mBarView.setPadding((int) bubbleBarPadding, mBarView.getPaddingTop(), (int) bubbleBarPadding, mBarView.getPaddingBottom()); } /** Sets a callback that updates the selected bubble after the bubble bar collapses. */ public void setUpdateSelectedBubbleAfterCollapse( Consumer<String> updateSelectedBubbleAfterCollapse) { Loading Loading
quickstep/res/values/dimens.xml +6 −3 Original line number Diff line number Diff line Loading @@ -427,11 +427,14 @@ <dimen name="bubblebar_drag_elevation">2dp</dimen> <dimen name="bubblebar_hotseat_adjustment_threshold">90dp</dimen> <dimen name="bubblebar_icon_size">50dp</dimen> <dimen name="bubblebar_icon_size_small">32dp</dimen> <dimen name="bubblebar_icon_size">36dp</dimen> <dimen name="bubblebar_badge_size">24dp</dimen> <dimen name="bubblebar_icon_overlap">12dp</dimen> <dimen name="bubblebar_overflow_inset">24dp</dimen> <dimen name="bubblebar_icon_spacing">3dp</dimen> <dimen name="bubblebar_overflow_inset">16dp</dimen> <dimen name="bubblebar_icon_spacing">6dp</dimen> <dimen name="bubblebar_icon_spacing_large">8dp</dimen> <dimen name="bubblebar_expanded_icon_spacing">12dp</dimen> <dimen name="bubblebar_icon_elevation">1dp</dimen> <!-- Bubble bar dismiss view --> Loading
quickstep/src/com/android/launcher3/taskbar/bubbles/BubbleBarBackground.kt +5 −1 Original line number Diff line number Diff line Loading @@ -31,7 +31,7 @@ import com.android.launcher3.icons.GraphicsUtils.setColorAlphaBound import com.android.wm.shell.common.TriangleShape /** Drawable for the background of the bubble bar. */ class BubbleBarBackground(context: Context, private val backgroundHeight: Float) : Drawable() { class BubbleBarBackground(context: Context, private var backgroundHeight: Float) : Drawable() { private val DARK_THEME_SHADOW_ALPHA = 51f private val LIGHT_THEME_SHADOW_ALPHA = 25f Loading Loading @@ -171,4 +171,8 @@ class BubbleBarBackground(context: Context, private val backgroundHeight: Float) fun setArrowAlpha(alpha: Int) { arrowDrawable.paint.alpha = alpha } fun setHeight(newHeight: Float) { backgroundHeight = newHeight } }
quickstep/src/com/android/launcher3/taskbar/bubbles/BubbleBarView.java +54 −14 Original line number Diff line number Diff line Loading @@ -106,10 +106,12 @@ public class BubbleBarView extends FrameLayout { private final Rect mBubbleBarBounds = new Rect(); // The amount the bubbles overlap when they are stacked in the bubble bar private final float mIconOverlapAmount; // The spacing between the bubbles when they are expanded in the bubble bar private final float mIconSpacing; // The spacing between the bubbles when bubble bar is expanded private final float mExpandedBarIconsSpacing; // The spacing between the bubbles and the borders of the bubble bar private float mBubbleBarPadding; // The size of a bubble in the bar private final float mIconSize; private float mIconSize; // The elevation of the bubbles within the bar private final float mBubbleElevation; private final float mDragElevation; Loading Loading @@ -169,16 +171,17 @@ public class BubbleBarView extends FrameLayout { setAlpha(0); setVisibility(INVISIBLE); mIconOverlapAmount = getResources().getDimensionPixelSize(R.dimen.bubblebar_icon_overlap); mIconSpacing = getResources().getDimensionPixelSize(R.dimen.bubblebar_icon_spacing); mBubbleBarPadding = getResources().getDimensionPixelSize(R.dimen.bubblebar_icon_spacing); mIconSize = getResources().getDimensionPixelSize(R.dimen.bubblebar_icon_size); mExpandedBarIconsSpacing = getResources().getDimensionPixelSize( R.dimen.bubblebar_expanded_icon_spacing); mBubbleElevation = getResources().getDimensionPixelSize(R.dimen.bubblebar_icon_elevation); mDragElevation = getResources().getDimensionPixelSize(R.dimen.bubblebar_drag_elevation); mPointerSize = getResources().getDimensionPixelSize(R.dimen.bubblebar_pointer_size); setClipToPadding(false); mBubbleBarBackground = new BubbleBarBackground(context, getResources().getDimensionPixelSize(R.dimen.bubblebar_size)); mBubbleBarBackground = new BubbleBarBackground(context, getBubbleBarHeight()); setBackgroundDrawable(mBubbleBarBackground); mWidthAnimator.setDuration(WIDTH_ANIMATION_DURATION_MS); Loading Loading @@ -219,6 +222,29 @@ public class BubbleBarView extends FrameLayout { }); } /** * Sets new icon size and spacing between icons and bubble bar borders. * * @param newIconSize new icon size * @param spacing spacing between icons and bubble bar borders. */ // TODO(b/335575529): animate bubble bar icons size change public void setIconSizeAndPadding(float newIconSize, float spacing) { // TODO(b/335457839): handle new bubble animation during the size change mBubbleBarPadding = spacing; mIconSize = newIconSize; int childCount = getChildCount(); for (int i = 0; i < childCount; i++) { View childView = getChildAt(i); FrameLayout.LayoutParams params = (LayoutParams) childView.getLayoutParams(); params.height = (int) mIconSize; params.width = (int) mIconSize; childView.setLayoutParams(params); } mBubbleBarBackground.setHeight(getBubbleBarHeight()); updateLayoutParams(); } @Override protected void onLayout(boolean changed, int left, int top, int right, int bottom) { super.onLayout(changed, left, top, right, bottom); Loading Loading @@ -516,6 +542,13 @@ public class BubbleBarView extends FrameLayout { setLayoutParams(lp); } private void updateLayoutParams() { LayoutParams lp = (FrameLayout.LayoutParams) getLayoutParams(); lp.height = getBubbleBarHeight(); lp.width = (int) (mIsBarExpanded ? expandedWidth() : collapsedWidth()); setLayoutParams(lp); } /** @return the horizontal margin between the bubble bar and the edge of the screen. */ int getHorizontalMargin() { LayoutParams lp = (FrameLayout.LayoutParams) getLayoutParams(); Loading Loading @@ -551,12 +584,12 @@ public class BubbleBarView extends FrameLayout { final float collapsedX; if (onLeft) { // If bar is on the left, bubbles are ordered right to left expandedX = (bubbleCount - i - 1) * (mIconSize + mIconSpacing); expandedX = (bubbleCount - i - 1) * (mIconSize + mExpandedBarIconsSpacing); // Shift the first bubble only if there are more bubbles in addition to overflow collapsedX = i == 0 && bubbleCount > 2 ? mIconOverlapAmount : 0; } else { // Bubbles ordered left to right, don't move the first bubble expandedX = i * (mIconSize + mIconSpacing); expandedX = i * (mIconSize + mExpandedBarIconsSpacing); collapsedX = i == 0 ? 0 : mIconOverlapAmount; } Loading Loading @@ -599,14 +632,14 @@ public class BubbleBarView extends FrameLayout { final float interpolatedWidth = widthState * (expandedWidth - collapsedWidth) + collapsedWidth; final float arrowPosition; if (onLeft) { float interpolatedShift = (expandedArrowPosition - collapsedArrowPosition) * widthState; if (onLeft) { arrowPosition = collapsedArrowPosition + interpolatedShift; } else { if (mIsBarExpanded) { // when the bar is expanding, the selected bubble is always the first, so the arrow // always shifts with the interpolated width. arrowPosition = currentWidth - interpolatedWidth + collapsedArrowPosition; arrowPosition = currentWidth - interpolatedWidth + collapsedArrowPosition + interpolatedShift; } else { final float targetPosition = currentWidth - collapsedWidth + collapsedArrowPosition; arrowPosition = Loading Loading @@ -709,7 +742,8 @@ public class BubbleBarView extends FrameLayout { } else { bubblePosition = index; } return getPaddingStart() + bubblePosition * (mIconSize + mIconSpacing) + mIconSize / 2f; return getPaddingStart() + bubblePosition * (mIconSize + mExpandedBarIconsSpacing) + mIconSize / 2f; } private float arrowPositionForSelectedWhenCollapsed() { Loading Loading @@ -770,7 +804,9 @@ public class BubbleBarView extends FrameLayout { public float expandedWidth() { final int childCount = getChildCount(); final int horizontalPadding = getPaddingStart() + getPaddingEnd(); return childCount * (mIconSize + mIconSpacing) + horizontalPadding; // spaces amount is less than child count by 1, or 0 if no child views int spacesCount = Math.max(childCount - 1, 0); return childCount * mIconSize + spacesCount * mExpandedBarIconsSpacing + horizontalPadding; } private float collapsedWidth() { Loading @@ -783,6 +819,10 @@ public class BubbleBarView extends FrameLayout { : mIconSize + horizontalPadding; } private int getBubbleBarHeight() { return (int) (mIconSize + mBubbleBarPadding * 2 + mPointerSize); } /** * Returns whether the given MotionEvent, *in screen coordinates*, is within bubble bar * touch bounds. Loading
quickstep/src/com/android/launcher3/taskbar/bubbles/BubbleBarViewController.java +38 −12 Original line number Diff line number Diff line Loading @@ -18,9 +18,12 @@ package com.android.launcher3.taskbar.bubbles; import static android.view.View.INVISIBLE; import static android.view.View.VISIBLE; import android.content.res.Resources; import android.graphics.Point; import android.graphics.Rect; import android.util.DisplayMetrics; import android.util.Log; import android.util.TypedValue; import android.view.Gravity; import android.view.MotionEvent; import android.view.View; Loading Loading @@ -52,12 +55,13 @@ import java.util.function.Consumer; public class BubbleBarViewController { private static final String TAG = BubbleBarViewController.class.getSimpleName(); private static final float APP_ICON_SMALL_DP = 44f; private static final float APP_ICON_MEDIUM_DP = 48f; private static final float APP_ICON_LARGE_DP = 52f; private final SystemUiProxy mSystemUiProxy; private final TaskbarActivityContext mActivity; private final BubbleBarView mBarView; private final int mIconSize; private final int mPointerSize; private int mIconSize; // Initialized in init. private BubbleStashController mBubbleStashController; Loading Loading @@ -96,9 +100,8 @@ public class BubbleBarViewController { mSystemUiProxy = SystemUiProxy.INSTANCE.get(mActivity); mBubbleBarAlpha = new MultiValueAlpha(mBarView, 1 /* num alpha channels */); mBubbleBarAlpha.setUpdateVisibility(true); mIconSize = activity.getResources().getDimensionPixelSize(R.dimen.bubblebar_icon_size); mPointerSize = activity.getResources().getDimensionPixelSize( R.dimen.bubblebar_pointer_size); mIconSize = activity.getResources().getDimensionPixelSize( R.dimen.bubblebar_icon_size); } public void init(TaskbarControllers controllers, BubbleControllers bubbleControllers) { Loading @@ -108,12 +111,8 @@ public class BubbleBarViewController { mTaskbarStashController = controllers.taskbarStashController; mTaskbarInsetsController = controllers.taskbarInsetsController; mActivity.addOnDeviceProfileChangeListener(dp -> mBarView.getLayoutParams().height = mActivity.getDeviceProfile().taskbarHeight + mPointerSize ); mBarView.getLayoutParams().height = mActivity.getDeviceProfile().taskbarHeight + mPointerSize; mActivity.addOnDeviceProfileChangeListener(dp -> setBubbleBarIconSize(dp.taskbarIconSize)); setBubbleBarIconSize(mActivity.getDeviceProfile().taskbarIconSize); mBubbleBarScale.updateValue(1f); mBubbleClickListener = v -> onBubbleClicked(v); mBubbleBarClickListener = v -> onBubbleBarClicked(); Loading Loading @@ -260,6 +259,33 @@ public class BubbleBarViewController { } } private void setBubbleBarIconSize(int newIconSize) { if (newIconSize == mIconSize) { return; } Resources res = mActivity.getResources(); DisplayMetrics dm = res.getDisplayMetrics(); float smallIconSize = TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, APP_ICON_SMALL_DP, dm); float mediumIconSize = TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, APP_ICON_MEDIUM_DP, dm); float largeIconSize = TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, APP_ICON_LARGE_DP, dm); float smallMediumThreshold = (smallIconSize + mediumIconSize) / 2f; float mediumLargeThreshold = (mediumIconSize + largeIconSize) / 2f; mIconSize = newIconSize <= smallMediumThreshold ? res.getDimensionPixelSize(R.dimen.bubblebar_icon_size_small) : res.getDimensionPixelSize(R.dimen.bubblebar_icon_size); float bubbleBarPadding = newIconSize >= mediumLargeThreshold ? res.getDimensionPixelSize(R.dimen.bubblebar_icon_spacing_large) : res.getDimensionPixelSize(R.dimen.bubblebar_icon_spacing); mBarView.setIconSizeAndPadding(mIconSize, bubbleBarPadding); mBarView.setPadding((int) bubbleBarPadding, mBarView.getPaddingTop(), (int) bubbleBarPadding, mBarView.getPaddingBottom()); } /** Sets a callback that updates the selected bubble after the bubble bar collapses. */ public void setUpdateSelectedBubbleAfterCollapse( Consumer<String> updateSelectedBubbleAfterCollapse) { Loading