Fix 2538826: Allow aspect of LockPatternView to be customized.

This fixes a problem where the pattern unlock area shrank on
mdpi devices.

This change is required since some devices (mdpi) don't have
enough vertical room to show a square LockPatternView and shrink
the area to match the minimum of width and height. To fix the
problem and minimize changes to existing platforms, the parameter
is configurable and has a default in values/donottranslate that
emulates the old behavior.  New behavior for mdpi devices is
specified in values-port-mdpi/donottranslate, which is the
only place we currently see the problem.

Tested:
mdpi device in both orientations
hdpi device in both orientations
hdpi device in both orientations with keyboard open/closed

Change-Id: I3b9a5ef1d9b5e70f7b1823c9f48a3938f52cc7a4
This commit is contained in:
Jim Miller
2010-03-31 18:15:27 -07:00
parent af8c900a18
commit bf1259b8a6
5 changed files with 82 additions and 9 deletions

View File

@@ -21,6 +21,7 @@ import com.android.internal.R;
import android.content.Context;
import android.content.res.Resources;
import android.content.res.TypedArray;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.Canvas;
@@ -50,6 +51,11 @@ import java.util.List;
* "correct" states.
*/
public class LockPatternView extends View {
// Aspect to use when rendering this view
private static final int ASPECT_SQUARE = 0; // View will be the minimum of width/height
private static final int ASPECT_LOCK_WIDTH = 1; // Fixed width; height will be minimum of (w,h)
private static final int ASPECT_LOCK_HEIGHT = 2; // Fixed height; width will be minimum of (w,h)
// Vibrator pattern for creating a tactile bump
private static final long[] DEFAULT_VIBE_PATTERN = {0, 1, 40, 41};
@@ -116,12 +122,14 @@ public class LockPatternView extends View {
private int mBitmapWidth;
private int mBitmapHeight;
private Vibrator vibe; // Vibrator for creating tactile feedback
private long[] mVibePattern;
private int mAspect;
/**
* Represents a cell in the 3 X 3 matrix of the unlock pattern view.
*/
@@ -237,6 +245,20 @@ public class LockPatternView extends View {
super(context, attrs);
vibe = new Vibrator();
TypedArray a = context.obtainStyledAttributes(attrs, R.styleable.LockPatternView);
final String aspect = a.getString(R.styleable.LockPatternView_aspect);
if ("square".equals(aspect)) {
mAspect = ASPECT_SQUARE;
} else if ("lock_width".equals(aspect)) {
mAspect = ASPECT_LOCK_WIDTH;
} else if ("lock_height".equals(aspect)) {
mAspect = ASPECT_LOCK_HEIGHT;
} else {
mAspect = ASPECT_SQUARE;
}
setClickable(true);
mPathPaint.setAntiAlias(true);
@@ -425,8 +447,22 @@ public class LockPatternView extends View {
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
final int width = MeasureSpec.getSize(widthMeasureSpec);
final int height = MeasureSpec.getSize(heightMeasureSpec);
final int squareSide = Math.min(width, height);
setMeasuredDimension(squareSide, squareSide);
int viewWidth = width;
int viewHeight = height;
switch (mAspect) {
case ASPECT_SQUARE:
viewWidth = viewHeight = Math.min(width, height);
break;
case ASPECT_LOCK_WIDTH:
viewWidth = width;
viewHeight = Math.min(width, height);
break;
case ASPECT_LOCK_HEIGHT:
viewWidth = Math.min(width, height);
viewHeight = height;
break;
}
setMeasuredDimension(viewWidth, viewHeight);
}
/**
@@ -890,17 +926,17 @@ public class LockPatternView extends View {
Matrix matrix = new Matrix();
final int cellWidth = mBitmapCircleDefault.getWidth();
final int cellHeight = mBitmapCircleDefault.getHeight();
// the up arrow bitmap is at 12:00, so find the rotation from x axis and add 90 degrees.
final float theta = (float) Math.atan2(
(double) (endRow - startRow), (double) (endColumn - startColumn));
final float angle = (float) Math.toDegrees(theta) + 90.0f;
final float angle = (float) Math.toDegrees(theta) + 90.0f;
// compose matrix
matrix.setTranslate(leftX + offsetX, topY + offsetY); // transform to cell position
matrix.preRotate(angle, cellWidth / 2.0f, cellHeight / 2.0f); // rotate about cell center
matrix.preTranslate((cellWidth - arrow.getWidth()) / 2.0f, 0.0f); // translate to 12:00 pos
canvas.drawBitmap(arrow, matrix, mPaint);
canvas.drawBitmap(arrow, matrix, mPaint);
}
/**
@@ -1004,7 +1040,7 @@ public class LockPatternView extends View {
mInStealthMode = (Boolean) in.readValue(null);
mTactileFeedbackEnabled = (Boolean) in.readValue(null);
}
public String getSerializedPattern() {
return mSerializedPattern;
}

View File

@@ -154,6 +154,7 @@
android:layout_height="0dip"
android:layout_weight="1"
android:layout_marginTop="2dip"
android:aspect="@string/lock_pattern_view_aspect"
/>
<!-- footer -->

View File

@@ -0,0 +1,23 @@
<?xml version="1.0" encoding="utf-8"?>
<!--
/* //device/apps/common/assets/res/any/strings.xml
**
** Copyright 2009, 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.
*/
-->
<resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<!-- @hide DO NOT TRANSLATE. There isn't enough room on mdpi devices, allow height to vary -->
<string name="lock_pattern_view_aspect">lock_width</string>
</resources>

View File

@@ -3623,7 +3623,18 @@
<!-- Use "horizontal" for a row, "vertical" for a column. The default is horizontal. -->
<attr name="orientation" />
</declare-styleable>
<!-- =============================== -->
<!-- LockPatternView class attributes -->
<!-- =============================== -->
<eat-comment />
<declare-styleable name="LockPatternView">
<!-- Aspect to use when drawing LockPatternView. Choices are "square"(default), "lock_width"
or "lock_height" -->
<attr name="aspect" format="string" />
</declare-styleable>
<!-- Use <code>recognition-service</code> as the root tag of the XML resource that
describes a {@link android.speech.RecognitionService}, which is reference from
its {@link android.speech.RecognitionService#SERVICE_META_DATA} meta-data entry.

View File

@@ -22,4 +22,6 @@
<string name="default_text_encoding">Latin-1</string>
<!-- @hide DO NOT TRANSLATE. Workaround for resource race condition in lockscreen. -->
<bool name="lockscreen_isPortrait">true</bool>
<!-- @hide DO NOT TRANSLATE. Control aspect ratio of lock pattern -->
<string name="lock_pattern_view_aspect">square</string>
</resources>