import com.android.keyguard.ViewMediatorCallback;
import com.android.systemui.statusbar.ScrimView;
import com.android.systemui.statusbar.phone.KeyguardBouncer;
+import com.android.systemui.statusbar.phone.NotificationIconAreaController;
+import com.android.systemui.statusbar.phone.PhoneStatusBar;
import com.android.systemui.statusbar.phone.ScrimController;
import com.android.systemui.statusbar.phone.StatusBarKeyguardViewManager;
import com.android.systemui.statusbar.phone.StatusBarWindowManager;
return new ScrimController(scrimBehind, scrimInFront, headsUpScrim);
}
+ public NotificationIconAreaController createNotificationIconAreaController(Context context,
+ PhoneStatusBar phoneStatusBar) {
+ return new NotificationIconAreaController(context, phoneStatusBar);
+ }
+
public <T> T createInstance(Class<T> classType) {
return null;
}
package com.android.systemui.statusbar.phone;
import android.content.Context;
+import android.content.res.Resources;
import android.util.AttributeSet;
import android.view.View;
import android.widget.LinearLayout;
private static final String TAG = "IconMerger";
private static final boolean DEBUG = false;
- private int mIconSize;
+ private final int mIconSize;
+ private final int mIconHPadding;
+
private View mMoreView;
public IconMerger(Context context, AttributeSet attrs) {
super(context, attrs);
- mIconSize = context.getResources().getDimensionPixelSize(
- R.dimen.status_bar_icon_size);
+ Resources res = context.getResources();
+ mIconSize = res.getDimensionPixelSize(R.dimen.status_bar_icon_size);
+ mIconHPadding = res.getDimensionPixelSize(R.dimen.status_bar_icon_padding);
if (DEBUG) {
setBackgroundColor(0x800099FF);
mMoreView = v;
}
+ private int getFullIconWidth() {
+ return mIconSize + 2 * mIconHPadding;
+ }
+
@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
super.onMeasure(widthMeasureSpec, heightMeasureSpec);
// we need to constrain this to an integral multiple of our children
int width = getMeasuredWidth();
- setMeasuredDimension(width - (width % mIconSize), getMeasuredHeight());
+ setMeasuredDimension(width - (width % getFullIconWidth()), getMeasuredHeight());
}
@Override
final boolean overflowShown = (mMoreView.getVisibility() == View.VISIBLE);
// let's assume we have one more slot if the more icon is already showing
if (overflowShown) visibleChildren --;
- final boolean moreRequired = visibleChildren * mIconSize > width;
+ final boolean moreRequired = visibleChildren * getFullIconWidth() > width;
if (moreRequired != overflowShown) {
post(new Runnable() {
@Override
import com.android.systemui.statusbar.notification.NotificationUtils;
import java.util.ArrayList;
+import java.util.List;
/**
* A controller for the space in the status bar to the left of the system icons. This area is
initializeNotificationAreaViews(context);
}
+ protected View inflateIconArea(LayoutInflater inflater) {
+ return inflater.inflate(R.layout.notification_icon_area, null);
+ }
+
/**
* Initializes the views that will represent the notification area.
*/
mIconHPadding = res.getDimensionPixelSize(R.dimen.status_bar_icon_padding);
LayoutInflater layoutInflater = LayoutInflater.from(context);
- mNotificationIconArea = layoutInflater.inflate(R.layout.notification_icon_area, null);
-
- mMoreIcon = (ImageView) mNotificationIconArea.findViewById(R.id.moreIcon);
- mMoreIcon.setImageTintList(ColorStateList.valueOf(mIconTint));
+ mNotificationIconArea = inflateIconArea(layoutInflater);
mNotificationIcons =
(IconMerger) mNotificationIconArea.findViewById(R.id.notificationIcons);
- mNotificationIcons.setOverflowIndicator(mMoreIcon);
+
+ mMoreIcon = (ImageView) mNotificationIconArea.findViewById(R.id.moreIcon);
+ if (mMoreIcon != null) {
+ mMoreIcon.setImageTintList(ColorStateList.valueOf(mIconTint));
+ mNotificationIcons.setOverflowIndicator(mMoreIcon);
+ }
}
/**
*/
public void setIconTint(int iconTint) {
mIconTint = iconTint;
- mMoreIcon.setImageTintList(ColorStateList.valueOf(mIconTint));
+ if (mMoreIcon != null) {
+ mMoreIcon.setImageTintList(ColorStateList.valueOf(mIconTint));
+ }
applyNotificationIconsTint();
}
+ protected int getHeight() {
+ return mPhoneStatusBar.getStatusBarHeight();
+ }
+
+ protected boolean shouldShowNotification(NotificationData.Entry entry,
+ NotificationData notificationData) {
+ if (notificationData.isAmbient(entry.key)
+ && !NotificationData.showNotificationEvenIfUnprovisioned(entry.notification)) {
+ return false;
+ }
+ if (!PhoneStatusBar.isTopLevelChild(entry)) {
+ return false;
+ }
+ if (entry.row.getVisibility() == View.GONE) {
+ return false;
+ }
+
+ return true;
+ }
+
/**
* Updates the notifications with the given list of notifications to display.
*/
public void updateNotificationIcons(NotificationData notificationData) {
final LinearLayout.LayoutParams params = new LinearLayout.LayoutParams(
- mIconSize + 2 * mIconHPadding, mPhoneStatusBar.getStatusBarHeight());
+ mIconSize + 2 * mIconHPadding, getHeight());
ArrayList<NotificationData.Entry> activeNotifications =
notificationData.getActiveNotifications();
// Filter out ambient notifications and notification children.
for (int i = 0; i < size; i++) {
NotificationData.Entry ent = activeNotifications.get(i);
- if (notificationData.isAmbient(ent.key)
- && !NotificationData.showNotificationEvenIfUnprovisioned(ent.notification)) {
- continue;
- }
- if (!PhoneStatusBar.isTopLevelChild(ent)) {
- continue;
- }
- if (ent.row.getVisibility() == View.GONE) {
- continue;
+ if (shouldShowNotification(ent, notificationData)) {
+ toShow.add(ent.icon);
}
- toShow.add(ent.icon);
}
ArrayList<View> toRemove = new ArrayList<>();
import android.graphics.Rect;
import android.graphics.drawable.ColorDrawable;
import android.graphics.drawable.Drawable;
-import android.hardware.display.DisplayManager;
import android.inputmethodservice.InputMethodService;
import android.media.AudioAttributes;
import android.media.MediaMetadata;
import com.android.systemui.statusbar.DragDownHelper;
import com.android.systemui.statusbar.EmptyShadeView;
import com.android.systemui.statusbar.ExpandableNotificationRow;
-import com.android.systemui.statusbar.ExpandableView;
import com.android.systemui.statusbar.GestureRecorder;
import com.android.systemui.statusbar.KeyguardIndicationController;
import com.android.systemui.statusbar.NotificationData;
Point mCurrentDisplaySize = new Point();
protected StatusBarWindowView mStatusBarWindow;
- PhoneStatusBarView mStatusBarView;
+ protected PhoneStatusBarView mStatusBarView;
private int mStatusBarWindowState = WINDOW_STATE_SHOWING;
protected StatusBarWindowManager mStatusBarWindowManager;
private UnlockMethodCache mUnlockMethodCache;
int mPixelFormat;
Object mQueueLock = new Object();
- StatusBarIconController mIconController;
+ protected StatusBarIconController mIconController;
// expanded notifications
protected NotificationPanelView mNotificationPanel; // the sliding/resizing panel within the notification window
// top bar
BaseStatusBarHeader mHeader;
- KeyguardStatusBarView mKeyguardStatusBar;
+ protected KeyguardStatusBarView mKeyguardStatusBar;
View mKeyguardStatusView;
KeyguardBottomAreaView mKeyguardBottomArea;
boolean mLeaveOpenOnKeyguardHide;
mFalsingManager = FalsingManager.getInstance(mContext);
}
+ protected void createIconController() {
+ mIconController = new StatusBarIconController(
+ mContext, mStatusBarView, mKeyguardStatusBar, this);
+ }
+
// ================================================================================
// Constructing the view
// ================================================================================
// set the initial view visibility
setAreThereNotifications();
- mIconController = new StatusBarIconController(
- mContext, mStatusBarView, mKeyguardStatusBar, this);
+ createIconController();
// Background thread for any controllers that need it.
mHandlerThread = new HandlerThread(TAG, Process.THREAD_PRIORITY_BACKGROUND);
}
}
- private int adjustDisableFlags(int state) {
+ protected int adjustDisableFlags(int state) {
if (!mLaunchTransitionFadingAway && !mKeyguardFadingAway
&& (mExpandedVisible || mBouncerShowing || mWaitingForKeyguardExit)) {
state |= StatusBarManager.DISABLE_NOTIFICATION_ICONS;
import com.android.systemui.FontSizeUtils;
import com.android.systemui.Interpolators;
import com.android.systemui.R;
+import com.android.systemui.SystemUIFactory;
import com.android.systemui.statusbar.NotificationData;
import com.android.systemui.statusbar.SignalClusterView;
import com.android.systemui.statusbar.StatusBarIconView;
mStatusIcons = (LinearLayout) statusBar.findViewById(R.id.statusIcons);
mSignalCluster = (SignalClusterView) statusBar.findViewById(R.id.signal_cluster);
- mNotificationIconAreaController =
- new NotificationIconAreaController(context, phoneStatusBar);
+ mNotificationIconAreaController = SystemUIFactory.getInstance()
+ .createNotificationIconAreaController(context, phoneStatusBar);
mNotificationIconAreaInner =
mNotificationIconAreaController.getNotificationInnerAreaView();