diff options
5 files changed, 71 insertions, 32 deletions
diff --git a/packages/SystemUI/src/com/android/systemui/SystemUIFactory.java b/packages/SystemUI/src/com/android/systemui/SystemUIFactory.java index 2e94bc7e4d52..0d75fdd1cc45 100644 --- a/packages/SystemUI/src/com/android/systemui/SystemUIFactory.java +++ b/packages/SystemUI/src/com/android/systemui/SystemUIFactory.java @@ -25,6 +25,8 @@ import com.android.internal.widget.LockPatternUtils; 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; @@ -75,6 +77,11 @@ public class SystemUIFactory { 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; } diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/IconMerger.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/IconMerger.java index 50ead3d17833..225751a627b2 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/IconMerger.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/IconMerger.java @@ -17,6 +17,7 @@ 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; @@ -27,14 +28,17 @@ public class IconMerger extends 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); @@ -45,12 +49,16 @@ public class IconMerger extends LinearLayout { 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 @@ -70,7 +78,7 @@ public class IconMerger extends LinearLayout { 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 diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/NotificationIconAreaController.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/NotificationIconAreaController.java index a605a81bb504..c4917a1c80fc 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/NotificationIconAreaController.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/NotificationIconAreaController.java @@ -17,6 +17,7 @@ import com.android.systemui.statusbar.StatusBarIconView; 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 @@ -42,6 +43,10 @@ public class NotificationIconAreaController { 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. */ @@ -51,14 +56,16 @@ public class NotificationIconAreaController { 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); + } } /** @@ -88,16 +95,38 @@ public class NotificationIconAreaController { */ 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(); @@ -107,17 +136,9 @@ public class NotificationIconAreaController { // 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<>(); diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/PhoneStatusBar.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/PhoneStatusBar.java index e84d8fc81903..86031e1d9e97 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/PhoneStatusBar.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/PhoneStatusBar.java @@ -48,7 +48,6 @@ import android.graphics.PorterDuffXfermode; 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; @@ -132,7 +131,6 @@ import com.android.systemui.statusbar.DismissView; 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; @@ -305,7 +303,7 @@ public class PhoneStatusBar extends BaseStatusBar implements DemoMode, Point mCurrentDisplaySize = new Point(); protected StatusBarWindowView mStatusBarWindow; - PhoneStatusBarView mStatusBarView; + protected PhoneStatusBarView mStatusBarView; private int mStatusBarWindowState = WINDOW_STATE_SHOWING; protected StatusBarWindowManager mStatusBarWindowManager; private UnlockMethodCache mUnlockMethodCache; @@ -317,7 +315,7 @@ public class PhoneStatusBar extends BaseStatusBar implements DemoMode, int mPixelFormat; Object mQueueLock = new Object(); - StatusBarIconController mIconController; + protected StatusBarIconController mIconController; // expanded notifications protected NotificationPanelView mNotificationPanel; // the sliding/resizing panel within the notification window @@ -329,7 +327,7 @@ public class PhoneStatusBar extends BaseStatusBar implements DemoMode, // top bar BaseStatusBarHeader mHeader; - KeyguardStatusBarView mKeyguardStatusBar; + protected KeyguardStatusBarView mKeyguardStatusBar; View mKeyguardStatusView; KeyguardBottomAreaView mKeyguardBottomArea; boolean mLeaveOpenOnKeyguardHide; @@ -678,6 +676,11 @@ public class PhoneStatusBar extends BaseStatusBar implements DemoMode, mFalsingManager = FalsingManager.getInstance(mContext); } + protected void createIconController() { + mIconController = new StatusBarIconController( + mContext, mStatusBarView, mKeyguardStatusBar, this); + } + // ================================================================================ // Constructing the view // ================================================================================ @@ -811,8 +814,7 @@ public class PhoneStatusBar extends BaseStatusBar implements DemoMode, // 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); @@ -1989,7 +1991,7 @@ public class PhoneStatusBar extends BaseStatusBar implements DemoMode, } } - private int adjustDisableFlags(int state) { + protected int adjustDisableFlags(int state) { if (!mLaunchTransitionFadingAway && !mKeyguardFadingAway && (mExpandedVisible || mBouncerShowing || mWaitingForKeyguardExit)) { state |= StatusBarManager.DISABLE_NOTIFICATION_ICONS; diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarIconController.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarIconController.java index f61f31e814f7..a40aa8338d89 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarIconController.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarIconController.java @@ -42,6 +42,7 @@ import com.android.systemui.BatteryMeterView; 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; @@ -116,8 +117,8 @@ public class StatusBarIconController extends StatusBarIconList implements Tunabl 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(); |