diff --git a/src/com/android/settings/applications/credentials/CredentialManagerPreferenceController.java b/src/com/android/settings/applications/credentials/CredentialManagerPreferenceController.java index b08bc616300..de06806a68b 100644 --- a/src/com/android/settings/applications/credentials/CredentialManagerPreferenceController.java +++ b/src/com/android/settings/applications/credentials/CredentialManagerPreferenceController.java @@ -95,6 +95,9 @@ public class CredentialManagerPreferenceController extends BasePreferenceControl private static final String ALTERNATE_INTENT = "android.settings.SYNC_SETTINGS"; private static final String PRIMARY_INTENT = "android.settings.CREDENTIAL_PROVIDER"; private static final int MAX_SELECTABLE_PROVIDERS = 5; + private static final String SETTINGS_ACTIVITY_INTENT_ACTION = "android.intent.action.MAIN"; + private static final String SETTINGS_ACTIVITY_INTENT_CATEGORY = + "android.intent.category.LAUNCHER"; private final PackageManager mPm; private final List mServices; @@ -481,13 +484,22 @@ public class CredentialManagerPreferenceController extends BasePreferenceControl continue; } + // Get the settings activity. + CharSequence settingsActivity = + combinedInfo.getCredentialProviderInfos().get(0).getSettingsActivity(); + Drawable icon = combinedInfo.getAppIcon(context, getUser()); CharSequence title = combinedInfo.getAppName(context); // Build the pref and add it to the output & group. CombiPreference pref = addProviderPreference( - context, title, icon, packageName, combinedInfo.getSettingsSubtitle()); + context, + title == null ? "" : title, + icon, + packageName, + combinedInfo.getSettingsSubtitle(), + settingsActivity); output.put(packageName, pref); group.addPreference(pref); } @@ -507,7 +519,8 @@ public class CredentialManagerPreferenceController extends BasePreferenceControl label == null ? "" : label, service.getServiceIcon(mContext), service.getServiceInfo().packageName, - service.getSettingsSubtitle()); + service.getSettingsSubtitle(), + service.getSettingsActivity()); } /** @@ -566,7 +579,8 @@ public class CredentialManagerPreferenceController extends BasePreferenceControl @NonNull CharSequence title, @Nullable Drawable icon, @NonNull String packageName, - @Nullable CharSequence subtitle) { + @Nullable CharSequence subtitle, + @Nullable CharSequence settingsActivity) { final CombiPreference pref = new CombiPreference(prefContext, mEnabledPackageNames.contains(packageName)); pref.setTitle(title); @@ -582,29 +596,73 @@ public class CredentialManagerPreferenceController extends BasePreferenceControl } pref.setPreferenceListener( - (p, isChecked) -> { - if (isChecked) { - if (mEnabledPackageNames.size() >= MAX_SELECTABLE_PROVIDERS) { - // Show the error if too many enabled. - pref.setChecked(false); - final DialogFragment fragment = newErrorDialogFragment(); + new CombiPreference.OnCombiPreferenceClickListener() { + @Override + public void onCheckChanged(CombiPreference p, boolean isChecked) { + if (isChecked) { + if (mEnabledPackageNames.size() >= MAX_SELECTABLE_PROVIDERS) { + // Show the error if too many enabled. + pref.setChecked(false); + final DialogFragment fragment = newErrorDialogFragment(); - if (fragment == null || mFragmentManager == null) { + if (fragment == null || mFragmentManager == null) { + return; + } + + fragment.show(mFragmentManager, ErrorDialogFragment.TAG); return; } - fragment.show(mFragmentManager, ErrorDialogFragment.TAG); + togglePackageNameEnabled(packageName); + + // Enable all prefs. + if (mPrefs.containsKey(packageName)) { + mPrefs.get(packageName).setChecked(true); + } + } else { + togglePackageNameDisabled(packageName); + } + } + + @Override + public void onLeftSideClicked() { + if (settingsActivity == null) { + Log.w(TAG, "settingsActivity was null"); return; } - togglePackageNameEnabled(packageName); - - // Enable all prefs. - if (mPrefs.containsKey(packageName)) { - mPrefs.get(packageName).setChecked(true); + String settingsActivityStr = String.valueOf(settingsActivity); + ComponentName cn = ComponentName.unflattenFromString(settingsActivityStr); + if (cn == null) { + Log.w( + TAG, + "Failed to deserialize settingsActivity attribute, we got: " + + settingsActivityStr); + return; } - } else { - togglePackageNameDisabled(packageName); + + Intent intent = new Intent(SETTINGS_ACTIVITY_INTENT_ACTION); + intent.addCategory(SETTINGS_ACTIVITY_INTENT_CATEGORY); + intent.setComponent(cn); + + Context context = mContext; + int currentUserId = getUser(); + int contextUserId = context.getUser().getIdentifier(); + + if (currentUserId != contextUserId) { + Log.d( + TAG, + "onLeftSideClicked(): using context for current user (" + + currentUserId + + ") instead of user " + + contextUserId + + " on headless system user mode"); + context = + context.createContextAsUser( + UserHandle.of(currentUserId), /* flags= */ 0); + } + + context.startActivity(intent); } }); @@ -920,6 +978,9 @@ public class CredentialManagerPreferenceController extends BasePreferenceControl public interface OnCombiPreferenceClickListener { /** Called when the check is updated */ void onCheckChanged(CombiPreference p, boolean isChecked); + + /** Called when the left side is clicked. */ + void onLeftSideClicked(); } public CombiPreference(Context context, boolean initialValue) { @@ -968,6 +1029,18 @@ public class CredentialManagerPreferenceController extends BasePreferenceControl // Store this for later. mSwitch = switchView; } + + super.setOnPreferenceClickListener( + new Preference.OnPreferenceClickListener() { + @Override + public boolean onPreferenceClick(Preference preference) { + if (mOnClickListener != null) { + mOnClickListener.onLeftSideClicked(); + } + + return true; + } + }); } } }