Add ability to colorize status bar
Bug: 19233606 Change-Id: I756599395c202c4d0dd04c44beac706fc19bfe17
This commit is contained in:
@@ -30,7 +30,7 @@
|
||||
<color name="notification_list_shadow_top">#80000000</color>
|
||||
<drawable name="recents_callout_line">#99ffffff</drawable>
|
||||
<drawable name="heads_up_notification_bg_pressed">#ff33B5E5</drawable>
|
||||
<color name="batterymeter_frame_color">#66FFFFFF</color><!-- 40% white -->
|
||||
<color name="batterymeter_frame_color">#4DFFFFFF</color><!-- 30% white -->
|
||||
<color name="batterymeter_charge_color">#FFFFFFFF</color>
|
||||
<color name="batterymeter_bolt_color">#FFFFFFFF</color>
|
||||
<color name="qs_batterymeter_frame_color">#FF404040</color>
|
||||
|
||||
@@ -40,5 +40,11 @@
|
||||
<item type="id" name="notification_power"/>
|
||||
<item type="id" name="notification_screenshot"/>
|
||||
<item type="id" name="notification_hidden"/>
|
||||
|
||||
<!-- Whether the icon is from a notification for which targetSdk < L -->
|
||||
<item type="id" name="icon_is_pre_L"/>
|
||||
|
||||
<!-- For notification icons for which targetSdk < L, this caches whether the icon is grayscale -->
|
||||
<item type="id" name="icon_is_grayscale" />
|
||||
</resources>
|
||||
|
||||
|
||||
@@ -23,8 +23,12 @@ import android.content.IntentFilter;
|
||||
import android.content.res.Resources;
|
||||
import android.content.res.TypedArray;
|
||||
import android.graphics.Canvas;
|
||||
import android.graphics.Color;
|
||||
import android.graphics.ColorFilter;
|
||||
import android.graphics.Paint;
|
||||
import android.graphics.Path;
|
||||
import android.graphics.PorterDuff;
|
||||
import android.graphics.PorterDuffColorFilter;
|
||||
import android.graphics.RectF;
|
||||
import android.graphics.Typeface;
|
||||
import android.os.BatteryManager;
|
||||
@@ -56,12 +60,13 @@ public class BatteryMeterView extends View implements DemoMode,
|
||||
private float mSubpixelSmoothingRight;
|
||||
private final Paint mFramePaint, mBatteryPaint, mWarningTextPaint, mTextPaint, mBoltPaint;
|
||||
private float mTextHeight, mWarningTextHeight;
|
||||
private int mIconTint = Color.WHITE;
|
||||
|
||||
private int mHeight;
|
||||
private int mWidth;
|
||||
private String mWarningString;
|
||||
private final int mCriticalLevel;
|
||||
private final int mChargeColor;
|
||||
private int mChargeColor;
|
||||
private final float[] mBoltPoints;
|
||||
private final Path mBoltPath = new Path();
|
||||
|
||||
@@ -292,11 +297,27 @@ public class BatteryMeterView extends View implements DemoMode,
|
||||
for (int i=0; i<mColors.length; i+=2) {
|
||||
thresh = mColors[i];
|
||||
color = mColors[i+1];
|
||||
if (percent <= thresh) return color;
|
||||
if (percent <= thresh) {
|
||||
|
||||
// Respect tinting for "normal" level
|
||||
if (i == mColors.length-2) {
|
||||
return mIconTint;
|
||||
} else {
|
||||
return color;
|
||||
}
|
||||
}
|
||||
}
|
||||
return color;
|
||||
}
|
||||
|
||||
public void setIconTint(int tint) {
|
||||
mIconTint = tint;
|
||||
mFramePaint.setColorFilter(new PorterDuffColorFilter(tint, PorterDuff.Mode.SRC_ATOP));
|
||||
mBoltPaint.setColor(tint);
|
||||
mChargeColor = tint;
|
||||
invalidate();
|
||||
}
|
||||
|
||||
@Override
|
||||
public void draw(Canvas c) {
|
||||
BatteryTracker tracker = mDemoMode ? mDemoTracker : mTracker;
|
||||
|
||||
@@ -773,11 +773,7 @@ public abstract class BaseStatusBar extends SystemUI implements
|
||||
}
|
||||
|
||||
if (entry.icon != null) {
|
||||
if (entry.targetSdk >= Build.VERSION_CODES.LOLLIPOP) {
|
||||
entry.icon.setColorFilter(mContext.getResources().getColor(android.R.color.white));
|
||||
} else {
|
||||
entry.icon.setColorFilter(null);
|
||||
}
|
||||
entry.icon.setTag(R.id.icon_is_pre_L, entry.targetSdk < Build.VERSION_CODES.LOLLIPOP);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -17,6 +17,9 @@
|
||||
package com.android.systemui.statusbar;
|
||||
|
||||
import android.content.Context;
|
||||
import android.content.res.ColorStateList;
|
||||
import android.graphics.Color;
|
||||
import android.graphics.PorterDuff;
|
||||
import android.telephony.SubscriptionInfo;
|
||||
import android.util.AttributeSet;
|
||||
import android.util.Log;
|
||||
@@ -55,6 +58,7 @@ public class SignalClusterView
|
||||
private int mAirplaneContentDescription;
|
||||
private String mWifiDescription;
|
||||
private ArrayList<PhoneState> mPhoneStates = new ArrayList<PhoneState>();
|
||||
private int mIconTint = Color.WHITE;
|
||||
|
||||
ViewGroup mWifiGroup;
|
||||
ImageView mVpn, mWifi, mAirplane, mNoSims;
|
||||
@@ -121,6 +125,7 @@ public class SignalClusterView
|
||||
}
|
||||
|
||||
apply();
|
||||
applyIconTint();
|
||||
}
|
||||
|
||||
@Override
|
||||
@@ -187,6 +192,9 @@ public class SignalClusterView
|
||||
for (int i = 0; i < n; i++) {
|
||||
inflatePhoneState(subs.get(i).getSubscriptionId());
|
||||
}
|
||||
if (isAttachedToWindow()) {
|
||||
applyIconTint();
|
||||
}
|
||||
}
|
||||
|
||||
private PhoneState getOrInflateState(int subId) {
|
||||
@@ -315,6 +323,29 @@ public class SignalClusterView
|
||||
setPaddingRelative(0, 0, anythingVisible ? mEndPadding : mEndPaddingNothingVisible, 0);
|
||||
}
|
||||
|
||||
public void setIconTint(int tint) {
|
||||
boolean changed = tint != mIconTint;
|
||||
mIconTint = tint;
|
||||
if (changed && isAttachedToWindow()) {
|
||||
applyIconTint();
|
||||
}
|
||||
}
|
||||
|
||||
private void applyIconTint() {
|
||||
setTint(mVpn, mIconTint);
|
||||
setTint(mWifi, mIconTint);
|
||||
setTint(mNoSims, mIconTint);
|
||||
setTint(mAirplane, mIconTint);
|
||||
for (int i = 0; i < mPhoneStates.size(); i++) {
|
||||
mPhoneStates.get(i).setIconTint(mIconTint);
|
||||
}
|
||||
}
|
||||
|
||||
private void setTint(ImageView v, int tint) {
|
||||
v.setImageTintMode(PorterDuff.Mode.SRC_ATOP);
|
||||
v.setImageTintList(ColorStateList.valueOf(tint));
|
||||
}
|
||||
|
||||
private class PhoneState {
|
||||
private final int mSubId;
|
||||
private boolean mMobileVisible = false;
|
||||
@@ -369,6 +400,11 @@ public class SignalClusterView
|
||||
event.getText().add(mMobileGroup.getContentDescription());
|
||||
}
|
||||
}
|
||||
|
||||
public void setIconTint(int tint) {
|
||||
setTint(mMobile, tint);
|
||||
setTint(mMobileType, tint);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -16,20 +16,26 @@
|
||||
|
||||
package com.android.systemui.statusbar.phone;
|
||||
|
||||
import android.app.Notification;
|
||||
import android.content.Context;
|
||||
import android.content.res.ColorStateList;
|
||||
import android.graphics.Color;
|
||||
import android.graphics.PorterDuff;
|
||||
import android.os.Bundle;
|
||||
import android.view.View;
|
||||
import android.view.ViewGroup;
|
||||
import android.view.animation.AnimationUtils;
|
||||
import android.view.animation.Interpolator;
|
||||
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 java.io.PrintWriter;
|
||||
@@ -46,28 +52,37 @@ public class StatusBarIconController {
|
||||
private PhoneStatusBar mPhoneStatusBar;
|
||||
private Interpolator mLinearOutSlowIn;
|
||||
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 BatteryMeterView mBatteryMeterView;
|
||||
private TextView mClock;
|
||||
|
||||
private int mIconSize;
|
||||
private int mIconHPadding;
|
||||
|
||||
private int mIconTint = Color.WHITE;
|
||||
|
||||
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);
|
||||
View moreIcon = statusBar.findViewById(R.id.moreIcon);
|
||||
mNotificationIcons.setOverflowIndicator(moreIcon);
|
||||
mMoreIcon = (ImageView) statusBar.findViewById(R.id.moreIcon);
|
||||
mNotificationIcons.setOverflowIndicator(mMoreIcon);
|
||||
mStatusIconsKeyguard = (LinearLayout) keyguardStatusBar.findViewById(R.id.statusIcons);
|
||||
mBatteryMeterView = (BatteryMeterView) statusBar.findViewById(R.id.battery);
|
||||
mClock = (TextView) statusBar.findViewById(R.id.clock);
|
||||
mLinearOutSlowIn = AnimationUtils.loadInterpolator(mContext,
|
||||
android.R.interpolator.linear_out_slow_in);
|
||||
@@ -91,6 +106,7 @@ public class StatusBarIconController {
|
||||
view.set(icon);
|
||||
mStatusIconsKeyguard.addView(view, viewIndex, new LinearLayout.LayoutParams(
|
||||
ViewGroup.LayoutParams.WRAP_CONTENT, mIconSize));
|
||||
applyIconTint();
|
||||
}
|
||||
|
||||
public void updateSystemIcon(String slot, int index, int viewIndex,
|
||||
@@ -99,6 +115,7 @@ public class StatusBarIconController {
|
||||
view.set(icon);
|
||||
view = (StatusBarIconView) mStatusIconsKeyguard.getChildAt(viewIndex);
|
||||
view.set(icon);
|
||||
applyIconTint();
|
||||
}
|
||||
|
||||
public void removeSystemIcon(String slot, int index, int viewIndex) {
|
||||
@@ -156,6 +173,8 @@ public class StatusBarIconController {
|
||||
mNotificationIcons.removeView(expected);
|
||||
mNotificationIcons.addView(expected, i);
|
||||
}
|
||||
|
||||
applyNotificationIconsTint();
|
||||
}
|
||||
|
||||
public void hideSystemIconArea(boolean animate) {
|
||||
@@ -247,4 +266,43 @@ public class StatusBarIconController {
|
||||
.start();
|
||||
}
|
||||
}
|
||||
|
||||
public void setIconTint(int tint) {
|
||||
mIconTint = tint;
|
||||
applyIconTint();
|
||||
}
|
||||
|
||||
private void applyIconTint() {
|
||||
for (int i = 0; i < mStatusIcons.getChildCount(); i++) {
|
||||
StatusBarIconView v = (StatusBarIconView) mStatusIcons.getChildAt(i);
|
||||
v.setImageTintList(ColorStateList.valueOf(mIconTint));
|
||||
}
|
||||
mSignalCluster.setIconTint(mIconTint);
|
||||
mMoreIcon.setImageTintList(ColorStateList.valueOf(mIconTint));
|
||||
mBatteryMeterView.setIconTint(mIconTint);
|
||||
mClock.setTextColor(mIconTint);
|
||||
applyNotificationIconsTint();
|
||||
}
|
||||
|
||||
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.setImageTintMode(PorterDuff.Mode.SRC_ATOP);
|
||||
v.setImageTintList(ColorStateList.valueOf(mIconTint));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private boolean isGrayscale(StatusBarIconView v) {
|
||||
Object isGrayscale = v.getTag(R.id.icon_is_grayscale);
|
||||
if (isGrayscale != null) {
|
||||
return Boolean.TRUE.equals(isGrayscale);
|
||||
}
|
||||
boolean grayscale = mNotificationColorUtil.isGrayscaleIcon(v.getDrawable());
|
||||
v.setTag(R.id.icon_is_grayscale, grayscale);
|
||||
return grayscale;
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user