Verify fingerprint exists before using it

The process will crash if we try to obtain a FingerprintManager
on a device that doesn't implement one. Verify that the feature
exists before trying.

Bug: 34923693
Test: Ran A11y unit tests and a11y fingerprint cts.
Change-Id: I48ad1c2c9c0c5739d8b1826c3c53bb817078e6cf
This commit is contained in:
Phil Weaver
2017-02-16 19:51:14 -08:00
parent ab9b002400
commit 7917a2f020
3 changed files with 30 additions and 19 deletions

View File

@@ -52,6 +52,8 @@ import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.util.List;
import static android.content.pm.PackageManager.FEATURE_FINGERPRINT;
/**
* Accessibility services should only be used to assist users with disabilities in using
* Android devices and apps. They run in the background and receive callbacks by the system
@@ -618,7 +620,8 @@ public abstract class AccessibilityService extends Service {
*/
@RequiresPermission(android.Manifest.permission.USE_FINGERPRINT)
public final @Nullable FingerprintGestureController getFingerprintGestureController() {
if (mFingerprintGestureController == null) {
if ((mFingerprintGestureController == null)
&& getPackageManager().hasSystemFeature(FEATURE_FINGERPRINT)) {
FingerprintManager fingerprintManager = getSystemService(FingerprintManager.class);
if ((fingerprintManager != null) && fingerprintManager.isHardwareDetected()) {
AccessibilityServiceInfo info = getServiceInfo();

View File

@@ -47,6 +47,8 @@ import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import static android.content.pm.PackageManager.FEATURE_FINGERPRINT;
/**
* This class describes an {@link AccessibilityService}. The system notifies an
* {@link AccessibilityService} for {@link android.view.accessibility.AccessibilityEvent}s
@@ -1042,8 +1044,7 @@ public class AccessibilityServiceInfo implements Parcelable {
new CapabilityInfo(CAPABILITY_CAN_PERFORM_GESTURES,
R.string.capability_title_canPerformGestures,
R.string.capability_desc_canPerformGestures));
if ((context == null)
|| context.getSystemService(FingerprintManager.class).isHardwareDetected()) {
if ((context == null) || fingerprintAvailable(context)) {
sAvailableCapabilityInfos.put(CAPABILITY_CAN_CAPTURE_FINGERPRINT_GESTURES,
new CapabilityInfo(CAPABILITY_CAN_CAPTURE_FINGERPRINT_GESTURES,
R.string.capability_title_canCaptureFingerprintGestures,
@@ -1053,6 +1054,10 @@ public class AccessibilityServiceInfo implements Parcelable {
return sAvailableCapabilityInfos;
}
private static boolean fingerprintAvailable(Context context) {
return context.getPackageManager().hasSystemFeature(FEATURE_FINGERPRINT)
&& context.getSystemService(FingerprintManager.class).isHardwareDetected();
}
/**
* @hide
*/

View File

@@ -1991,23 +1991,26 @@ public class AccessibilityManagerService extends IAccessibilityManager.Stub {
private void updateFingerprintGestureHandling(UserState userState) {
final List<Service> services;
synchronized (mLock) {
// Only create the controller when a service wants to use the feature
services = userState.mBoundServices;
int numServices = services.size();
for (int i = 0; i < numServices; i++) {
if (services.get(i).isCapturingFingerprintGestures()) {
final long identity = Binder.clearCallingIdentity();
IFingerprintService service = null;
try {
service = IFingerprintService.Stub.asInterface(
ServiceManager.getService(Context.FINGERPRINT_SERVICE));
} finally {
Binder.restoreCallingIdentity(identity);
}
if (service != null) {
mFingerprintGestureDispatcher = new FingerprintGestureDispatcher(
service, mLock);
break;
if ((mFingerprintGestureDispatcher == null)
&& mPackageManager.hasSystemFeature(PackageManager.FEATURE_FINGERPRINT)) {
// Only create the controller when a service wants to use the feature
int numServices = services.size();
for (int i = 0; i < numServices; i++) {
if (services.get(i).isCapturingFingerprintGestures()) {
final long identity = Binder.clearCallingIdentity();
IFingerprintService service = null;
try {
service = IFingerprintService.Stub.asInterface(
ServiceManager.getService(Context.FINGERPRINT_SERVICE));
} finally {
Binder.restoreCallingIdentity(identity);
}
if (service != null) {
mFingerprintGestureDispatcher = new FingerprintGestureDispatcher(
service, mLock);
break;
}
}
}
}