1 /* 2 * Copyright (C) 2015 The Android Open Source Project 3 * 4 * Licensed under the Apache License, Version 2.0 (the "License"); 5 * you may not use this file except in compliance with the License. 6 * You may obtain a copy of the License at 7 * 8 * http://www.apache.org/licenses/LICENSE-2.0 9 * 10 * Unless required by applicable law or agreed to in writing, software 11 * distributed under the License is distributed on an "AS IS" BASIS, 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 * See the License for the specific language governing permissions and 14 * limitations under the License 15 */ 16 17 package com.android.systemui.statusbar.notification.row; 18 19 import android.app.Notification; 20 import android.content.Context; 21 import android.content.res.Resources; 22 import android.util.TypedValue; 23 import android.view.ContextThemeWrapper; 24 import android.view.LayoutInflater; 25 import android.view.ViewGroup; 26 import android.widget.TextView; 27 28 import com.android.systemui.R; 29 import com.android.systemui.statusbar.notification.NotificationDozeHelper; 30 import com.android.systemui.statusbar.notification.NotificationUtils; 31 32 /** 33 * A class managing hybrid groups that include {@link HybridNotificationView} and the notification 34 * group overflow. 35 */ 36 public class HybridGroupManager { 37 38 private final Context mContext; 39 private final ViewGroup mParent; 40 41 private float mOverflowNumberSize; 42 private int mOverflowNumberPadding; 43 44 private int mOverflowNumberColor; 45 HybridGroupManager(Context ctx, ViewGroup parent)46 public HybridGroupManager(Context ctx, ViewGroup parent) { 47 mContext = ctx; 48 mParent = parent; 49 initDimens(); 50 } 51 initDimens()52 public void initDimens() { 53 Resources res = mContext.getResources(); 54 mOverflowNumberSize = res.getDimensionPixelSize( 55 R.dimen.group_overflow_number_size); 56 mOverflowNumberPadding = res.getDimensionPixelSize( 57 R.dimen.group_overflow_number_padding); 58 } 59 inflateHybridViewWithStyle(int style)60 private HybridNotificationView inflateHybridViewWithStyle(int style) { 61 LayoutInflater inflater = new ContextThemeWrapper(mContext, style) 62 .getSystemService(LayoutInflater.class); 63 HybridNotificationView hybrid = (HybridNotificationView) inflater.inflate( 64 R.layout.hybrid_notification, mParent, false); 65 mParent.addView(hybrid); 66 return hybrid; 67 } 68 inflateOverflowNumber()69 private TextView inflateOverflowNumber() { 70 LayoutInflater inflater = mContext.getSystemService(LayoutInflater.class); 71 TextView numberView = (TextView) inflater.inflate( 72 R.layout.hybrid_overflow_number, mParent, false); 73 mParent.addView(numberView); 74 updateOverFlowNumberColor(numberView); 75 return numberView; 76 } 77 updateOverFlowNumberColor(TextView numberView)78 private void updateOverFlowNumberColor(TextView numberView) { 79 numberView.setTextColor(mOverflowNumberColor); 80 } 81 setOverflowNumberColor(TextView numberView, int colorRegular)82 public void setOverflowNumberColor(TextView numberView, int colorRegular) { 83 mOverflowNumberColor = colorRegular; 84 if (numberView != null) { 85 updateOverFlowNumberColor(numberView); 86 } 87 } 88 bindFromNotification(HybridNotificationView reusableView, Notification notification)89 public HybridNotificationView bindFromNotification(HybridNotificationView reusableView, 90 Notification notification) { 91 return bindFromNotificationWithStyle(reusableView, notification, 92 R.style.HybridNotification); 93 } 94 bindFromNotificationWithStyle( HybridNotificationView reusableView, Notification notification, int style)95 private HybridNotificationView bindFromNotificationWithStyle( 96 HybridNotificationView reusableView, Notification notification, int style) { 97 if (reusableView == null) { 98 reusableView = inflateHybridViewWithStyle(style); 99 } 100 CharSequence titleText = resolveTitle(notification); 101 CharSequence contentText = resolveText(notification); 102 reusableView.bind(titleText, contentText); 103 return reusableView; 104 } 105 resolveText(Notification notification)106 private CharSequence resolveText(Notification notification) { 107 CharSequence contentText = notification.extras.getCharSequence(Notification.EXTRA_TEXT); 108 if (contentText == null) { 109 contentText = notification.extras.getCharSequence(Notification.EXTRA_BIG_TEXT); 110 } 111 return contentText; 112 } 113 resolveTitle(Notification notification)114 private CharSequence resolveTitle(Notification notification) { 115 CharSequence titleText = notification.extras.getCharSequence(Notification.EXTRA_TITLE); 116 if (titleText == null) { 117 titleText = notification.extras.getCharSequence(Notification.EXTRA_TITLE_BIG); 118 } 119 return titleText; 120 } 121 bindOverflowNumber(TextView reusableView, int number)122 public TextView bindOverflowNumber(TextView reusableView, int number) { 123 if (reusableView == null) { 124 reusableView = inflateOverflowNumber(); 125 } 126 String text = mContext.getResources().getString( 127 R.string.notification_group_overflow_indicator, number); 128 if (!text.equals(reusableView.getText())) { 129 reusableView.setText(text); 130 } 131 String contentDescription = String.format(mContext.getResources().getQuantityString( 132 R.plurals.notification_group_overflow_description, number), number); 133 134 reusableView.setContentDescription(contentDescription); 135 reusableView.setTextSize(TypedValue.COMPLEX_UNIT_PX, mOverflowNumberSize); 136 reusableView.setPaddingRelative(reusableView.getPaddingStart(), 137 reusableView.getPaddingTop(), mOverflowNumberPadding, 138 reusableView.getPaddingBottom()); 139 updateOverFlowNumberColor(reusableView); 140 return reusableView; 141 } 142 } 143