diff options
author | Andrew Flynn <flynn@google.com> | 2015-06-10 14:12:23 -0400 |
---|---|---|
committer | Andrew Flynn <flynn@google.com> | 2015-06-12 09:56:56 -0400 |
commit | 0f27a3f0d7048140fac2329c714af2bfcf4218d6 (patch) | |
tree | 6e026b830d46b0fddbc63e9fc0f3279c982623fd /packages | |
parent | a31940df170ea7e8253736ce7b5dba2176699c25 (diff) | |
download | frameworks_base-0f27a3f0d7048140fac2329c714af2bfcf4218d6.zip frameworks_base-0f27a3f0d7048140fac2329c714af2bfcf4218d6.tar.gz frameworks_base-0f27a3f0d7048140fac2329c714af2bfcf4218d6.tar.bz2 |
SysUI: Status bar ImageViews
- Switch AlphaOptimizedImageView to have the boolean hasOverLappingRendering()
return be a custom value. This allows us to have AnimatedImageView extend
AlphaOptimizedImageView and support both types of ImageViews w/o having to
create 2x subclasses.
- Add drawable ID tracking to AnimatedImageView so that we don't interrupt
animations with an update of the exact same drawable.
- Switch mobile signal icon to use AnimatedImageView so that animations aren't
interrupted.
Bug: 21504588
Change-Id: Ic2275f1bf607449c191ae0d08bc7756c7d694bc1
Diffstat (limited to 'packages')
6 files changed, 57 insertions, 12 deletions
diff --git a/packages/SystemUI/res/layout/mobile_signal_group.xml b/packages/SystemUI/res/layout/mobile_signal_group.xml index 6a4ac2c..6ae5cf3 100644 --- a/packages/SystemUI/res/layout/mobile_signal_group.xml +++ b/packages/SystemUI/res/layout/mobile_signal_group.xml @@ -19,22 +19,25 @@ --> <FrameLayout xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:systemui="http://schemas.android.com/apk/res-auto" android:id="@+id/mobile_combo" android:layout_width="wrap_content" android:layout_height="wrap_content" > - <com.android.systemui.statusbar.AlphaOptimizedImageView + <com.android.systemui.statusbar.AnimatedImageView android:theme="@style/DualToneLightTheme" android:id="@+id/mobile_signal" android:layout_height="wrap_content" android:layout_width="wrap_content" + systemui:hasOverlappingRendering="false" /> - <com.android.systemui.statusbar.AlphaOptimizedImageView + <com.android.systemui.statusbar.AnimatedImageView android:theme="@style/DualToneDarkTheme" android:id="@+id/mobile_signal_dark" android:layout_height="wrap_content" android:layout_width="wrap_content" android:alpha="0.0" + systemui:hasOverlappingRendering="false" /> <ImageView android:id="@+id/mobile_type" diff --git a/packages/SystemUI/res/layout/signal_cluster_view.xml b/packages/SystemUI/res/layout/signal_cluster_view.xml index a2121ee..f8bd6fd 100644 --- a/packages/SystemUI/res/layout/signal_cluster_view.xml +++ b/packages/SystemUI/res/layout/signal_cluster_view.xml @@ -20,6 +20,7 @@ <!-- extends LinearLayout --> <com.android.systemui.statusbar.SignalClusterView xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:systemui="http://schemas.android.com/apk/res-auto" android:layout_height="match_parent" android:layout_width="wrap_content" android:gravity="center_vertical" @@ -43,6 +44,7 @@ android:id="@+id/ethernet" android:layout_height="wrap_content" android:layout_width="wrap_content" + systemui:hasOverlappingRendering="false" /> <com.android.systemui.statusbar.AlphaOptimizedImageView android:theme="@style/DualToneDarkTheme" @@ -50,6 +52,7 @@ android:layout_height="wrap_content" android:layout_width="wrap_content" android:alpha="0.0" + systemui:hasOverlappingRendering="false" /> </FrameLayout> <FrameLayout @@ -62,6 +65,7 @@ android:id="@+id/wifi_signal" android:layout_height="wrap_content" android:layout_width="wrap_content" + systemui:hasOverlappingRendering="false" /> <com.android.systemui.statusbar.AlphaOptimizedImageView android:theme="@style/DualToneDarkTheme" @@ -69,6 +73,7 @@ android:layout_height="wrap_content" android:layout_width="wrap_content" android:alpha="0.0" + systemui:hasOverlappingRendering="false" /> </FrameLayout> <View @@ -94,6 +99,7 @@ android:layout_height="wrap_content" android:layout_width="wrap_content" android:src="@drawable/stat_sys_no_sims" + systemui:hasOverlappingRendering="false" /> <com.android.systemui.statusbar.AlphaOptimizedImageView android:theme="@style/DualToneDarkTheme" @@ -102,6 +108,7 @@ android:layout_width="wrap_content" android:src="@drawable/stat_sys_no_sims" android:alpha="0.0" + systemui:hasOverlappingRendering="false" /> </FrameLayout> <View diff --git a/packages/SystemUI/res/layout/status_bar_expanded_header.xml b/packages/SystemUI/res/layout/status_bar_expanded_header.xml index 0e1517f..7262ed2 100644 --- a/packages/SystemUI/res/layout/status_bar_expanded_header.xml +++ b/packages/SystemUI/res/layout/status_bar_expanded_header.xml @@ -162,6 +162,7 @@ android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_alignParentBottom="true" + systemui:hasOverlappingRendering="false" /> <TextView diff --git a/packages/SystemUI/res/values/attrs.xml b/packages/SystemUI/res/values/attrs.xml index 354b70b..527248c 100644 --- a/packages/SystemUI/res/values/attrs.xml +++ b/packages/SystemUI/res/values/attrs.xml @@ -86,5 +86,9 @@ <declare-styleable name="StatusBarWindowView_Layout"> <attr name="ignoreRightInset" format="boolean" /> </declare-styleable> + + <declare-styleable name="AlphaOptimizedImageView"> + <attr name="hasOverlappingRendering" format="boolean" /> + </declare-styleable> </resources> diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/AlphaOptimizedImageView.java b/packages/SystemUI/src/com/android/systemui/statusbar/AlphaOptimizedImageView.java index 858c118..700ea34 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/AlphaOptimizedImageView.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/AlphaOptimizedImageView.java @@ -17,34 +17,49 @@ package com.android.systemui.statusbar; import android.content.Context; +import android.content.res.TypedArray; import android.util.AttributeSet; import android.widget.ImageView; +import com.android.systemui.R; + /** - * An ImageView which does not have overlapping rendering commands and therefore does not need a - * layer when alpha is changed. + * An ImageView which supports an attribute specifying whether it has overlapping rendering + * commands and therefore does not need a layer when alpha is changed. */ -public class AlphaOptimizedImageView extends ImageView -{ +public class AlphaOptimizedImageView extends ImageView { + private final boolean mHasOverlappingRendering; + public AlphaOptimizedImageView(Context context) { - super(context); + this(context, null /* attrs */); } public AlphaOptimizedImageView(Context context, AttributeSet attrs) { - super(context, attrs); + this(context, attrs, 0 /* defStyleAttr */); } public AlphaOptimizedImageView(Context context, AttributeSet attrs, int defStyleAttr) { - super(context, attrs, defStyleAttr); + this(context, attrs, defStyleAttr, 0 /* defStyleRes */); } public AlphaOptimizedImageView(Context context, AttributeSet attrs, int defStyleAttr, int defStyleRes) { super(context, attrs, defStyleAttr, defStyleRes); + + TypedArray a = context.getTheme().obtainStyledAttributes(attrs, + R.styleable.AlphaOptimizedImageView, 0, 0); + + try { + // Default to true, which is what View.java defaults to + mHasOverlappingRendering = a.getBoolean( + R.styleable.AlphaOptimizedImageView_hasOverlappingRendering, true); + } finally { + a.recycle(); + } } @Override public boolean hasOverlappingRendering() { - return false; + return mHasOverlappingRendering; } } diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/AnimatedImageView.java b/packages/SystemUI/src/com/android/systemui/statusbar/AnimatedImageView.java index 9839fe9..90f7c08 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/AnimatedImageView.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/AnimatedImageView.java @@ -25,10 +25,15 @@ import android.widget.ImageView; import android.widget.RemoteViews.RemoteView; @RemoteView -public class AnimatedImageView extends ImageView { +public class AnimatedImageView extends AlphaOptimizedImageView { AnimationDrawable mAnim; boolean mAttached; + // Tracks the last image that was set, so that we don't refresh the image if it is exactly + // the same as the previous one. If this is a resid, we track that. If it's a drawable, we + // track the hashcode of the drawable. + int mDrawableId; + public AnimatedImageView(Context context) { super(context); } @@ -43,7 +48,7 @@ public class AnimatedImageView extends ImageView { mAnim.stop(); } if (drawable instanceof AnimationDrawable) { - mAnim = (AnimationDrawable)drawable; + mAnim = (AnimationDrawable) drawable; if (isShown()) { mAnim.start(); } @@ -54,6 +59,13 @@ public class AnimatedImageView extends ImageView { @Override public void setImageDrawable(Drawable drawable) { + if (drawable != null) { + if (mDrawableId == drawable.hashCode()) return; + + mDrawableId = drawable.hashCode(); + } else { + mDrawableId = 0; + } super.setImageDrawable(drawable); updateAnim(); } @@ -61,6 +73,9 @@ public class AnimatedImageView extends ImageView { @Override @android.view.RemotableViewMethod public void setImageResource(int resid) { + if (mDrawableId == resid) return; + + mDrawableId = resid; super.setImageResource(resid); updateAnim(); } |