OSDN Git Service

Fix fingerprint for multiuser
authorJorim Jaggi <jjaggi@google.com>
Wed, 13 May 2015 23:30:04 +0000 (16:30 -0700)
committerJorim Jaggi <jjaggi@google.com>
Wed, 13 May 2015 23:35:56 +0000 (16:35 -0700)
Change-Id: Iab18c4de9764da1a65490b186b33535f8e79e1e5

core/java/android/hardware/fingerprint/FingerprintManager.java
packages/Keyguard/src/com/android/keyguard/KeyguardUpdateMonitor.java
services/core/java/com/android/server/fingerprint/FingerprintService.java

index cf96145..657beee 100644 (file)
@@ -686,7 +686,7 @@ public class FingerprintManager {
 
         private void sendAuthenticatedResult(Fingerprint fp) {
             if (mAuthenticationCallback != null) {
-                if (fp.getFingerId() == 0 && fp.getGroupId() == 0) {
+                if (fp.getFingerId() == 0) {
                     // Fingerprint template valid but doesn't match one in database
                     mAuthenticationCallback.onAuthenticationFailed();
                 } else {
index d13d71c..0795f65 100644 (file)
@@ -102,7 +102,6 @@ public class KeyguardUpdateMonitor implements TrustManager.TrustListener {
     private static final int MSG_SIM_STATE_CHANGE = 304;
     private static final int MSG_RINGER_MODE_CHANGED = 305;
     private static final int MSG_PHONE_STATE_CHANGED = 306;
-    private static final int MSG_CLOCK_VISIBILITY_CHANGED = 307;
     private static final int MSG_DEVICE_PROVISIONED = 308;
     private static final int MSG_DPM_STATE_CHANGED = 309;
     private static final int MSG_USER_SWITCHING = 310;
@@ -174,9 +173,6 @@ public class KeyguardUpdateMonitor implements TrustManager.TrustListener {
                 case MSG_PHONE_STATE_CHANGED:
                     handlePhoneStateChanged((String) msg.obj);
                     break;
-                case MSG_CLOCK_VISIBILITY_CHANGED:
-                    handleClockVisibilityChanged();
-                    break;
                 case MSG_DEVICE_PROVISIONED:
                     handleDeviceProvisioned();
                     break;
@@ -764,15 +760,11 @@ public class KeyguardUpdateMonitor implements TrustManager.TrustListener {
                         public void onUserSwitching(int newUserId, IRemoteCallback reply) {
                             mHandler.sendMessage(mHandler.obtainMessage(MSG_USER_SWITCHING,
                                     newUserId, 0, reply));
-                            mSwitchingUser = true;
-                            updateFingerprintListeningState();
                         }
                         @Override
                         public void onUserSwitchComplete(int newUserId) throws RemoteException {
                             mHandler.sendMessage(mHandler.obtainMessage(MSG_USER_SWITCH_COMPLETE,
                                     newUserId, 0));
-                            mSwitchingUser = false;
-                            updateFingerprintListeningState();
                         }
                         @Override
                         public void onForegroundProfileSwitch(int newProfileId) {
@@ -877,6 +869,9 @@ public class KeyguardUpdateMonitor implements TrustManager.TrustListener {
      * Handle {@link #MSG_USER_SWITCHING}
      */
     protected void handleUserSwitching(int userId, IRemoteCallback reply) {
+        mSwitchingUser = true;
+        updateFingerprintListeningState();
+
         for (int i = 0; i < mCallbacks.size(); i++) {
             KeyguardUpdateMonitorCallback cb = mCallbacks.get(i).get();
             if (cb != null) {
@@ -893,6 +888,9 @@ public class KeyguardUpdateMonitor implements TrustManager.TrustListener {
      * Handle {@link #MSG_USER_SWITCH_COMPLETE}
      */
     protected void handleUserSwitchComplete(int userId) {
+        mSwitchingUser = false;
+        updateFingerprintListeningState();
+
         for (int i = 0; i < mCallbacks.size(); i++) {
             KeyguardUpdateMonitorCallback cb = mCallbacks.get(i).get();
             if (cb != null) {
@@ -1052,19 +1050,6 @@ public class KeyguardUpdateMonitor implements TrustManager.TrustListener {
     }
 
     /**
-     * Handle {@link #MSG_CLOCK_VISIBILITY_CHANGED}
-     */
-    private void handleClockVisibilityChanged() {
-        if (DEBUG) Log.d(TAG, "handleClockVisibilityChanged()");
-        for (int i = 0; i < mCallbacks.size(); i++) {
-            KeyguardUpdateMonitorCallback cb = mCallbacks.get(i).get();
-            if (cb != null) {
-                cb.onClockVisibilityChanged();
-            }
-        }
-    }
-
-    /**
      * Handle {@link #MSG_KEYGUARD_VISIBILITY_CHANGED}
      */
     private void handleKeyguardVisibilityChanged(int showing) {
@@ -1108,21 +1093,6 @@ public class KeyguardUpdateMonitor implements TrustManager.TrustListener {
         }
     }
 
-    public boolean isKeyguardVisible() {
-        return mKeyguardIsVisible;
-    }
-
-    /**
-     * @return if the keyguard is currently in bouncer mode.
-     */
-    public boolean isKeyguardBouncer() {
-        return mBouncer;
-    }
-
-    public boolean isSwitchingUser() {
-        return mSwitchingUser;
-    }
-
     private static boolean isBatteryUpdateInteresting(BatteryStatus old, BatteryStatus current) {
         final boolean nowPluggedIn = current.isPluggedIn();
         final boolean wasPluggedIn = old.isPluggedIn();
@@ -1148,13 +1118,6 @@ public class KeyguardUpdateMonitor implements TrustManager.TrustListener {
     }
 
     /**
-     * @return The default plmn (no service)
-     */
-    private CharSequence getDefaultPlmn() {
-        return mContext.getResources().getText(R.string.keyguard_carrier_default);
-    }
-
-    /**
      * Remove the given observer's callback.
      *
      * @param callback The callback to remove
@@ -1219,11 +1182,6 @@ public class KeyguardUpdateMonitor implements TrustManager.TrustListener {
         message.sendToTarget();
     }
 
-    public void reportClockVisible(boolean visible) {
-        mClockVisible = visible;
-        mHandler.obtainMessage(MSG_CLOCK_VISIBILITY_CHANGED).sendToTarget();
-    }
-
     /**
      * Report that the user successfully entered the SIM PIN or PUK/SIM PIN so we
      * have the information earlier than waiting for the intent
index 0faccc6..2edfdf0 100644 (file)
 package com.android.server.fingerprint;
 
 import android.app.ActivityManager;
+import android.app.ActivityManagerNative;
 import android.app.AppOpsManager;
+import android.app.IUserSwitchObserver;
 import android.content.ContentResolver;
 import android.content.Context;
 import android.os.Binder;
 import android.os.Environment;
 import android.os.Handler;
 import android.os.IBinder;
+import android.os.IRemoteCallback;
 import android.os.Looper;
 import android.os.MessageQueue;
 import android.os.RemoteException;
@@ -63,6 +66,7 @@ public class FingerprintService extends SystemService {
     private final AppOpsManager mAppOps;
 
     private static final int MSG_NOTIFY = 10;
+    private static final int MSG_USER_SWITCHING = 11;
 
     private static final int ENROLLMENT_TIMEOUT_MS = 60 * 1000; // 1 minute
 
@@ -85,6 +89,10 @@ public class FingerprintService extends SystemService {
                     handleNotify(m.type, m.arg1, m.arg2, m.arg3);
                     break;
 
+                case MSG_USER_SWITCHING:
+                    handleUserSwitching(msg.arg1);
+                    break;
+
                 default:
                     Slog.w(TAG, "Unknown message:" + msg.what);
             }
@@ -144,7 +152,7 @@ public class FingerprintService extends SystemService {
 
     void handleNotify(int type, int arg1, int arg2, int arg3) {
         Slog.v(TAG, "handleNotify(type=" + type + ", arg1=" + arg1 + ", arg2=" + arg2 + ")"
-                    + ", mAuthClients = " + mAuthClient + ", mEnrollClient = " + mEnrollClient);
+                + ", mAuthClients = " + mAuthClient + ", mEnrollClient = " + mEnrollClient);
         if (mEnrollClient != null) {
             final IBinder token = mEnrollClient.token;
             if (dispatchNotify(mEnrollClient, type, arg1, arg2, arg3)) {
@@ -166,6 +174,10 @@ public class FingerprintService extends SystemService {
         }
     }
 
+    void handleUserSwitching(int userId) {
+        updateActiveGroup(userId);
+    }
+
     /*
      * Dispatch notify events to clients.
      *
@@ -633,11 +645,37 @@ public class FingerprintService extends SystemService {
         publishBinderService(Context.FINGERPRINT_SERVICE, new FingerprintServiceWrapper());
         mHalDeviceId = nativeOpenHal();
         if (mHalDeviceId != 0) {
-            int userId = ActivityManager.getCurrentUser();
-            File path = Environment.getUserSystemDirectory(userId);
-            nativeSetActiveGroup(0, path.getAbsolutePath().getBytes());
+            updateActiveGroup(ActivityManager.getCurrentUser());
         }
         if (DEBUG) Slog.v(TAG, "Fingerprint HAL id: " + mHalDeviceId);
+        listenForUserSwitches();
     }
 
+    private void updateActiveGroup(int userId) {
+        File path = Environment.getUserSystemDirectory(userId);
+        nativeSetActiveGroup(userId, path.getAbsolutePath().getBytes());
+    }
+
+    private void listenForUserSwitches() {
+        try {
+            ActivityManagerNative.getDefault().registerUserSwitchObserver(
+                    new IUserSwitchObserver.Stub() {
+                        @Override
+                        public void onUserSwitching(int newUserId, IRemoteCallback reply) {
+                            mHandler.obtainMessage(MSG_USER_SWITCHING, newUserId, 0 /* unused */)
+                                    .sendToTarget();
+                        }
+                        @Override
+                        public void onUserSwitchComplete(int newUserId) throws RemoteException {
+                            // Ignore.
+                        }
+                        @Override
+                        public void onForegroundProfileSwitch(int newProfileId) {
+                            // Ignore.
+                        }
+                    });
+        } catch (RemoteException e) {
+            Slog.w(TAG, "Failed to listen for user switching event" ,e);
+        }
+    }
 }