Skip to content

Commit 61cd69c

Browse files
author
Adam Cohen
committed
Keyguard polish
-> Updated user switcher to be closer to spec (issue 7047393) -> Drawing keyguard overscroll gradient manually in KeyguardWidgetFrame (eliminates need for assets, eliminates banding) -> Fixed clipping of overscroll on sw600dp using negative margin Change-Id: I90ec7f820ca7dccebf7e05628a3185e95d41af08
1 parent 891a216 commit 61cd69c

File tree

10 files changed

+132
-86
lines changed

10 files changed

+132
-86
lines changed
-2.16 KB
Binary file not shown.
-1.42 KB
Binary file not shown.

core/res/res/layout/keyguard_multi_user_avatar.xml

Lines changed: 21 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -22,19 +22,31 @@
2222
xmlns:android="http://schemas.android.com/apk/res/android"
2323
android:layout_width="125dp"
2424
android:layout_height="125dp"
25+
android:background="#000000"
2526
android:gravity="center_horizontal">
2627
<ImageView
2728
android:id="@+id/keyguard_user_avatar"
2829
android:scaleType="centerCrop"
2930
android:layout_width="match_parent"
3031
android:layout_height="match_parent"
3132
android:layout_gravity="center"/>
32-
<TextView
33-
android:id="@+id/keyguard_user_name"
34-
android:layout_width="wrap_content"
35-
android:layout_height="wrap_content"
36-
android:layout_gravity="bottom|right"
37-
android:textSize="12sp"
38-
android:background="#99FFFFFF"
39-
android:textColor="#ff000000"/>
40-
</com.android.internal.policy.impl.keyguard.KeyguardMultiUserAvatar>
33+
<LinearLayout
34+
android:layout_width="match_parent"
35+
android:layout_height="match_parent"
36+
android:orientation="vertical">
37+
<Space
38+
android:layout_width="match_parent"
39+
android:layout_height="0dp"
40+
android:layout_weight="0.78" />
41+
<TextView
42+
android:id="@+id/keyguard_user_name"
43+
android:layout_width="match_parent"
44+
android:layout_height="0dp"
45+
android:layout_weight="0.22"
46+
android:paddingLeft="6dp"
47+
android:layout_gravity="center_vertical|left"
48+
android:textSize="16sp"
49+
android:textColor="#ffffff"
50+
android:background="#808080" />
51+
</LinearLayout>
52+
</com.android.internal.policy.impl.keyguard.KeyguardMultiUserAvatar>

core/res/res/layout/keyguard_widget_region.xml

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -38,7 +38,8 @@
3838
android:layout_height="10dp"
3939
android:orientation="horizontal"
4040
android:paddingLeft="@dimen/kg_widget_pager_horizontal_padding"
41-
android:paddingRight="@dimen/kg_widget_pager_horizontal_padding">
41+
android:paddingRight="@dimen/kg_widget_pager_horizontal_padding"
42+
android:layout_marginTop="@dimen/kg_runway_lights_top_margin">
4243
<com.android.internal.policy.impl.keyguard.KeyguardGlowStripView
4344
android:id="@+id/left_strip"
4445
android:paddingTop="@dimen/kg_runway_lights_vertical_padding"

core/res/res/values-sw600dp/dimens.xml

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -77,5 +77,13 @@
7777
<!-- Preference fragment padding, sides -->
7878
<dimen name="preference_fragment_padding_side">24dp</dimen>
7979
<dimen name="preference_screen_header_padding_side">24dip</dimen>
80+
81+
<!-- Keyguard dimensions -->
82+
<!-- Bottom padding for the widget pager -->
83+
<dimen name="kg_widget_pager_bottom_padding">16dp</dimen>
84+
85+
<!-- Top margin for the runway lights. We add a negative margin in large
86+
devices to account for the widget pager padding -->
87+
<dimen name="kg_runway_lights_top_margin">-10dp</dimen>
8088
</resources>
8189

core/res/res/values/colors.xml

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -115,6 +115,11 @@
115115
<color name="lockscreen_clock_am_pm">#ffffffff</color>
116116
<color name="lockscreen_owner_info">#ff9a9a9a</color>
117117

118+
<!-- keyguard overscroll widget pager -->
119+
<color name="kg_multi_user_text_active">#ffffffff</color>
120+
<color name="kg_multi_user_text_inactive">#ff808080</color>
121+
<color name="kg_widget_pager_gradient">#ff33B5E5</color>
122+
118123
<!-- FaceLock -->
119124
<color name="facelock_spotlight_mask">#CC000000</color>
120125

core/res/res/values/dimens.xml

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -286,7 +286,7 @@
286286
<dimen name="kg_runway_lights_height">7dp</dimen>
287287

288288
<!-- The height of the runway lights strip -->
289-
<dimen name="kg_runway_lights_vertical_padding">3dp</dimen>
289+
<dimen name="kg_runway_lights_vertical_padding">2dp</dimen>
290290

291291
<!-- Horizontal padding for the widget pager -->
292292
<dimen name="kg_widget_pager_horizontal_padding">16dp</dimen>
@@ -297,6 +297,10 @@
297297
<!-- Bottom padding for the widget pager -->
298298
<dimen name="kg_widget_pager_bottom_padding">6dp</dimen>
299299

300+
<!-- Top margin for the runway lights. We add a negative margin in large
301+
devices to account for the widget pager padding -->
302+
<dimen name="kg_runway_lights_top_margin">0dp</dimen>
303+
300304
<!-- Touch slop for the global toggle accessibility gesture -->
301305
<dimen name="accessibility_touch_slop">80dip</dimen>
302306

core/res/res/values/symbols.xml

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1188,6 +1188,9 @@
11881188
<java-symbol type="bool" name="config_reverseDefaultRotation" />
11891189
<java-symbol type="bool" name="config_showNavigationBar" />
11901190
<java-symbol type="bool" name="target_honeycomb_needs_options_menu" />
1191+
<java-symbol type="color" name="kg_multi_user_text_active" />
1192+
<java-symbol type="color" name="kg_multi_user_text_inactive" />
1193+
<java-symbol type="color" name="kg_widget_pager_gradient" />
11911194
<java-symbol type="dimen" name="navigation_bar_height" />
11921195
<java-symbol type="dimen" name="navigation_bar_height_landscape" />
11931196
<java-symbol type="dimen" name="navigation_bar_width" />
@@ -1213,8 +1216,6 @@
12131216
<java-symbol type="drawable" name="magnified_region_frame" />
12141217
<java-symbol type="drawable" name="menu_background" />
12151218
<java-symbol type="drawable" name="stat_sys_secure" />
1216-
<java-symbol type="drawable" name="kg_widget_overscroll_layer_left" />
1217-
<java-symbol type="drawable" name="kg_widget_overscroll_layer_right" />
12181219
<java-symbol type="id" name="action_mode_bar_stub" />
12191220
<java-symbol type="id" name="alarm_status" />
12201221
<java-symbol type="id" name="backspace" />

policy/src/com/android/internal/policy/impl/keyguard/KeyguardMultiUserAvatar.java

Lines changed: 60 additions & 48 deletions
Original file line numberDiff line numberDiff line change
@@ -22,11 +22,11 @@
2222
import android.animation.ValueAnimator.AnimatorUpdateListener;
2323
import android.content.Context;
2424
import android.content.pm.UserInfo;
25+
import android.content.res.Resources;
2526
import android.graphics.Color;
2627
import android.graphics.drawable.Drawable;
2728
import android.util.AttributeSet;
2829
import android.view.LayoutInflater;
29-
import android.view.ViewGroup;
3030
import android.widget.FrameLayout;
3131
import android.widget.ImageView;
3232
import android.widget.TextView;
@@ -38,9 +38,13 @@ class KeyguardMultiUserAvatar extends FrameLayout {
3838
private ImageView mUserImage;
3939
private TextView mUserName;
4040
private UserInfo mUserInfo;
41-
private static final int INACTIVE_COLOR = 85;
42-
private static final int INACTIVE_ALPHA = 195;
43-
private static final float ACTIVE_SCALE = 1.1f;
41+
private static final float ACTIVE_ALPHA = 1.0f;
42+
private static final float INACTIVE_ALPHA = 0.5f;
43+
private static final float ACTIVE_SCALE = 1.2f;
44+
private static final float ACTIVE_TEXT_BACGROUND_ALPHA = 0.5f;
45+
private static final float INACTIVE_TEXT_BACGROUND_ALPHA = 0f;
46+
private static int mActiveTextColor;
47+
private static int mInactiveTextColor;
4448
private boolean mActive;
4549
private boolean mInit = true;
4650
private KeyguardMultiUserSelectorView mUserSelector;
@@ -67,6 +71,10 @@ public KeyguardMultiUserAvatar(Context context, AttributeSet attrs) {
6771

6872
public KeyguardMultiUserAvatar(Context context, AttributeSet attrs, int defStyle) {
6973
super(context, attrs, defStyle);
74+
75+
Resources res = context.getResources();
76+
mActiveTextColor = res.getColor(R.color.kg_multi_user_text_active);
77+
mInactiveTextColor = res.getColor(R.color.kg_multi_user_text_inactive);
7078
}
7179

7280
public void setup(UserInfo user, KeyguardMultiUserSelectorView userSelector) {
@@ -89,51 +97,61 @@ private void init() {
8997
public void setActive(boolean active, boolean animate, int duration, final Runnable onComplete) {
9098
if (mActive != active || mInit) {
9199
mActive = active;
92-
final int finalFilterAlpha = mActive ? 0 : INACTIVE_ALPHA;
93-
final int initFilterAlpha = mActive ? INACTIVE_ALPHA : 0;
94-
95-
final float finalScale = mActive ? ACTIVE_SCALE : 1.0f;
96-
final float initScale = mActive ? 1.0f : ACTIVE_SCALE;
97100

98101
if (active) {
99102
KeyguardSubdivisionLayout parent = (KeyguardSubdivisionLayout) getParent();
100103
parent.setTopChild(parent.indexOfChild(this));
101104
}
105+
}
106+
updateVisualsForActive(mActive, animate, duration, true, onComplete);
107+
}
102108

103-
if (animate) {
104-
ValueAnimator va = ValueAnimator.ofFloat(0f, 1f);
105-
va.addUpdateListener(new AnimatorUpdateListener() {
106-
@Override
107-
public void onAnimationUpdate(ValueAnimator animation) {
108-
float r = animation.getAnimatedFraction();
109-
float scale = (1 - r) * initScale + r * finalScale;
110-
int filterAlpha = (int) ((1 - r) * initFilterAlpha + r * finalFilterAlpha);
111-
setScaleX(scale);
112-
setScaleY(scale);
113-
mUserImage.setColorFilter(Color.argb(filterAlpha, INACTIVE_COLOR,
114-
INACTIVE_COLOR, INACTIVE_COLOR));
115-
mUserSelector.invalidate();
116-
117-
}
118-
});
119-
va.addListener(new AnimatorListenerAdapter() {
120-
@Override
121-
public void onAnimationEnd(Animator animation) {
122-
if (onComplete != null) {
123-
onComplete.run();
124-
}
109+
void updateVisualsForActive(boolean active, boolean animate, int duration, boolean scale,
110+
final Runnable onComplete) {
111+
final float finalAlpha = active ? ACTIVE_ALPHA : INACTIVE_ALPHA;
112+
final float initAlpha = active ? INACTIVE_ALPHA : ACTIVE_ALPHA;
113+
final float finalScale = active && scale ? ACTIVE_SCALE : 1.0f;
114+
final float initScale = active ? 1.0f : ACTIVE_SCALE;
115+
final int finalTextBgAlpha = active ? (int) (ACTIVE_TEXT_BACGROUND_ALPHA * 255) :
116+
(int) (INACTIVE_TEXT_BACGROUND_ALPHA * 255);
117+
final int initTextBgAlpha = active ? (int) (INACTIVE_TEXT_BACGROUND_ALPHA * 255) :
118+
(int) (ACTIVE_TEXT_BACGROUND_ALPHA * 255);
119+
int textColor = active ? mActiveTextColor : mInactiveTextColor;
120+
mUserName.setTextColor(textColor);
121+
122+
if (animate) {
123+
ValueAnimator va = ValueAnimator.ofFloat(0f, 1f);
124+
va.addUpdateListener(new AnimatorUpdateListener() {
125+
@Override
126+
public void onAnimationUpdate(ValueAnimator animation) {
127+
float r = animation.getAnimatedFraction();
128+
float scale = (1 - r) * initScale + r * finalScale;
129+
float alpha = (1 - r) * initAlpha + r * finalAlpha;
130+
int textBgAlpha = (int) ((1 - r) * initTextBgAlpha + r * finalTextBgAlpha);
131+
setScaleX(scale);
132+
setScaleY(scale);
133+
mUserImage.setAlpha(alpha);
134+
mUserName.setBackgroundColor(Color.argb(textBgAlpha, 0, 0, 0));
135+
mUserSelector.invalidate();
136+
}
137+
});
138+
va.addListener(new AnimatorListenerAdapter() {
139+
@Override
140+
public void onAnimationEnd(Animator animation) {
141+
if (onComplete != null) {
142+
onComplete.run();
125143
}
126-
});
127-
va.setDuration(duration);
128-
va.start();
129-
} else {
130-
setScaleX(finalScale);
131-
setScaleY(finalScale);
132-
mUserImage.setColorFilter(Color.argb(finalFilterAlpha, INACTIVE_COLOR,
133-
INACTIVE_COLOR, INACTIVE_COLOR));
134-
if (onComplete != null) {
135-
post(onComplete);
136144
}
145+
});
146+
va.setDuration(duration);
147+
va.start();
148+
} else {
149+
setScaleX(finalScale);
150+
setScaleY(finalScale);
151+
mUserImage.setAlpha(finalAlpha);
152+
mUserName.setBackgroundColor(Color.argb(finalTextBgAlpha, 0, 0, 0));
153+
if (onComplete != null) {
154+
post(onComplete);
137155
}
138156
}
139157
}
@@ -156,13 +174,7 @@ public void run() {
156174
public void setPressed(boolean pressed) {
157175
if (!mPressedStateLocked) {
158176
super.setPressed(pressed);
159-
if (pressed) {
160-
mUserImage.setColorFilter(Color.argb(0, INACTIVE_COLOR,
161-
INACTIVE_COLOR, INACTIVE_COLOR));
162-
} else if (!mActive) {
163-
mUserImage.setColorFilter(Color.argb(INACTIVE_ALPHA, INACTIVE_COLOR,
164-
INACTIVE_COLOR, INACTIVE_COLOR));
165-
}
177+
updateVisualsForActive(pressed || mActive, false, 0, mActive, null);
166178
} else {
167179
mTempPressedStateHolder = pressed;
168180
}

policy/src/com/android/internal/policy/impl/keyguard/KeyguardWidgetFrame.java

Lines changed: 28 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -19,12 +19,13 @@
1919
import android.content.Context;
2020
import android.content.res.Resources;
2121
import android.graphics.Canvas;
22+
import android.graphics.Color;
23+
import android.graphics.LinearGradient;
2224
import android.graphics.Paint;
2325
import android.graphics.PorterDuff;
2426
import android.graphics.PorterDuffXfermode;
2527
import android.graphics.Rect;
26-
import android.graphics.drawable.Drawable;
27-
import android.graphics.drawable.NinePatchDrawable;
28+
import android.graphics.Shader;
2829
import android.util.AttributeSet;
2930
import android.widget.FrameLayout;
3031

@@ -33,10 +34,14 @@
3334
public class KeyguardWidgetFrame extends FrameLayout {
3435
private final static PorterDuffXfermode sAddBlendMode =
3536
new PorterDuffXfermode(PorterDuff.Mode.ADD);
36-
private static Drawable sLeftOverscrollDrawable;
37-
private static Drawable sRightOverscrollDrawable;
3837

39-
private Drawable mForegroundDrawable;
38+
private int mGradientColor;
39+
private LinearGradient mForegroundGradient;
40+
private LinearGradient mLeftToRightGradient;
41+
private LinearGradient mRightToLeftGradient;
42+
private Paint mGradientPaint = new Paint();
43+
boolean mLeftToRight = true;
44+
4045
private float mOverScrollAmount = 0f;
4146
private final Rect mForegroundRect = new Rect();
4247
private int mForegroundAlpha = 0;
@@ -52,47 +57,45 @@ public KeyguardWidgetFrame(Context context, AttributeSet attrs) {
5257
public KeyguardWidgetFrame(Context context, AttributeSet attrs, int defStyle) {
5358
super(context, attrs, defStyle);
5459
Resources res = context.getResources();
55-
if (sLeftOverscrollDrawable == null) {
56-
sLeftOverscrollDrawable = res.getDrawable(R.drawable.kg_widget_overscroll_layer_left);
57-
sRightOverscrollDrawable = res.getDrawable(R.drawable.kg_widget_overscroll_layer_right);
58-
}
59-
6060
int hPadding = res.getDimensionPixelSize(R.dimen.kg_widget_pager_horizontal_padding);
6161
int topPadding = res.getDimensionPixelSize(R.dimen.kg_widget_pager_top_padding);
6262
int bottomPadding = res.getDimensionPixelSize(R.dimen.kg_widget_pager_bottom_padding);
6363
setPadding(hPadding, topPadding, hPadding, bottomPadding);
64+
mGradientColor = res.getColor(R.color.kg_widget_pager_gradient);
65+
mGradientPaint.setXfermode(sAddBlendMode);
6466
}
6567

6668
@Override
6769
protected void dispatchDraw(Canvas canvas) {
6870
super.dispatchDraw(canvas);
69-
if (mForegroundAlpha > 0) {
70-
mForegroundDrawable.setBounds(mForegroundRect);
71-
Paint p = ((NinePatchDrawable) mForegroundDrawable).getPaint();
72-
p.setXfermode(sAddBlendMode);
73-
mForegroundDrawable.draw(canvas);
74-
p.setXfermode(null);
75-
}
71+
drawGradientOverlay(canvas);
72+
73+
}
74+
75+
private void drawGradientOverlay(Canvas c) {
76+
mGradientPaint.setShader(mForegroundGradient);
77+
mGradientPaint.setAlpha(mForegroundAlpha);
78+
c.drawRect(mForegroundRect, mGradientPaint);
7679
}
7780

7881
@Override
7982
protected void onSizeChanged(int w, int h, int oldw, int oldh) {
8083
super.onSizeChanged(w, h, oldw, oldh);
8184
mForegroundRect.set(getPaddingLeft(), getPaddingTop(),
8285
w - getPaddingRight(), h - getPaddingBottom());
86+
float x0 = mLeftToRight ? 0 : mForegroundRect.width();
87+
float x1 = mLeftToRight ? mForegroundRect.width(): 0;
88+
mLeftToRightGradient = new LinearGradient(x0, 0f, x1, 0f,
89+
mGradientColor, 0, Shader.TileMode.CLAMP);
90+
mRightToLeftGradient = new LinearGradient(x1, 0f, x0, 0f,
91+
mGradientColor, 0, Shader.TileMode.CLAMP);
8392
}
8493

8594
void setOverScrollAmount(float r, boolean left) {
8695
if (Float.compare(mOverScrollAmount, r) != 0) {
8796
mOverScrollAmount = r;
88-
if (left && mForegroundDrawable != sLeftOverscrollDrawable) {
89-
mForegroundDrawable = sLeftOverscrollDrawable;
90-
} else if (!left && mForegroundDrawable != sRightOverscrollDrawable) {
91-
mForegroundDrawable = sRightOverscrollDrawable;
92-
}
93-
94-
mForegroundAlpha = (int) Math.round((r * 255));
95-
mForegroundDrawable.setAlpha(mForegroundAlpha);
97+
mForegroundGradient = left ? mLeftToRightGradient : mRightToLeftGradient;
98+
mForegroundAlpha = (int) Math.round((0.85f * r * 255));
9699
if (getLayerType() != LAYER_TYPE_HARDWARE) {
97100
setLayerType(LAYER_TYPE_HARDWARE, null);
98101
}

0 commit comments

Comments
 (0)