OSDN Git Service

FUL uses square aspect ratio for all layouts fixes b/7426399
authorBrian Colonna <bcolonna@google.com>
Tue, 30 Oct 2012 18:48:55 +0000 (14:48 -0400)
committerBrian Colonna <bcolonna@google.com>
Tue, 30 Oct 2012 18:48:55 +0000 (14:48 -0400)
When the referenced bug was filed, face unlock was only showing as a
tiny sliver on tablet layouts.  Due to other changes in the lockscreen
branch, it was no longer a sliver, but was still an incorrect layout,
with a width much greater than height.  This change makes face unlock
square for all layouts.

The face unlock RelativeLayout was replaced with a custom
FaceUnlockView derived from RelativeLayout.  The new view forces a
square layout using the same technique used by LockPatternView.

Note that there is still a bug where the pattern view covers the widget
area on portrait tablet layouts.  The face unlock view has this same
issue, but may resolve itself when the pattern bug is fixed.

Also note there are two other Face Unlock tablet bugs that existed
before this change (and therefore are not caused by this change):
 - flash during transition from spotlight animation to camera preview
 - PIN backup is upper-left instead of centered

Change-Id: I550eccfa3924f230a9dc43f0a9b59f1ea55a9273

core/java/com/android/internal/widget/FaceUnlockView.java [new file with mode: 0644]
core/res/res/layout/keyguard_face_unlock_view.xml

diff --git a/core/java/com/android/internal/widget/FaceUnlockView.java b/core/java/com/android/internal/widget/FaceUnlockView.java
new file mode 100644 (file)
index 0000000..c8d65fc
--- /dev/null
@@ -0,0 +1,67 @@
+/*
+ * Copyright (C) 2012 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.
+ */
+
+package com.android.internal.widget;
+
+import android.content.Context;
+import android.util.AttributeSet;
+import android.util.Log;
+import android.view.View;
+import android.widget.RelativeLayout;
+
+public class FaceUnlockView extends RelativeLayout {
+    private static final String TAG = "FaceUnlockView";
+
+    public FaceUnlockView(Context context) {
+        this(context, null);
+    }
+
+    public FaceUnlockView(Context context, AttributeSet attrs) {
+        super(context, attrs);
+    }
+
+    private int resolveMeasured(int measureSpec, int desired)
+    {
+        int result = 0;
+        int specSize = MeasureSpec.getSize(measureSpec);
+        switch (MeasureSpec.getMode(measureSpec)) {
+            case MeasureSpec.UNSPECIFIED:
+                result = desired;
+                break;
+            case MeasureSpec.AT_MOST:
+                result = Math.max(specSize, desired);
+                break;
+            case MeasureSpec.EXACTLY:
+            default:
+                result = specSize;
+        }
+        return result;
+    }
+
+    @Override
+    protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
+        super.onMeasure(widthMeasureSpec, heightMeasureSpec);
+
+        final int minimumWidth = getSuggestedMinimumWidth();
+        final int minimumHeight = getSuggestedMinimumHeight();
+        int viewWidth = resolveMeasured(widthMeasureSpec, minimumWidth);
+        int viewHeight = resolveMeasured(heightMeasureSpec, minimumHeight);
+
+        viewWidth = viewHeight = Math.min(viewWidth, viewHeight);
+        Log.v(TAG, "FaceUnlockView dimensions: " + viewWidth + "x" + viewHeight);
+        setMeasuredDimension(viewWidth, viewHeight);
+    }
+}
index ae7984c..976d0c6 100644 (file)
         android:layout_height="wrap_content"
         />
 
-    <RelativeLayout
+    <com.android.internal.widget.FaceUnlockView
         android:id="@+id/face_unlock_area_view"
         android:layout_width="match_parent"
-        android:layout_height="@*android:dimen/face_unlock_height"
+        android:layout_height="0dp"
         android:background="@*android:drawable/intro_bg"
         android:gravity="center"
         android:layout_weight="1">
@@ -55,8 +55,7 @@
             android:background="#00000000"
             android:src="@*android:drawable/ic_facial_backup"
         />
-
-    </RelativeLayout>
+    </com.android.internal.widget.FaceUnlockView>
 
     <include layout="@layout/keyguard_emergency_carrier_area"
         android:id="@+id/keyguard_selector_fade_container"