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:
@@ -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;
|
||||
}
|
||||
|
||||
@@ -154,6 +154,7 @@
|
||||
android:layout_height="0dip"
|
||||
android:layout_weight="1"
|
||||
android:layout_marginTop="2dip"
|
||||
android:aspect="@string/lock_pattern_view_aspect"
|
||||
/>
|
||||
|
||||
<!-- footer -->
|
||||
|
||||
23
core/res/res/values-port-mdpi/donottranslate.xml
Normal file
23
core/res/res/values-port-mdpi/donottranslate.xml
Normal 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>
|
||||
@@ -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.
|
||||
|
||||
@@ -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>
|
||||
|
||||
Reference in New Issue
Block a user