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);
}