import android.app.admin.DevicePolicyManager;
import android.app.trust.TrustManager;
import android.content.BroadcastReceiver;
+import android.content.ContentResolver;
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
import com.android.internal.telephony.IccCardConstants;
import com.android.internal.telephony.TelephonyIntents;
+import android.service.fingerprint.FingerprintManager;
+import android.service.fingerprint.FingerprintManagerReceiver;
+import android.service.fingerprint.FingerprintUtils;
import android.telephony.TelephonyManager;
import android.util.Log;
import android.util.SparseBooleanArray;
private static final int MSG_USER_SWITCHING = 310;
private static final int MSG_USER_REMOVED = 311;
private static final int MSG_KEYGUARD_VISIBILITY_CHANGED = 312;
- protected static final int MSG_BOOT_COMPLETED = 313;
+ private static final int MSG_BOOT_COMPLETED = 313;
private static final int MSG_USER_SWITCH_COMPLETE = 314;
- protected static final int MSG_USER_INFO_CHANGED = 317;
- protected static final int MSG_REPORT_EMERGENCY_CALL_ACTION = 318;
+ private static final int MSG_SET_CURRENT_CLIENT_ID = 315;
+ private static final int MSG_SET_PLAYBACK_STATE = 316;
+ private static final int MSG_USER_INFO_CHANGED = 317;
+ private static final int MSG_REPORT_EMERGENCY_CALL_ACTION = 318;
private static final int MSG_SCREEN_TURNED_ON = 319;
private static final int MSG_SCREEN_TURNED_OFF = 320;
private static final int MSG_KEYGUARD_BOUNCER_CHANGED = 322;
+ private static final int MSG_FINGERPRINT_PROCESSED = 323;
+ private static final int MSG_FINGERPRINT_ACQUIRED = 324;
private static KeyguardUpdateMonitor sInstance;
case MSG_SCREEN_TURNED_ON:
handleScreenTurnedOn();
break;
+ case MSG_FINGERPRINT_ACQUIRED:
+ handleFingerprintAcquired(msg.arg1);
+ break;
+ case MSG_FINGERPRINT_PROCESSED:
+ handleFingerprintProcessed(msg.arg1);
+ break;
}
}
};
private SparseBooleanArray mUserHasTrust = new SparseBooleanArray();
+ private SparseBooleanArray mUserFingerprintRecognized = new SparseBooleanArray();
@Override
public void onTrustChanged(boolean enabled, int userId) {
}
}
+ private void onFingerprintRecognized(int userId) {
+ mUserFingerprintRecognized.put(userId, true);
+ for (int i = 0; i < mCallbacks.size(); i++) {
+ KeyguardUpdateMonitorCallback cb = mCallbacks.get(i).get();
+ if (cb != null) {
+ cb.onFingerprintRecognized(userId);
+ }
+ }
+ }
+
+ private void handleFingerprintProcessed(int fingerprintId) {
+ if (fingerprintId == 0) return; // not a valid fingerprint
+
+ final int userId;
+ try {
+ userId = ActivityManagerNative.getDefault().getCurrentUser().id;
+ } catch (RemoteException e) {
+ Log.e(TAG, "Failed to get current user id: ", e);
+ return;
+ }
+ final ContentResolver res = mContext.getContentResolver();
+ final int ids[] = FingerprintUtils.getFingerprintIdsForUser(res, userId);
+ for (int i = 0; i < ids.length; i++) {
+ if (ids[i] == fingerprintId) {
+ onFingerprintRecognized(userId);
+ }
+ }
+ }
+
+ private void handleFingerprintAcquired(int info) {
+ for (int i = 0; i < mCallbacks.size(); i++) {
+ KeyguardUpdateMonitorCallback cb = mCallbacks.get(i).get();
+ if (cb != null) {
+ cb.onFingerprintAcquired(info);
+ }
+ }
+ }
+
private boolean isTrustDisabled(int userId) {
final DevicePolicyManager dpm =
(DevicePolicyManager) mContext.getSystemService(Context.DEVICE_POLICY_SERVICE);
}
public boolean getUserHasTrust(int userId) {
- return !isTrustDisabled(userId) && mUserHasTrust.get(userId);
+ return !isTrustDisabled(userId) && mUserHasTrust.get(userId)
+ || mUserFingerprintRecognized.get(userId);
}
static class DisplayClientState {
}
}
};
+ private FingerprintManagerReceiver mFingerprintManagerReceiver =
+ new FingerprintManagerReceiver() {
+ @Override
+ public void onProcessed(int fingerprintId) {
+ mHandler.obtainMessage(MSG_FINGERPRINT_PROCESSED, fingerprintId, 0).sendToTarget();
+ };
+
+ @Override
+ public void onAcquired(int info) {
+ mHandler.obtainMessage(MSG_FINGERPRINT_ACQUIRED, info, 0).sendToTarget();
+ }
+
+ @Override
+ public void onError(int error) {
+ if (DEBUG) Log.w(TAG, "FingerprintManager reported error: " + error);
+ }
+ };
/**
* When we receive a
}
protected void handleScreenTurnedOff(int arg1) {
+ clearFingerprintRecognized();
final int count = mCallbacks.size();
for (int i = 0; i < count; i++) {
KeyguardUpdateMonitorCallback cb = mCallbacks.get(i).get();
private KeyguardUpdateMonitor(Context context) {
mContext = context;
-
mDeviceProvisioned = isDeviceProvisionedInSettingsDb();
// Since device can't be un-provisioned, we only need to register a content observer
// to update mDeviceProvisioned when we are...
TrustManager trustManager = (TrustManager) context.getSystemService(Context.TRUST_SERVICE);
trustManager.registerTrustListener(this);
+
+ FingerprintManager fpm;
+ fpm = (FingerprintManager) context.getSystemService(Context.FINGERPRINT_SERVICE);
+ fpm.startListening(mFingerprintManagerReceiver);
}
private boolean isDeviceProvisionedInSettingsDb() {
mFailedBiometricUnlockAttempts = 0;
}
+ public void clearFingerprintRecognized() {
+ mUserFingerprintRecognized.clear();
+ }
+
public void reportFailedUnlockAttempt() {
mFailedAttempts++;
}