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:
@@ -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();
|
||||
|
||||
@@ -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
|
||||
*/
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user