From 83092c6cbb03b840a4b723d30486b491206b4bcd Mon Sep 17 00:00:00 2001 From: Anthony Chen Date: Mon, 11 Jan 2016 17:00:36 -0800 Subject: [PATCH] Separate notification area into own controller. Extracts the notification area of the status bar into a layout file and create a NotificationAreaController that controls what happens in this area. This is to allow this area to be configurable in Android Auto Embedded cases where OEMs may want their own custom implementations here. Change-Id: I8a52af676d16fd6f7d3878805970a5897d2db945 --- .../res/layout/notification_icon_area.xml | 35 ++++ packages/SystemUI/res/layout/status_bar.xml | 26 +-- .../phone/NotificationIconAreaController.java | 151 ++++++++++++++++++ .../phone/StatusBarIconController.java | 98 +++--------- 4 files changed, 207 insertions(+), 103 deletions(-) create mode 100644 packages/SystemUI/res/layout/notification_icon_area.xml create mode 100644 packages/SystemUI/src/com/android/systemui/statusbar/phone/NotificationIconAreaController.java diff --git a/packages/SystemUI/res/layout/notification_icon_area.xml b/packages/SystemUI/res/layout/notification_icon_area.xml new file mode 100644 index 0000000000000..c5b4e84ebba54 --- /dev/null +++ b/packages/SystemUI/res/layout/notification_icon_area.xml @@ -0,0 +1,35 @@ + + + + + + \ No newline at end of file diff --git a/packages/SystemUI/res/layout/status_bar.xml b/packages/SystemUI/res/layout/status_bar.xml index aaa5a0968adb8..bea9f788ee57c 100644 --- a/packages/SystemUI/res/layout/status_bar.xml +++ b/packages/SystemUI/res/layout/status_bar.xml @@ -47,34 +47,14 @@ android:orientation="horizontal" > + - - - - - - + android:orientation="horizontal" /> activeNotifications = + notificationData.getActiveNotifications(); + final int size = activeNotifications.size(); + ArrayList toShow = new ArrayList<>(size); + + // 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; + } + toShow.add(ent.icon); + } + + ArrayList toRemove = new ArrayList<>(); + for (int i = 0; i < mNotificationIcons.getChildCount(); i++) { + View child = mNotificationIcons.getChildAt(i); + if (!toShow.contains(child)) { + toRemove.add(child); + } + } + + final int toRemoveCount = toRemove.size(); + for (int i = 0; i < toRemoveCount; i++) { + mNotificationIcons.removeView(toRemove.get(i)); + } + + for (int i = 0; i < toShow.size(); i++) { + View v = toShow.get(i); + if (v.getParent() == null) { + mNotificationIcons.addView(v, i, params); + } + } + + // Re-sort notification icons + final int childCount = mNotificationIcons.getChildCount(); + for (int i = 0; i < childCount; i++) { + View actual = mNotificationIcons.getChildAt(i); + StatusBarIconView expected = toShow.get(i); + if (actual == expected) { + continue; + } + mNotificationIcons.removeView(expected); + mNotificationIcons.addView(expected, i); + } + + applyNotificationIconsTint(); + } + + /** + * Applies {@link #mIconTint} to the notification icons. + */ + private void applyNotificationIconsTint() { + for (int i = 0; i < mNotificationIcons.getChildCount(); i++) { + StatusBarIconView v = (StatusBarIconView) mNotificationIcons.getChildAt(i); + boolean isPreL = Boolean.TRUE.equals(v.getTag(R.id.icon_is_pre_L)); + boolean colorize = !isPreL || NotificationUtils.isGrayscale(v, mNotificationColorUtil); + if (colorize) { + v.setImageTintList(ColorStateList.valueOf(mIconTint)); + } + } + } +} 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 5e98ec1a5b601..0eb0bf89b2d06 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarIconController.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarIconController.java @@ -36,14 +36,12 @@ import android.widget.ImageView; import android.widget.LinearLayout; import android.widget.TextView; import com.android.internal.statusbar.StatusBarIcon; -import com.android.internal.util.NotificationColorUtil; import com.android.systemui.BatteryMeterView; import com.android.systemui.FontSizeUtils; import com.android.systemui.R; import com.android.systemui.statusbar.NotificationData; import com.android.systemui.statusbar.SignalClusterView; import com.android.systemui.statusbar.StatusBarIconView; -import com.android.systemui.statusbar.notification.NotificationUtils; import com.android.systemui.tuner.TunerService; import com.android.systemui.tuner.TunerService.Tunable; @@ -66,15 +64,15 @@ public class StatusBarIconController extends StatusBarIconList implements Tunabl private Interpolator mLinearOutSlowIn; private Interpolator mFastOutSlowIn; private DemoStatusIcons mDemoStatusIcons; - private NotificationColorUtil mNotificationColorUtil; private LinearLayout mSystemIconArea; private LinearLayout mStatusIcons; private SignalClusterView mSignalCluster; private LinearLayout mStatusIconsKeyguard; - private IconMerger mNotificationIcons; - private View mNotificationIconArea; - private ImageView mMoreIcon; + + private NotificationIconAreaController mNotificationIconAreaController; + private View mNotificationIconAreaInner; + private BatteryMeterView mBatteryMeterView; private TextView mClock; @@ -110,14 +108,19 @@ public class StatusBarIconController extends StatusBarIconList implements Tunabl PhoneStatusBar phoneStatusBar) { mContext = context; mPhoneStatusBar = phoneStatusBar; - mNotificationColorUtil = NotificationColorUtil.getInstance(context); mSystemIconArea = (LinearLayout) statusBar.findViewById(R.id.system_icon_area); mStatusIcons = (LinearLayout) statusBar.findViewById(R.id.statusIcons); mSignalCluster = (SignalClusterView) statusBar.findViewById(R.id.signal_cluster); - mNotificationIconArea = statusBar.findViewById(R.id.notification_icon_area_inner); - mNotificationIcons = (IconMerger) statusBar.findViewById(R.id.notificationIcons); - mMoreIcon = (ImageView) statusBar.findViewById(R.id.moreIcon); - mNotificationIcons.setOverflowIndicator(mMoreIcon); + + mNotificationIconAreaController = + new NotificationIconAreaController(context, phoneStatusBar); + mNotificationIconAreaInner = + mNotificationIconAreaController.getNotificationInnerAreaView(); + + ViewGroup notificationIconArea = + (ViewGroup) statusBar.findViewById(R.id.notification_icon_area); + notificationIconArea.addView(mNotificationIconAreaInner); + mStatusIconsKeyguard = (LinearLayout) keyguardStatusBar.findViewById(R.id.statusIcons); mBatteryMeterView = (BatteryMeterView) statusBar.findViewById(R.id.battery); mClock = (TextView) statusBar.findViewById(R.id.clock); @@ -259,60 +262,7 @@ public class StatusBarIconController extends StatusBarIconList implements Tunabl } public void updateNotificationIcons(NotificationData notificationData) { - final LinearLayout.LayoutParams params = new LinearLayout.LayoutParams( - mIconSize + 2*mIconHPadding, mPhoneStatusBar.getStatusBarHeight()); - - ArrayList activeNotifications = - notificationData.getActiveNotifications(); - final int N = activeNotifications.size(); - ArrayList toShow = new ArrayList<>(N); - - // Filter out ambient notifications and notification children. - for (int i = 0; i < N; i++) { - NotificationData.Entry ent = activeNotifications.get(i); - if (notificationData.isAmbient(ent.key) - && !NotificationData.showNotificationEvenIfUnprovisioned(ent.notification)) { - continue; - } - if (!PhoneStatusBar.isTopLevelChild(ent)) { - continue; - } - toShow.add(ent.icon); - } - - ArrayList toRemove = new ArrayList<>(); - for (int i=0; i