Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit ccbe3cea authored by Becca Hughes's avatar Becca Hughes Committed by Android (Google) Code Review
Browse files

Merge "Add support for settingsActivity in settings" into main

parents a9b979c7 fa040ab3
Loading
Loading
Loading
Loading
+91 −18
Original line number Diff line number Diff line
@@ -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<CredentialProviderInfo> 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,7 +596,9 @@ public class CredentialManagerPreferenceController extends BasePreferenceControl
        }

        pref.setPreferenceListener(
                (p, isChecked) -> {
                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.
@@ -606,6 +622,48 @@ public class CredentialManagerPreferenceController extends BasePreferenceControl
                        } else {
                            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;
@@ -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;
                        }
                    });
        }
    }
}