Add the current sensor strength into dumpsys

Bug: 169730503

Test: atest com.android.server.biometrics
Test: atest com.android.systemui.biometrics
Change-Id: I67529fc65fb712ff7231f4aa063cb0d84aabd701
diff --git a/core/proto/android/server/biometrics.proto b/core/proto/android/server/biometrics.proto
index 4f3ae28..c918dbb 100644
--- a/core/proto/android/server/biometrics.proto
+++ b/core/proto/android/server/biometrics.proto
@@ -120,18 +120,23 @@
 
     optional Modality modality = 2;
 
+    // The current strength (see {@link BiometricManager.Authenticators}) of this sensor, taking any
+    // downgraded strengths into effect. It may be different from the sensor's original strength but
+    // can never be stronger than that.
+    optional int32 current_strength = 3;
+
     // State of the sensor's scheduler.
-    optional BiometricSchedulerProto scheduler = 3;
+    optional BiometricSchedulerProto scheduler = 4;
 
     // User states for this sensor.
-    repeated UserStateProto user_states = 4;
+    repeated UserStateProto user_states = 5;
 
     // True if resetLockout requires a HAT to be verified in the TEE or equivalent.
-    optional bool reset_lockout_requires_hardware_auth_token = 5;
+    optional bool reset_lockout_requires_hardware_auth_token = 6;
 
     // True if a HAT is required (field above) AND a challenge needs to be generated by the
     // biometric TEE (or equivalent), and wrapped within the HAT.
-    optional bool reset_lockout_requires_challenge = 6;
+    optional bool reset_lockout_requires_challenge = 7;
 }
 
 // State of a specific user for a specific sensor.
diff --git a/services/core/java/com/android/server/biometrics/BiometricStrengthController.java b/services/core/java/com/android/server/biometrics/BiometricStrengthController.java
index c96a182..270621c 100644
--- a/services/core/java/com/android/server/biometrics/BiometricStrengthController.java
+++ b/services/core/java/com/android/server/biometrics/BiometricStrengthController.java
@@ -84,6 +84,8 @@
             final int id = sensor.id;
             if (idToStrength.containsKey(id)) {
                 final int newStrength = idToStrength.get(id);
+                Slog.d(TAG, "updateStrengths: update sensorId=" + id + " to newStrength="
+                        + newStrength);
                 sensor.updateStrength(newStrength);
             }
         }
diff --git a/services/core/java/com/android/server/biometrics/Utils.java b/services/core/java/com/android/server/biometrics/Utils.java
index f4cb387..996f0fd 100644
--- a/services/core/java/com/android/server/biometrics/Utils.java
+++ b/services/core/java/com/android/server/biometrics/Utils.java
@@ -411,6 +411,23 @@
     }
 
     /**
+     * Returns the sensor's current strength, taking any updated strengths into effect.
+     *
+     * @param sensorId The sensor Id
+     * @return see {@link BiometricManager.Authenticators}
+     */
+    public static @Authenticators.Types int getCurrentStrength(int sensorId) {
+        IBiometricService service = IBiometricService.Stub.asInterface(
+                ServiceManager.getService(Context.BIOMETRIC_SERVICE));
+        try {
+            return service.getCurrentStrength(sensorId);
+        } catch (RemoteException e) {
+            Slog.e(TAG, "RemoteException", e);
+            return Authenticators.EMPTY_SET;
+        }
+    }
+
+    /**
      * Checks if a client package matches Keyguard and can perform internal biometric operations.
      *
      * @param context The system context.
diff --git a/services/core/java/com/android/server/biometrics/sensors/face/aidl/Sensor.java b/services/core/java/com/android/server/biometrics/sensors/face/aidl/Sensor.java
index ee36775..2752ff4 100644
--- a/services/core/java/com/android/server/biometrics/sensors/face/aidl/Sensor.java
+++ b/services/core/java/com/android/server/biometrics/sensors/face/aidl/Sensor.java
@@ -546,6 +546,8 @@
 
         proto.write(SensorStateProto.SENSOR_ID, mSensorProperties.sensorId);
         proto.write(SensorStateProto.MODALITY, SensorStateProto.FACE);
+        proto.write(SensorStateProto.CURRENT_STRENGTH,
+                Utils.getCurrentStrength(mSensorProperties.sensorId));
         proto.write(SensorStateProto.SCHEDULER, mScheduler.dumpProtoState(clearSchedulerBuffer));
 
         for (UserInfo user : UserManager.get(mContext).getUsers()) {
diff --git a/services/core/java/com/android/server/biometrics/sensors/face/hidl/Face10.java b/services/core/java/com/android/server/biometrics/sensors/face/hidl/Face10.java
index 4ffbe06..5be70e7 100644
--- a/services/core/java/com/android/server/biometrics/sensors/face/hidl/Face10.java
+++ b/services/core/java/com/android/server/biometrics/sensors/face/hidl/Face10.java
@@ -792,6 +792,8 @@
 
         proto.write(SensorStateProto.SENSOR_ID, mSensorProperties.sensorId);
         proto.write(SensorStateProto.MODALITY, SensorStateProto.FACE);
+        proto.write(SensorStateProto.CURRENT_STRENGTH,
+                Utils.getCurrentStrength(mSensorProperties.sensorId));
         proto.write(SensorStateProto.SCHEDULER, mScheduler.dumpProtoState(clearSchedulerBuffer));
 
         for (UserInfo user : UserManager.get(mContext).getUsers()) {
diff --git a/services/core/java/com/android/server/biometrics/sensors/fingerprint/aidl/Sensor.java b/services/core/java/com/android/server/biometrics/sensors/fingerprint/aidl/Sensor.java
index 4862d849..94e5da4 100644
--- a/services/core/java/com/android/server/biometrics/sensors/fingerprint/aidl/Sensor.java
+++ b/services/core/java/com/android/server/biometrics/sensors/fingerprint/aidl/Sensor.java
@@ -526,6 +526,8 @@
 
         proto.write(SensorStateProto.SENSOR_ID, mSensorProperties.sensorId);
         proto.write(SensorStateProto.MODALITY, SensorStateProto.FINGERPRINT);
+        proto.write(SensorStateProto.CURRENT_STRENGTH,
+                Utils.getCurrentStrength(mSensorProperties.sensorId));
         proto.write(SensorStateProto.SCHEDULER, mScheduler.dumpProtoState(clearSchedulerBuffer));
 
         for (UserInfo user : UserManager.get(mContext).getUsers()) {
diff --git a/services/core/java/com/android/server/biometrics/sensors/fingerprint/hidl/Fingerprint21.java b/services/core/java/com/android/server/biometrics/sensors/fingerprint/hidl/Fingerprint21.java
index e149ca9..f5a7e80 100644
--- a/services/core/java/com/android/server/biometrics/sensors/fingerprint/hidl/Fingerprint21.java
+++ b/services/core/java/com/android/server/biometrics/sensors/fingerprint/hidl/Fingerprint21.java
@@ -753,6 +753,8 @@
 
         proto.write(SensorStateProto.SENSOR_ID, mSensorProperties.sensorId);
         proto.write(SensorStateProto.MODALITY, SensorStateProto.FINGERPRINT);
+        proto.write(SensorStateProto.CURRENT_STRENGTH,
+                Utils.getCurrentStrength(mSensorProperties.sensorId));
         proto.write(SensorStateProto.SCHEDULER, mScheduler.dumpProtoState(clearSchedulerBuffer));
 
         for (UserInfo user : UserManager.get(mContext).getUsers()) {