summaryrefslogtreecommitdiffstats
path: root/core
diff options
context:
space:
mode:
Diffstat (limited to 'core')
-rw-r--r--core/java/android/app/admin/DevicePolicyManager.java20
-rw-r--r--core/java/com/android/internal/widget/LockPatternUtils.java83
-rw-r--r--core/java/com/authentec/AuthentecHelper.java231
-rw-r--r--core/java/com/authentec/GfxEngineRelayService.java127
-rw-r--r--core/java/com/authentec/TrueSuiteMobile/RelayReceiverService.aidl7
-rw-r--r--core/res/AndroidManifest.xml6
-rw-r--r--core/res/res/drawable/cmfp.pngbin0 -> 92468 bytes
-rw-r--r--core/res/res/layout/keyguard_screen_finger_landscape.xml206
-rw-r--r--core/res/res/layout/keyguard_screen_finger_portrait.xml217
-rw-r--r--core/res/res/layout/unlock_finger.xml63
-rw-r--r--core/res/res/values-es/strings.xml16
-rw-r--r--core/res/res/values-fr/strings.xml17
-rw-r--r--core/res/res/values-ja/strings.xml16
-rw-r--r--core/res/res/values-pt-rBR/strings.xml22
-rw-r--r--core/res/res/values-zh-rCN/strings.xml17
-rw-r--r--core/res/res/values-zh-rTW/strings.xml16
-rw-r--r--core/res/res/values/config.xml3
-rw-r--r--core/res/res/values/strings.xml16
18 files changed, 1058 insertions, 25 deletions
diff --git a/core/java/android/app/admin/DevicePolicyManager.java b/core/java/android/app/admin/DevicePolicyManager.java
index 570351d..802b3ef 100644
--- a/core/java/android/app/admin/DevicePolicyManager.java
+++ b/core/java/android/app/admin/DevicePolicyManager.java
@@ -190,7 +190,15 @@ public class DevicePolicyManager {
* are ordered so that higher values are more restrictive.
*/
public static final int PASSWORD_QUALITY_SOMETHING = 0x10000;
-
+
+ /**
+ * Constant for {@link #setPasswordQuality}: the user must swipe a finger
+ * to unlock the screen. Note that quality constants are
+ * ordered so that higher values are more restrictive.
+ * @hide
+ */
+ public static final int PASSWORD_QUALITY_FINGER = 0x1FFFF;
+
/**
* Constant for {@link #setPasswordQuality}: the user must have entered a
* password containing at least numeric characters. Note that quality
@@ -418,7 +426,15 @@ public class DevicePolicyManager {
* the password again until the user has entered it.
*/
public static final int RESET_PASSWORD_REQUIRE_ENTRY = 0x0001;
-
+
+ /**
+ * Flag for {@link #resetPassword}: Enable/Disable finger lock
+ */
+ /** @hide */
+ public static final int ENABLE_FINGER_LOCK = 0x1000;
+ /** @hide */
+ public static final int DISABLE_FINGER_LOCK = 0x1001;
+
/**
* Force a new device unlock password (the password needed to access the
* entire device, not for individual accounts) on the user. This takes
diff --git a/core/java/com/android/internal/widget/LockPatternUtils.java b/core/java/com/android/internal/widget/LockPatternUtils.java
index 668b029..cbd1317 100644
--- a/core/java/com/android/internal/widget/LockPatternUtils.java
+++ b/core/java/com/android/internal/widget/LockPatternUtils.java
@@ -101,8 +101,9 @@ public class LockPatternUtils {
private final static String LOCKOUT_PERMANENT_KEY = "lockscreen.lockedoutpermanently";
private final static String LOCKOUT_ATTEMPT_DEADLINE = "lockscreen.lockoutattemptdeadline";
private final static String PATTERN_EVER_CHOSEN_KEY = "lockscreen.patterneverchosen";
- public final static String PASSWORD_TYPE_KEY = "lockscreen.password_type";
private final static String LOCK_PASSWORD_SALT_KEY = "lockscreen.password_salt";
+ private final static String LOCK_FINGER_ENABLED = "lockscreen.lockfingerenabled";
+ public final static String PASSWORD_TYPE_KEY = "lockscreen.password_type";
private final Context mContext;
private final ContentResolver mContentResolver;
@@ -251,6 +252,14 @@ public class LockPatternUtils {
}
/**
+ * Check to see if the user has stored a finger.
+ * @return Whether a saved finger exists.
+ */
+ public boolean savedFingerExists() {
+ return true;
+ }
+
+ /**
* Return true if the user has ever chosen a pattern. This is true even if the pattern is
* currently cleared.
*
@@ -287,6 +296,11 @@ public class LockPatternUtils {
activePasswordQuality = DevicePolicyManager.PASSWORD_QUALITY_ALPHANUMERIC;
}
break;
+ case DevicePolicyManager.PASSWORD_QUALITY_FINGER:
+ if (isLockFingerEnabled()) {
+ activePasswordQuality = DevicePolicyManager.PASSWORD_QUALITY_FINGER;
+ }
+ break;
}
return activePasswordQuality;
}
@@ -560,6 +574,15 @@ public class LockPatternUtils {
}
/**
+ * @return Whether the lock finger is enabled.
+ */
+ public boolean isLockFingerEnabled() {
+ return getBoolean(LOCK_FINGER_ENABLED)
+ && getLong(PASSWORD_TYPE_KEY, 0)
+ == DevicePolicyManager.PASSWORD_QUALITY_FINGER;
+ }
+
+ /**
* Set whether the lock pattern is enabled.
*/
public void setLockPatternEnabled(boolean enabled) {
@@ -567,6 +590,18 @@ public class LockPatternUtils {
}
/**
+ * Set whether the lock finger is enabled.
+ */
+ public void setLockFingerEnabled(boolean enabled) {
+ setBoolean(LOCK_FINGER_ENABLED, enabled);
+ if (enabled) {
+ setLong(PASSWORD_TYPE_KEY, DevicePolicyManager.PASSWORD_QUALITY_FINGER);
+ } else {
+ setLong(PASSWORD_TYPE_KEY, DevicePolicyManager.PASSWORD_QUALITY_SOMETHING);
+ }
+ }
+
+ /**
* @return Whether the visible pattern is enabled.
*/
public boolean isVisiblePatternEnabled() {
@@ -593,59 +628,59 @@ public class LockPatternUtils {
public void setTactileFeedbackEnabled(boolean enabled) {
setBoolean(Settings.Secure.LOCK_PATTERN_TACTILE_FEEDBACK_ENABLED, enabled);
}
-
+
public void setVisibleDotsEnabled(boolean enabled) {
- setBoolean(Settings.Secure.LOCK_DOTS_VISIBLE, enabled);
+ setBoolean(Settings.Secure.LOCK_DOTS_VISIBLE, enabled);
}
-
+
public boolean isVisibleDotsEnabled() {
return getBoolean(Settings.Secure.LOCK_DOTS_VISIBLE, true);
}
-
+
public void setShowErrorPath(boolean enabled) {
- setBoolean(Settings.Secure.LOCK_SHOW_ERROR_PATH, enabled);
+ setBoolean(Settings.Secure.LOCK_SHOW_ERROR_PATH, enabled);
}
-
+
public boolean isShowErrorPath() {
return getBoolean(Settings.Secure.LOCK_SHOW_ERROR_PATH, true);
}
-
+
public void setShowCustomMsg(boolean enabled) {
setBoolean(Settings.Secure.LOCK_SHOW_CUSTOM_MSG, enabled);
}
-
+
public boolean isShowCustomMsg() {
return getBoolean(Settings.Secure.LOCK_SHOW_CUSTOM_MSG, false);
}
-
+
public void setCustomMsg(String msg) {
setString(Settings.Secure.LOCK_CUSTOM_MSG, msg);
}
-
+
public String getCustomMsg() {
return getString(Settings.Secure.LOCK_CUSTOM_MSG);
}
-
+
public int getIncorrectDelay() {
return getInt(Settings.Secure.LOCK_INCORRECT_DELAY, 2000);
}
-
+
public void setIncorrectDelay(int delay) {
setInt(Settings.Secure.LOCK_INCORRECT_DELAY, delay);
}
-
+
public void setShowUnlockMsg(boolean enabled) {
setBoolean(Settings.Secure.SHOW_UNLOCK_TEXT, enabled);
}
-
+
public boolean isShowUnlockMsg() {
return getBoolean(Settings.Secure.SHOW_UNLOCK_TEXT, true);
}
-
+
public void setShowUnlockErrMsg(boolean enabled) {
setBoolean(Settings.Secure.SHOW_UNLOCK_ERR_TEXT, enabled);
}
-
+
public boolean isShowUnlockErrMsg() {
return getBoolean(Settings.Secure.SHOW_UNLOCK_ERR_TEXT, true);
}
@@ -852,7 +887,7 @@ public class LockPatternUtils {
return 1 ==
android.provider.Settings.Secure.getInt(mContentResolver, secureSettingKey, 0);
}
-
+
private boolean getBoolean(String systemSettingKey, boolean defaultValue) {
return 1 ==
android.provider.Settings.Secure.getInt(
@@ -872,7 +907,7 @@ public class LockPatternUtils {
private void setLong(String secureSettingKey, long value) {
android.provider.Settings.Secure.putLong(mContentResolver, secureSettingKey, value);
}
-
+
private int getInt(String systemSettingKey, int def) {
return android.provider.Settings.Secure.getInt(mContentResolver, systemSettingKey, def);
}
@@ -880,16 +915,16 @@ public class LockPatternUtils {
private void setInt(String systemSettingKey, int value) {
android.provider.Settings.Secure.putInt(mContentResolver, systemSettingKey, value);
}
-
+
private String getString(String systemSettingKey) {
String s = android.provider.Settings.Secure.getString(mContentResolver, systemSettingKey);
-
+
if (s == null)
return "";
-
+
return s;
}
-
+
private void setString(String systemSettingKey, String value) {
android.provider.Settings.Secure.putString(mContentResolver, systemSettingKey, value);
}
@@ -897,10 +932,12 @@ public class LockPatternUtils {
public boolean isSecure() {
long mode = getKeyguardStoredPasswordQuality();
final boolean isPattern = mode == DevicePolicyManager.PASSWORD_QUALITY_SOMETHING;
+ final boolean isFinger = mode == DevicePolicyManager.PASSWORD_QUALITY_FINGER;
final boolean isPassword = mode == DevicePolicyManager.PASSWORD_QUALITY_NUMERIC
|| mode == DevicePolicyManager.PASSWORD_QUALITY_ALPHABETIC
|| mode == DevicePolicyManager.PASSWORD_QUALITY_ALPHANUMERIC;
final boolean secure = isPattern && isLockPatternEnabled() && savedPatternExists()
+ || isFinger && isLockFingerEnabled() && savedFingerExists()
|| isPassword && savedPasswordExists();
return secure;
}
diff --git a/core/java/com/authentec/AuthentecHelper.java b/core/java/com/authentec/AuthentecHelper.java
new file mode 100644
index 0000000..7a5b17b
--- /dev/null
+++ b/core/java/com/authentec/AuthentecHelper.java
@@ -0,0 +1,231 @@
+/*
+ * Copyright (C) 2011 The CyanogenMOD 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.authentec;
+
+import dalvik.system.DexClassLoader;
+
+import android.content.Context;
+import android.content.ContextWrapper;
+
+import android.os.SystemProperties;
+
+import java.lang.reflect.Constructor;
+
+public class AuthentecHelper
+{
+ private static DexClassLoader sAuthentecClassLoader = null;
+ private Class TSM = null;
+ private Class AuthentecMobile = null;
+ private Object am = null;
+
+ /* AM_STATUS codes */
+ public static final int eAM_STATUS_ACCESS_ERROR = 6;
+ public static final int eAM_STATUS_APPLICATION_IO_ERROR = 11;
+ public static final int eAM_STATUS_CAPTURE_FAILED = 15;
+ public static final int eAM_STATUS_CLIENT_CANCELED = 17;
+ public static final int eAM_STATUS_CLIENT_NOT_PERMITTED = 18;
+ public static final int eAM_STATUS_CREDENTIAL_LOCKED = 3;
+ public static final int eAM_STATUS_CREDENTIAL_TOO_LARGE = 5;
+ public static final int eAM_STATUS_DATABASE_FULL = 7;
+ public static final int eAM_STATUS_FINGERS_NOT_PROVISIONED = 19;
+ public static final int eAM_STATUS_FOREIGN_DATABASE = 8;
+ public static final int eAM_STATUS_GUI_IS_OFFLINE = 21;
+ public static final int eAM_STATUS_INVALID_APP_CONTEXT = 10;
+ public static final int eAM_STATUS_INVALID_PARAMETER = 4;
+ public static final int eAM_STATUS_INVALID_USER_ID = 22;
+ public static final int eAM_STATUS_LIBRARY_NOT_AVAILABLE = 14;
+ public static final int eAM_STATUS_NO_ACTIVE_USER = 20;
+ public static final int eAM_STATUS_NO_STORED_CREDENTIAL = 2;
+ public static final int eAM_STATUS_OK = 0;
+ public static final int eAM_STATUS_TIMEOUT = 12;
+ public static final int eAM_STATUS_UI_TIMEOUT = 16;
+ public static final int eAM_STATUS_UNKNOWN_COMMAND = 1;
+ public static final int eAM_STATUS_UNKNOWN_ERROR = 99;
+ public static final int eAM_STATUS_USER_CANCELED = 9;
+ public static final int eAM_STATUS_USURP_FAILURE = 13;
+
+ private AuthentecHelper(Context ctx)
+ {
+ try {
+ AuthentecMobile = sAuthentecClassLoader.loadClass("com.authentec.amjni.AuthentecMobile");
+ TSM = sAuthentecClassLoader.loadClass("com.authentec.amjni.TSM");
+ Constructor ctor = AuthentecMobile.getDeclaredConstructors()[0];
+ am = ctor.newInstance(ctx);
+ } catch (Exception ex) {
+ ex.printStackTrace();
+ return;
+ }
+ }
+
+ public int fingerprintUnlock(String sScreen, Context ctx) {
+ int iResult = 0;
+
+ try {
+ if (! (Boolean) AuthentecMobile.getMethod("AM2ClientLibraryLoaded").invoke(am)) {
+ return eAM_STATUS_LIBRARY_NOT_AVAILABLE;
+ }
+
+ if(null == ctx) {
+ return eAM_STATUS_INVALID_PARAMETER;
+ }
+
+ //int iResult = TSM.LAP(ctx).verify().viaGfxScreen(sScreen).exec();
+ Class partTypes[] = new Class[1];
+ Object argList[] = new Object[1];
+
+ partTypes[0] = Context.class;
+ argList[0] = ctx;
+ Object TSMi = TSM.getMethod("LAP", partTypes).invoke(null, argList);
+
+ TSM.getMethod("verify").invoke(TSMi);
+
+ partTypes[0] = String.class;
+ argList[0] = sScreen;
+ TSM.getMethod("viaGfxScreen", partTypes).invoke(TSMi, argList);
+
+ iResult = (Integer) TSM.getMethod("exec").invoke(TSMi);
+ TSMi = null;
+
+ try {
+ Thread.sleep(1500);
+ } catch (InterruptedException e) {
+ e.printStackTrace();
+ }
+ } catch (Exception e) {
+ e.printStackTrace();
+ }
+
+ return iResult;
+ }
+
+ public int startEnrollmentWizard(Context choosefinger, String msTempPasscode)
+ {
+ int miResult = eAM_STATUS_LIBRARY_NOT_AVAILABLE;
+
+ try {
+ Class partTypes[] = new Class[1];
+ Object argList[] = new Object[1];
+
+ partTypes[0] = Context.class;
+ argList[0] = choosefinger;
+ Object TSMi = TSM.getMethod("LAP", partTypes).invoke(null, argList);
+
+ if (msTempPasscode != null) {
+ partTypes[0] = String.class;
+ argList[0] = msTempPasscode;
+ argList[0] = (String) TSM.getMethod("Hexify", partTypes).invoke(null, argList);
+
+ TSM.getMethod("usingPasscode", partTypes).invoke(TSMi, argList);
+
+ TSM.getMethod("enroll").invoke(TSMi);
+ //miResult = TSM.LAP(ChooseLockFinger.this).usingPasscode(TSM.Hexify(msTempPasscode)).enroll().exec();
+ } else {
+ partTypes[0] = String.class;
+ argList[0] = "_classicEnroll";
+ TSM.getMethod("addFunction", partTypes).invoke(TSMi, argList);
+ //miResult = TSM.LAP(ChooseLockFinger.this).addFunction("_classicEnroll").exec();
+ }
+
+ miResult = (Integer) TSM.getMethod("exec").invoke(TSMi);
+ TSMi = null;
+
+ } catch (Exception e) {
+ e.printStackTrace();
+ }
+
+ return miResult;
+ }
+
+ public int startVerification(Context choosefinger)
+ {
+ int miResult = eAM_STATUS_LIBRARY_NOT_AVAILABLE;
+
+ try {
+ //miResult = TSM.LAP(ChooseLockFinger.this).verify().viaGfxScreen("lap-verify").exec();
+ Class partTypes[] = new Class[1];
+ Object argList[] = new Object[1];
+
+ partTypes[0] = Context.class;
+ argList[0] = choosefinger;
+ Object TSMi = TSM.getMethod("LAP", partTypes).invoke(null, argList);
+
+ TSM.getMethod("verify").invoke(TSMi);
+
+ partTypes[0] = String.class;
+ argList[0] = "lap-verify";
+ TSM.getMethod("viaGfxScreen", partTypes).invoke(TSMi, argList);
+
+ miResult = (Integer) TSM.getMethod("exec").invoke(TSMi);
+ TSMi = null;
+
+ } catch (Exception e) {
+ e.printStackTrace();
+ }
+
+ return miResult;
+ }
+
+ public int verifyPolicy(Context ctx)
+ {
+ int iResult = eAM_STATUS_LIBRARY_NOT_AVAILABLE;
+
+ try {
+ //iResult = TSM.LAP(m_Context).waitForUI().verify().exec();
+ Class partTypes[] = new Class[1];
+ Object argList[] = new Object[1];
+
+ partTypes[0] = Context.class;
+ argList[0] = ctx;
+ Object TSMi = TSM.getMethod("LAP", partTypes).invoke(null, argList);
+
+ TSM.getMethod("waitForUI").invoke(TSMi, (Object[]) null);
+
+ TSM.getMethod("verify").invoke(TSMi, (Object[]) null);
+
+ iResult = (Integer) TSM.getMethod("exec").invoke(TSMi, (Object[]) null);
+ TSMi = null;
+
+ } catch (Exception e) {
+ e.printStackTrace();
+ }
+
+ return iResult;
+ }
+
+ public static AuthentecHelper getInstance(Context ctx)
+ {
+ ensureClassLoader(ctx);
+ return new AuthentecHelper(ctx);
+ }
+
+ public static void ensureClassLoader(Context ctx)
+ {
+ if (sAuthentecClassLoader != null) {
+ return;
+ }
+
+ String authentecJarLocation = SystemProperties.get("ro.authentec.fingerprint.jar","");
+ String authentecSoLocation = SystemProperties.get("ro.authentec.fingerprint.so","");
+
+ if ("".equals(authentecJarLocation) || "".equals(authentecSoLocation))
+ return;
+
+ sAuthentecClassLoader = new DexClassLoader(authentecJarLocation,
+ new ContextWrapper(ctx).getCacheDir().getAbsolutePath(),
+ authentecSoLocation,ClassLoader.getSystemClassLoader());
+ }
+}
diff --git a/core/java/com/authentec/GfxEngineRelayService.java b/core/java/com/authentec/GfxEngineRelayService.java
new file mode 100644
index 0000000..53a4d68
--- /dev/null
+++ b/core/java/com/authentec/GfxEngineRelayService.java
@@ -0,0 +1,127 @@
+package com.authentec;
+
+import java.util.ArrayList;
+import java.util.List;
+import java.util.concurrent.Semaphore;
+import java.util.concurrent.TimeUnit;
+
+import android.app.Service;
+import android.content.Intent;
+import android.os.IBinder;
+import android.os.RemoteException;
+
+import com.authentec.TrueSuiteMobile.RelayReceiverService;
+
+public class GfxEngineRelayService extends Service {
+
+ public interface Receiver
+ {
+ public void receiveCommand(String command, String args);
+ }
+
+ static Receiver mLocalReceiver = null;
+ public static void setLocalReceiver(Receiver localReceiver) {
+ // first send any queued commands to the activity
+ while (!mCommandBuffer.isEmpty()) {
+ Command storedCommand = mCommandBuffer.remove(0);
+ if (null == localReceiver) continue;
+
+ // send the command on to the receiver
+ localReceiver.receiveCommand(
+ storedCommand.mCommand, storedCommand.mArguments);
+
+ }
+
+ // finally record who the receiver is
+ mLocalReceiver = localReceiver;
+ }
+
+ static private ArrayList<Command> mCommandBuffer = new ArrayList<Command>();
+ static private List<String> mEventBuffer = new ArrayList<String>();
+ static private Semaphore mEventBufferSemaphore = null;
+
+ private class Command {
+ public String mCommand;
+ public String mArguments;
+ public Command(String command, String arguments) {
+ mCommand = command;
+ mArguments = arguments;
+ }
+ }
+
+ static public void queueEvent(String event) {
+ if (null == mEventBufferSemaphore) return;
+ mEventBuffer.add(event);
+ mEventBufferSemaphore.release();
+ }
+
+ @Override
+ public IBinder onBind(Intent intent) {
+ /* when we're bound to, we want to have an empty event buffer */
+ mEventBuffer.clear();
+ mEventBufferSemaphore = new Semaphore(0);
+ return new RelayReceiverServiceImpl();
+ }
+
+ private class RelayReceiverServiceImpl extends RelayReceiverService.Stub
+ implements RelayReceiverService {
+
+ /* remote clients call sendCommand() when the GfxEngine has provided */
+ /* a new command to apply to the UI */
+ public void sendCommand(String command, String args) throws RemoteException {
+
+ /* if we've got a local receiver, pass the command to it */
+ if (null != mLocalReceiver) {
+ while (!mCommandBuffer.isEmpty()) {
+ // first pull items from the buffer. if anything is in here,
+ // it came in before the activity was ready to receive them.
+ Command storedCommand = mCommandBuffer.remove(0);
+ mLocalReceiver.receiveCommand(
+ storedCommand.mCommand, storedCommand.mArguments);
+ }
+ mLocalReceiver.receiveCommand(command, args);
+ }
+ else {
+ // append it to a buffer to be delivered later
+ mCommandBuffer.add(new Command(command, args));
+ }
+ }
+
+ /* remote clients call receiveEvent() to get the next event from the */
+ /* UI's event queue -- things like #cancel and #timeout */
+ public String receiveEvent() throws RemoteException {
+ /* block until there's something in the event queue */
+ try {
+ // mEventBufferSemaphore.acquire();
+
+ // This method runs in the service's main thread (and there's no way
+ // to move it to a child thread, since it needs to return an answer
+ // to the GfxEngine), and when the keyguard blocks here, Android has
+ // problems. So it's better to add a timeout to the block waiting.
+ if (!mEventBufferSemaphore.tryAcquire(10, TimeUnit.SECONDS)) {
+
+ // The GfxEngine is not currently expecting this exception and it will
+ // try to use the null pointer. We should probably fix this in the GfxEngine,
+ // but a short term solution is to return "" instead of null.
+ return "";
+ }
+ } catch (InterruptedException e) {
+ // return null;
+ return "";
+ }
+
+ /* remove the next event from the queue and return it */
+ if (mEventBuffer.isEmpty()) {
+ return "";
+ }
+ else{
+ return mEventBuffer.remove(0);
+ }
+ }
+
+ /* remote clients call receiveEvent() to release mEventBufferSemaphore */
+ public void quit() throws RemoteException {
+ mEventBufferSemaphore.release();
+ }
+ }
+}
diff --git a/core/java/com/authentec/TrueSuiteMobile/RelayReceiverService.aidl b/core/java/com/authentec/TrueSuiteMobile/RelayReceiverService.aidl
new file mode 100644
index 0000000..ac8c8af
--- /dev/null
+++ b/core/java/com/authentec/TrueSuiteMobile/RelayReceiverService.aidl
@@ -0,0 +1,7 @@
+package com.authentec.TrueSuiteMobile;
+interface RelayReceiverService
+{
+ void sendCommand(String command, String args);
+ String receiveEvent();
+ void quit();
+}
diff --git a/core/res/AndroidManifest.xml b/core/res/AndroidManifest.xml
index e179d34..11d849b 100644
--- a/core/res/AndroidManifest.xml
+++ b/core/res/AndroidManifest.xml
@@ -1395,6 +1395,12 @@
android:permission="android.permission.BIND_WALLPAPER">
</service>
+ <service android:name="com.authentec.GfxEngineRelayService">
+ <intent-filter>
+ <action android:name="com.authentec.Keyguard" />
+ </intent-filter>
+ </service>
+
<receiver android:name="com.android.server.BootReceiver" >
<intent-filter>
<action android:name="android.intent.action.BOOT_COMPLETED" />
diff --git a/core/res/res/drawable/cmfp.png b/core/res/res/drawable/cmfp.png
new file mode 100644
index 0000000..b120773
--- /dev/null
+++ b/core/res/res/drawable/cmfp.png
Binary files differ
diff --git a/core/res/res/layout/keyguard_screen_finger_landscape.xml b/core/res/res/layout/keyguard_screen_finger_landscape.xml
new file mode 100644
index 0000000..928c7d4
--- /dev/null
+++ b/core/res/res/layout/keyguard_screen_finger_landscape.xml
@@ -0,0 +1,206 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+**
+** Copyright 2008, 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.
+*/
+-->
+
+<!-- This is the screen that shows the 9 circle unlock widget and instructs
+ the user how to unlock their device, or make an emergency call. This
+ is the portrait layout. -->
+
+<com.android.internal.widget.LinearLayoutWithDefaultTouchRecepient
+ xmlns:android="http://schemas.android.com/apk/res/android"
+ android:orientation="horizontal"
+ android:layout_width="match_parent"
+ android:layout_height="match_parent"
+ android:background="#70000000"
+ >
+
+ <!-- left side: instructions and emergency call button -->
+ <LinearLayout
+ android:orientation="vertical"
+ android:layout_width="match_parent"
+ android:layout_height="match_parent"
+ android:layout_weight="1"
+ android:layout_marginLeft="24dip"
+ android:gravity="left"
+ >
+
+ <TextView
+ android:id="@+id/status1"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:layout_marginTop="16dip"
+ android:textAppearance="?android:attr/textAppearanceMedium"
+ />
+
+ <TextView
+ android:id="@+id/carrier"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:textAppearance="?android:attr/textAppearanceMedium"
+ android:textSize="17sp"
+ android:drawablePadding="4dip"
+ android:layout_marginTop="32dip"
+ android:singleLine="true"
+ android:ellipsize="marquee"
+ android:gravity="right|bottom"
+ />
+
+ <com.android.internal.widget.DigitalClock android:id="@+id/time"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:layout_alignParentTop="true"
+ android:layout_alignParentLeft="true"
+ android:layout_marginTop="8dip"
+ android:paddingBottom="8dip"
+ >
+
+ <TextView android:id="@+id/timeDisplay"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:singleLine="true"
+ android:ellipsize="none"
+ android:textSize="72sp"
+ android:textAppearance="?android:attr/textAppearanceMedium"
+ android:shadowColor="#C0000000"
+ android:shadowDx="0"
+ android:shadowDy="0"
+ android:shadowRadius="3.0"
+ android:layout_marginBottom="6dip"
+ />
+
+
+ <TextView android:id="@+id/am_pm"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:layout_toRightOf="@id/timeDisplay"
+ android:layout_alignBaseline="@id/timeDisplay"
+ android:singleLine="true"
+ android:ellipsize="none"
+ android:textSize="22sp"
+ android:layout_marginLeft="8dip"
+ android:textAppearance="?android:attr/textAppearanceMedium"
+ android:shadowColor="#C0000000"
+ android:shadowDx="0"
+ android:shadowDy="0"
+ android:shadowRadius="3.0"
+ />
+
+ </com.android.internal.widget.DigitalClock>
+
+ <TextView
+ android:id="@+id/date"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:layout_below="@id/time"
+ android:textAppearance="?android:attr/textAppearanceMedium"
+ />
+
+ <!-- used for instructions such as "draw pattern to unlock", the next alarm, and charging
+ status. -->
+ <LinearLayout
+ android:orientation="horizontal"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:layout_marginTop="8dip"
+ android:gravity="center"
+ >
+ <TextView
+ android:id="@+id/statusSep"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:layout_marginLeft="5dip"
+ android:layout_marginRight="5dip"
+ android:textAppearance="?android:attr/textAppearanceMedium"
+ android:textSize="17sp"
+ />
+ <TextView
+ android:id="@+id/status2"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:layout_alignParentTop="true"
+ android:textAppearance="?android:attr/textAppearanceMedium"
+ android:textSize="17sp"
+ android:drawablePadding="4dip"
+ />
+ </LinearLayout>
+
+ <!-- fill space between header and button below -->
+ <View
+ android:layout_weight="1.0"
+ android:layout_width="match_parent"
+ android:layout_height="0dip"
+ />
+
+ <!-- footer -->
+ <FrameLayout
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:layout_marginBottom="16dip"
+ >
+
+ <!-- option 1: a single emergency call button -->
+ <RelativeLayout android:id="@+id/footerNormal"
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:gravity="left"
+ >
+ <Button android:id="@+id/emergencyCallAlone"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:text="@string/lockscreen_emergency_call"
+ style="@style/Widget.Button.Transparent"
+ android:drawableLeft="@drawable/ic_emergency"
+ android:drawablePadding="8dip"
+ />
+ </RelativeLayout>
+
+ <!-- option 2: an emergency call button, and a 'forgot pattern?' button -->
+ <LinearLayout android:id="@+id/footerForgotPattern"
+ android:orientation="vertical"
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:gravity="left"
+ >
+ <Button android:id="@+id/forgotPattern"
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ style="@style/Widget.Button.Transparent"
+ android:visibility="invisible"
+ />
+ <Button android:id="@+id/emergencyCallTogether"
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:text="@string/lockscreen_emergency_call"
+ style="@style/Widget.Button.Transparent"
+ android:drawableLeft="@drawable/ic_emergency"
+ android:drawablePadding="8dip"
+ />
+ </LinearLayout>
+ </FrameLayout>
+ </LinearLayout>
+
+ <!-- right side: lock finger -->
+ <include
+ layout="@layout/unlock_finger"
+ android:id="@+id/unlock_layout"
+ android:layout_width="match_parent"
+ android:layout_height="match_parent"
+ android:layout_weight="1"
+ />
+
+</com.android.internal.widget.LinearLayoutWithDefaultTouchRecepient>
diff --git a/core/res/res/layout/keyguard_screen_finger_portrait.xml b/core/res/res/layout/keyguard_screen_finger_portrait.xml
new file mode 100644
index 0000000..8bb9a22
--- /dev/null
+++ b/core/res/res/layout/keyguard_screen_finger_portrait.xml
@@ -0,0 +1,217 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+**
+** Copyright 2008, 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.
+*/
+-->
+
+<!-- This is the screen that shows the 9 circle unlock widget and instructs
+ the user how to unlock their device, or make an emergency call. This
+ is the portrait layout. -->
+<com.android.internal.widget.LinearLayoutWithDefaultTouchRecepient
+ xmlns:android="http://schemas.android.com/apk/res/android"
+ android:orientation="vertical"
+ android:layout_width="match_parent"
+ android:layout_height="match_parent"
+ android:gravity="center_horizontal"
+ android:background="#70000000"
+ >
+
+ <RelativeLayout
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ >
+ <TextView
+ android:id="@+id/carrier"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:layout_alignParentTop="true"
+ android:layout_marginTop="6dip"
+ android:layout_alignParentRight="true"
+ android:layout_marginRight="8dip"
+ android:layout_toRightOf="@+id/time"
+ android:singleLine="true"
+ android:ellipsize="marquee"
+ android:gravity="right|bottom"
+ android:textAppearance="?android:attr/textAppearanceMedium"
+ />
+
+ <com.android.internal.widget.DigitalClock android:id="@+id/time"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:layout_alignParentLeft="true"
+ android:layout_alignParentTop="true"
+ android:layout_marginTop="15dip"
+ android:layout_marginLeft="20dip"
+ android:paddingBottom="8dip"
+ >
+
+ <TextView android:id="@+id/timeDisplay"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:singleLine="true"
+ android:ellipsize="none"
+ android:textSize="56sp"
+ android:textAppearance="?android:attr/textAppearanceMedium"
+ android:shadowColor="#C0000000"
+ android:shadowDx="0"
+ android:shadowDy="0"
+ android:shadowRadius="3.0"
+ android:layout_marginBottom="6dip"
+ />
+
+ <TextView android:id="@+id/am_pm"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:layout_toRightOf="@id/timeDisplay"
+ android:layout_alignBaseline="@id/timeDisplay"
+ android:singleLine="true"
+ android:ellipsize="none"
+ android:textSize="18sp"
+ android:layout_marginLeft="4dip"
+ android:textAppearance="?android:attr/textAppearanceMedium"
+ android:shadowColor="#C0000000"
+ android:shadowDx="0"
+ android:shadowDy="0"
+ android:shadowRadius="3.0"
+ />
+
+ </com.android.internal.widget.DigitalClock>
+
+ <TextView
+ android:id="@+id/date"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:layout_below="@id/time"
+ android:layout_marginLeft="24dip"
+ android:textAppearance="?android:attr/textAppearanceMedium"
+ />
+
+ </RelativeLayout>
+
+ <View
+ android:id="@+id/divider"
+ android:layout_width="match_parent"
+ android:layout_height="1dip"
+ android:layout_marginTop="8dip"
+ android:layout_marginBottom="8dip"
+ android:background="@android:drawable/divider_horizontal_dark"
+ />
+
+ <!-- used for instructions such as "draw pattern to unlock", the next alarm, and charging
+ status. -->
+ <LinearLayout
+ android:orientation="horizontal"
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:layout_marginTop="0dip"
+ android:layout_marginLeft="12dip"
+ android:gravity="left"
+ >
+ <TextView
+ android:id="@+id/status1"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:textAppearance="?android:attr/textAppearanceMedium"
+ android:textSize="18sp"
+ android:drawablePadding="4dip"
+ />
+ <TextView
+ android:id="@+id/statusSep"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:layout_marginLeft="5dip"
+ android:layout_marginRight="5dip"
+ android:textAppearance="?android:attr/textAppearanceMedium"
+ android:textSize="18sp"
+ />
+ <TextView
+ android:id="@+id/status2"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:layout_alignParentTop="true"
+ android:textAppearance="?android:attr/textAppearanceMedium"
+ android:textSize="18sp"
+ android:drawablePadding="4dip"
+ />
+ </LinearLayout>
+
+ <include
+ layout="@layout/unlock_finger"
+ android:id="@+id/unlock_layout"
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:layout_marginLeft="12dip"
+ />
+
+ <!-- footer -->
+ <FrameLayout
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ >
+
+ <!-- option 1: a single emergency call button -->
+ <RelativeLayout android:id="@+id/footerNormal"
+ android:layout_width="match_parent"
+ android:layout_height="match_parent"
+ >
+ <Button android:id="@+id/emergencyCallAlone"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:layout_centerInParent="true"
+ android:text="@string/lockscreen_emergency_call"
+ style="@style/Widget.Button.Transparent"
+ android:drawableLeft="@drawable/ic_emergency"
+ android:drawablePadding="8dip"
+ />
+
+ </RelativeLayout>
+
+ <!-- option 2: an emergency call button, and a 'forgot pattern?' button -->
+ <LinearLayout android:id="@+id/footerForgotPattern"
+ android:orientation="horizontal"
+ android:layout_width="match_parent"
+ android:layout_height="match_parent"
+ android:gravity="center"
+ >
+ <Button android:id="@+id/emergencyCallTogether"
+ android:layout_width="0dip"
+ android:layout_height="match_parent"
+ android:layout_weight="1.0"
+ android:layout_marginTop="4dip"
+ android:layout_marginBottom="4dip"
+ android:layout_marginLeft="4dip"
+ android:layout_marginRight="2dip"
+ android:text="@string/lockscreen_emergency_call"
+ style="@style/Widget.Button.Transparent"
+ android:drawableLeft="@drawable/ic_emergency"
+ android:drawablePadding="8dip"
+ />
+ <Button android:id="@+id/forgotPattern"
+ android:layout_width="0dip"
+ android:layout_height="match_parent"
+ android:layout_weight="1.0"
+ android:layout_marginTop="4dip"
+ android:layout_marginBottom="4dip"
+ android:layout_marginLeft="2dip"
+ android:layout_marginRight="4dip"
+ style="@style/Widget.Button.Transparent"
+ android:visibility="invisible"
+ />
+ </LinearLayout>
+
+ </FrameLayout>
+
+</com.android.internal.widget.LinearLayoutWithDefaultTouchRecepient>
diff --git a/core/res/res/layout/unlock_finger.xml b/core/res/res/layout/unlock_finger.xml
new file mode 100644
index 0000000..f3a74f6
--- /dev/null
+++ b/core/res/res/layout/unlock_finger.xml
@@ -0,0 +1,63 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+**
+** Copyright 2008, 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.
+*/
+-->
+<LinearLayout
+ xmlns:android="http://schemas.android.com/apk/res/android"
+ android:orientation="vertical"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:paddingTop="8dip"
+ android:paddingBottom="8dip"
+ android:gravity="left"
+ >
+ <LinearLayout
+ android:id="@+id/userPrompt"
+ android:orientation="horizontal"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ >
+ <ImageView
+ android:src="@drawable/ic_lock_lock"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ />
+ <TextView
+ android:id="@+id/usageMessage"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:paddingTop="8dip"
+ />
+ </LinearLayout>
+
+ <TextView
+ android:id="@+id/errorMessage"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:layout_gravity="center"
+ android:paddingTop="2dip"
+ android:paddingBottom="2dip"
+ />
+
+ <ImageView
+ android:src="@drawable/cmfp"
+ android:paddingLeft="1dip"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ />
+
+</LinearLayout>
diff --git a/core/res/res/values-es/strings.xml b/core/res/res/values-es/strings.xml
index 4a359eb..edd46d9 100644
--- a/core/res/res/values-es/strings.xml
+++ b/core/res/res/values-es/strings.xml
@@ -957,4 +957,20 @@
<!-- Description of an application permission that lets lets an application view/edit revoked permissions. -->
<string name="permdesc_revokePermissions">Permitir ver y editar los permisos revocados a las aplicaciones. No utilizar para aplicaciones normales.</string>
+ <string name="keyguard_finger_please_swipe">Pase el dedo sobre el sensor para desbloquear</string>
+ <string name="keyguard_finger_ui_timeout">La IU ha superado el tiempo de espera</string>
+ <string name="keyguard_finger_failed_to_unlock">No se ha podido desbloquear</string>
+ <string name="keyguard_finger_screen_off">Pantalla apagada</string>
+ <string name="keyguard_finger_screen_on">Pantalla encendida</string>
+ <string name="keyguard_finger_match">El dedo coincide, desbloqueando la pantalla...</string>
+ <string name="keyguard_finger_not_match">El dedo no coincide...</string>
+ <string name="keyguard_finger_swipe_too_far_right">Pase el dedo por el centro.</string>
+ <string name="keyguard_finger_swipe_too_far_left">Pase el dedo por el centro.</string>
+ <string name="keyguard_finger_swipe_too_fast">Pase demasiado rápido.</string>
+ <string name="keyguard_finger_swipe_too_short">Pase demasiado corto.</string>
+ <string name="keyguard_finger_swipe_too_slow">Pase demasiado lento.</string>
+ <string name="keyguard_finger_swipe_too_skewed">Pase demasiado fraccionado.</string>
+ <string name="lockscreen_too_many_failed_fingers_dialog_message">La huella dactilar ha dado error al identificarle %1$d veces. \n\nVuelva a intentarlo en %2$d segundos. </string>
+ <string name="lockscreen_failed_fingers_almost_glogin">La huella dactilar ha dado error al identificarle %1$d veces. Tras %2$d identificaciones correctas más, se le pedirá que desbloquee el teléfono mediante el inicio de sesión de Google.\n\n Vuelva a intentarlo en %3$d segundos. </string>
+ <string name="lockscreen_forgot_finger_button_text">¿Ha olvidado el dedo?</string>
</resources>
diff --git a/core/res/res/values-fr/strings.xml b/core/res/res/values-fr/strings.xml
index afd887c..acbf696 100644
--- a/core/res/res/values-fr/strings.xml
+++ b/core/res/res/values-fr/strings.xml
@@ -943,4 +943,21 @@
<item quantity="one">%d seconde restante</item>
<item quantity="other">%d secondes restantes</item>
</plurals>
+
+ <string name="keyguard_finger_please_swipe">Passez le doigt sur le capteur pour déverrouiller</string>
+ <string name="keyguard_finger_ui_timeout">Délai d\'attente de l\'interface utilisateur !</string>
+ <string name="keyguard_finger_failed_to_unlock">Échec du déverrouillage !</string>
+ <string name="keyguard_finger_screen_off">Écran désactivé</string>
+ <string name="keyguard_finger_screen_on">Écran activé</string>
+ <string name="keyguard_finger_match">Le doigt correspond, déverrouillage de l\'écran...</string>
+ <string name="keyguard_finger_not_match">Le doigt ne correspond pas...</string>
+ <string name="keyguard_finger_swipe_too_far_right">Faites glisser le doigt au centre.</string>
+ <string name="keyguard_finger_swipe_too_far_left">Faites glisser le doigt au centre.</string>
+ <string name="keyguard_finger_swipe_too_fast">Vous avez fait glisser votre doigt trop rapidement.</string>
+ <string name="keyguard_finger_swipe_too_short">La distance sur laquelle vous avez fait glisser votre doigt est trop courte.</string>
+ <string name="keyguard_finger_swipe_too_slow">Vous avez fait glisser votre doigt trop lentement.</string>
+ <string name="keyguard_finger_swipe_too_skewed">Vous avez fait glisser votre doigt de travers.</string>
+ <string name="lockscreen_too_many_failed_fingers_dialog_message">L\'identification avec votre empreinte digitale à échoué %1$d fois.\n\nVeuillez réessayer dans %2$d secondes.</string>
+ <string name="lockscreen_failed_fingers_almost_glogin">L\'identification avec votre empreinte digitale à échoué %1$d fois. Après %2$d autres échecs d\'identification, il vous sera demandé de déverrouiller votre téléphone à l\'aide de votre connexion Google.\n\n Veuillez réessayer dans %3$d secondes.</string>
+ <string name="lockscreen_forgot_finger_button_text">Vous ne vous souvenez plus du doigt utilisé ?</string>
</resources>
diff --git a/core/res/res/values-ja/strings.xml b/core/res/res/values-ja/strings.xml
index 1c64dac..0e846ca 100644
--- a/core/res/res/values-ja/strings.xml
+++ b/core/res/res/values-ja/strings.xml
@@ -978,4 +978,20 @@
<!-- Description of an application permission that lets lets an application view/edit revoked permissions. -->
<string name="permdesc_revokePermissions">取り消された権限を読み書きする。通常のアプリケーションでは不要です。</string>
+ <string name="keyguard_finger_please_swipe">ロックを解除するには指をセンサー上で滑らせてください</string>
+ <string name="keyguard_finger_ui_timeout">UI がタイムアウトしました!</string>
+ <string name="keyguard_finger_failed_to_unlock">ロックを解除できませんでした!</string>
+ <string name="keyguard_finger_screen_off">画面オフ</string>
+ <string name="keyguard_finger_screen_on">画面オン</string>
+ <string name="keyguard_finger_match">指が一致しました。画面のロックを解除しています...</string>
+ <string name="keyguard_finger_not_match">指が一致しませんでした...</string>
+ <string name="keyguard_finger_swipe_too_far_right">中央で指を滑らせてください。</string>
+ <string name="keyguard_finger_swipe_too_far_left">中央で指を滑らせてください。</string>
+ <string name="keyguard_finger_swipe_too_fast">滑らせ方が速すぎます。</string>
+ <string name="keyguard_finger_swipe_too_short">滑らせる距離が短すぎます。</string>
+ <string name="keyguard_finger_swipe_too_slow">滑らせ方が遅すぎます。</string>
+ <string name="keyguard_finger_swipe_too_skewed">滑らせ方が傾きすぎです。</string>
+ <string name="lockscreen_too_many_failed_fingers_dialog_message">指紋の識別に %1$d 回失敗しました。\n\n%2$d 秒後に再試行してください。</string>
+ <string name="lockscreen_failed_fingers_almost_glogin">指紋の識別に %1$d 回失敗しました。識別にあと %2$d 回失敗すると、Google サインインを使用して電話のロックを解除するように求められます。\n\n%3$d 秒後に再試行してください。</string>
+ <string name="lockscreen_forgot_finger_button_text">どの指かわからなくなった場合</string>
</resources>
diff --git a/core/res/res/values-pt-rBR/strings.xml b/core/res/res/values-pt-rBR/strings.xml
new file mode 100644
index 0000000..6e93e15
--- /dev/null
+++ b/core/res/res/values-pt-rBR/strings.xml
@@ -0,0 +1,22 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- THIS FILE WAS AUTO-GENERATED, MANUAL MODIFICATIONS WILL BE LOST! -->
+<!-- resource category: keyguard -->
+<!-- file generated at 05:10:05 on 2011/08/12-->
+<resources>
+ <string name="keyguard_finger_please_swipe">Deslize o dedo sobre o sensor para desbloquear</string>
+ <string name="keyguard_finger_ui_timeout">O tempo limite da interface do usuário expirou!</string>
+ <string name="keyguard_finger_failed_to_unlock">Falha ao desbloquear!</string>
+ <string name="keyguard_finger_screen_off">Tela apagada</string>
+ <string name="keyguard_finger_screen_on">Tela acesa</string>
+ <string name="keyguard_finger_match">Correspondência encontrada para o dedo. Desbloqueando tela...</string>
+ <string name="keyguard_finger_not_match">Nenhuma correspondência encontrada para o dedo...</string>
+ <string name="keyguard_finger_swipe_too_far_right">Deslize o dedo pelo centro.</string>
+ <string name="keyguard_finger_swipe_too_far_left">Deslize o dedo pelo centro.</string>
+ <string name="keyguard_finger_swipe_too_fast">Movimento rápido demais.</string>
+ <string name="keyguard_finger_swipe_too_short">Movimento curto demais.</string>
+ <string name="keyguard_finger_swipe_too_slow">Movimento lento demais.</string>
+ <string name="keyguard_finger_swipe_too_skewed">Movimento inclinado demais.</string>
+ <string name="lockscreen_too_many_failed_fingers_dialog_message">Sua impressão digital não identificou você %1$d vezes.\n\nTente novamente em %2$d segundos.</string>
+ <string name="lockscreen_failed_fingers_almost_glogin">Sua impressão digital não identificou você %1$d vezes. Depois de mais %2$d identificação(ões) malsucedida(s), você será solicitado a desbloquear o telefone usando seu logon do Google.\n\n Tente novamente em %3$d segundos.</string>
+ <string name="lockscreen_forgot_finger_button_text">Esqueceu o dedo?</string>
+</resources>
diff --git a/core/res/res/values-zh-rCN/strings.xml b/core/res/res/values-zh-rCN/strings.xml
index 2c66101..0e988e7 100644
--- a/core/res/res/values-zh-rCN/strings.xml
+++ b/core/res/res/values-zh-rCN/strings.xml
@@ -954,4 +954,21 @@
<item quantity="one">还剩 %d 秒</item>
<item quantity="other">还剩 %d 秒</item>
</plurals>
+
+ <string name="keyguard_finger_please_swipe">将手指滑过传感器以解锁</string>
+ <string name="keyguard_finger_ui_timeout">UI 超时!</string>
+ <string name="keyguard_finger_failed_to_unlock">无法解锁!</string>
+ <string name="keyguard_finger_screen_off">屏幕关闭</string>
+ <string name="keyguard_finger_screen_on">屏幕打开</string>
+ <string name="keyguard_finger_match">手指吻合,解锁屏幕...</string>
+ <string name="keyguard_finger_not_match">手指不吻合...</string>
+ <string name="keyguard_finger_swipe_too_far_right">在中心滑动。</string>
+ <string name="keyguard_finger_swipe_too_far_left">在中心滑动。</string>
+ <string name="keyguard_finger_swipe_too_fast">滑得太快。</string>
+ <string name="keyguard_finger_swipe_too_short">滑得太短。</string>
+ <string name="keyguard_finger_swipe_too_slow">滑得太慢。</string>
+ <string name="keyguard_finger_swipe_too_skewed">滑得太偏。</string>
+ <string name="lockscreen_too_many_failed_fingers_dialog_message">您的指纹识别已失败 %1$d 次。\n\n请在 %2$d 秒内重试。</string>
+ <string name="lockscreen_failed_fingers_almost_glogin">您的指纹识别已失败 %1$d 次。如果识别再失败 %2$d 次,系统将要求您使用 Google 登录来解锁您的电话。\n\n请在 %3$d 秒内重试。</string>
+ <string name="lockscreen_forgot_finger_button_text">忘记手指?</string>
</resources>
diff --git a/core/res/res/values-zh-rTW/strings.xml b/core/res/res/values-zh-rTW/strings.xml
index 8b851bf..2c85287 100644
--- a/core/res/res/values-zh-rTW/strings.xml
+++ b/core/res/res/values-zh-rTW/strings.xml
@@ -2230,4 +2230,20 @@
<!-- Description of an application permission that lets lets an application view/edit revoked permissions. -->
<string name="permdesc_revokePermissions">允許讀取及寫入被撤消的權限。不應使用於正常的應用程式。</string>
+ <string name="keyguard_finger_please_swipe">在感應器上劃一下手指以解除鎖定</string>
+ <string name="keyguard_finger_ui_timeout">UI 逾時!</string>
+ <string name="keyguard_finger_failed_to_unlock">無法解除鎖定!</string>
+ <string name="keyguard_finger_screen_off">螢幕關閉</string>
+ <string name="keyguard_finger_screen_on">螢幕開啟</string>
+ <string name="keyguard_finger_match">手指符合,解除鎖定螢幕...</string>
+ <string name="keyguard_finger_not_match">手指不符合...</string>
+ <string name="keyguard_finger_swipe_too_far_right">在中心位置劃一下。</string>
+ <string name="keyguard_finger_swipe_too_far_left">在中心位置劃一下。</string>
+ <string name="keyguard_finger_swipe_too_fast">劃太快。</string>
+ <string name="keyguard_finger_swipe_too_short">劃太短。</string>
+ <string name="keyguard_finger_swipe_too_slow">劃太慢。</string>
+ <string name="keyguard_finger_swipe_too_skewed">劃太歪。</string>
+ <string name="lockscreen_too_many_failed_fingers_dialog_message">您的指紋無法識別您的身分達 %1$d 次。\n\n請在 %2$d 秒內再試一次。</string>
+ <string name="lockscreen_failed_fingers_almost_glogin">您的指紋無法識別您的身分達 %1$d 次。如果識別再失敗 %2$d 次,系統將要求您使用 Google 登入資訊來解除鎖定您的電話。\n\n請在 %3$d 秒內再試一次。</string>
+ <string name="lockscreen_forgot_finger_button_text">忘記手指?</string>
</resources>
diff --git a/core/res/res/values/config.xml b/core/res/res/values/config.xml
index 6d5c256..07de23c 100644
--- a/core/res/res/values/config.xml
+++ b/core/res/res/values/config.xml
@@ -636,4 +636,7 @@
-SourcePortDestPort-SourcePortDestPort-OMADM PDU
If false, not supported. -->
<bool name="config_duplicate_port_omadm_wappush">false</bool>
+
+ <!-- Location of the Authentec framework jar -->
+ <string name="config_authentecJarLocation"></string>
</resources>
diff --git a/core/res/res/values/strings.xml b/core/res/res/values/strings.xml
index e91d0d2..ed94087 100644
--- a/core/res/res/values/strings.xml
+++ b/core/res/res/values/strings.xml
@@ -2471,4 +2471,20 @@
<!-- Description of an application permission that lets lets an application view/edit revoked permissions. -->
<string name="permdesc_revokePermissions">Allows read and write for revoked permissions. Not for use by normal applications.</string>
+ <string name="keyguard_finger_please_swipe">Swipe finger over sensor to unlock</string>
+ <string name="keyguard_finger_ui_timeout">UI timeout!</string>
+ <string name="keyguard_finger_failed_to_unlock">Failed to unlock!</string>
+ <string name="keyguard_finger_screen_off">Screen off</string>
+ <string name="keyguard_finger_screen_on">Screen on</string>
+ <string name="keyguard_finger_match">Finger match, unlock screen...</string>
+ <string name="keyguard_finger_not_match">Finger did not match...</string>
+ <string name="keyguard_finger_swipe_too_far_right">Swipe in the center.</string>
+ <string name="keyguard_finger_swipe_too_far_left">Swipe in the center.</string>
+ <string name="keyguard_finger_swipe_too_fast">Swipe was too fast.</string>
+ <string name="keyguard_finger_swipe_too_short">Swipe was too short.</string>
+ <string name="keyguard_finger_swipe_too_slow">Swipe was too slow.</string>
+ <string name="keyguard_finger_swipe_too_skewed">Swipe was too skewed.</string>
+ <string name="lockscreen_too_many_failed_fingers_dialog_message">Your fingerprint failed to identify you %1$d times.\n\nPlease try again in %2$d seconds.</string>
+ <string name="lockscreen_failed_fingers_almost_glogin">Your fingerprint failed to identify you %1$d times. After %2$d more unsuccessful identifications, you will be asked to unlock your phone using your Google sign-in.\n\n Please try again in %3$d seconds.</string>
+ <string name="lockscreen_forgot_finger_button_text">Forgot finger?</string>
</resources>