From 9884f1ccf47b63e4face96eca6209005bb35a601 Mon Sep 17 00:00:00 2001 From: Jerry Shi Date: Mon, 13 May 2024 23:45:54 -0700 Subject: [PATCH] Fix the issue the if primary provider is disabled by work admin, it should be removed from the settings' storage. Test: locally built and tested Bug: 337040395 Change-Id: Ic572cd87f571d93ee0e7fa29157172444c7c36ce --- .../DefaultCombinedPreferenceController.java | 34 +++++++++++++++++++ 1 file changed, 34 insertions(+) diff --git a/src/com/android/settings/applications/credentials/DefaultCombinedPreferenceController.java b/src/com/android/settings/applications/credentials/DefaultCombinedPreferenceController.java index fccd969bece..57cd1d2d8da 100644 --- a/src/com/android/settings/applications/credentials/DefaultCombinedPreferenceController.java +++ b/src/com/android/settings/applications/credentials/DefaultCombinedPreferenceController.java @@ -20,16 +20,20 @@ import android.content.Context; import android.content.Intent; import android.credentials.CredentialManager; import android.credentials.CredentialProviderInfo; +import android.credentials.SetEnabledProvidersException; import android.graphics.drawable.Drawable; +import android.os.OutcomeReceiver; import android.os.UserHandle; import android.provider.Settings; import android.service.autofill.AutofillService; import android.service.autofill.AutofillServiceInfo; import android.text.TextUtils; +import android.util.Log; import android.view.autofill.AutofillManager; import androidx.annotation.NonNull; import androidx.annotation.Nullable; +import androidx.core.content.ContextCompat; import androidx.preference.Preference; import com.android.internal.annotations.VisibleForTesting; @@ -41,6 +45,7 @@ import com.android.settingslib.widget.TwoTargetPreference; import java.util.ArrayList; import java.util.List; +import java.util.concurrent.Executor; public class DefaultCombinedPreferenceController extends DefaultAppPreferenceController { @@ -49,10 +54,12 @@ public class DefaultCombinedPreferenceController extends DefaultAppPreferenceCon private final AutofillManager mAutofillManager; private final CredentialManager mCredentialManager; + private final Executor mExecutor; public DefaultCombinedPreferenceController(Context context) { super(context); + mExecutor = ContextCompat.getMainExecutor(context); mAutofillManager = mContext.getSystemService(AutofillManager.class); if (CredentialManager.isServiceEnabled(context)) { @@ -158,6 +165,9 @@ public class DefaultCombinedPreferenceController extends DefaultAppPreferenceCon // Apply device admin restrictions to top provider. if (topProvider != null && topProvider.getDeviceAdminRestrictions(mContext, userId) != null) { + // This case means, the provider is blocked by device admin, but settings' storage has + // not be cleared correctly. So clean the storage here. + removePrimaryProvider(); return null; } @@ -209,4 +219,28 @@ public class DefaultCombinedPreferenceController extends DefaultAppPreferenceCon mContext.createContextAsUser(UserHandle.of(getUser()), /* flags= */ 0); return new Intent(context, CredentialsPickerActivity.class); } + + private void removePrimaryProvider() { + // Commit using the CredMan API. + if (mCredentialManager == null) { + return; + } + + mCredentialManager.setEnabledProviders( + List.of(), // empty primary provider. + List.of(), // empty enabled providers. + getUser(), + mExecutor, + new OutcomeReceiver() { + @Override + public void onResult(Void result) { + Log.i(TAG, "setEnabledProviders success"); + } + + @Override + public void onError(SetEnabledProvidersException e) { + Log.e(TAG, "setEnabledProviders error: " + e.toString()); + } + }); + } }