am 1d269e8e: Merge "single unlock target with honycomb semantics" into jb-mr1-lockscreen-dev

* commit '1d269e8e8fc508f59e4010777f4da6a2feafb0a4':
  single unlock target with honycomb semantics
This commit is contained in:
Chris Wren
2012-10-30 08:48:38 -07:00
committed by Android Git Automerger
7 changed files with 73 additions and 14 deletions

View File

@@ -116,6 +116,8 @@ public class GlowPadView extends View {
private float mOuterRadius = 0.0f;
private float mSnapMargin = 0.0f;
private float mFirstItemOffset = 0.0f;
private boolean mMagneticTargets = false;
private boolean mDragging;
private int mNewTargetResources;
@@ -212,6 +214,9 @@ public class GlowPadView extends View {
mInnerRadius = a.getDimension(R.styleable.GlowPadView_innerRadius, mInnerRadius);
mOuterRadius = a.getDimension(R.styleable.GlowPadView_outerRadius, mOuterRadius);
mSnapMargin = a.getDimension(R.styleable.GlowPadView_snapMargin, mSnapMargin);
mFirstItemOffset = (float) Math.toRadians(
a.getFloat(R.styleable.GlowPadView_firstItemOffset,
(float) Math.toDegrees(mFirstItemOffset)));
mVibrationDuration = a.getInt(R.styleable.GlowPadView_vibrationDuration,
mVibrationDuration);
mFeedbackCount = a.getInt(R.styleable.GlowPadView_feedbackCount,
@@ -223,6 +228,7 @@ public class GlowPadView extends View {
getResourceId(a, R.styleable.GlowPadView_outerRingDrawable));
mAlwaysTrackFinger = a.getBoolean(R.styleable.GlowPadView_alwaysTrackFinger, false);
mMagneticTargets = a.getBoolean(R.styleable.GlowPadView_magneticTargets, mMagneticTargets);
int pointId = getResourceId(a, R.styleable.GlowPadView_pointDrawable);
Drawable pointDrawable = pointId != 0 ? res.getDrawable(pointId) : null;
@@ -820,6 +826,7 @@ public class GlowPadView extends View {
int ntargets = targets.size();
float x = 0.0f;
float y = 0.0f;
float activeAngle = 0.0f;
int actionIndex = event.findPointerIndex(mPointerId);
if (actionIndex == -1) {
@@ -852,15 +859,18 @@ public class GlowPadView extends View {
for (int i = 0; i < ntargets; i++) {
TargetDrawable target = targets.get(i);
double targetMinRad = (i - 0.5) * 2 * Math.PI / ntargets;
double targetMaxRad = (i + 0.5) * 2 * Math.PI / ntargets;
double targetMinRad = mFirstItemOffset + (i - 0.5) * 2 * Math.PI / ntargets;
double targetMaxRad = mFirstItemOffset + (i + 0.5) * 2 * Math.PI / ntargets;
if (target.isEnabled()) {
boolean angleMatches =
(angleRad > targetMinRad && angleRad <= targetMaxRad) ||
(angleRad + 2 * Math.PI > targetMinRad &&
angleRad + 2 * Math.PI <= targetMaxRad);
angleRad + 2 * Math.PI <= targetMaxRad) ||
(angleRad - 2 * Math.PI > targetMinRad &&
angleRad - 2 * Math.PI <= targetMaxRad);
if (angleMatches && (dist2(tx, ty) > snapDistance2)) {
activeTarget = i;
activeAngle = (float) -angleRad;
}
}
}
@@ -888,6 +898,9 @@ public class GlowPadView extends View {
if (target.hasState(TargetDrawable.STATE_FOCUSED)) {
target.setState(TargetDrawable.STATE_INACTIVE);
}
if (mMagneticTargets) {
updateTargetPosition(mActiveTarget, mWaveCenterX, mWaveCenterY);
}
}
// Focus the new target
if (activeTarget != -1) {
@@ -895,6 +908,9 @@ public class GlowPadView extends View {
if (target.hasState(TargetDrawable.STATE_FOCUSED)) {
target.setState(TargetDrawable.STATE_FOCUSED);
}
if (mMagneticTargets) {
updateTargetPosition(activeTarget, mWaveCenterX, mWaveCenterY, activeAngle);
}
if (AccessibilityManager.getInstance(mContext).isEnabled()) {
String targetContentDescription = getTargetDescription(activeTarget);
announceForAccessibility(targetContentDescription);
@@ -1039,14 +1055,15 @@ public class GlowPadView extends View {
if (DEBUG) dump();
}
private void updateTargetPositions(float centerX, float centerY) {
// Reposition the target drawables if the view changed.
ArrayList<TargetDrawable> targets = mTargetDrawables;
final int size = targets.size();
final float alpha = (float) (-2.0f * Math.PI / size);
for (int i = 0; i < size; i++) {
private void updateTargetPosition(int i, float centerX, float centerY) {
final float angle = getAngle(getSliceAngle(), i);
updateTargetPosition(i, centerX, centerY, angle);
}
private void updateTargetPosition(int i, float centerX, float centerY, float angle) {
if (i >= 0) {
ArrayList<TargetDrawable> targets = mTargetDrawables;
final TargetDrawable targetIcon = targets.get(i);
final float angle = alpha * i;
targetIcon.setPositionX(centerX);
targetIcon.setPositionY(centerY);
targetIcon.setX(mOuterRadius * (float) Math.cos(angle));
@@ -1054,6 +1071,29 @@ public class GlowPadView extends View {
}
}
private void updateTargetPositions(float centerX, float centerY) {
updateTargetPositions(centerX, centerY, false);
}
private void updateTargetPositions(float centerX, float centerY, boolean skipActive) {
final int size = mTargetDrawables.size();
final float alpha = getSliceAngle();
// Reposition the target drawables if the view changed.
for (int i = 0; i < size; i++) {
if (!skipActive || i != mActiveTarget) {
updateTargetPosition(i, centerX, centerY, getAngle(alpha, i));
}
}
}
private float getAngle(float alpha, int i) {
return mFirstItemOffset + alpha * i;
}
private float getSliceAngle() {
return (float) (-2.0f * Math.PI / mTargetDrawables.size());
}
private void updatePointCloudPosition(float centerX, float centerY) {
mPointCloud.setCenter(centerX, centerY);
}

View File

@@ -29,14 +29,16 @@
android:gravity="@integer/kg_selector_gravity"
android:focusable="true"
prvandroid:targetDrawables="@*android:array/lockscreen_targets_with_camera"
prvandroid:targetDescriptions="@*android:array/lockscreen_target_descriptions_with_camera"
prvandroid:targetDrawables="@array/lockscreen_targets_unlock_only"
prvandroid:targetDescriptions="@array/lockscreen_target_descriptions_unlock_only"
prvandroid:directionDescriptions="@*android:array/lockscreen_direction_descriptions"
prvandroid:handleDrawable="@*android:drawable/ic_lockscreen_handle"
prvandroid:outerRingDrawable="@*android:drawable/ic_lockscreen_outerring"
prvandroid:outerRadius="@*android:dimen/glowpadview_target_placement_radius"
prvandroid:innerRadius="@*android:dimen/glowpadview_inner_radius"
prvandroid:snapMargin="@*android:dimen/glowpadview_snap_margin"
prvandroid:firstItemOffset="@integer/kg_glowpad_rotation_offset"
prvandroid:magneticTargets="true"
prvandroid:feedbackCount="1"
prvandroid:vibrationDuration="20"
prvandroid:glowRadius="@*android:dimen/glowpadview_glow_radius"

View File

@@ -22,4 +22,5 @@
<integer name="kg_selector_gravity">0x13</integer>
<integer name="kg_widget_region_weight">45</integer>
<integer name="kg_security_flipper_weight">55</integer>
</resources>
<integer name="kg_glowpad_rotation_offset">-90</integer>
</resources>

View File

@@ -19,4 +19,5 @@
<resources>
<integer name="kg_widget_region_weight">50</integer>
<integer name="kg_security_flipper_weight">50</integer>
</resources>
<integer name="kg_glowpad_rotation_offset">0</integer>
</resources>

View File

@@ -398,6 +398,14 @@
<item>@null</item>
</array>
<array name="lockscreen_targets_unlock_only">
<item>@*android:drawable/ic_lockscreen_unlock</item>
</array>
<array name="lockscreen_target_descriptions_unlock_only">
<item>@*android:string/description_target_unlock</item>
</array>
<!-- list of 3- or 4-letter mnemonics for a 10-key numeric keypad -->
<string-array translatable="false" name="lockscreen_num_pad_klondike">
<item></item><!-- 0 -->

View File

@@ -5465,6 +5465,12 @@
<!-- Used when the handle shouldn't wait to be hit before following the finger -->
<attr name="alwaysTrackFinger"/>
<!-- Location along the circle of the first item, in degrees.-->
<attr name="firstItemOffset" format="float" />
<!-- Causes targets to snap to the finger location on activation. -->
<attr name="magneticTargets" format="boolean" />
<attr name="gravity" />
</declare-styleable>

View File

@@ -20,4 +20,5 @@
<integer name="kg_carousel_angle">75</integer>
<integer name="kg_security_flip_duration">75</integer>
<integer name="kg_security_fade_duration">75</integer>
<integer name="kg_glowpad_rotation_offset">0</integer>
</resources>