From 55e8e1ee604475b05c96934a4c53688504d1b9c5 Mon Sep 17 00:00:00 2001 From: Anthony Chen Date: Fri, 8 Jan 2016 10:31:46 -0800 Subject: [PATCH] Move hard-coded dimens to dimens.xml. This is an initial change to allow the values to be overridden by Android Auto. Change-Id: Iaa611b6ff2ce0aa00d93776e775905c786802ef2 --- .../res/layout/signal_cluster_view.xml | 4 +- packages/SystemUI/res/layout/status_bar.xml | 3 +- packages/SystemUI/res/layout/system_icons.xml | 6 +- packages/SystemUI/res/values/dimens.xml | 26 ++++- .../statusbar/ScalingDrawableWrapper.java | 43 +++++++++ .../systemui/statusbar/SignalClusterView.java | 96 +++++++++++++------ .../systemui/statusbar/StatusBarIconView.java | 21 +++- .../phone/StatusBarIconController.java | 37 ++++++- 8 files changed, 193 insertions(+), 43 deletions(-) create mode 100644 packages/SystemUI/src/com/android/systemui/statusbar/ScalingDrawableWrapper.java diff --git a/packages/SystemUI/res/layout/signal_cluster_view.xml b/packages/SystemUI/res/layout/signal_cluster_view.xml index 198e65834046c..c634cd61afe16 100644 --- a/packages/SystemUI/res/layout/signal_cluster_view.xml +++ b/packages/SystemUI/res/layout/signal_cluster_view.xml @@ -77,7 +77,7 @@ @@ -112,7 +112,7 @@ diff --git a/packages/SystemUI/res/layout/status_bar.xml b/packages/SystemUI/res/layout/status_bar.xml index bea9f788ee57c..39c16d7118977 100644 --- a/packages/SystemUI/res/layout/status_bar.xml +++ b/packages/SystemUI/res/layout/status_bar.xml @@ -70,7 +70,8 @@ android:layout_width="wrap_content" android:layout_height="match_parent" android:singleLine="true" - android:paddingStart="7dp" + android:paddingStart="@dimen/status_bar_clock_starting_padding" + android:paddingEnd="@dimen/status_bar_clock_end_padding" android:gravity="center_vertical|start" /> diff --git a/packages/SystemUI/res/layout/system_icons.xml b/packages/SystemUI/res/layout/system_icons.xml index 943e84622fe76..e9448dbd7163c 100644 --- a/packages/SystemUI/res/layout/system_icons.xml +++ b/packages/SystemUI/res/layout/system_icons.xml @@ -30,11 +30,11 @@ android:id="@+id/signal_cluster" android:layout_width="wrap_content" android:layout_height="wrap_content" - android:layout_marginStart="2.5dp"/> + android:layout_marginStart="@dimen/signal_cluster_margin_start"/> \ No newline at end of file diff --git a/packages/SystemUI/res/values/dimens.xml b/packages/SystemUI/res/values/dimens.xml index 3fb5f182c1b87..e72a3fc5163a0 100644 --- a/packages/SystemUI/res/values/dimens.xml +++ b/packages/SystemUI/res/values/dimens.xml @@ -33,9 +33,30 @@ @*android:dimen/status_bar_icon_size - + + 14.5dp + + + 9.5dp + + 14sp + + 7dp + + + 0dp + + + 4dp + + + 4dp + + + 1.0 + 84dp @@ -518,6 +539,9 @@ 8dp + + 2.5dp + 7dp diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/ScalingDrawableWrapper.java b/packages/SystemUI/src/com/android/systemui/statusbar/ScalingDrawableWrapper.java new file mode 100644 index 0000000000000..24277e64a2105 --- /dev/null +++ b/packages/SystemUI/src/com/android/systemui/statusbar/ScalingDrawableWrapper.java @@ -0,0 +1,43 @@ +/* + * Copyright (C) 2016 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.android.systemui.statusbar; + +import android.graphics.drawable.Drawable; +import android.graphics.drawable.DrawableWrapper; + +/** + * An extension of {@link DrawableWrapper} that will take a given Drawable and scale it by + * the given factor. + */ +class ScalingDrawableWrapper extends DrawableWrapper { + private float mScaleFactor; + + public ScalingDrawableWrapper(Drawable drawable, float scaleFactor) { + super(drawable); + mScaleFactor = scaleFactor; + } + + @Override + public int getIntrinsicWidth() { + return (int) (super.getIntrinsicWidth() * mScaleFactor); + } + + @Override + public int getIntrinsicHeight() { + return (int) (super.getIntrinsicHeight() * mScaleFactor); + } +} diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/SignalClusterView.java b/packages/SystemUI/src/com/android/systemui/statusbar/SignalClusterView.java index cc30882a7089e..f5cac3337b014 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/SignalClusterView.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/SignalClusterView.java @@ -16,16 +16,18 @@ package com.android.systemui.statusbar; +import android.annotation.DrawableRes; import android.content.Context; import android.content.res.ColorStateList; +import android.content.res.Resources; import android.graphics.Color; -import android.graphics.PorterDuff; import android.graphics.drawable.Animatable; import android.graphics.drawable.Drawable; import android.telephony.SubscriptionInfo; import android.util.ArraySet; import android.util.AttributeSet; import android.util.Log; +import android.util.TypedValue; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; @@ -86,10 +88,11 @@ public class SignalClusterView View mWifiSignalSpacer; LinearLayout mMobileSignalGroup; - private int mWideTypeIconStartPadding; - private int mSecondaryTelephonyPadding; - private int mEndPadding; - private int mEndPaddingNothingVisible; + private final int mWideTypeIconStartPadding; + private final int mSecondaryTelephonyPadding; + private final int mEndPadding; + private final int mEndPaddingNothingVisible; + private final float mIconScaleFactor; private boolean mBlockAirplane; private boolean mBlockMobile; @@ -106,6 +109,17 @@ public class SignalClusterView public SignalClusterView(Context context, AttributeSet attrs, int defStyle) { super(context, attrs, defStyle); + + Resources res = getResources(); + mWideTypeIconStartPadding = res.getDimensionPixelSize(R.dimen.wide_type_icon_start_padding); + mSecondaryTelephonyPadding = res.getDimensionPixelSize(R.dimen.secondary_telephony_padding); + mEndPadding = res.getDimensionPixelSize(R.dimen.signal_cluster_battery_padding); + mEndPaddingNothingVisible = res.getDimensionPixelSize( + R.dimen.no_signal_cluster_battery_padding); + + TypedValue typedValue = new TypedValue(); + res.getValue(R.dimen.status_bar_icon_scale_factor, typedValue, true); + mIconScaleFactor = typedValue.getFloat(); } @Override @@ -146,19 +160,6 @@ public class SignalClusterView @Override protected void onFinishInflate() { super.onFinishInflate(); - mWideTypeIconStartPadding = getContext().getResources().getDimensionPixelSize( - R.dimen.wide_type_icon_start_padding); - mSecondaryTelephonyPadding = getContext().getResources().getDimensionPixelSize( - R.dimen.secondary_telephony_padding); - mEndPadding = getContext().getResources().getDimensionPixelSize( - R.dimen.signal_cluster_battery_padding); - mEndPaddingNothingVisible = getContext().getResources().getDimensionPixelSize( - R.dimen.no_signal_cluster_battery_padding); - } - - @Override - protected void onAttachedToWindow() { - super.onAttachedToWindow(); mVpn = (ImageView) findViewById(R.id.vpn); mEthernetGroup = (ViewGroup) findViewById(R.id.ethernet_combo); @@ -174,6 +175,32 @@ public class SignalClusterView mWifiAirplaneSpacer = findViewById(R.id.wifi_airplane_spacer); mWifiSignalSpacer = findViewById(R.id.wifi_signal_spacer); mMobileSignalGroup = (LinearLayout) findViewById(R.id.mobile_signal_group); + + maybeScaleVpnAndNoSimsIcons(); + } + + /** + * Extracts the icon off of the VPN and no sims views and maybe scale them by + * {@link #mIconScaleFactor}. Note that the other icons are not scaled here because they are + * dynamic. As such, they need to be scaled each time the icon changes in {@link #apply()}. + */ + private void maybeScaleVpnAndNoSimsIcons() { + if (mIconScaleFactor == 1.f) { + return; + } + + mVpn.setImageDrawable(new ScalingDrawableWrapper(mVpn.getDrawable(), mIconScaleFactor)); + + mNoSims.setImageDrawable( + new ScalingDrawableWrapper(mNoSims.getDrawable(), mIconScaleFactor)); + mNoSimsDark.setImageDrawable( + new ScalingDrawableWrapper(mNoSimsDark.getDrawable(), mIconScaleFactor)); + } + + @Override + protected void onAttachedToWindow() { + super.onAttachedToWindow(); + for (PhoneState state : mPhoneStates) { mMobileSignalGroup.addView(state.mMobileGroup); } @@ -185,14 +212,7 @@ public class SignalClusterView @Override protected void onDetachedFromWindow() { - mVpn = null; - mEthernetGroup = null; - mEthernet = null; - mWifiGroup = null; - mWifi = null; - mAirplane = null; mMobileSignalGroup.removeAllViews(); - mMobileSignalGroup = null; TunerService.get(mContext).removeTunable(this); super.onDetachedFromWindow(); @@ -380,8 +400,8 @@ public class SignalClusterView if (mEthernetVisible) { if (mLastEthernetIconId != mEthernetIconId) { - mEthernet.setImageResource(mEthernetIconId); - mEthernetDark.setImageResource(mEthernetIconId); + setIconForView(mEthernet, mEthernetIconId); + setIconForView(mEthernetDark, mEthernetIconId); mLastEthernetIconId = mEthernetIconId; } mEthernetGroup.setContentDescription(mEthernetDescription); @@ -394,11 +414,10 @@ public class SignalClusterView String.format("ethernet: %s", (mEthernetVisible ? "VISIBLE" : "GONE"))); - if (mWifiVisible) { if (mWifiStrengthId != mLastWifiStrengthId) { - mWifi.setImageResource(mWifiStrengthId); - mWifiDark.setImageResource(mWifiStrengthId); + setIconForView(mWifi, mWifiStrengthId); + setIconForView(mWifiDark, mWifiStrengthId); mLastWifiStrengthId = mWifiStrengthId; } mWifiGroup.setContentDescription(mWifiDescription); @@ -425,7 +444,7 @@ public class SignalClusterView if (mIsAirplaneMode) { if (mLastAirplaneIconId != mAirplaneIconId) { - mAirplane.setImageResource(mAirplaneIconId); + setIconForView(mAirplane, mAirplaneIconId); mLastAirplaneIconId = mAirplaneIconId; } mAirplane.setContentDescription(mAirplaneContentDescription); @@ -453,6 +472,21 @@ public class SignalClusterView setPaddingRelative(0, 0, anythingVisible ? mEndPadding : mEndPaddingNothingVisible, 0); } + /** + * Sets the given drawable id on the view. This method will also scale the icon by + * {@link #mIconScaleFactor} if appropriate. + */ + private void setIconForView(ImageView imageView, @DrawableRes int iconId) { + // Using the imageView's context to retrieve the Drawable so that theme is preserved. + Drawable icon = imageView.getContext().getDrawable(iconId); + + if (mIconScaleFactor == 1.f) { + imageView.setImageDrawable(icon); + } else { + imageView.setImageDrawable(new ScalingDrawableWrapper(icon, mIconScaleFactor)); + } + } + public void setIconTint(int tint, float darkIntensity) { boolean changed = tint != mIconTint || darkIntensity != mDarkIntensity; mIconTint = tint; diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/StatusBarIconView.java b/packages/SystemUI/src/com/android/systemui/statusbar/StatusBarIconView.java index de7a8dbc94832..5a7cf86be8e55 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/StatusBarIconView.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/StatusBarIconView.java @@ -24,10 +24,13 @@ import android.graphics.Paint; import android.graphics.Rect; import android.graphics.drawable.Drawable; import android.graphics.drawable.Icon; +import android.graphics.drawable.ScaleDrawable; import android.os.UserHandle; import android.text.TextUtils; import android.util.AttributeSet; import android.util.Log; +import android.util.TypedValue; +import android.view.Gravity; import android.view.ViewDebug; import android.view.accessibility.AccessibilityEvent; import com.android.internal.statusbar.StatusBarIcon; @@ -189,12 +192,24 @@ public class StatusBarIconView extends AnimatedImageView { * @return Drawable for this item, or null if the package or item could not * be found */ - public static Drawable getIcon(Context context, StatusBarIcon icon) { - int userId = icon.user.getIdentifier(); + public static Drawable getIcon(Context context, StatusBarIcon statusBarIcon) { + int userId = statusBarIcon.user.getIdentifier(); if (userId == UserHandle.USER_ALL) { userId = UserHandle.USER_SYSTEM; } - return icon.icon.loadDrawableAsUser(context, userId); + + Drawable icon = statusBarIcon.icon.loadDrawableAsUser(context, userId); + + TypedValue typedValue = new TypedValue(); + context.getResources().getValue(R.dimen.status_bar_icon_scale_factor, typedValue, true); + float scaleFactor = typedValue.getFloat(); + + // No need to scale the icon, so return it as is. + if (scaleFactor == 1.f) { + return icon; + } + + return new ScalingDrawableWrapper(icon, scaleFactor); } public StatusBarIcon getStatusBarIcon() { 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 b16c98e7c5e15..64fb066babcd1 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarIconController.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarIconController.java @@ -20,6 +20,7 @@ import android.animation.ArgbEvaluator; import android.animation.ValueAnimator; import android.content.Context; import android.content.res.ColorStateList; +import android.content.res.Resources; import android.graphics.Color; import android.graphics.drawable.Icon; import android.os.Bundle; @@ -28,6 +29,7 @@ import android.os.SystemClock; import android.os.UserHandle; import android.text.TextUtils; import android.util.ArraySet; +import android.util.TypedValue; import android.view.View; import android.view.ViewGroup; import android.view.animation.AnimationUtils; @@ -122,7 +124,10 @@ public class StatusBarIconController extends StatusBarIconList implements Tunabl notificationIconArea.addView(mNotificationIconAreaInner); mStatusIconsKeyguard = (LinearLayout) keyguardStatusBar.findViewById(R.id.statusIcons); + mBatteryMeterView = (BatteryMeterView) statusBar.findViewById(R.id.battery); + maybeScaleBatteryMeterView(context); + mClock = (TextView) statusBar.findViewById(R.id.clock); mLinearOutSlowIn = AnimationUtils.loadInterpolator(mContext, android.R.interpolator.linear_out_slow_in); @@ -136,6 +141,30 @@ public class StatusBarIconController extends StatusBarIconList implements Tunabl TunerService.get(mContext).addTunable(this, ICON_BLACKLIST); } + /** + * Looks up the scale factor for status bar icons and scales the battery view by that amount + * if appropriate. + */ + private void maybeScaleBatteryMeterView(Context context) { + Resources res = context.getResources(); + TypedValue typedValue = new TypedValue(); + + res.getValue(R.dimen.status_bar_icon_scale_factor, typedValue, true); + float iconScaleFactor = typedValue.getFloat(); + + if (iconScaleFactor == 1.f) { + return; + } + + float batteryHeight = res.getDimension(R.dimen.status_bar_battery_icon_height); + float batteryWidth = res.getDimension(R.dimen.status_bar_battery_icon_width); + + LinearLayout.LayoutParams scaledLayoutParams = new LinearLayout.LayoutParams( + (int) (batteryWidth * iconScaleFactor), (int) (batteryHeight * iconScaleFactor)); + + mBatteryMeterView.setLayoutParams(scaledLayoutParams); + } + @Override public void onTuningChanged(String key, String newValue) { if (!ICON_BLACKLIST.equals(key)) { @@ -174,8 +203,12 @@ public class StatusBarIconController extends StatusBarIconList implements Tunabl boolean blocked = mIconBlacklist.contains(slot); StatusBarIconView view = new StatusBarIconView(mContext, slot, null, blocked); view.set(icon); - mStatusIcons.addView(view, viewIndex, new LinearLayout.LayoutParams( - ViewGroup.LayoutParams.WRAP_CONTENT, mIconSize)); + + LinearLayout.LayoutParams lp = new LinearLayout.LayoutParams( + ViewGroup.LayoutParams.WRAP_CONTENT, mIconSize); + lp.setMargins(mIconHPadding, 0, mIconHPadding, 0); + mStatusIcons.addView(view, viewIndex, lp); + view = new StatusBarIconView(mContext, slot, null, blocked); view.set(icon); mStatusIconsKeyguard.addView(view, viewIndex, new LinearLayout.LayoutParams(