Merge "Overflow bubble labels" into rvc-dev am: 38a520e6f5
Change-Id: Ic5f23f385a90c989c9bf8a9bbcd25de509e5e62d
This commit is contained in:
@@ -19,6 +19,7 @@
|
||||
android:id="@+id/bubble_overflow_container"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="match_parent"
|
||||
android:paddingTop="@dimen/bubble_overflow_padding"
|
||||
android:orientation="vertical"
|
||||
android:layout_gravity="center_horizontal">
|
||||
|
||||
|
||||
41
packages/SystemUI/res/layout/bubble_overflow_view.xml
Normal file
41
packages/SystemUI/res/layout/bubble_overflow_view.xml
Normal file
@@ -0,0 +1,41 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<!--
|
||||
~ Copyright (C) 2020 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
|
||||
-->
|
||||
<LinearLayout
|
||||
xmlns:android="http://schemas.android.com/apk/res/android"
|
||||
android:id="@+id/bubble_overflow_view"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:orientation="vertical">
|
||||
|
||||
<com.android.systemui.bubbles.BadgedImageView
|
||||
xmlns:android="http://schemas.android.com/apk/res/android"
|
||||
android:id="@+id/bubble_view"
|
||||
android:layout_gravity="center"
|
||||
android:layout_width="@dimen/individual_bubble_size"
|
||||
android:layout_height="@dimen/individual_bubble_size"/>
|
||||
|
||||
<TextView
|
||||
android:id="@+id/bubble_view_name"
|
||||
android:fontFamily="@*android:string/config_bodyFontFamily"
|
||||
android:textAppearance="@*android:style/TextAppearance.DeviceDefault.Body2"
|
||||
android:textColor="?android:attr/textColorSecondary"
|
||||
android:layout_width="fill_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:maxLines="1"
|
||||
android:layout_gravity="center"
|
||||
android:gravity="center"/>
|
||||
</LinearLayout>
|
||||
@@ -1150,8 +1150,8 @@
|
||||
<dimen name="bubble_overflow_height">380dp</dimen>
|
||||
<!-- Bubble overflow padding when there are no bubbles -->
|
||||
<dimen name="bubble_overflow_empty_state_padding">16dp</dimen>
|
||||
<!-- Margin of overflow bubbles -->
|
||||
<dimen name="bubble_overflow_margin">16dp</dimen>
|
||||
<!-- Padding of container for overflow bubbles -->
|
||||
<dimen name="bubble_overflow_padding">5dp</dimen>
|
||||
<!-- Height of the triangle that points to the expanded bubble -->
|
||||
<dimen name="bubble_pointer_height">4dp</dimen>
|
||||
<!-- Width of the triangle that points to the expanded bubble -->
|
||||
|
||||
@@ -21,14 +21,20 @@ import static com.android.systemui.bubbles.BubbleDebugConfig.TAG_BUBBLES;
|
||||
import static com.android.systemui.bubbles.BubbleDebugConfig.TAG_WITH_CLASS_NAME;
|
||||
|
||||
import android.app.Activity;
|
||||
import android.app.Notification;
|
||||
import android.app.Person;
|
||||
import android.content.res.Resources;
|
||||
import android.content.res.TypedArray;
|
||||
import android.graphics.Color;
|
||||
import android.os.Bundle;
|
||||
import android.os.Parcelable;
|
||||
import android.util.DisplayMetrics;
|
||||
import android.util.Log;
|
||||
import android.view.LayoutInflater;
|
||||
import android.view.View;
|
||||
import android.view.ViewGroup;
|
||||
import android.widget.LinearLayout;
|
||||
import android.widget.TextView;
|
||||
|
||||
import androidx.recyclerview.widget.GridLayoutManager;
|
||||
import androidx.recyclerview.widget.RecyclerView;
|
||||
@@ -67,13 +73,22 @@ public class BubbleOverflowActivity extends Activity {
|
||||
|
||||
mEmptyState = findViewById(R.id.bubble_overflow_empty_state);
|
||||
mRecyclerView = findViewById(R.id.bubble_overflow_recycler);
|
||||
mRecyclerView.setLayoutManager(
|
||||
new GridLayoutManager(getApplicationContext(),
|
||||
getResources().getInteger(R.integer.bubbles_overflow_columns)));
|
||||
|
||||
int bubbleMargin = getResources().getDimensionPixelSize(R.dimen.bubble_overflow_margin);
|
||||
Resources res = getResources();
|
||||
final int columns = res.getInteger(R.integer.bubbles_overflow_columns);
|
||||
mRecyclerView.setLayoutManager(
|
||||
new GridLayoutManager(getApplicationContext(), columns));
|
||||
|
||||
DisplayMetrics displayMetrics = new DisplayMetrics();
|
||||
getWindowManager().getDefaultDisplay().getMetrics(displayMetrics);
|
||||
final int viewWidth = displayMetrics.widthPixels / columns;
|
||||
|
||||
final int maxOverflowBubbles = res.getInteger(R.integer.bubbles_max_overflow);
|
||||
final int rows = (int) Math.ceil((double) maxOverflowBubbles / columns);
|
||||
final int viewHeight = res.getDimensionPixelSize(R.dimen.bubble_overflow_height) / rows;
|
||||
|
||||
mAdapter = new BubbleOverflowAdapter(mOverflowBubbles,
|
||||
mBubbleController::promoteBubbleFromOverflow, bubbleMargin);
|
||||
mBubbleController::promoteBubbleFromOverflow, viewWidth, viewHeight);
|
||||
mRecyclerView.setAdapter(mAdapter);
|
||||
onDataChanged(mBubbleController.getOverflowBubbles());
|
||||
mBubbleController.setOverflowCallback(() -> {
|
||||
@@ -139,39 +154,48 @@ public class BubbleOverflowActivity extends Activity {
|
||||
class BubbleOverflowAdapter extends RecyclerView.Adapter<BubbleOverflowAdapter.ViewHolder> {
|
||||
private Consumer<Bubble> mPromoteBubbleFromOverflow;
|
||||
private List<Bubble> mBubbles;
|
||||
private int mBubbleMargin;
|
||||
private int mWidth;
|
||||
private int mHeight;
|
||||
|
||||
public BubbleOverflowAdapter(List<Bubble> list, Consumer<Bubble> promoteBubble,
|
||||
int bubbleMargin) {
|
||||
public BubbleOverflowAdapter(List<Bubble> list, Consumer<Bubble> promoteBubble, int width,
|
||||
int height) {
|
||||
mBubbles = list;
|
||||
mPromoteBubbleFromOverflow = promoteBubble;
|
||||
mBubbleMargin = bubbleMargin;
|
||||
mWidth = width;
|
||||
mHeight = height;
|
||||
}
|
||||
|
||||
@Override
|
||||
public BubbleOverflowAdapter.ViewHolder onCreateViewHolder(ViewGroup parent,
|
||||
int viewType) {
|
||||
BadgedImageView view = (BadgedImageView) LayoutInflater.from(parent.getContext())
|
||||
.inflate(R.layout.bubble_view, parent, false);
|
||||
LinearLayout overflowView = (LinearLayout) LayoutInflater.from(parent.getContext())
|
||||
.inflate(R.layout.bubble_overflow_view, parent, false);
|
||||
LinearLayout.LayoutParams params = new LinearLayout.LayoutParams(
|
||||
LinearLayout.LayoutParams.WRAP_CONTENT,
|
||||
LinearLayout.LayoutParams.WRAP_CONTENT
|
||||
);
|
||||
params.setMargins(mBubbleMargin, mBubbleMargin, mBubbleMargin, mBubbleMargin);
|
||||
view.setLayoutParams(params);
|
||||
return new ViewHolder(view);
|
||||
LinearLayout.LayoutParams.WRAP_CONTENT);
|
||||
params.width = mWidth;
|
||||
params.height = mHeight;
|
||||
overflowView.setLayoutParams(params);
|
||||
return new ViewHolder(overflowView);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onBindViewHolder(ViewHolder vh, int index) {
|
||||
Bubble bubble = mBubbles.get(index);
|
||||
Bubble b = mBubbles.get(index);
|
||||
|
||||
vh.mBadgedImageView.update(bubble);
|
||||
vh.mBadgedImageView.setOnClickListener(view -> {
|
||||
mBubbles.remove(bubble);
|
||||
vh.iconView.update(b);
|
||||
vh.iconView.setOnClickListener(view -> {
|
||||
mBubbles.remove(b);
|
||||
notifyDataSetChanged();
|
||||
mPromoteBubbleFromOverflow.accept(bubble);
|
||||
mPromoteBubbleFromOverflow.accept(b);
|
||||
});
|
||||
|
||||
Bubble.FlyoutMessage message = b.getFlyoutMessage();
|
||||
if (message != null && message.senderName != null) {
|
||||
vh.textView.setText(message.senderName);
|
||||
} else {
|
||||
vh.textView.setText(b.getAppName());
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
@@ -180,11 +204,13 @@ class BubbleOverflowAdapter extends RecyclerView.Adapter<BubbleOverflowAdapter.V
|
||||
}
|
||||
|
||||
public static class ViewHolder extends RecyclerView.ViewHolder {
|
||||
public BadgedImageView mBadgedImageView;
|
||||
public BadgedImageView iconView;
|
||||
public TextView textView;
|
||||
|
||||
public ViewHolder(BadgedImageView v) {
|
||||
public ViewHolder(LinearLayout v) {
|
||||
super(v);
|
||||
mBadgedImageView = v;
|
||||
iconView = v.findViewById(R.id.bubble_view);
|
||||
textView = v.findViewById(R.id.bubble_view_name);
|
||||
}
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user