Merge "Add support for settingsActivity in settings" into main

This commit is contained in:
Becca Hughes
2023-10-12 19:19:55 +00:00
committed by Android (Google) Code Review

View File

@@ -95,6 +95,9 @@ public class CredentialManagerPreferenceController extends BasePreferenceControl
private static final String ALTERNATE_INTENT = "android.settings.SYNC_SETTINGS"; private static final String ALTERNATE_INTENT = "android.settings.SYNC_SETTINGS";
private static final String PRIMARY_INTENT = "android.settings.CREDENTIAL_PROVIDER"; private static final String PRIMARY_INTENT = "android.settings.CREDENTIAL_PROVIDER";
private static final int MAX_SELECTABLE_PROVIDERS = 5; 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 PackageManager mPm;
private final List<CredentialProviderInfo> mServices; private final List<CredentialProviderInfo> mServices;
@@ -481,13 +484,22 @@ public class CredentialManagerPreferenceController extends BasePreferenceControl
continue; continue;
} }
// Get the settings activity.
CharSequence settingsActivity =
combinedInfo.getCredentialProviderInfos().get(0).getSettingsActivity();
Drawable icon = combinedInfo.getAppIcon(context, getUser()); Drawable icon = combinedInfo.getAppIcon(context, getUser());
CharSequence title = combinedInfo.getAppName(context); CharSequence title = combinedInfo.getAppName(context);
// Build the pref and add it to the output & group. // Build the pref and add it to the output & group.
CombiPreference pref = CombiPreference pref =
addProviderPreference( addProviderPreference(
context, title, icon, packageName, combinedInfo.getSettingsSubtitle()); context,
title == null ? "" : title,
icon,
packageName,
combinedInfo.getSettingsSubtitle(),
settingsActivity);
output.put(packageName, pref); output.put(packageName, pref);
group.addPreference(pref); group.addPreference(pref);
} }
@@ -507,7 +519,8 @@ public class CredentialManagerPreferenceController extends BasePreferenceControl
label == null ? "" : label, label == null ? "" : label,
service.getServiceIcon(mContext), service.getServiceIcon(mContext),
service.getServiceInfo().packageName, service.getServiceInfo().packageName,
service.getSettingsSubtitle()); service.getSettingsSubtitle(),
service.getSettingsActivity());
} }
/** /**
@@ -566,7 +579,8 @@ public class CredentialManagerPreferenceController extends BasePreferenceControl
@NonNull CharSequence title, @NonNull CharSequence title,
@Nullable Drawable icon, @Nullable Drawable icon,
@NonNull String packageName, @NonNull String packageName,
@Nullable CharSequence subtitle) { @Nullable CharSequence subtitle,
@Nullable CharSequence settingsActivity) {
final CombiPreference pref = final CombiPreference pref =
new CombiPreference(prefContext, mEnabledPackageNames.contains(packageName)); new CombiPreference(prefContext, mEnabledPackageNames.contains(packageName));
pref.setTitle(title); pref.setTitle(title);
@@ -582,7 +596,9 @@ public class CredentialManagerPreferenceController extends BasePreferenceControl
} }
pref.setPreferenceListener( pref.setPreferenceListener(
(p, isChecked) -> { new CombiPreference.OnCombiPreferenceClickListener() {
@Override
public void onCheckChanged(CombiPreference p, boolean isChecked) {
if (isChecked) { if (isChecked) {
if (mEnabledPackageNames.size() >= MAX_SELECTABLE_PROVIDERS) { if (mEnabledPackageNames.size() >= MAX_SELECTABLE_PROVIDERS) {
// Show the error if too many enabled. // Show the error if too many enabled.
@@ -606,6 +622,48 @@ public class CredentialManagerPreferenceController extends BasePreferenceControl
} else { } else {
togglePackageNameDisabled(packageName); togglePackageNameDisabled(packageName);
} }
}
@Override
public void onLeftSideClicked() {
if (settingsActivity == null) {
Log.w(TAG, "settingsActivity was null");
return;
}
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;
}
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);
}
}); });
return pref; return pref;
@@ -920,6 +978,9 @@ public class CredentialManagerPreferenceController extends BasePreferenceControl
public interface OnCombiPreferenceClickListener { public interface OnCombiPreferenceClickListener {
/** Called when the check is updated */ /** Called when the check is updated */
void onCheckChanged(CombiPreference p, boolean isChecked); void onCheckChanged(CombiPreference p, boolean isChecked);
/** Called when the left side is clicked. */
void onLeftSideClicked();
} }
public CombiPreference(Context context, boolean initialValue) { public CombiPreference(Context context, boolean initialValue) {
@@ -968,6 +1029,18 @@ public class CredentialManagerPreferenceController extends BasePreferenceControl
// Store this for later. // Store this for later.
mSwitch = switchView; mSwitch = switchView;
} }
super.setOnPreferenceClickListener(
new Preference.OnPreferenceClickListener() {
@Override
public boolean onPreferenceClick(Preference preference) {
if (mOnClickListener != null) {
mOnClickListener.onLeftSideClicked();
}
return true;
}
});
} }
} }
} }