55913d53c6
BubbleBarView shows BubbleViews in a bar similar to transient taskbar. BubbleBarView can be collapsed (bubbles in a stack) or expanded (bubbles all visible). When expanded, WMShell will be notified to show the appropriate expanded bubble view (not part of this CL). Also creates BubbleControllers which contains BubbleBarViewController and will eventually contain other controllers related to stashing for the bubble bar. Bug: 253318833 Test: manual, with other CLs, see go/bubble-bar-tests Flag: WM_BUBBLE_BAR Change-Id: I990ab3da6614db90ffff8c40281dc7f16b3957f6
135 lines
4.3 KiB
Java
135 lines
4.3 KiB
Java
/*
|
|
* Copyright (C) 2023 The Android Open Source Project
|
|
*
|
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
* you may not use this file except in compliance with the License.
|
|
* You may obtain a copy of the License at
|
|
*
|
|
* http://www.apache.org/licenses/LICENSE-2.0
|
|
*
|
|
* Unless required by applicable law or agreed to in writing, software
|
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
* See the License for the specific language governing permissions and
|
|
* limitations under the License.
|
|
*/
|
|
package com.android.launcher3.taskbar.bubbles;
|
|
|
|
import android.annotation.Nullable;
|
|
import android.content.Context;
|
|
import android.graphics.Bitmap;
|
|
import android.graphics.Outline;
|
|
import android.util.AttributeSet;
|
|
import android.view.LayoutInflater;
|
|
import android.view.View;
|
|
import android.view.ViewOutlineProvider;
|
|
import android.widget.ImageView;
|
|
|
|
import androidx.constraintlayout.widget.ConstraintLayout;
|
|
|
|
import com.android.launcher3.R;
|
|
import com.android.launcher3.icons.IconNormalizer;
|
|
|
|
// TODO: (b/276978250) This is will be similar to WMShell's BadgedImageView, it'd be nice to share.
|
|
// TODO: (b/269670235) currently this doesn't show the 'update dot'
|
|
/**
|
|
* View that displays a bubble icon, along with an app badge on either the left or
|
|
* right side of the view.
|
|
*/
|
|
public class BubbleView extends ConstraintLayout {
|
|
|
|
// TODO: (b/269670235) currently we don't render the 'update dot', this will be used for that.
|
|
public static final int DEFAULT_PATH_SIZE = 100;
|
|
|
|
private final ImageView mBubbleIcon;
|
|
private final ImageView mAppIcon;
|
|
private final int mBubbleSize;
|
|
|
|
// TODO: (b/273310265) handle RTL
|
|
private boolean mOnLeft = false;
|
|
|
|
private BubbleBarBubble mBubble;
|
|
|
|
public BubbleView(Context context) {
|
|
this(context, null);
|
|
}
|
|
|
|
public BubbleView(Context context, AttributeSet attrs) {
|
|
this(context, attrs, 0);
|
|
}
|
|
|
|
public BubbleView(Context context, AttributeSet attrs, int defStyleAttr) {
|
|
this(context, attrs, defStyleAttr, 0);
|
|
}
|
|
|
|
public BubbleView(Context context, AttributeSet attrs, int defStyleAttr,
|
|
int defStyleRes) {
|
|
super(context, attrs, defStyleAttr, defStyleRes);
|
|
// We manage positioning the badge ourselves
|
|
setLayoutDirection(LAYOUT_DIRECTION_LTR);
|
|
|
|
LayoutInflater.from(context).inflate(R.layout.bubble_view, this);
|
|
|
|
mBubbleSize = getResources().getDimensionPixelSize(R.dimen.bubblebar_icon_size);
|
|
mBubbleIcon = findViewById(R.id.icon_view);
|
|
mAppIcon = findViewById(R.id.app_icon_view);
|
|
|
|
setFocusable(true);
|
|
setClickable(true);
|
|
setOutlineProvider(new ViewOutlineProvider() {
|
|
@Override
|
|
public void getOutline(View view, Outline outline) {
|
|
BubbleView.this.getOutline(outline);
|
|
}
|
|
});
|
|
}
|
|
|
|
private void getOutline(Outline outline) {
|
|
final int normalizedSize = IconNormalizer.getNormalizedCircleSize(mBubbleSize);
|
|
final int inset = (mBubbleSize - normalizedSize) / 2;
|
|
outline.setOval(inset, inset, inset + normalizedSize, inset + normalizedSize);
|
|
}
|
|
|
|
/** Sets the bubble being rendered in this view. */
|
|
void setBubble(BubbleBarBubble bubble) {
|
|
mBubble = bubble;
|
|
mBubbleIcon.setImageBitmap(bubble.getIcon());
|
|
mAppIcon.setImageBitmap(bubble.getBadge());
|
|
}
|
|
|
|
/** Returns the bubble being rendered in this view. */
|
|
@Nullable
|
|
BubbleBarBubble getBubble() {
|
|
return mBubble;
|
|
}
|
|
|
|
/** Shows the app badge on this bubble. */
|
|
void showBadge() {
|
|
Bitmap appBadgeBitmap = mBubble.getBadge();
|
|
if (appBadgeBitmap == null) {
|
|
mAppIcon.setVisibility(GONE);
|
|
return;
|
|
}
|
|
|
|
int translationX;
|
|
if (mOnLeft) {
|
|
translationX = -(mBubble.getIcon().getWidth() - appBadgeBitmap.getWidth());
|
|
} else {
|
|
translationX = 0;
|
|
}
|
|
|
|
mAppIcon.setTranslationX(translationX);
|
|
mAppIcon.setVisibility(VISIBLE);
|
|
}
|
|
|
|
/** Hides the app badge on this bubble. */
|
|
void hideBadge() {
|
|
mAppIcon.setVisibility(GONE);
|
|
}
|
|
|
|
@Override
|
|
public String toString() {
|
|
return "BubbleView{" + mBubble + "}";
|
|
}
|
|
}
|