Fix: CTS Verifier app crashes Fingerprint Bound keys Test
The CTS Verifier app crashes due to using a non static
member class as fragment. It is impossible to recover the
state of the fragment upon configuration change. This was
never a problem for the Fingerprint Bound Keys Test because
it handles configuration changes and is not recreated.
However, as of SDK version N_MR1 a check was introduced
that checks the condition before it leads to problems
causing this crash.
This patch makes the FingerprintAuthDialogFragment a static
member class to fix the issue.
Also makes the
managedprovisioning.AuthenticationBoundKeyTestActivity
handle config events. Thost would crash the test as well.
Bug: 63066872
Test: Install and run CtsVerifier then perform the
"Fingerprint Bound Keys Test"
Change-Id: I07aa9936cbb39efc9ea1942eb2758a0cb4c6919e
diff --git a/apps/CtsVerifier/AndroidManifest.xml b/apps/CtsVerifier/AndroidManifest.xml
index 18a8764..df617d3 100644
--- a/apps/CtsVerifier/AndroidManifest.xml
+++ b/apps/CtsVerifier/AndroidManifest.xml
@@ -2409,7 +2409,8 @@
</intent-filter>
</service>
- <activity android:name=".managedprovisioning.AuthenticationBoundKeyTestActivity">
+ <activity android:name=".managedprovisioning.AuthenticationBoundKeyTestActivity"
+ android:configChanges="keyboardHidden|orientation|screenSize">
<intent-filter>
<action android:name="com.android.cts.verifier.managedprovisioning.action.AUTH_BOUND_KEY_TEST" />
<category android:name="android.intent.category.DEFAULT" />
diff --git a/apps/CtsVerifier/src/com/android/cts/verifier/managedprovisioning/AuthenticationBoundKeyTestActivity.java b/apps/CtsVerifier/src/com/android/cts/verifier/managedprovisioning/AuthenticationBoundKeyTestActivity.java
index 7b6c696..f404d2f 100644
--- a/apps/CtsVerifier/src/com/android/cts/verifier/managedprovisioning/AuthenticationBoundKeyTestActivity.java
+++ b/apps/CtsVerifier/src/com/android/cts/verifier/managedprovisioning/AuthenticationBoundKeyTestActivity.java
@@ -6,6 +6,7 @@
import android.app.Dialog;
import android.app.DialogFragment;
import android.app.KeyguardManager;
+import android.content.Context;
import android.content.DialogInterface;
import android.content.Intent;
import android.hardware.fingerprint.FingerprintManager;
@@ -162,8 +163,8 @@
}
};
adapter.add(mLockScreenBoundKeyTest);
-
if (mFingerprintSupported) {
+ AuthenticationBoundKeyTestActivity that = this;
mFingerprintBoundKeyTest = new DialogTestListItem(this,
R.string.provisioning_byod_fingerprint_bound_key,
"BYOD_FingerprintBoundKeyTest") {
@@ -177,8 +178,10 @@
showToast("Test failed. Key accessible without auth.");
setTestResult(mFingerprintBoundKeyTest, TestResult.TEST_RESULT_FAILED);
} else {
- new FingerprintAuthDialogFragment().show(getFragmentManager(),
- "fingerprint_dialog");
+ FingerprintAuthDialogFragment fadf =
+ new FingerprintAuthDialogFragment();
+ fadf.setActivity(that);
+ fadf.show(getFragmentManager(),"fingerprint_dialog");
}
}
}
@@ -324,9 +327,11 @@
Toast.makeText(this, message, Toast.LENGTH_LONG).show();
}
- public class FingerprintAuthDialogFragment extends DialogFragment {
+ static public class FingerprintAuthDialogFragment extends DialogFragment {
+ private AuthenticationBoundKeyTestActivity mActivity;
private CancellationSignal mCancellationSignal;
+ private FingerprintManager mFingerprintManager;
private FingerprintManagerCallback mFingerprintManagerCallback;
private boolean mSelfCancelled;
@@ -350,12 +355,14 @@
@Override
public void onAuthenticationSucceeded(FingerprintManager.AuthenticationResult result) {
- if (tryEncryptWithFingerprintKey(mFingerprintCipher)) {
+ if (mActivity.tryEncryptWithFingerprintKey(mActivity.mFingerprintCipher)) {
showToast("Test passed.");
- setTestResult(mFingerprintBoundKeyTest, TestResult.TEST_RESULT_PASSED);
+ mActivity.setTestResult(mActivity.mFingerprintBoundKeyTest,
+ TestResult.TEST_RESULT_PASSED);
} else {
showToast("Test failed. Key not accessible after auth");
- setTestResult(mFingerprintBoundKeyTest, TestResult.TEST_RESULT_FAILED);
+ mActivity.setTestResult(mActivity.mFingerprintBoundKeyTest,
+ TestResult.TEST_RESULT_FAILED);
}
FingerprintAuthDialogFragment.this.dismiss();
}
@@ -367,12 +374,25 @@
mSelfCancelled = true;
}
+ private void setActivity(AuthenticationBoundKeyTestActivity activity) {
+ mActivity = activity;
+ }
+
+ private void showToast(String message) {
+ Toast.makeText(getContext(), message, Toast.LENGTH_LONG)
+ .show();
+ }
+
+
@Override
public Dialog onCreateDialog(Bundle savedInstanceState) {
mCancellationSignal = new CancellationSignal();
mSelfCancelled = false;
+ mFingerprintManager =
+ (FingerprintManager) getContext().getSystemService(Context.FINGERPRINT_SERVICE);
mFingerprintManagerCallback = new FingerprintManagerCallback();
- mFingerprintManager.authenticate(new FingerprintManager.CryptoObject(mFingerprintCipher),
+ mFingerprintManager.authenticate(
+ new FingerprintManager.CryptoObject(mActivity.mFingerprintCipher),
mCancellationSignal, 0, mFingerprintManagerCallback, null);
AlertDialog.Builder builder = new AlertDialog.Builder(getActivity());
builder.setMessage(R.string.sec_fp_dialog_message);