Merge "Show the overflow expanded view in bubble bar" into udc-qpr-dev

This commit is contained in:
Liran Binyamin
2023-06-21 20:00:36 +00:00
committed by Android (Google) Code Review
11 changed files with 204 additions and 135 deletions

View File

@@ -780,7 +780,7 @@ public class BubbleController implements ConfigurationChangeListener,
try {
mAddedToWindowManager = true;
registerBroadcastReceiver();
mBubbleData.getOverflow().initialize(this);
mBubbleData.getOverflow().initialize(this, isShowingAsBubbleBar());
// (TODO: b/273314541) some duplication in the inset listener
if (isShowingAsBubbleBar()) {
mWindowManager.addView(mLayerView, mWmLayoutParams);
@@ -1077,6 +1077,13 @@ public class BubbleController implements ConfigurationChangeListener,
@VisibleForTesting
public void expandStackAndSelectBubbleFromLauncher(String key, boolean onLauncherHome) {
mBubblePositioner.setShowingInBubbleBar(onLauncherHome);
if (BubbleOverflow.KEY.equals(key)) {
mBubbleData.setSelectedBubbleFromLauncher(mBubbleData.getOverflow());
mLayerView.showExpandedView(mBubbleData.getOverflow());
return;
}
Bubble b = mBubbleData.getAnyBubbleWithkey(key);
if (b == null) {
return;

View File

@@ -948,9 +948,9 @@ public class BubbleExpandedView extends LinearLayout {
mTaskView.onLocationChanged();
}
if (mIsOverflow) {
post(() -> {
mOverflowView.show();
});
// post this to the looper so that the view has a chance to be laid out before it can
// calculate row and column sizes correctly.
post(() -> mOverflowView.show());
}
}

View File

@@ -44,6 +44,7 @@ class BubbleOverflow(private val context: Context, private val positioner: Bubbl
private val inflater: LayoutInflater = LayoutInflater.from(context)
private var expandedView: BubbleExpandedView?
private var bubbleBarExpandedView: BubbleBarExpandedView? = null
private var overflowBtn: BadgedImageView?
init {
@@ -53,19 +54,26 @@ class BubbleOverflow(private val context: Context, private val positioner: Bubbl
}
/** Call before use and again if cleanUpExpandedState was called. */
fun initialize(controller: BubbleController) {
createExpandedView()
getExpandedView()?.initialize(controller, controller.stackView, true /* isOverflow */)
fun initialize(controller: BubbleController, forBubbleBar: Boolean) {
if (forBubbleBar) {
createBubbleBarExpandedView().initialize(controller, true /* isOverflow */)
} else {
createExpandedView()
.initialize(controller, controller.stackView, true /* isOverflow */)
}
}
fun cleanUpExpandedState() {
expandedView?.cleanUpExpandedState()
expandedView = null
bubbleBarExpandedView?.cleanUpExpandedState()
bubbleBarExpandedView = null
}
fun update() {
updateResources()
getExpandedView()?.applyThemeAttrs()
getBubbleBarExpandedView()?.applyThemeAttrs()
// Apply inset and new style to fresh icon drawable.
getIconView()?.setIconImageResource(R.drawable.bubble_ic_overflow_button)
updateBtnTheme()
@@ -151,26 +159,39 @@ class BubbleOverflow(private val context: Context, private val positioner: Bubbl
overflowBtn?.updateDotVisibility(true /* animate */)
}
fun createExpandedView(): BubbleExpandedView? {
expandedView =
/** Creates the expanded view for bubbles showing in the stack view. */
private fun createExpandedView(): BubbleExpandedView {
val view =
inflater.inflate(
R.layout.bubble_expanded_view,
null /* root */,
false /* attachToRoot */
) as BubbleExpandedView
expandedView?.applyThemeAttrs()
view.applyThemeAttrs()
expandedView = view
updateResources()
return expandedView
return view
}
override fun getExpandedView(): BubbleExpandedView? {
return expandedView
}
override fun getBubbleBarExpandedView(): BubbleBarExpandedView? {
return null
/** Creates the expanded view for bubbles showing in the bubble bar. */
private fun createBubbleBarExpandedView(): BubbleBarExpandedView {
val view =
inflater.inflate(
R.layout.bubble_bar_expanded_view,
null, /* root */
false /* attachToRoot*/
) as BubbleBarExpandedView
view.applyThemeAttrs()
bubbleBarExpandedView = view
return view
}
override fun getBubbleBarExpandedView(): BubbleBarExpandedView? = bubbleBarExpandedView
override fun getDotColor(): Int {
return dotColor
}

View File

@@ -732,17 +732,25 @@ public class BubblePositioner {
/**
* How wide the expanded view should be when showing from the bubble bar.
*/
public int getExpandedViewWidthForBubbleBar() {
return mExpandedViewLargeScreenWidth;
public int getExpandedViewWidthForBubbleBar(boolean isOverflow) {
return isOverflow ? mOverflowWidth : mExpandedViewLargeScreenWidth;
}
/**
* How tall the expanded view should be when showing from the bubble bar.
*/
public int getExpandedViewHeightForBubbleBar() {
public int getExpandedViewHeightForBubbleBar(boolean isOverflow) {
return isOverflow
? mOverflowHeight
: getExpandedViewBottomForBubbleBar() - mInsets.top - mExpandedViewPadding;
}
/** The bottom position of the expanded view when showing above the bubble bar. */
public int getExpandedViewBottomForBubbleBar() {
return getAvailableRect().height()
+ mInsets.top
- mBubbleBarSize
- mExpandedViewPadding * 2
- mExpandedViewPadding
- getBubbleBarHomeAdjustment();
}

View File

@@ -1500,9 +1500,6 @@ public class BubbleStackView extends FrameLayout
getViewTreeObserver().removeOnPreDrawListener(mViewUpdater);
getViewTreeObserver().removeOnDrawListener(mSystemGestureExcludeUpdater);
getViewTreeObserver().removeOnComputeInternalInsetsListener(this);
if (mBubbleOverflow != null) {
mBubbleOverflow.cleanUpExpandedState();
}
}
@Override

View File

@@ -176,44 +176,14 @@ public class BubbleViewInfoTask extends AsyncTask<Void, Void, BubbleViewInfoTask
LayoutInflater inflater = LayoutInflater.from(c);
info.bubbleBarExpandedView = (BubbleBarExpandedView) inflater.inflate(
R.layout.bubble_bar_expanded_view, layerView, false /* attachToRoot */);
info.bubbleBarExpandedView.initialize(controller);
info.bubbleBarExpandedView.initialize(controller, false /* isOverflow */);
}
if (b.getShortcutInfo() != null) {
info.shortcutInfo = b.getShortcutInfo();
}
// App name & app icon
PackageManager pm = BubbleController.getPackageManagerForUser(c,
b.getUser().getIdentifier());
ApplicationInfo appInfo;
Drawable badgedIcon;
Drawable appIcon;
try {
appInfo = pm.getApplicationInfo(
b.getPackageName(),
PackageManager.MATCH_UNINSTALLED_PACKAGES
| PackageManager.MATCH_DISABLED_COMPONENTS
| PackageManager.MATCH_DIRECT_BOOT_UNAWARE
| PackageManager.MATCH_DIRECT_BOOT_AWARE);
if (appInfo != null) {
info.appName = String.valueOf(pm.getApplicationLabel(appInfo));
}
appIcon = pm.getApplicationIcon(b.getPackageName());
badgedIcon = pm.getUserBadgedIcon(appIcon, b.getUser());
} catch (PackageManager.NameNotFoundException exception) {
// If we can't find package... don't think we should show the bubble.
Log.w(TAG, "Unable to find package: " + b.getPackageName());
if (!populateCommonInfo(info, c, b, iconFactory)) {
// if we failed to update common fields return null
return null;
}
info.rawBadgeBitmap = iconFactory.getBadgeBitmap(badgedIcon, false).icon;
float[] bubbleBitmapScale = new float[1];
info.bubbleBitmap = iconFactory.getBubbleBitmap(
iconFactory.getBubbleDrawable(c, info.shortcutInfo,
b.getIcon()), bubbleBitmapScale);
return info;
}
@@ -236,66 +206,11 @@ public class BubbleViewInfoTask extends AsyncTask<Void, Void, BubbleViewInfoTask
info.expandedView.initialize(controller, stackView, false /* isOverflow */);
}
if (b.getShortcutInfo() != null) {
info.shortcutInfo = b.getShortcutInfo();
}
// App name & app icon
PackageManager pm = BubbleController.getPackageManagerForUser(c,
b.getUser().getIdentifier());
ApplicationInfo appInfo;
Drawable badgedIcon;
Drawable appIcon;
try {
appInfo = pm.getApplicationInfo(
b.getPackageName(),
PackageManager.MATCH_UNINSTALLED_PACKAGES
| PackageManager.MATCH_DISABLED_COMPONENTS
| PackageManager.MATCH_DIRECT_BOOT_UNAWARE
| PackageManager.MATCH_DIRECT_BOOT_AWARE);
if (appInfo != null) {
info.appName = String.valueOf(pm.getApplicationLabel(appInfo));
}
appIcon = pm.getApplicationIcon(b.getPackageName());
badgedIcon = pm.getUserBadgedIcon(appIcon, b.getUser());
} catch (PackageManager.NameNotFoundException exception) {
// If we can't find package... don't think we should show the bubble.
Log.w(TAG, "Unable to find package: " + b.getPackageName());
if (!populateCommonInfo(info, c, b, iconFactory)) {
// if we failed to update common fields return null
return null;
}
// Badged bubble image
Drawable bubbleDrawable = iconFactory.getBubbleDrawable(c, info.shortcutInfo,
b.getIcon());
if (bubbleDrawable == null) {
// Default to app icon
bubbleDrawable = appIcon;
}
BitmapInfo badgeBitmapInfo = iconFactory.getBadgeBitmap(badgedIcon,
b.isImportantConversation());
info.badgeBitmap = badgeBitmapInfo.icon;
// Raw badge bitmap never includes the important conversation ring
info.rawBadgeBitmap = b.isImportantConversation()
? iconFactory.getBadgeBitmap(badgedIcon, false).icon
: badgeBitmapInfo.icon;
float[] bubbleBitmapScale = new float[1];
info.bubbleBitmap = iconFactory.getBubbleBitmap(bubbleDrawable, bubbleBitmapScale);
// Dot color & placement
Path iconPath = PathParser.createPathFromPathData(
c.getResources().getString(com.android.internal.R.string.config_icon_mask));
Matrix matrix = new Matrix();
float scale = bubbleBitmapScale[0];
float radius = DEFAULT_PATH_SIZE / 2f;
matrix.setScale(scale /* x scale */, scale /* y scale */, radius /* pivot x */,
radius /* pivot y */);
iconPath.transform(matrix);
info.dotPath = iconPath;
info.dotColor = ColorUtils.blendARGB(badgeBitmapInfo.color,
Color.WHITE, WHITE_SCRIM_ALPHA);
// Flyout
info.flyoutMessage = b.getFlyoutMessage();
if (info.flyoutMessage != null) {
@@ -306,6 +221,75 @@ public class BubbleViewInfoTask extends AsyncTask<Void, Void, BubbleViewInfoTask
}
}
/**
* Modifies the given {@code info} object and populates common fields in it.
*
* <p>This method returns {@code true} if the update was successful and {@code false} otherwise.
* Callers should assume that the info object is unusable if the update was unsuccessful.
*/
private static boolean populateCommonInfo(
BubbleViewInfo info, Context c, Bubble b, BubbleIconFactory iconFactory) {
if (b.getShortcutInfo() != null) {
info.shortcutInfo = b.getShortcutInfo();
}
// App name & app icon
PackageManager pm = BubbleController.getPackageManagerForUser(c,
b.getUser().getIdentifier());
ApplicationInfo appInfo;
Drawable badgedIcon;
Drawable appIcon;
try {
appInfo = pm.getApplicationInfo(
b.getPackageName(),
PackageManager.MATCH_UNINSTALLED_PACKAGES
| PackageManager.MATCH_DISABLED_COMPONENTS
| PackageManager.MATCH_DIRECT_BOOT_UNAWARE
| PackageManager.MATCH_DIRECT_BOOT_AWARE);
if (appInfo != null) {
info.appName = String.valueOf(pm.getApplicationLabel(appInfo));
}
appIcon = pm.getApplicationIcon(b.getPackageName());
badgedIcon = pm.getUserBadgedIcon(appIcon, b.getUser());
} catch (PackageManager.NameNotFoundException exception) {
// If we can't find package... don't think we should show the bubble.
Log.w(TAG, "Unable to find package: " + b.getPackageName());
return false;
}
// Badged bubble image
Drawable bubbleDrawable = iconFactory.getBubbleDrawable(c, info.shortcutInfo, b.getIcon());
if (bubbleDrawable == null) {
// Default to app icon
bubbleDrawable = appIcon;
}
BitmapInfo badgeBitmapInfo = iconFactory.getBadgeBitmap(badgedIcon,
b.isImportantConversation());
info.badgeBitmap = badgeBitmapInfo.icon;
// Raw badge bitmap never includes the important conversation ring
info.rawBadgeBitmap = b.isImportantConversation() // is this needed for bar?
? iconFactory.getBadgeBitmap(badgedIcon, false).icon
: badgeBitmapInfo.icon;
float[] bubbleBitmapScale = new float[1];
info.bubbleBitmap = iconFactory.getBubbleBitmap(bubbleDrawable, bubbleBitmapScale);
// Dot color & placement
Path iconPath = PathParser.createPathFromPathData(
c.getResources().getString(com.android.internal.R.string.config_icon_mask));
Matrix matrix = new Matrix();
float scale = bubbleBitmapScale[0];
float radius = DEFAULT_PATH_SIZE / 2f;
matrix.setScale(scale /* x scale */, scale /* y scale */, radius /* pivot x */,
radius /* pivot y */);
iconPath.transform(matrix);
info.dotPath = iconPath;
info.dotColor = ColorUtils.blendARGB(badgeBitmapInfo.color,
Color.WHITE, WHITE_SCRIM_ALPHA);
return true;
}
@Nullable
static Drawable loadSenderAvatar(@NonNull final Context context, @Nullable final Icon icon) {
Objects.requireNonNull(context);

View File

@@ -27,6 +27,7 @@ import android.widget.FrameLayout;
import com.android.wm.shell.animation.Interpolators;
import com.android.wm.shell.animation.PhysicsAnimator;
import com.android.wm.shell.bubbles.BubbleOverflow;
import com.android.wm.shell.bubbles.BubblePositioner;
import com.android.wm.shell.bubbles.BubbleViewProvider;
import com.android.wm.shell.bubbles.animation.AnimatableScaleMatrix;
@@ -215,9 +216,10 @@ public class BubbleBarAnimationHelper {
}
BubbleBarExpandedView bbev = mExpandedBubble.getBubbleBarExpandedView();
boolean isOverflowExpanded = mExpandedBubble.getKey().equals(BubbleOverflow.KEY);
final int padding = mPositioner.getBubbleBarExpandedViewPadding();
final int width = mPositioner.getExpandedViewWidthForBubbleBar();
final int height = mPositioner.getExpandedViewHeightForBubbleBar();
final int width = mPositioner.getExpandedViewWidthForBubbleBar(isOverflowExpanded);
final int height = mPositioner.getExpandedViewHeightForBubbleBar(isOverflowExpanded);
FrameLayout.LayoutParams lp = (FrameLayout.LayoutParams) bbev.getLayoutParams();
lp.width = width;
lp.height = height;
@@ -227,7 +229,8 @@ public class BubbleBarAnimationHelper {
} else {
bbev.setX(mPositioner.getAvailableRect().width() - width - padding);
}
bbev.setY(mPositioner.getInsets().top + padding);
bbev.setY(mPositioner.getExpandedViewBottomForBubbleBar() - height);
bbev.updateLocation();
bbev.maybeShowOverflow();
}
}

View File

@@ -25,6 +25,7 @@ import android.graphics.Color;
import android.graphics.Outline;
import android.graphics.Rect;
import android.util.AttributeSet;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewOutlineProvider;
import android.widget.FrameLayout;
@@ -33,6 +34,7 @@ import com.android.internal.policy.ScreenDecorationsUtils;
import com.android.wm.shell.R;
import com.android.wm.shell.bubbles.Bubble;
import com.android.wm.shell.bubbles.BubbleController;
import com.android.wm.shell.bubbles.BubbleOverflowContainerView;
import com.android.wm.shell.bubbles.BubbleTaskViewHelper;
import com.android.wm.shell.bubbles.Bubbles;
import com.android.wm.shell.taskview.TaskView;
@@ -51,6 +53,7 @@ public class BubbleBarExpandedView extends FrameLayout implements BubbleTaskView
private static final int INVALID_TASK_ID = -1;
private BubbleController mController;
private boolean mIsOverflow;
private BubbleTaskViewHelper mBubbleTaskViewHelper;
private BubbleBarMenuViewController mMenuViewController;
private @Nullable Supplier<Rect> mLayerBoundsSupplier;
@@ -58,6 +61,7 @@ public class BubbleBarExpandedView extends FrameLayout implements BubbleTaskView
private BubbleBarHandleView mHandleView = new BubbleBarHandleView(getContext());
private @Nullable TaskView mTaskView;
private @Nullable BubbleOverflowContainerView mOverflowView;
private int mHandleHeight;
private int mBackgroundColor;
@@ -114,15 +118,25 @@ public class BubbleBarExpandedView extends FrameLayout implements BubbleTaskView
}
/** Set the BubbleController on the view, must be called before doing anything else. */
public void initialize(BubbleController controller) {
public void initialize(BubbleController controller, boolean isOverflow) {
mController = controller;
mBubbleTaskViewHelper = new BubbleTaskViewHelper(mContext, mController,
/* listener= */ this,
/* viewParent= */ this);
mTaskView = mBubbleTaskViewHelper.getTaskView();
addView(mTaskView);
mTaskView.setEnableSurfaceClipping(true);
mTaskView.setCornerRadius(mCornerRadius);
mIsOverflow = isOverflow;
if (mIsOverflow) {
mOverflowView = (BubbleOverflowContainerView) LayoutInflater.from(getContext()).inflate(
R.layout.bubble_overflow_container, null /* root */);
mOverflowView.setBubbleController(mController);
addView(mOverflowView);
} else {
mBubbleTaskViewHelper = new BubbleTaskViewHelper(mContext, mController,
/* listener= */ this,
/* viewParent= */ this);
mTaskView = mBubbleTaskViewHelper.getTaskView();
addView(mTaskView);
mTaskView.setEnableSurfaceClipping(true);
mTaskView.setCornerRadius(mCornerRadius);
}
mMenuViewController = new BubbleBarMenuViewController(mContext, this);
mMenuViewController.setListener(new BubbleBarMenuViewController.Listener() {
@Override
@@ -156,7 +170,8 @@ public class BubbleBarExpandedView extends FrameLayout implements BubbleTaskView
}
// TODO (b/275087636): call this when theme/config changes
void applyThemeAttrs() {
/** Updates the view based on the current theme. */
public void applyThemeAttrs() {
boolean supportsRoundedCorners = ScreenDecorationsUtils.supportsRoundedCornersOnWindows(
mContext.getResources());
final TypedArray ta = mContext.obtainStyledAttributes(new int[]{
@@ -257,8 +272,18 @@ public class BubbleBarExpandedView extends FrameLayout implements BubbleTaskView
* Call when the location or size of the view has changed to update TaskView.
*/
public void updateLocation() {
if (mTaskView == null) return;
mTaskView.onLocationChanged();
if (mTaskView != null) {
mTaskView.onLocationChanged();
}
}
/** Shows the expanded view for the overflow if it exists. */
void maybeShowOverflow() {
if (mOverflowView != null) {
// post this to the looper so that the view has a chance to be laid out before it can
// calculate row and column sizes correctly.
post(() -> mOverflowView.show());
}
}
/** Sets the alpha of the task view. */

View File

@@ -29,6 +29,7 @@ import android.view.ViewTreeObserver;
import android.widget.FrameLayout;
import com.android.wm.shell.bubbles.BubbleController;
import com.android.wm.shell.bubbles.BubbleOverflow;
import com.android.wm.shell.bubbles.BubblePositioner;
import com.android.wm.shell.bubbles.BubbleViewProvider;
@@ -146,8 +147,9 @@ public class BubbleBarLayerView extends FrameLayout
if (mExpandedView == null) {
mExpandedBubble = b;
mExpandedView = expandedView;
final int width = mPositioner.getExpandedViewWidthForBubbleBar();
final int height = mPositioner.getExpandedViewHeightForBubbleBar();
boolean isOverflowExpanded = b.getKey().equals(BubbleOverflow.KEY);
final int width = mPositioner.getExpandedViewWidthForBubbleBar(isOverflowExpanded);
final int height = mPositioner.getExpandedViewHeightForBubbleBar(isOverflowExpanded);
mExpandedView.setVisibility(GONE);
mExpandedView.setUnBubbleConversationCallback(mUnBubbleConversationCallback);
mExpandedView.setLayerBoundsSupplier(() -> new Rect(0, 0, getWidth(), getHeight()));
@@ -156,6 +158,7 @@ public class BubbleBarLayerView extends FrameLayout
mUnBubbleConversationCallback.accept(bubbleKey);
}
});
mExpandedView.setY(mPositioner.getExpandedViewBottomForBubbleBar() - height);
addView(mExpandedView, new FrameLayout.LayoutParams(width, height));
}
@@ -184,9 +187,10 @@ public class BubbleBarLayerView extends FrameLayout
/** Updates the expanded view size and position. */
private void updateExpandedView() {
if (mExpandedView == null) return;
boolean isOverflowExpanded = mExpandedBubble.getKey().equals(BubbleOverflow.KEY);
final int padding = mPositioner.getBubbleBarExpandedViewPadding();
final int width = mPositioner.getExpandedViewWidthForBubbleBar();
final int height = mPositioner.getExpandedViewHeightForBubbleBar();
final int width = mPositioner.getExpandedViewWidthForBubbleBar(isOverflowExpanded);
final int height = mPositioner.getExpandedViewHeightForBubbleBar(isOverflowExpanded);
FrameLayout.LayoutParams lp = (LayoutParams) mExpandedView.getLayoutParams();
lp.width = width;
lp.height = height;
@@ -196,7 +200,7 @@ public class BubbleBarLayerView extends FrameLayout
} else {
mExpandedView.setX(mPositioner.getAvailableRect().width() - width - padding);
}
mExpandedView.setY(mPositioner.getInsets().top + padding);
mExpandedView.setY(mPositioner.getExpandedViewBottomForBubbleBar() - height);
mExpandedView.updateLocation();
}

View File

@@ -64,18 +64,27 @@ public class BubbleOverflowTest extends ShellTestCase {
}
@Test
public void test_initialize() {
public void test_initialize_forStack() {
assertThat(mOverflow.getExpandedView()).isNull();
mOverflow.initialize(mBubbleController);
mOverflow.initialize(mBubbleController, /* forBubbleBar= */ false);
assertThat(mOverflow.getExpandedView()).isNotNull();
assertThat(mOverflow.getExpandedView().getBubbleKey()).isEqualTo(BubbleOverflow.KEY);
assertThat(mOverflow.getBubbleBarExpandedView()).isNull();
}
@Test
public void test_initialize_forBubbleBar() {
mOverflow.initialize(mBubbleController, /* forBubbleBar= */ true);
assertThat(mOverflow.getBubbleBarExpandedView()).isNotNull();
assertThat(mOverflow.getExpandedView()).isNull();
}
@Test
public void test_cleanUpExpandedState() {
mOverflow.createExpandedView();
mOverflow.initialize(mBubbleController, /* forBubbleBar= */ false);
assertThat(mOverflow.getExpandedView()).isNotNull();
mOverflow.cleanUpExpandedState();

View File

@@ -133,8 +133,10 @@ import com.android.wm.shell.bubbles.BubbleData;
import com.android.wm.shell.bubbles.BubbleDataRepository;
import com.android.wm.shell.bubbles.BubbleEntry;
import com.android.wm.shell.bubbles.BubbleLogger;
import com.android.wm.shell.bubbles.BubbleOverflow;
import com.android.wm.shell.bubbles.BubbleStackView;
import com.android.wm.shell.bubbles.BubbleViewInfoTask;
import com.android.wm.shell.bubbles.BubbleViewProvider;
import com.android.wm.shell.bubbles.Bubbles;
import com.android.wm.shell.bubbles.StackEducationViewKt;
import com.android.wm.shell.bubbles.properties.BubbleProperties;
@@ -1936,6 +1938,7 @@ public class BubblesTest extends SysuiTestCase {
assertThat(mBubbleData.getBubbles()).hasSize(1);
assertBubbleIsInflatedForStack(mBubbleData.getBubbles().get(0));
assertBubbleIsInflatedForStack(mBubbleData.getOverflow());
FakeBubbleStateListener bubbleStateListener = new FakeBubbleStateListener();
mBubbleController.registerBubbleStateListener(bubbleStateListener);
@@ -1944,6 +1947,7 @@ public class BubblesTest extends SysuiTestCase {
assertThat(mBubbleData.getBubbles()).hasSize(1);
assertBubbleIsInflatedForBar(mBubbleData.getBubbles().get(0));
assertBubbleIsInflatedForBar(mBubbleData.getOverflow());
mBubbleController.unregisterBubbleStateListener();
@@ -1951,6 +1955,7 @@ public class BubblesTest extends SysuiTestCase {
assertThat(mBubbleData.getBubbles()).hasSize(1);
assertBubbleIsInflatedForStack(mBubbleData.getBubbles().get(0));
assertBubbleIsInflatedForStack(mBubbleData.getOverflow());
}
@Test
@@ -2118,7 +2123,7 @@ public class BubblesTest extends SysuiTestCase {
}
/** Asserts that the given bubble has the stack expanded view inflated. */
private void assertBubbleIsInflatedForStack(Bubble b) {
private void assertBubbleIsInflatedForStack(BubbleViewProvider b) {
assertThat(b.getIconView()).isNotNull();
assertThat(b.getExpandedView()).isNotNull();
assertThat(b.getBubbleBarExpandedView()).isNull();
@@ -2131,8 +2136,14 @@ public class BubblesTest extends SysuiTestCase {
}
/** Asserts that the given bubble has the bar expanded view inflated. */
private void assertBubbleIsInflatedForBar(Bubble b) {
assertThat(b.getIconView()).isNull();
private void assertBubbleIsInflatedForBar(BubbleViewProvider b) {
// the icon view should be inflated for the overflow but not for other bubbles when showing
// in the bar
if (b instanceof Bubble) {
assertThat(b.getIconView()).isNull();
} else if (b instanceof BubbleOverflow) {
assertThat(b.getIconView()).isNotNull();
}
assertThat(b.getExpandedView()).isNull();
assertThat(b.getBubbleBarExpandedView()).isNotNull();
}