Merge "Add support for settingsActivity in settings" into main
This commit is contained in:
@@ -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,29 +596,73 @@ public class CredentialManagerPreferenceController extends BasePreferenceControl
|
|||||||
}
|
}
|
||||||
|
|
||||||
pref.setPreferenceListener(
|
pref.setPreferenceListener(
|
||||||
(p, isChecked) -> {
|
new CombiPreference.OnCombiPreferenceClickListener() {
|
||||||
if (isChecked) {
|
@Override
|
||||||
if (mEnabledPackageNames.size() >= MAX_SELECTABLE_PROVIDERS) {
|
public void onCheckChanged(CombiPreference p, boolean isChecked) {
|
||||||
// Show the error if too many enabled.
|
if (isChecked) {
|
||||||
pref.setChecked(false);
|
if (mEnabledPackageNames.size() >= MAX_SELECTABLE_PROVIDERS) {
|
||||||
final DialogFragment fragment = newErrorDialogFragment();
|
// 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;
|
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;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
togglePackageNameEnabled(packageName);
|
String settingsActivityStr = String.valueOf(settingsActivity);
|
||||||
|
ComponentName cn = ComponentName.unflattenFromString(settingsActivityStr);
|
||||||
// Enable all prefs.
|
if (cn == null) {
|
||||||
if (mPrefs.containsKey(packageName)) {
|
Log.w(
|
||||||
mPrefs.get(packageName).setChecked(true);
|
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 {
|
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;
|
||||||
|
}
|
||||||
|
});
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
Reference in New Issue
Block a user