diff --git a/fingerprint/FingerprintWrapper.cpp b/fingerprint/FingerprintWrapper.cpp index 5da06416cfcb706a1f374247a1e7730003163c68..c9ca0900f257ff1084c0951962384739e09ba281 100644 --- a/fingerprint/FingerprintWrapper.cpp +++ b/fingerprint/FingerprintWrapper.cpp @@ -99,6 +99,34 @@ static int cancel(struct fingerprint_device *dev) return device->vendor.device->cancel(device->vendor.device); } +#define MAX_FINGERPRINTS 100 + +typedef int (*enumerate_2_0)(struct fingerprint_device *dev, fingerprint_finger_id_t *results, + uint32_t *max_size); + +static int enumerate_pre_2_1(struct fingerprint_device *dev) +{ + device_t *device = (device_t *) dev; + fingerprint_finger_id_t results[MAX_FINGERPRINTS]; + uint32_t n = MAX_FINGERPRINTS; + enumerate_2_0 enumerate = (enumerate_2_0) device->vendor.device->enumerate; + int rv = enumerate(device->vendor.device, results, &n); + + if (rv == 0) { + uint32_t i; + fingerprint_msg_t msg; + + msg.type = FINGERPRINT_TEMPLATE_ENUMERATING; + for (i = 0; i < n; i++) { + msg.data.enumerated.finger = results[i]; + msg.data.enumerated.remaining_templates = n - i - 1; + device->base.notify(&msg); + } + } + + return rv; +} + static int enumerate(struct fingerprint_device *dev) { device_t *device = (device_t *) dev; @@ -168,7 +196,11 @@ static int device_open(const hw_module_t *module, const char *name, hw_device_t device->base.post_enroll = post_enroll; device->base.get_authenticator_id = get_authenticator_id; device->base.cancel = cancel; - device->base.enumerate = enumerate; + if (vendor.module->common.module_api_version >= FINGERPRINT_MODULE_API_VERSION_2_1) { + device->base.enumerate = enumerate; + } else { + device->base.enumerate = enumerate_pre_2_1; + } device->base.remove = remove; device->base.set_active_group = set_active_group; device->base.authenticate = authenticate;