From 688b023d09a649bdf176f3cf00b781fe5f372634 Mon Sep 17 00:00:00 2001 From: Becca Hughes Date: Thu, 20 Apr 2023 16:04:22 +0000 Subject: [PATCH] DO NOT MERGE Listen for updates to autofill/credman provider The provider for both of these are in Settings and this will refresh the CredMan section of the page if either of these change. Test: make Bug: 278919696 Change-Id: Ia82c3533540e52aaa26a68e0a27f0e496728b87f --- ...CredentialManagerPreferenceController.java | 66 +++++++++++++++---- 1 file changed, 52 insertions(+), 14 deletions(-) diff --git a/src/com/android/settings/applications/credentials/CredentialManagerPreferenceController.java b/src/com/android/settings/applications/credentials/CredentialManagerPreferenceController.java index c627df3e198..58c5a2cbe0d 100644 --- a/src/com/android/settings/applications/credentials/CredentialManagerPreferenceController.java +++ b/src/com/android/settings/applications/credentials/CredentialManagerPreferenceController.java @@ -23,6 +23,7 @@ import android.annotation.Nullable; import android.app.Activity; import android.app.Dialog; import android.content.ComponentName; +import android.content.ContentResolver; import android.content.Context; import android.content.DialogInterface; import android.content.Intent; @@ -33,9 +34,11 @@ import android.content.res.Resources; import android.credentials.CredentialManager; import android.credentials.CredentialProviderInfo; import android.credentials.SetEnabledProvidersException; +import android.database.ContentObserver; import android.graphics.drawable.Drawable; import android.net.Uri; import android.os.Bundle; +import android.os.Handler; import android.os.OutcomeReceiver; import android.os.UserHandle; import android.provider.DeviceConfig; @@ -59,10 +62,12 @@ import androidx.preference.PreferenceScreen; import androidx.preference.SwitchPreference; import com.android.internal.annotations.VisibleForTesting; +import com.android.internal.content.PackageMonitor; import com.android.settings.R; import com.android.settings.Utils; import com.android.settings.core.BasePreferenceController; import com.android.settings.dashboard.DashboardFragment; +import com.android.settingslib.utils.ThreadUtils; import java.util.ArrayList; import java.util.HashMap; @@ -89,10 +94,12 @@ public class CredentialManagerPreferenceController extends BasePreferenceControl private final Executor mExecutor; private final Map mPrefs = new HashMap<>(); // key is package name private final List mPendingServiceInfos = new ArrayList<>(); + private final Handler mHandler = new Handler(); private @Nullable FragmentManager mFragmentManager = null; private @Nullable Delegate mDelegate = null; private @Nullable String mFlagOverrideForTest = null; + private @Nullable PreferenceScreen mPreferenceScreen = null; public CredentialManagerPreferenceController(Context context, String preferenceKey) { super(context, preferenceKey); @@ -103,6 +110,7 @@ public class CredentialManagerPreferenceController extends BasePreferenceControl mExecutor = ContextCompat.getMainExecutor(mContext); mCredentialManager = getCredentialManager(context, preferenceKey.equals("credentials_test")); + new SettingContentObserver(mHandler).register(context.getContentResolver()); } private @Nullable CredentialManager getCredentialManager(Context context, boolean isTest) { @@ -241,6 +249,25 @@ public class CredentialManagerPreferenceController extends BasePreferenceControl update(); } + private void update() { + if (mCredentialManager == null) { + return; + } + + setAvailableServices( + mCredentialManager.getCredentialProviderServices( + getUser(), CredentialManager.PROVIDER_FILTER_USER_PROVIDERS_ONLY), + null); + } + + private void updateFromExternal() { + update(); + + if (mPreferenceScreen != null) { + displayPreference(mPreferenceScreen); + } + } + @VisibleForTesting void setAvailableServices( List availableServices, @@ -276,6 +303,7 @@ public class CredentialManagerPreferenceController extends BasePreferenceControl // Since the UI is being cleared, clear any refs. mPrefs.clear(); + mPreferenceScreen = screen; PreferenceGroup group = screen.findPreference(getPreferenceKey()); Context context = screen.getContext(); mPrefs.putAll(buildPreferenceList(context, group)); @@ -655,20 +683,6 @@ public class CredentialManagerPreferenceController extends BasePreferenceControl } }; - /** - * Update the data in this UI. - */ - private void update() { - if (mCredentialManager == null) { - return; - } - - setAvailableServices( - mCredentialManager.getCredentialProviderServices( - getUser(), CredentialManager.PROVIDER_FILTER_USER_PROVIDERS_ONLY), - null); - } - /** Dialog fragment parent class. */ private abstract static class CredentialManagerDialogFragment extends DialogFragment implements DialogInterface.OnClickListener { @@ -790,4 +804,28 @@ public class CredentialManagerPreferenceController extends BasePreferenceControl getDialogHost().onDialogClick(which); } } + + /** Updates the list if setting content changes. */ + private final class SettingContentObserver extends ContentObserver { + + private final Uri mAutofillService = + Settings.Secure.getUriFor(Settings.Secure.AUTOFILL_SERVICE); + + private final Uri mCredentialService = + Settings.Secure.getUriFor(Settings.Secure.CREDENTIAL_SERVICE); + + public SettingContentObserver(Handler handler) { + super(handler); + } + + public void register(ContentResolver contentResolver) { + contentResolver.registerContentObserver(mAutofillService, false, this, getUser()); + contentResolver.registerContentObserver(mCredentialService, false, this, getUser()); + } + + @Override + public void onChange(boolean selfChange, Uri uri) { + updateFromExternal(); + } + } }