Fields Summary |
---|
private static final String | TAG |
private static final String | LOCK_PATTERN_FILE |
public static final int | FAILED_ATTEMPTS_BEFORE_TIMEOUTThe maximum number of incorrect attempts before the user is prevented
from trying again for {@link #FAILED_ATTEMPT_TIMEOUT_MS}. |
public static final int | FAILED_ATTEMPTS_BEFORE_RESETThe number of incorrect attempts before which we fall back on an alternative
method of verifying the user, and resetting their lock pattern. |
public static final long | FAILED_ATTEMPT_TIMEOUT_MSHow long the user is prevented from trying again after entering the
wrong pattern too many times. |
public static final long | FAILED_ATTEMPT_COUNTDOWN_INTERVAL_MSThe interval of the countdown for showing progress of the lockout. |
public static final int | MIN_LOCK_PATTERN_SIZEThe minimum number of dots in a valid pattern. |
public static final int | MIN_PATTERN_REGISTER_FAILThe minimum number of dots the user must include in a wrong pattern
attempt for it to be counted against the counts that affect
{@link #FAILED_ATTEMPTS_BEFORE_TIMEOUT} and {@link #FAILED_ATTEMPTS_BEFORE_RESET} |
private static final String | LOCKOUT_PERMANENT_KEY |
private static final String | LOCKOUT_ATTEMPT_DEADLINE |
private static final String | PATTERN_EVER_CHOSEN |
private final android.content.ContentResolver | mContentResolver |
private static String | sLockPatternFilename |
Methods Summary |
---|
public boolean | checkPattern(java.util.List pattern)Check to see if a pattern matches the saved pattern. If no pattern exists,
always returns true.
try {
// Read all the bytes from the file
RandomAccessFile raf = new RandomAccessFile(sLockPatternFilename, "r");
final byte[] stored = new byte[(int) raf.length()];
int got = raf.read(stored, 0, stored.length);
raf.close();
if (got <= 0) {
return true;
}
// Compare the hash from the file with the entered pattern's hash
return Arrays.equals(stored, LockPatternUtils.patternToHash(pattern));
} catch (FileNotFoundException fnfe) {
return true;
} catch (IOException ioe) {
return true;
}
|
private boolean | getBoolean(java.lang.String systemSettingKey)
return 1 ==
android.provider.Settings.System.getInt(
mContentResolver,
systemSettingKey, 0);
|
public long | getLockoutAttemptDeadline()
final long deadline = getLong(LOCKOUT_ATTEMPT_DEADLINE, 0L);
final long now = SystemClock.elapsedRealtime();
if (deadline < now || deadline > (now + FAILED_ATTEMPT_TIMEOUT_MS)) {
return 0L;
}
return deadline;
|
private long | getLong(java.lang.String systemSettingKey, long def)
return android.provider.Settings.System.getLong(mContentResolver, systemSettingKey, def);
|
public java.lang.String | getNextAlarm()
String nextAlarm = Settings.System.getString(mContentResolver,
Settings.System.NEXT_ALARM_FORMATTED);
if (nextAlarm == null || TextUtils.isEmpty(nextAlarm)) {
return null;
}
return nextAlarm;
|
public boolean | isLockPatternEnabled()
return getBoolean(Settings.System.LOCK_PATTERN_ENABLED);
|
public boolean | isPatternEverChosen()Return true if the user has ever chosen a pattern. This is true even if the pattern is
currently cleared.
return getBoolean(PATTERN_EVER_CHOSEN);
|
public boolean | isPermanentlyLocked()
return getBoolean(LOCKOUT_PERMANENT_KEY);
|
public boolean | isTactileFeedbackEnabled()
return getBoolean(Settings.System.LOCK_PATTERN_TACTILE_FEEDBACK_ENABLED);
|
public boolean | isVisiblePatternEnabled()
return getBoolean(Settings.System.LOCK_PATTERN_VISIBLE);
|
static byte[] | patternToHash(java.util.List pattern)
if (pattern == null) {
return null;
}
final int patternSize = pattern.size();
byte[] res = new byte[patternSize];
for (int i = 0; i < patternSize; i++) {
LockPatternView.Cell cell = pattern.get(i);
res[i] = (byte) (cell.getRow() * 3 + cell.getColumn());
}
try {
MessageDigest md = MessageDigest.getInstance("SHA-1");
byte[] hash = md.digest(res);
return hash;
} catch (NoSuchAlgorithmException nsa) {
return res;
}
|
public static java.lang.String | patternToString(java.util.List pattern)Serialize a pattern.
if (pattern == null) {
return "";
}
final int patternSize = pattern.size();
byte[] res = new byte[patternSize];
for (int i = 0; i < patternSize; i++) {
LockPatternView.Cell cell = pattern.get(i);
res[i] = (byte) (cell.getRow() * 3 + cell.getColumn());
}
return new String(res);
|
public void | saveLockPattern(java.util.List pattern)Save a lock pattern.
// Compute the hash
final byte[] hash = LockPatternUtils.patternToHash(pattern);
try {
// Write the hash to file
RandomAccessFile raf = new RandomAccessFile(sLockPatternFilename, "rw");
// Truncate the file if pattern is null, to clear the lock
if (pattern == null) {
raf.setLength(0);
} else {
raf.write(hash, 0, hash.length);
}
raf.close();
setBoolean(PATTERN_EVER_CHOSEN, true);
} catch (FileNotFoundException fnfe) {
// Cant do much, unless we want to fail over to using the settings provider
Log.e(TAG, "Unable to save lock pattern to " + sLockPatternFilename);
} catch (IOException ioe) {
// Cant do much
Log.e(TAG, "Unable to save lock pattern to " + sLockPatternFilename);
}
|
public boolean | savedPatternExists()Check to see if the user has stored a lock pattern.
try {
// Check if we can read a byte from the file
RandomAccessFile raf = new RandomAccessFile(sLockPatternFilename, "r");
byte first = raf.readByte();
raf.close();
return true;
} catch (FileNotFoundException fnfe) {
return false;
} catch (IOException ioe) {
return false;
}
|
private void | setBoolean(java.lang.String systemSettingKey, boolean enabled)
android.provider.Settings.System.putInt(
mContentResolver,
systemSettingKey,
enabled ? 1 : 0);
|
public void | setLockPatternEnabled(boolean enabled)Set whether the lock pattern is enabled.
setBoolean(Settings.System.LOCK_PATTERN_ENABLED, enabled);
|
public long | setLockoutAttemptDeadline()Set and store the lockout deadline, meaning the user can't attempt his/her unlock
pattern until the deadline has passed.
final long deadline = SystemClock.elapsedRealtime() + FAILED_ATTEMPT_TIMEOUT_MS;
setLong(LOCKOUT_ATTEMPT_DEADLINE, deadline);
return deadline;
|
private void | setLong(java.lang.String systemSettingKey, long value)
android.provider.Settings.System.putLong(mContentResolver, systemSettingKey, value);
|
public void | setPermanentlyLocked(boolean locked)Set the state of whether the device is permanently locked, meaning the user
must authenticate via other means. If false, that means the user has gone
out of permanent lock, so the existing (forgotten) lock pattern needs to
be cleared.
setBoolean(LOCKOUT_PERMANENT_KEY, locked);
if (!locked) {
setLockPatternEnabled(false);
saveLockPattern(null);
}
|
public void | setTactileFeedbackEnabled(boolean enabled)Set whether tactile feedback for the pattern is enabled.
setBoolean(Settings.System.LOCK_PATTERN_TACTILE_FEEDBACK_ENABLED, enabled);
|
public void | setVisiblePatternEnabled(boolean enabled)Set whether the visible pattern is enabled.
setBoolean(Settings.System.LOCK_PATTERN_VISIBLE, enabled);
|
public static java.util.List | stringToPattern(java.lang.String string)Deserialize a pattern.
List<LockPatternView.Cell> result = Lists.newArrayList();
final byte[] bytes = string.getBytes();
for (int i = 0; i < bytes.length; i++) {
byte b = bytes[i];
result.add(LockPatternView.Cell.of(b / 3, b % 3));
}
return result;
|