Trust the certificate after unlocking screenlock
When trust button is clicked, if ConfirmCredential (CC) is shown,
and user successfully unlock CC, trust the cert immediately
Bug: 28752364
Change-Id: Ied4aeda59a668a9dd2bf079a385b1fecd8eabb9e
diff --git a/src/com/android/settings/TrustedCredentialsDialogBuilder.java b/src/com/android/settings/TrustedCredentialsDialogBuilder.java
index 2508d8c..da557fe 100644
--- a/src/com/android/settings/TrustedCredentialsDialogBuilder.java
+++ b/src/com/android/settings/TrustedCredentialsDialogBuilder.java
@@ -38,12 +38,14 @@
import java.security.cert.X509Certificate;
import java.util.ArrayList;
import java.util.List;
+import java.util.function.IntConsumer;
class TrustedCredentialsDialogBuilder extends AlertDialog.Builder {
public interface DelegateInterface {
List<X509Certificate> getX509CertsFromCertHolder(CertHolder certHolder);
void removeOrInstallCert(CertHolder certHolder);
- boolean startConfirmCredentialIfNotConfirmed(int userId);
+ boolean startConfirmCredentialIfNotConfirmed(int userId,
+ IntConsumer onCredentialConfirmedListener);
}
private final DialogEventHandler mDialogEventHandler;
@@ -145,7 +147,8 @@
private void onClickTrust() {
CertHolder certHolder = getCurrentCertInfo();
- if (!mDelegate.startConfirmCredentialIfNotConfirmed(certHolder.getUserId())) {
+ if (!mDelegate.startConfirmCredentialIfNotConfirmed(certHolder.getUserId(),
+ this::onCredentialConfirmed)) {
mDpm.approveCaCert(certHolder.getAlias(), certHolder.getUserId(), true);
nextOrDismiss();
}
@@ -168,6 +171,14 @@
.show();
}
+ private void onCredentialConfirmed(int userId) {
+ if (mDialog.isShowing() && mNeedsApproval && getCurrentCertInfo() != null
+ && getCurrentCertInfo().getUserId() == userId) {
+ // Treat it as user just clicks "trust" for this cert
+ onClickTrust();
+ }
+ }
+
private CertHolder getCurrentCertInfo() {
return mCurrentCertIndex < mCertHolders.length ? mCertHolders[mCurrentCertIndex] : null;
}
diff --git a/src/com/android/settings/TrustedCredentialsSettings.java b/src/com/android/settings/TrustedCredentialsSettings.java
index 4100e75..92b7f6b 100644
--- a/src/com/android/settings/TrustedCredentialsSettings.java
+++ b/src/com/android/settings/TrustedCredentialsSettings.java
@@ -68,6 +68,7 @@
import java.util.Collections;
import java.util.List;
import java.util.Set;
+import java.util.function.IntConsumer;
public class TrustedCredentialsSettings extends OptionsMenuFragment
implements TrustedCredentialsDialogBuilder.DelegateInterface {
@@ -159,6 +160,7 @@
private AliasOperation mAliasOperation;
private ArraySet<Integer> mConfirmedCredentialUsers;
private int mConfirmingCredentialUser;
+ private IntConsumer mConfirmingCredentialListener;
private Set<AdapterData.AliasLoader> mAliasLoaders = new ArraySet<AdapterData.AliasLoader>(2);
private final SparseArray<KeyChainConnection>
mKeyChainConnectionByProfileId = new SparseArray<KeyChainConnection>();
@@ -199,6 +201,8 @@
}
}
+ mConfirmingCredentialListener = null;
+
IntentFilter filter = new IntentFilter();
filter.addAction(Intent.ACTION_MANAGED_PROFILE_AVAILABLE);
filter.addAction(Intent.ACTION_MANAGED_PROFILE_UNAVAILABLE);
@@ -246,10 +250,18 @@
@Override
public void onActivityResult(int requestCode, int resultCode, Intent data) {
if (requestCode == REQUEST_CONFIRM_CREDENTIALS) {
- if (resultCode == Activity.RESULT_OK) {
- mConfirmedCredentialUsers.add(mConfirmingCredentialUser);
- }
+ int userId = mConfirmingCredentialUser;
+ IntConsumer listener = mConfirmingCredentialListener;
+ // reset them before calling the listener because the listener may call back to start
+ // activity again. (though it should never happen.)
mConfirmingCredentialUser = UserHandle.USER_NULL;
+ mConfirmingCredentialListener = null;
+ if (resultCode == Activity.RESULT_OK) {
+ mConfirmedCredentialUsers.add(userId);
+ if (listener != null) {
+ listener.accept(userId);
+ }
+ }
}
}
@@ -942,12 +954,18 @@
}
@Override
- public boolean startConfirmCredentialIfNotConfirmed(int userId) {
+ public boolean startConfirmCredentialIfNotConfirmed(int userId,
+ IntConsumer onCredentialConfirmedListener) {
if (mConfirmedCredentialUsers.contains(userId)) {
// Credential has been confirmed. Don't start activity.
return false;
}
- return startConfirmCredential(userId);
+
+ boolean result = startConfirmCredential(userId);
+ if (result) {
+ mConfirmingCredentialListener = onCredentialConfirmedListener;
+ }
+ return result;
}
private class AliasOperation extends AsyncTask<Void, Void, Boolean> {