Skip to content

Commit 1d269e8

Browse files
cwrenAndroid (Google) Code Review
authored andcommitted
Merge "single unlock target with honycomb semantics" into jb-mr1-lockscreen-dev
2 parents fdbbbba + f0ee5b8 commit 1d269e8

File tree

7 files changed

+73
-14
lines changed

7 files changed

+73
-14
lines changed

core/java/com/android/internal/widget/multiwaveview/GlowPadView.java

Lines changed: 50 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -116,6 +116,8 @@ public interface OnTriggerListener {
116116

117117
private float mOuterRadius = 0.0f;
118118
private float mSnapMargin = 0.0f;
119+
private float mFirstItemOffset = 0.0f;
120+
private boolean mMagneticTargets = false;
119121
private boolean mDragging;
120122
private int mNewTargetResources;
121123

@@ -212,6 +214,9 @@ public GlowPadView(Context context, AttributeSet attrs) {
212214
mInnerRadius = a.getDimension(R.styleable.GlowPadView_innerRadius, mInnerRadius);
213215
mOuterRadius = a.getDimension(R.styleable.GlowPadView_outerRadius, mOuterRadius);
214216
mSnapMargin = a.getDimension(R.styleable.GlowPadView_snapMargin, mSnapMargin);
217+
mFirstItemOffset = (float) Math.toRadians(
218+
a.getFloat(R.styleable.GlowPadView_firstItemOffset,
219+
(float) Math.toDegrees(mFirstItemOffset)));
215220
mVibrationDuration = a.getInt(R.styleable.GlowPadView_vibrationDuration,
216221
mVibrationDuration);
217222
mFeedbackCount = a.getInt(R.styleable.GlowPadView_feedbackCount,
@@ -223,6 +228,7 @@ public GlowPadView(Context context, AttributeSet attrs) {
223228
getResourceId(a, R.styleable.GlowPadView_outerRingDrawable));
224229

225230
mAlwaysTrackFinger = a.getBoolean(R.styleable.GlowPadView_alwaysTrackFinger, false);
231+
mMagneticTargets = a.getBoolean(R.styleable.GlowPadView_magneticTargets, mMagneticTargets);
226232

227233
int pointId = getResourceId(a, R.styleable.GlowPadView_pointDrawable);
228234
Drawable pointDrawable = pointId != 0 ? res.getDrawable(pointId) : null;
@@ -820,6 +826,7 @@ private void handleMove(MotionEvent event) {
820826
int ntargets = targets.size();
821827
float x = 0.0f;
822828
float y = 0.0f;
829+
float activeAngle = 0.0f;
823830
int actionIndex = event.findPointerIndex(mPointerId);
824831

825832
if (actionIndex == -1) {
@@ -852,15 +859,18 @@ private void handleMove(MotionEvent event) {
852859
for (int i = 0; i < ntargets; i++) {
853860
TargetDrawable target = targets.get(i);
854861

855-
double targetMinRad = (i - 0.5) * 2 * Math.PI / ntargets;
856-
double targetMaxRad = (i + 0.5) * 2 * Math.PI / ntargets;
862+
double targetMinRad = mFirstItemOffset + (i - 0.5) * 2 * Math.PI / ntargets;
863+
double targetMaxRad = mFirstItemOffset + (i + 0.5) * 2 * Math.PI / ntargets;
857864
if (target.isEnabled()) {
858865
boolean angleMatches =
859866
(angleRad > targetMinRad && angleRad <= targetMaxRad) ||
860867
(angleRad + 2 * Math.PI > targetMinRad &&
861-
angleRad + 2 * Math.PI <= targetMaxRad);
868+
angleRad + 2 * Math.PI <= targetMaxRad) ||
869+
(angleRad - 2 * Math.PI > targetMinRad &&
870+
angleRad - 2 * Math.PI <= targetMaxRad);
862871
if (angleMatches && (dist2(tx, ty) > snapDistance2)) {
863872
activeTarget = i;
873+
activeAngle = (float) -angleRad;
864874
}
865875
}
866876
}
@@ -888,13 +898,19 @@ private void handleMove(MotionEvent event) {
888898
if (target.hasState(TargetDrawable.STATE_FOCUSED)) {
889899
target.setState(TargetDrawable.STATE_INACTIVE);
890900
}
901+
if (mMagneticTargets) {
902+
updateTargetPosition(mActiveTarget, mWaveCenterX, mWaveCenterY);
903+
}
891904
}
892905
// Focus the new target
893906
if (activeTarget != -1) {
894907
TargetDrawable target = targets.get(activeTarget);
895908
if (target.hasState(TargetDrawable.STATE_FOCUSED)) {
896909
target.setState(TargetDrawable.STATE_FOCUSED);
897910
}
911+
if (mMagneticTargets) {
912+
updateTargetPosition(activeTarget, mWaveCenterX, mWaveCenterY, activeAngle);
913+
}
898914
if (AccessibilityManager.getInstance(mContext).isEnabled()) {
899915
String targetContentDescription = getTargetDescription(activeTarget);
900916
announceForAccessibility(targetContentDescription);
@@ -1039,21 +1055,45 @@ protected void onLayout(boolean changed, int left, int top, int right, int botto
10391055
if (DEBUG) dump();
10401056
}
10411057

1042-
private void updateTargetPositions(float centerX, float centerY) {
1043-
// Reposition the target drawables if the view changed.
1044-
ArrayList<TargetDrawable> targets = mTargetDrawables;
1045-
final int size = targets.size();
1046-
final float alpha = (float) (-2.0f * Math.PI / size);
1047-
for (int i = 0; i < size; i++) {
1058+
private void updateTargetPosition(int i, float centerX, float centerY) {
1059+
final float angle = getAngle(getSliceAngle(), i);
1060+
updateTargetPosition(i, centerX, centerY, angle);
1061+
}
1062+
1063+
private void updateTargetPosition(int i, float centerX, float centerY, float angle) {
1064+
if (i >= 0) {
1065+
ArrayList<TargetDrawable> targets = mTargetDrawables;
10481066
final TargetDrawable targetIcon = targets.get(i);
1049-
final float angle = alpha * i;
10501067
targetIcon.setPositionX(centerX);
10511068
targetIcon.setPositionY(centerY);
10521069
targetIcon.setX(mOuterRadius * (float) Math.cos(angle));
10531070
targetIcon.setY(mOuterRadius * (float) Math.sin(angle));
10541071
}
10551072
}
10561073

1074+
private void updateTargetPositions(float centerX, float centerY) {
1075+
updateTargetPositions(centerX, centerY, false);
1076+
}
1077+
1078+
private void updateTargetPositions(float centerX, float centerY, boolean skipActive) {
1079+
final int size = mTargetDrawables.size();
1080+
final float alpha = getSliceAngle();
1081+
// Reposition the target drawables if the view changed.
1082+
for (int i = 0; i < size; i++) {
1083+
if (!skipActive || i != mActiveTarget) {
1084+
updateTargetPosition(i, centerX, centerY, getAngle(alpha, i));
1085+
}
1086+
}
1087+
}
1088+
1089+
private float getAngle(float alpha, int i) {
1090+
return mFirstItemOffset + alpha * i;
1091+
}
1092+
1093+
private float getSliceAngle() {
1094+
return (float) (-2.0f * Math.PI / mTargetDrawables.size());
1095+
}
1096+
10571097
private void updatePointCloudPosition(float centerX, float centerY) {
10581098
mPointCloud.setCenter(centerX, centerY);
10591099
}

core/res/res/layout/keyguard_glow_pad_view.xml

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -29,14 +29,16 @@
2929
android:gravity="@integer/kg_selector_gravity"
3030
android:focusable="true"
3131

32-
prvandroid:targetDrawables="@*android:array/lockscreen_targets_with_camera"
33-
prvandroid:targetDescriptions="@*android:array/lockscreen_target_descriptions_with_camera"
32+
prvandroid:targetDrawables="@array/lockscreen_targets_unlock_only"
33+
prvandroid:targetDescriptions="@array/lockscreen_target_descriptions_unlock_only"
3434
prvandroid:directionDescriptions="@*android:array/lockscreen_direction_descriptions"
3535
prvandroid:handleDrawable="@*android:drawable/ic_lockscreen_handle"
3636
prvandroid:outerRingDrawable="@*android:drawable/ic_lockscreen_outerring"
3737
prvandroid:outerRadius="@*android:dimen/glowpadview_target_placement_radius"
3838
prvandroid:innerRadius="@*android:dimen/glowpadview_inner_radius"
3939
prvandroid:snapMargin="@*android:dimen/glowpadview_snap_margin"
40+
prvandroid:firstItemOffset="@integer/kg_glowpad_rotation_offset"
41+
prvandroid:magneticTargets="true"
4042
prvandroid:feedbackCount="1"
4143
prvandroid:vibrationDuration="20"
4244
prvandroid:glowRadius="@*android:dimen/glowpadview_glow_radius"

core/res/res/values-land/integers.xml

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -22,4 +22,5 @@
2222
<integer name="kg_selector_gravity">0x13</integer>
2323
<integer name="kg_widget_region_weight">45</integer>
2424
<integer name="kg_security_flipper_weight">55</integer>
25-
</resources>
25+
<integer name="kg_glowpad_rotation_offset">-90</integer>
26+
</resources>

core/res/res/values-sw600dp-land/integers.xml

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -19,4 +19,5 @@
1919
<resources>
2020
<integer name="kg_widget_region_weight">50</integer>
2121
<integer name="kg_security_flipper_weight">50</integer>
22-
</resources>
22+
<integer name="kg_glowpad_rotation_offset">0</integer>
23+
</resources>

core/res/res/values/arrays.xml

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -398,6 +398,14 @@
398398
<item>@null</item>
399399
</array>
400400

401+
<array name="lockscreen_targets_unlock_only">
402+
<item>@*android:drawable/ic_lockscreen_unlock</item>
403+
</array>
404+
405+
<array name="lockscreen_target_descriptions_unlock_only">
406+
<item>@*android:string/description_target_unlock</item>
407+
</array>
408+
401409
<!-- list of 3- or 4-letter mnemonics for a 10-key numeric keypad -->
402410
<string-array translatable="false" name="lockscreen_num_pad_klondike">
403411
<item></item><!-- 0 -->

core/res/res/values/attrs.xml

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5465,6 +5465,12 @@
54655465
<!-- Used when the handle shouldn't wait to be hit before following the finger -->
54665466
<attr name="alwaysTrackFinger"/>
54675467

5468+
<!-- Location along the circle of the first item, in degrees.-->
5469+
<attr name="firstItemOffset" format="float" />
5470+
5471+
<!-- Causes targets to snap to the finger location on activation. -->
5472+
<attr name="magneticTargets" format="boolean" />
5473+
54685474
<attr name="gravity" />
54695475
</declare-styleable>
54705476

core/res/res/values/integers.xml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,4 +20,5 @@
2020
<integer name="kg_carousel_angle">75</integer>
2121
<integer name="kg_security_flip_duration">75</integer>
2222
<integer name="kg_security_fade_duration">75</integer>
23+
<integer name="kg_glowpad_rotation_offset">0</integer>
2324
</resources>

0 commit comments

Comments
 (0)