|
|
|
|
@@ -69,7 +69,7 @@ import com.android.systemui.statusbar.notification.row.ExpandableNotificationRow
|
|
|
|
|
import com.android.systemui.statusbar.notification.stack.ExpandableViewState;
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* Container for the expanded bubble view, handles rendering the caret and header of the view.
|
|
|
|
|
* Container for the expanded bubble view, handles rendering the caret and settings icon.
|
|
|
|
|
*/
|
|
|
|
|
public class BubbleExpandedView extends LinearLayout implements View.OnClickListener {
|
|
|
|
|
private static final String TAG = "BubbleExpandedView";
|
|
|
|
|
@@ -82,6 +82,7 @@ public class BubbleExpandedView extends LinearLayout implements View.OnClickList
|
|
|
|
|
|
|
|
|
|
// Permission view
|
|
|
|
|
private View mPermissionView;
|
|
|
|
|
private TextView mPermissionPrompt;
|
|
|
|
|
|
|
|
|
|
// Views for expanded state
|
|
|
|
|
private ExpandableNotificationRow mNotifRow;
|
|
|
|
|
@@ -94,9 +95,13 @@ public class BubbleExpandedView extends LinearLayout implements View.OnClickList
|
|
|
|
|
private boolean mNeedsNewHeight;
|
|
|
|
|
|
|
|
|
|
private int mMinHeight;
|
|
|
|
|
private int mHeaderHeight;
|
|
|
|
|
private int mSettingsIconHeight;
|
|
|
|
|
private int mBubbleHeight;
|
|
|
|
|
private int mPermissionHeight;
|
|
|
|
|
private int mIconInset;
|
|
|
|
|
private Drawable mSettingsIconDrawable;
|
|
|
|
|
private int mPointerWidth;
|
|
|
|
|
private int mPointerHeight;
|
|
|
|
|
|
|
|
|
|
private NotificationEntry mEntry;
|
|
|
|
|
private PackageManager mPm;
|
|
|
|
|
@@ -173,20 +178,21 @@ public class BubbleExpandedView extends LinearLayout implements View.OnClickList
|
|
|
|
|
|
|
|
|
|
Resources res = getResources();
|
|
|
|
|
mPointerView = findViewById(R.id.pointer_view);
|
|
|
|
|
int width = res.getDimensionPixelSize(R.dimen.bubble_pointer_width);
|
|
|
|
|
int height = res.getDimensionPixelSize(R.dimen.bubble_pointer_height);
|
|
|
|
|
mPointerWidth = res.getDimensionPixelSize(R.dimen.bubble_pointer_width);
|
|
|
|
|
mPointerHeight = res.getDimensionPixelSize(R.dimen.bubble_pointer_height);
|
|
|
|
|
|
|
|
|
|
TypedArray ta = getContext().obtainStyledAttributes(
|
|
|
|
|
new int[] {android.R.attr.colorBackgroundFloating});
|
|
|
|
|
int bgColor = ta.getColor(0, Color.WHITE);
|
|
|
|
|
ta.recycle();
|
|
|
|
|
|
|
|
|
|
ShapeDrawable triangleDrawable = new ShapeDrawable(
|
|
|
|
|
TriangleShape.create(width, height, false /* pointUp */));
|
|
|
|
|
ShapeDrawable triangleDrawable = new ShapeDrawable(TriangleShape.create(
|
|
|
|
|
mPointerWidth, mPointerHeight, false /* pointUp */));
|
|
|
|
|
|
|
|
|
|
triangleDrawable.setTint(bgColor);
|
|
|
|
|
mPointerView.setBackground(triangleDrawable);
|
|
|
|
|
|
|
|
|
|
FrameLayout viewWrapper = findViewById(R.id.header_permission_wrapper);
|
|
|
|
|
FrameLayout permissionOrSettings = findViewById(R.id.permission_or_settings);
|
|
|
|
|
|
|
|
|
|
LayoutTransition transition = new LayoutTransition();
|
|
|
|
|
transition.setDuration(200);
|
|
|
|
|
@@ -200,18 +206,21 @@ public class BubbleExpandedView extends LinearLayout implements View.OnClickList
|
|
|
|
|
transition.setInterpolator(LayoutTransition.DISAPPEARING, Interpolators.ALPHA_OUT);
|
|
|
|
|
|
|
|
|
|
transition.setAnimateParentHierarchy(false);
|
|
|
|
|
viewWrapper.setLayoutTransition(transition);
|
|
|
|
|
viewWrapper.getLayoutTransition().enableTransitionType(LayoutTransition.CHANGING);
|
|
|
|
|
permissionOrSettings.setLayoutTransition(transition);
|
|
|
|
|
permissionOrSettings.getLayoutTransition().enableTransitionType(LayoutTransition.CHANGING);
|
|
|
|
|
|
|
|
|
|
mHeaderHeight = getContext().getResources().getDimensionPixelSize(
|
|
|
|
|
mSettingsIconHeight = getContext().getResources().getDimensionPixelSize(
|
|
|
|
|
R.dimen.bubble_expanded_header_height);
|
|
|
|
|
mSettingsIcon = findViewById(R.id.settings_button);
|
|
|
|
|
mIconInset = getResources().getDimensionPixelSize(R.dimen.bubble_icon_inset);
|
|
|
|
|
mSettingsIcon.setOnClickListener(this);
|
|
|
|
|
// Save initial drawable to create adaptive icons that will take its place.
|
|
|
|
|
mSettingsIconDrawable = mSettingsIcon.getDrawable();
|
|
|
|
|
|
|
|
|
|
mPermissionHeight = getContext().getResources().getDimensionPixelSize(
|
|
|
|
|
R.dimen.bubble_permission_height);
|
|
|
|
|
|
|
|
|
|
mPermissionView = findViewById(R.id.permission_layout);
|
|
|
|
|
mSettingsIcon = findViewById(R.id.settings_button);
|
|
|
|
|
mSettingsIcon.setOnClickListener(this);
|
|
|
|
|
updateHeaderColor();
|
|
|
|
|
mPermissionPrompt = mPermissionView.findViewById(R.id.prompt);
|
|
|
|
|
|
|
|
|
|
findViewById(R.id.no_bubbles_button).setOnClickListener(this);
|
|
|
|
|
findViewById(R.id.yes_bubbles_button).setOnClickListener(this);
|
|
|
|
|
@@ -264,7 +273,7 @@ public class BubbleExpandedView extends LinearLayout implements View.OnClickList
|
|
|
|
|
/**
|
|
|
|
|
* Creates a background with corners rounded based on how the view is configured to display
|
|
|
|
|
*/
|
|
|
|
|
private Drawable createHeaderPermissionBackground(int bgColor) {
|
|
|
|
|
private Drawable createPermissionBackground(int bgColor) {
|
|
|
|
|
TypedArray ta2 = getContext().obtainStyledAttributes(
|
|
|
|
|
new int[] {android.R.attr.dialogCornerRadius});
|
|
|
|
|
final float cr = ta2.getDimension(0, 0f);
|
|
|
|
|
@@ -311,8 +320,8 @@ public class BubbleExpandedView extends LinearLayout implements View.OnClickList
|
|
|
|
|
if (mAppIcon == null) {
|
|
|
|
|
mAppIcon = mPm.getDefaultActivityIcon();
|
|
|
|
|
}
|
|
|
|
|
updateHeaderView();
|
|
|
|
|
updatePermissionView();
|
|
|
|
|
updateTheme();
|
|
|
|
|
togglePermissionOrSettings();
|
|
|
|
|
updateExpandedView();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
@@ -338,12 +347,12 @@ public class BubbleExpandedView extends LinearLayout implements View.OnClickList
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* Updates the entry backing this view. This will not re-populate ActivityView, it will
|
|
|
|
|
* only update the deep-links in the header, the title, and the height of the view.
|
|
|
|
|
* only update the deep-links in the title, and the height of the view.
|
|
|
|
|
*/
|
|
|
|
|
public void update(NotificationEntry entry) {
|
|
|
|
|
if (entry.key.equals(mEntry.key)) {
|
|
|
|
|
mEntry = entry;
|
|
|
|
|
updateHeaderView();
|
|
|
|
|
updateSettingsContentDescription();
|
|
|
|
|
updateHeight();
|
|
|
|
|
} else {
|
|
|
|
|
Log.w(TAG, "Trying to update entry with different key, new entry: "
|
|
|
|
|
@@ -351,35 +360,36 @@ public class BubbleExpandedView extends LinearLayout implements View.OnClickList
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* Update header color and icon shape when theme changes.
|
|
|
|
|
*/
|
|
|
|
|
void updateHeaderColor() {
|
|
|
|
|
void updateTheme() {
|
|
|
|
|
// Get new colors.
|
|
|
|
|
TypedArray ta = mContext.obtainStyledAttributes(
|
|
|
|
|
new int[] {android.R.attr.colorBackgroundFloating, android.R.attr.colorForeground});
|
|
|
|
|
new int[]{android.R.attr.colorBackgroundFloating, android.R.attr.colorForeground});
|
|
|
|
|
int backgroundColor = ta.getColor(0, Color.WHITE /* default */);
|
|
|
|
|
int foregroundColor = ta.getColor(1, Color.BLACK /* default */);
|
|
|
|
|
ta.recycle();
|
|
|
|
|
|
|
|
|
|
mPermissionView.setBackground(createHeaderPermissionBackground(backgroundColor));
|
|
|
|
|
// Must clear tint first - otherwise tint updates inconsistently.
|
|
|
|
|
mSettingsIconDrawable.setTintList(null);
|
|
|
|
|
mSettingsIconDrawable.setTint(foregroundColor);
|
|
|
|
|
|
|
|
|
|
Drawable settingsIcon = mSettingsIcon.getDrawable();
|
|
|
|
|
settingsIcon.setTint(foregroundColor);
|
|
|
|
|
|
|
|
|
|
int mIconInset = getResources().getDimensionPixelSize(R.dimen.bubble_icon_inset);
|
|
|
|
|
InsetDrawable foreground = new InsetDrawable(settingsIcon, mIconInset);
|
|
|
|
|
InsetDrawable foreground = new InsetDrawable(mSettingsIconDrawable, mIconInset);
|
|
|
|
|
ColorDrawable background = new ColorDrawable(backgroundColor);
|
|
|
|
|
AdaptiveIconDrawable adaptiveIcon = new AdaptiveIconDrawable(background,
|
|
|
|
|
foreground);
|
|
|
|
|
mSettingsIcon.setImageDrawable(adaptiveIcon);
|
|
|
|
|
|
|
|
|
|
// Update permission prompt color.
|
|
|
|
|
mPermissionView.setBackground(createPermissionBackground(backgroundColor));
|
|
|
|
|
mPermissionPrompt.setTextColor(foregroundColor);
|
|
|
|
|
|
|
|
|
|
// Update triangle color.
|
|
|
|
|
ShapeDrawable triangleDrawable = new ShapeDrawable(
|
|
|
|
|
TriangleShape.create(mPointerWidth, mPointerHeight, false /* pointUp */));
|
|
|
|
|
triangleDrawable.setTint(backgroundColor);
|
|
|
|
|
mPointerView.setBackground(triangleDrawable);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
private void updateHeaderView() {
|
|
|
|
|
mSettingsIcon.setContentDescription(getResources().getString(
|
|
|
|
|
R.string.bubbles_settings_button_description, mAppName));
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
private void updatePermissionView() {
|
|
|
|
|
void togglePermissionOrSettings() {
|
|
|
|
|
boolean hasUserApprovedBubblesForPackage = false;
|
|
|
|
|
try {
|
|
|
|
|
hasUserApprovedBubblesForPackage =
|
|
|
|
|
@@ -392,12 +402,6 @@ public class BubbleExpandedView extends LinearLayout implements View.OnClickList
|
|
|
|
|
showSettingsIcon();
|
|
|
|
|
} else {
|
|
|
|
|
showPermissionView();
|
|
|
|
|
((ImageView) mPermissionView.findViewById(R.id.pkgicon)).setImageDrawable(mAppIcon);
|
|
|
|
|
((TextView) mPermissionView.findViewById(R.id.pkgname)).setText(mAppName);
|
|
|
|
|
((TextView) mPermissionView.findViewById(R.id.prompt)).setText(
|
|
|
|
|
getResources().getString(R.string.bubbles_prompt, mAppName));
|
|
|
|
|
logBubbleClickEvent(mEntry,
|
|
|
|
|
StatsLog.BUBBLE_UICHANGED__ACTION__PERMISSION_DIALOG_SHOWN);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
@@ -432,7 +436,7 @@ public class BubbleExpandedView extends LinearLayout implements View.OnClickList
|
|
|
|
|
*/
|
|
|
|
|
int getExpandedSize() {
|
|
|
|
|
int chromeHeight = mPermissionView.getVisibility() != View.VISIBLE
|
|
|
|
|
? mHeaderHeight
|
|
|
|
|
? mSettingsIconHeight
|
|
|
|
|
: mPermissionHeight;
|
|
|
|
|
return mBubbleHeight + mPointerView.getHeight() + mPointerMargin
|
|
|
|
|
+ chromeHeight;
|
|
|
|
|
@@ -460,7 +464,7 @@ public class BubbleExpandedView extends LinearLayout implements View.OnClickList
|
|
|
|
|
desiredHeight = desiredPx > 0 ? desiredPx : mMinHeight;
|
|
|
|
|
}
|
|
|
|
|
int chromeHeight = mPermissionView.getVisibility() != View.VISIBLE
|
|
|
|
|
? mHeaderHeight
|
|
|
|
|
? mSettingsIconHeight
|
|
|
|
|
: mPermissionHeight;
|
|
|
|
|
int max = mStackView.getMaxExpandedHeight() - chromeHeight - mPointerView.getHeight()
|
|
|
|
|
- mPointerMargin;
|
|
|
|
|
@@ -523,15 +527,28 @@ public class BubbleExpandedView extends LinearLayout implements View.OnClickList
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
private void updateSettingsContentDescription() {
|
|
|
|
|
mSettingsIcon.setContentDescription(getResources().getString(
|
|
|
|
|
R.string.bubbles_settings_button_description, mAppName));
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void showSettingsIcon() {
|
|
|
|
|
updateSettingsContentDescription();
|
|
|
|
|
|
|
|
|
|
mPermissionView.setVisibility(GONE);
|
|
|
|
|
mSettingsIcon.setVisibility(VISIBLE);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void showPermissionView() {
|
|
|
|
|
((ImageView) mPermissionView.findViewById(R.id.pkgicon)).setImageDrawable(mAppIcon);
|
|
|
|
|
((TextView) mPermissionView.findViewById(R.id.pkgname)).setText(mAppName);
|
|
|
|
|
mPermissionPrompt.setText(
|
|
|
|
|
getResources().getString(R.string.bubbles_prompt, mAppName));
|
|
|
|
|
logBubbleClickEvent(mEntry,
|
|
|
|
|
StatsLog.BUBBLE_UICHANGED__ACTION__PERMISSION_DIALOG_SHOWN);
|
|
|
|
|
|
|
|
|
|
mSettingsIcon.setVisibility(GONE);
|
|
|
|
|
mPermissionView.setVisibility(VISIBLE);
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
|