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 || isGrayscale(v);
     if (colorize) {
       v.setImageTintList(ColorStateList.valueOf(mIconTint));
     }
   }
 }
  public StatusBarIconController(
      Context context, View statusBar, View keyguardStatusBar, 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);
    mStatusIconsKeyguard = (LinearLayout) keyguardStatusBar.findViewById(R.id.statusIcons);
    mBatteryMeterView = (BatteryMeterView) statusBar.findViewById(R.id.battery);
    mNetworkTraffic = (NetworkTraffic) statusBar.findViewById(R.id.networkTraffic);
    mCarrier = (TextView) statusBar.findViewById(R.id.statusbar_carrier_text);
    mLinearOutSlowIn =
        AnimationUtils.loadInterpolator(mContext, android.R.interpolator.linear_out_slow_in);
    mFastOutSlowIn =
        AnimationUtils.loadInterpolator(mContext, android.R.interpolator.fast_out_slow_in);
    mDarkModeIconColorSingleTone = context.getColor(R.color.dark_mode_icon_color_single_tone);
    mLightModeIconColorSingleTone = context.getColor(R.color.light_mode_icon_color_single_tone);
    mHandler = new Handler();
    mClockController = new ClockController(statusBar, mNotificationIcons, mHandler);
    mCenterClockLayout = statusBar.findViewById(R.id.center_clock_layout);
    updateResources();

    TunerService.get(mContext).addTunable(this, ICON_BLACKLIST);
  }
  public void updateNotificationIcons(NotificationData notificationData) {
    final LinearLayout.LayoutParams params =
        new LinearLayout.LayoutParams(
            mIconSize + 2 * mIconHPadding, mPhoneStatusBar.getStatusBarHeight());

    ArrayList<NotificationData.Entry> activeNotifications =
        notificationData.getActiveNotifications();
    final int N = activeNotifications.size();
    ArrayList<StatusBarIconView> 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<View> 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);
      }
    }

    // Resort 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();
  }