[DO NOT MERGE] Handling power press messages sent from the HAL

Test: Manually checked behavior when power is pressed for:
Biometric Prompt: an error is shown
Keyguard authentication: nothing happens
Fingerprint Enrollment: an acquired message is displayed
atest FingerprintAuthenticationClientTest FingerprintEnrollClientTest
Bug: 265202141

Change-Id: I842115fae9f25387c7d8d5b494336b3fe10c2cb0
Merged-in: I842115fae9f25387c7d8d5b494336b3fe10c2cb0
This commit is contained in:
Diya Bera
2023-02-10 19:13:56 +00:00
parent 7c1e07e54c
commit 49d9706fa2
6 changed files with 61 additions and 12 deletions

View File

@@ -6084,6 +6084,12 @@
different from the home screen wallpaper. -->
<bool name="config_independentLockscreenLiveWallpaper">false</bool>
<!-- Whether the vendor power press code need to be mapped. -->
<bool name="config_powerPressMapping">false</bool>
<!-- Power press vendor code. -->
<integer name="config_powerPressCode">-1</integer>
<!-- Whether to show weather on the lock screen by default. -->
<bool name="config_lockscreenWeatherEnabledByDefault">false</bool>
</resources>

View File

@@ -2655,6 +2655,8 @@
<java-symbol type="integer" name="config_sideFpsToastTimeout"/>
<java-symbol type="integer" name="config_sidefpsSkipWaitForPowerAcquireMessage"/>
<java-symbol type="integer" name="config_sidefpsSkipWaitForPowerVendorAcquireMessage"/>
<java-symbol type="integer" name="config_powerPressCode"/>
<java-symbol type="bool" name="config_powerPressMapping"/>
<!-- Clickable toast used during sidefps enrollment -->
<java-symbol type="layout" name="side_fps_toast" />

View File

@@ -228,7 +228,16 @@ class FingerprintAuthenticationClient extends AuthenticationClient<AidlSession>
@Override
public void onError(int errorCode, int vendorCode) {
super.onError(errorCode, vendorCode);
if (getContext().getResources().getBoolean(R.bool.config_powerPressMapping)
&& errorCode == BiometricFingerprintConstants.FINGERPRINT_ERROR_VENDOR
&& vendorCode == getContext().getResources()
.getInteger(R.integer.config_powerPressCode)) {
// Translating vendor code to internal code
super.onError(BiometricFingerprintConstants.BIOMETRIC_ERROR_POWER_PRESSED,
0 /* vendorCode */);
} else {
super.onError(errorCode, vendorCode);
}
if (errorCode == BiometricFingerprintConstants.FINGERPRINT_ERROR_BAD_CALIBRATION) {
BiometricNotificationUtils.showBadCalibrationNotification(getContext());

View File

@@ -37,6 +37,7 @@ import android.os.RemoteException;
import android.util.Slog;
import android.view.accessibility.AccessibilityManager;
import com.android.internal.R;
import com.android.server.biometrics.HardwareAuthTokenUtils;
import com.android.server.biometrics.log.BiometricContext;
import com.android.server.biometrics.log.BiometricLogger;
@@ -143,7 +144,17 @@ class FingerprintEnrollClient extends EnrollClient<AidlSession> implements Udfps
}
});
mCallback.onBiometricAction(BiometricStateListener.ACTION_SENSOR_TOUCH);
super.onAcquired(acquiredInfo, vendorCode);
if (getContext().getResources().getBoolean(R.bool.config_powerPressMapping)
&& acquiredInfo == BiometricFingerprintConstants.FINGERPRINT_ACQUIRED_VENDOR
&& vendorCode == getContext().getResources()
.getInteger(R.integer.config_powerPressCode)) {
// Translating vendor code to internal code
super.onAcquired(BiometricFingerprintConstants.FINGERPRINT_ACQUIRED_POWER_PRESSED,
0 /* vendorCode */);
} else {
super.onAcquired(acquiredInfo, vendorCode);
}
}
@Override
@@ -270,8 +281,5 @@ class FingerprintEnrollClient extends EnrollClient<AidlSession> implements Udfps
}
@Override
public void onPowerPressed() {
onAcquired(BiometricFingerprintConstants.FINGERPRINT_ACQUIRED_POWER_PRESSED,
0 /* vendorCode */);
}
public void onPowerPressed() {}
}

View File

@@ -16,6 +16,8 @@
package com.android.server.biometrics.sensors.fingerprint.aidl;
import static android.hardware.biometrics.BiometricFingerprintConstants.FINGERPRINT_ERROR_VENDOR;
import static com.google.common.truth.Truth.assertThat;
import static org.mockito.ArgumentMatchers.anyBoolean;
@@ -35,6 +37,7 @@ import static org.mockito.Mockito.when;
import android.app.ActivityManager;
import android.app.ActivityTaskManager;
import android.content.ComponentName;
import android.hardware.biometrics.BiometricFingerprintConstants;
import android.hardware.biometrics.BiometricManager;
import android.hardware.biometrics.common.ICancellationSignal;
import android.hardware.biometrics.common.OperationContext;
@@ -54,6 +57,7 @@ import android.testing.TestableContext;
import androidx.test.filters.SmallTest;
import androidx.test.platform.app.InstrumentationRegistry;
import com.android.internal.R;
import com.android.server.biometrics.log.BiometricContext;
import com.android.server.biometrics.log.BiometricLogger;
import com.android.server.biometrics.log.CallbackWithProbe;
@@ -335,6 +339,21 @@ public class FingerprintAuthenticationClientTest {
showHideOverlay(c -> c.onLockoutPermanent());
}
@Test
public void testPowerPressForwardsErrorMessage() throws RemoteException {
final FingerprintAuthenticationClient client = createClient();
final int testVendorPowerPressCode = 1;
when(mContext.getOrCreateTestableResources().getResources()
.getBoolean(R.bool.config_powerPressMapping)).thenReturn(true);
when(mContext.getOrCreateTestableResources().getResources()
.getInteger(R.integer.config_powerPressCode)).thenReturn(testVendorPowerPressCode);
client.onError(FINGERPRINT_ERROR_VENDOR, testVendorPowerPressCode);
verify(mClientMonitorCallbackConverter).onError(anyInt(), anyInt(),
eq(BiometricFingerprintConstants.BIOMETRIC_ERROR_POWER_PRESSED), anyInt());
}
private void showHideOverlay(Consumer<FingerprintAuthenticationClient> block)
throws RemoteException {
final FingerprintAuthenticationClient client = createClient();

View File

@@ -16,7 +16,7 @@
package com.android.server.biometrics.sensors.fingerprint.aidl;
import static android.hardware.biometrics.BiometricFingerprintConstants.FINGERPRINT_ACQUIRED_POWER_PRESSED;
import static android.hardware.biometrics.BiometricFingerprintConstants.FINGERPRINT_ACQUIRED_VENDOR;
import static com.google.common.truth.Truth.assertThat;
@@ -28,10 +28,10 @@ import static org.mockito.Mockito.any;
import static org.mockito.Mockito.inOrder;
import static org.mockito.Mockito.never;
import static org.mockito.Mockito.same;
import static org.mockito.Mockito.times;
import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.when;
import android.hardware.biometrics.BiometricFingerprintConstants;
import android.hardware.biometrics.common.OperationContext;
import android.hardware.biometrics.fingerprint.ISession;
import android.hardware.biometrics.fingerprint.PointerContext;
@@ -48,6 +48,7 @@ import android.testing.TestableContext;
import androidx.test.filters.SmallTest;
import androidx.test.platform.app.InstrumentationRegistry;
import com.android.internal.R;
import com.android.server.biometrics.log.BiometricContext;
import com.android.server.biometrics.log.BiometricLogger;
import com.android.server.biometrics.log.CallbackWithProbe;
@@ -66,7 +67,6 @@ import org.mockito.Mock;
import org.mockito.junit.MockitoJUnit;
import org.mockito.junit.MockitoRule;
import java.util.ArrayList;
import java.util.function.Consumer;
@Presubmit
@@ -258,11 +258,16 @@ public class FingerprintEnrollClientTest {
@Test
public void testPowerPressForwardsAcquireMessage() throws RemoteException {
final FingerprintEnrollClient client = createClient();
client.start(mCallback);
client.onPowerPressed();
final int testVendorPowerPressCode = 1;
when(mContext.getOrCreateTestableResources().getResources()
.getBoolean(R.bool.config_powerPressMapping)).thenReturn(true);
when(mContext.getOrCreateTestableResources().getResources()
.getInteger(R.integer.config_powerPressCode)).thenReturn(testVendorPowerPressCode);
client.onAcquired(FINGERPRINT_ACQUIRED_VENDOR, testVendorPowerPressCode);
verify(mClientMonitorCallbackConverter).onAcquired(anyInt(),
eq(FINGERPRINT_ACQUIRED_POWER_PRESSED), anyInt());
eq(BiometricFingerprintConstants.FINGERPRINT_ACQUIRED_POWER_PRESSED), anyInt());
}
private void showHideOverlay(Consumer<FingerprintEnrollClient> block)