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