diff --git a/src/com/android/settings/applications/credentials/CredentialManagerPreferenceController.java b/src/com/android/settings/applications/credentials/CredentialManagerPreferenceController.java index 43c46474557..c627df3e198 100644 --- a/src/com/android/settings/applications/credentials/CredentialManagerPreferenceController.java +++ b/src/com/android/settings/applications/credentials/CredentialManagerPreferenceController.java @@ -41,6 +41,8 @@ import android.os.UserHandle; import android.provider.DeviceConfig; import android.provider.Settings; import android.text.TextUtils; +import com.android.settingslib.utils.ThreadUtils; +import com.android.internal.content.PackageMonitor; import android.util.IconDrawableFactory; import android.util.Log; @@ -236,20 +238,11 @@ public class CredentialManagerPreferenceController extends BasePreferenceControl @OnLifecycleEvent(ON_CREATE) void onCreate(LifecycleOwner lifecycleOwner) { - if (mCredentialManager == null) { - return; - } - - setAvailableServices( - lifecycleOwner, - mCredentialManager.getCredentialProviderServices( - getUser(), CredentialManager.PROVIDER_FILTER_USER_PROVIDERS_ONLY), - null); + update(); } @VisibleForTesting void setAvailableServices( - LifecycleOwner lifecycleOwner, List availableServices, String flagOverrideForTest) { mFlagOverrideForTest = flagOverrideForTest; @@ -642,6 +635,40 @@ public class CredentialManagerPreferenceController extends BasePreferenceControl void setActivityResult(int resultCode); } + /** + * Monitor coming and going credman services and calls {@link #update()} when necessary + */ + private final PackageMonitor mSettingsPackageMonitor = new PackageMonitor() { + @Override + public void onPackageAdded(String packageName, int uid) { + ThreadUtils.postOnMainThread(() -> update()); + } + + @Override + public void onPackageModified(String packageName) { + ThreadUtils.postOnMainThread(() -> update()); + } + + @Override + public void onPackageRemoved(String packageName, int uid) { + ThreadUtils.postOnMainThread(() -> update()); + } + }; + + /** + * 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 { diff --git a/tests/unit/src/com/android/settings/applications/credentials/CredentialManagerPreferenceControllerTest.java b/tests/unit/src/com/android/settings/applications/credentials/CredentialManagerPreferenceControllerTest.java index b02cf1c50b5..2a2aaee9494 100644 --- a/tests/unit/src/com/android/settings/applications/credentials/CredentialManagerPreferenceControllerTest.java +++ b/tests/unit/src/com/android/settings/applications/credentials/CredentialManagerPreferenceControllerTest.java @@ -484,7 +484,7 @@ public class CredentialManagerPreferenceControllerTest { CredentialManagerPreferenceController controller = new CredentialManagerPreferenceController( mContext, mCredentialsPreferenceCategory.getKey()); - controller.setAvailableServices(() -> mock(Lifecycle.class), availableServices, addServiceOverride); + controller.setAvailableServices(availableServices, addServiceOverride); controller.setDelegate(mDelegate); return controller; }