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