Don't use a WeakReference for fingerprint notification object.

This was causing a problem where a GC in the system process
would inadvertently remove the callback.

Potential fix for bug 20491119

Change-Id: I9d7d0bb8e29fcd6c52cb3be645bbb9c8e5413d48
diff --git a/services/core/java/com/android/server/fingerprint/FingerprintService.java b/services/core/java/com/android/server/fingerprint/FingerprintService.java
index ac488e3..a33f000 100644
--- a/services/core/java/com/android/server/fingerprint/FingerprintService.java
+++ b/services/core/java/com/android/server/fingerprint/FingerprintService.java
@@ -37,7 +37,6 @@
 import static android.Manifest.permission.MANAGE_FINGERPRINT;
 import static android.Manifest.permission.USE_FINGERPRINT;
 
-import java.lang.ref.WeakReference;
 import java.util.ArrayList;
 import java.util.Arrays;
 import java.util.List;
@@ -363,12 +362,12 @@
 
     private class ClientMonitor implements IBinder.DeathRecipient {
         IBinder token;
-        WeakReference<IFingerprintServiceReceiver> receiver;
+        IFingerprintServiceReceiver receiver;
         int userId;
 
         public ClientMonitor(IBinder token, IFingerprintServiceReceiver receiver, int userId) {
             this.token = token;
-            this.receiver = new WeakReference<IFingerprintServiceReceiver>(receiver);
+            this.receiver = receiver;
             this.userId = userId;
             try {
                 token.linkToDeath(this, 0);
@@ -388,6 +387,7 @@
         public void binderDied() {
             token = null;
             removeClient(this);
+            receiver = null;
         }
 
         protected void finalize() throws Throwable {
@@ -405,10 +405,9 @@
          * @return true if we're done.
          */
         private boolean sendRemoved(int fingerId, int groupId) {
-            IFingerprintServiceReceiver rx = receiver.get();
-            if (rx == null) return true; // client not listening
+            if (receiver == null) return true; // client not listening
             try {
-                rx.onRemoved(mHalDeviceId, fingerId, groupId);
+                receiver.onRemoved(mHalDeviceId, fingerId, groupId);
                 return fingerId == 0;
             } catch (RemoteException e) {
                 Slog.w(TAG, "Failed to notify Removed:", e);
@@ -420,11 +419,10 @@
          * @return true if we're done.
          */
         private boolean sendEnrollResult(int fpId, int groupId, int remaining) {
-            IFingerprintServiceReceiver rx = receiver.get();
-            if (rx == null) return true; // client not listening
+            if (receiver == null) return true; // client not listening
             FingerprintUtils.vibrateFingerprintSuccess(getContext());
             try {
-                rx.onEnrollResult(mHalDeviceId, fpId, groupId, remaining);
+                receiver.onEnrollResult(mHalDeviceId, fpId, groupId, remaining);
                 return remaining == 0;
             } catch (RemoteException e) {
                 Slog.w(TAG, "Failed to notify EnrollResult:", e);
@@ -436,11 +434,10 @@
          * @return true if we're done.
          */
         private boolean sendAuthenticated(int fpId, int groupId) {
-            IFingerprintServiceReceiver rx = receiver.get();
             boolean result = false;
-            if (rx != null) {
+            if (receiver != null) {
                 try {
-                    rx.onAuthenticated(mHalDeviceId, fpId, groupId);
+                    receiver.onAuthenticated(mHalDeviceId, fpId, groupId);
                 } catch (RemoteException e) {
                     Slog.w(TAG, "Failed to notify Authenticated:", e);
                     result = true; // client failed
@@ -463,10 +460,9 @@
          * @return true if we're done.
          */
         private boolean sendAcquired(int acquiredInfo) {
-            IFingerprintServiceReceiver rx = receiver.get();
-            if (rx == null) return true; // client not listening
+            if (receiver == null) return true; // client not listening
             try {
-                rx.onAcquired(mHalDeviceId, acquiredInfo);
+                receiver.onAcquired(mHalDeviceId, acquiredInfo);
                 return false; // acquisition continues...
             } catch (RemoteException e) {
                 Slog.w(TAG, "Failed to invoke sendAcquired:", e);
@@ -478,10 +474,9 @@
          * @return true if we're done.
          */
         private boolean sendError(int error) {
-            IFingerprintServiceReceiver rx = receiver.get();
-            if (rx != null) {
+            if (receiver != null) {
                 try {
-                    rx.onError(mHalDeviceId, error);
+                    receiver.onError(mHalDeviceId, error);
                 } catch (RemoteException e) {
                     Slog.w(TAG, "Failed to invoke sendError:", e);
                 }