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

Commit 99cd0f36 authored by Guangjie (Jerry) Shi's avatar Guangjie (Jerry) Shi Committed by Automerger Merge Worker
Browse files

Merge "Support setting primary provider" into udc-dev am: d07c89db am: 23c6f5e3

parents fd6bdb3a 23c6f5e3
Loading
Loading
Loading
Loading
+8 −1
Original line number Original line Diff line number Diff line
@@ -355,7 +355,11 @@ public final class CredentialManager {
     * Sets a list of all user configurable credential providers registered on the system. This API
     * Sets a list of all user configurable credential providers registered on the system. This API
     * is intended for settings apps.
     * is intended for settings apps.
     *
     *
     * @param providers the list of enabled providers
     * @param primaryProviders the primary providers that user selected for saving credentials. In
     *                         the most case, there should be only one primary provider, However,
     *                         if there are more than one CredentialProviderService in the same APK,
     *                         they should be passed in altogether.
     * @param providers the list of enabled providers.
     * @param userId the user ID to configure credential manager for
     * @param userId the user ID to configure credential manager for
     * @param executor the callback will take place on this {@link Executor}
     * @param executor the callback will take place on this {@link Executor}
     * @param callback the callback invoked when the request succeeds or fails
     * @param callback the callback invoked when the request succeeds or fails
@@ -363,6 +367,7 @@ public final class CredentialManager {
     */
     */
    @RequiresPermission(android.Manifest.permission.WRITE_SECURE_SETTINGS)
    @RequiresPermission(android.Manifest.permission.WRITE_SECURE_SETTINGS)
    public void setEnabledProviders(
    public void setEnabledProviders(
            @NonNull List<String> primaryProviders,
            @NonNull List<String> providers,
            @NonNull List<String> providers,
            int userId,
            int userId,
            @CallbackExecutor @NonNull Executor executor,
            @CallbackExecutor @NonNull Executor executor,
@@ -370,9 +375,11 @@ public final class CredentialManager {
        requireNonNull(executor, "executor must not be null");
        requireNonNull(executor, "executor must not be null");
        requireNonNull(callback, "callback must not be null");
        requireNonNull(callback, "callback must not be null");
        requireNonNull(providers, "providers must not be null");
        requireNonNull(providers, "providers must not be null");
        requireNonNull(primaryProviders, "primaryProviders must not be null");


        try {
        try {
            mService.setEnabledProviders(
            mService.setEnabledProviders(
                    primaryProviders,
                    providers, userId, new SetEnabledProvidersTransport(executor, callback));
                    providers, userId, new SetEnabledProvidersTransport(executor, callback));
        } catch (RemoteException e) {
        } catch (RemoteException e) {
            e.rethrowFromSystemServer();
            e.rethrowFromSystemServer();
+31 −0
Original line number Original line Diff line number Diff line
@@ -46,6 +46,7 @@ public final class CredentialProviderInfo implements Parcelable {
    @Nullable private CharSequence mSettingsSubtitle = null;
    @Nullable private CharSequence mSettingsSubtitle = null;
    private final boolean mIsSystemProvider;
    private final boolean mIsSystemProvider;
    private final boolean mIsEnabled;
    private final boolean mIsEnabled;
    private final boolean mIsPrimary;


    /**
    /**
     * Constructs an information instance of the credential provider.
     * Constructs an information instance of the credential provider.
@@ -58,6 +59,7 @@ public final class CredentialProviderInfo implements Parcelable {
        mIsSystemProvider = builder.mIsSystemProvider;
        mIsSystemProvider = builder.mIsSystemProvider;
        mSettingsSubtitle = builder.mSettingsSubtitle;
        mSettingsSubtitle = builder.mSettingsSubtitle;
        mIsEnabled = builder.mIsEnabled;
        mIsEnabled = builder.mIsEnabled;
        mIsPrimary = builder.mIsPrimary;
        mOverrideLabel = builder.mOverrideLabel;
        mOverrideLabel = builder.mOverrideLabel;
    }
    }


@@ -108,6 +110,15 @@ public final class CredentialProviderInfo implements Parcelable {
        return mIsEnabled;
        return mIsEnabled;
    }
    }


    /**
     * Returns whether the provider is set as primary by the user.
     *
     * @hide
     */
    public boolean isPrimary() {
        return mIsPrimary;
    }

    /** Returns the settings subtitle. */
    /** Returns the settings subtitle. */
    @Nullable
    @Nullable
    public CharSequence getSettingsSubtitle() {
    public CharSequence getSettingsSubtitle() {
@@ -125,6 +136,7 @@ public final class CredentialProviderInfo implements Parcelable {
        dest.writeTypedObject(mServiceInfo, flags);
        dest.writeTypedObject(mServiceInfo, flags);
        dest.writeBoolean(mIsSystemProvider);
        dest.writeBoolean(mIsSystemProvider);
        dest.writeBoolean(mIsEnabled);
        dest.writeBoolean(mIsEnabled);
        dest.writeBoolean(mIsPrimary);
        TextUtils.writeToParcel(mOverrideLabel, dest, flags);
        TextUtils.writeToParcel(mOverrideLabel, dest, flags);
        TextUtils.writeToParcel(mSettingsSubtitle, dest, flags);
        TextUtils.writeToParcel(mSettingsSubtitle, dest, flags);


@@ -149,6 +161,9 @@ public final class CredentialProviderInfo implements Parcelable {
                + "isEnabled="
                + "isEnabled="
                + mIsEnabled
                + mIsEnabled
                + ", "
                + ", "
                + "isPrimary="
                + mIsPrimary
                + ", "
                + "overrideLabel="
                + "overrideLabel="
                + mOverrideLabel
                + mOverrideLabel
                + ", "
                + ", "
@@ -164,6 +179,7 @@ public final class CredentialProviderInfo implements Parcelable {
        mServiceInfo = in.readTypedObject(ServiceInfo.CREATOR);
        mServiceInfo = in.readTypedObject(ServiceInfo.CREATOR);
        mIsSystemProvider = in.readBoolean();
        mIsSystemProvider = in.readBoolean();
        mIsEnabled = in.readBoolean();
        mIsEnabled = in.readBoolean();
        mIsPrimary = in.readBoolean();
        mOverrideLabel = TextUtils.CHAR_SEQUENCE_CREATOR.createFromParcel(in);
        mOverrideLabel = TextUtils.CHAR_SEQUENCE_CREATOR.createFromParcel(in);
        mSettingsSubtitle = TextUtils.CHAR_SEQUENCE_CREATOR.createFromParcel(in);
        mSettingsSubtitle = TextUtils.CHAR_SEQUENCE_CREATOR.createFromParcel(in);


@@ -193,6 +209,7 @@ public final class CredentialProviderInfo implements Parcelable {
        private boolean mIsSystemProvider = false;
        private boolean mIsSystemProvider = false;
        @Nullable private CharSequence mSettingsSubtitle = null;
        @Nullable private CharSequence mSettingsSubtitle = null;
        private boolean mIsEnabled = false;
        private boolean mIsEnabled = false;
        private boolean mIsPrimary = false;
        @Nullable private CharSequence mOverrideLabel = null;
        @Nullable private CharSequence mOverrideLabel = null;


        /**
        /**
@@ -248,6 +265,20 @@ public final class CredentialProviderInfo implements Parcelable {
            return this;
            return this;
        }
        }


        /**
         * Sets whether it is set as primary by the user.
         *
         * <p>Primary provider will be used for saving credentials by default. In most cases, there
         * should only one primary provider exist. However, if there are multiple credential
         * providers exist in the same package, all of them will be marked as primary.
         *
         * @hide
         */
        public @NonNull Builder setPrimary(boolean isPrimary) {
            mIsPrimary = isPrimary;
            return this;
        }

        /** Builds a new {@link CredentialProviderInfo} instance. */
        /** Builds a new {@link CredentialProviderInfo} instance. */
        public @NonNull CredentialProviderInfo build() {
        public @NonNull CredentialProviderInfo build() {
            return new CredentialProviderInfo(this);
            return new CredentialProviderInfo(this);
+1 −1
Original line number Original line Diff line number Diff line
@@ -47,7 +47,7 @@ interface ICredentialManager {


    @nullable ICancellationSignal clearCredentialState(in ClearCredentialStateRequest request, in IClearCredentialStateCallback callback, String callingPackage);
    @nullable ICancellationSignal clearCredentialState(in ClearCredentialStateRequest request, in IClearCredentialStateCallback callback, String callingPackage);


    void setEnabledProviders(in List<String> providers, in int userId, in ISetEnabledProvidersCallback callback);
    void setEnabledProviders(in List<String> primaryProviders, in List<String> providers, in int userId, in ISetEnabledProvidersCallback callback);


    void registerCredentialDescription(in RegisterCredentialDescriptionRequest request, String callingPackage);
    void registerCredentialDescription(in RegisterCredentialDescriptionRequest request, String callingPackage);


+46 −26
Original line number Original line Diff line number Diff line
@@ -80,8 +80,7 @@ public final class CredentialProviderInfoFactory {
     * @param userId the android userId for which the current process is running
     * @param userId the android userId for which the current process is running
     * @param isSystemProvider whether this provider is a system provider
     * @param isSystemProvider whether this provider is a system provider
     * @throws PackageManager.NameNotFoundException If provider service is not found
     * @throws PackageManager.NameNotFoundException If provider service is not found
     * @throws SecurityException                    If provider does not require the relevant
     * @throws SecurityException If provider does not require the relevant permission
     *                                              permission
     */
     */
    public static CredentialProviderInfo create(
    public static CredentialProviderInfo create(
            @NonNull Context context,
            @NonNull Context context,
@@ -94,20 +93,19 @@ public final class CredentialProviderInfoFactory {
                getServiceInfoOrThrow(serviceComponent, userId),
                getServiceInfoOrThrow(serviceComponent, userId),
                isSystemProvider,
                isSystemProvider,
                /* disableSystemAppVerificationForTests= */ false,
                /* disableSystemAppVerificationForTests= */ false,
                /* isEnabled= */ false);
                /* isEnabled= */ false,
                /* isPrimary= */ false);
    }
    }


    /**
    /**
     * Constructs an information instance of the credential provider.
     * Constructs an information instance of the credential provider.
     *
     *
     * @param context the context object
     * @param context the context object
     * @param serviceInfo                          the service info for the provider app. This must
     * @param serviceInfo the service info for the provider app. This must be retrieved from the
     *                                             be retrieved from the
     *     {@code PackageManager}
     *     {@code PackageManager}
     * @param isSystemProvider whether the provider app is a system provider
     * @param isSystemProvider whether the provider app is a system provider
     * @param disableSystemAppVerificationForTests whether to disable system app permission
     * @param disableSystemAppVerificationForTests whether to disable system app permission
     *                                             verification so that tests can install system
     *     verification so that tests can install system providers
     *                                             providers
     * @param isEnabled whether the user enabled this provider
     * @param isEnabled whether the user enabled this provider
     * @throws SecurityException If provider does not require the relevant permission
     * @throws SecurityException If provider does not require the relevant permission
     */
     */
@@ -116,7 +114,8 @@ public final class CredentialProviderInfoFactory {
            @NonNull ServiceInfo serviceInfo,
            @NonNull ServiceInfo serviceInfo,
            boolean isSystemProvider,
            boolean isSystemProvider,
            boolean disableSystemAppVerificationForTests,
            boolean disableSystemAppVerificationForTests,
            boolean isEnabled)
            boolean isEnabled,
            boolean isPrimary)
            throws SecurityException {
            throws SecurityException {
        verifyProviderPermission(serviceInfo);
        verifyProviderPermission(serviceInfo);
        if (isSystemProvider) {
        if (isSystemProvider) {
@@ -131,6 +130,7 @@ public final class CredentialProviderInfoFactory {
        return populateMetadata(context, serviceInfo)
        return populateMetadata(context, serviceInfo)
                .setSystemProvider(isSystemProvider)
                .setSystemProvider(isSystemProvider)
                .setEnabled(isEnabled)
                .setEnabled(isEnabled)
                .setPrimary(isPrimary)
                .build();
                .build();
    }
    }


@@ -168,7 +168,9 @@ public final class CredentialProviderInfoFactory {
            Slog.w(TAG, "Context is null in isSystemProviderWithValidPermission");
            Slog.w(TAG, "Context is null in isSystemProviderWithValidPermission");
            return false;
            return false;
        }
        }
        return PermissionUtils.hasPermission(context, serviceInfo.packageName,
        return PermissionUtils.hasPermission(
                context,
                serviceInfo.packageName,
                Manifest.permission.PROVIDE_DEFAULT_ENABLED_CREDENTIAL_SERVICE);
                Manifest.permission.PROVIDE_DEFAULT_ENABLED_CREDENTIAL_SERVICE);
    }
    }


@@ -181,8 +183,11 @@ public final class CredentialProviderInfoFactory {
        if (disableSystemAppVerificationForTests) {
        if (disableSystemAppVerificationForTests) {
            Bundle metadata = serviceInfo.metaData;
            Bundle metadata = serviceInfo.metaData;
            if (metadata == null) {
            if (metadata == null) {
                Slog.w(TAG, "metadata is null while reading "
                Slog.w(
                        + "TEST_SYSTEM_PROVIDER_META_DATA_KEY: " + serviceInfo);
                        TAG,
                        "metadata is null while reading "
                                + "TEST_SYSTEM_PROVIDER_META_DATA_KEY: "
                                + serviceInfo);
                return false;
                return false;
            }
            }
            return metadata.getBoolean(
            return metadata.getBoolean(
@@ -215,7 +220,9 @@ public final class CredentialProviderInfoFactory {


        // 3. Stop if we are missing data.
        // 3. Stop if we are missing data.
        if (resources == null) {
        if (resources == null) {
            Slog.w(TAG, "Resources are null for the serviceInfo being processed: "
            Slog.w(
                    TAG,
                    "Resources are null for the serviceInfo being processed: "
                            + serviceInfo.getComponentName());
                            + serviceInfo.getComponentName());
            return builder;
            return builder;
        }
        }
@@ -408,7 +415,7 @@ public final class CredentialProviderInfoFactory {
                                si,
                                si,
                                /* isSystemProvider= */ true,
                                /* isSystemProvider= */ true,
                                disableSystemAppVerificationForTests,
                                disableSystemAppVerificationForTests,
                                enabledServices.contains(si.getComponentName()));
                                enabledServices.contains(si.getComponentName()), false);
                if (cpi.isSystemProvider()) {
                if (cpi.isSystemProvider()) {
                    providerInfos.add(cpi);
                    providerInfos.add(cpi);
                } else {
                } else {
@@ -446,7 +453,8 @@ public final class CredentialProviderInfoFactory {
            @NonNull Context context,
            @NonNull Context context,
            int userId,
            int userId,
            int providerFilter,
            int providerFilter,
            Set<ComponentName> enabledServices) {
            Set<ComponentName> enabledServices,
            Set<String> primaryServices) {
        requireNonNull(context, "context must not be null");
        requireNonNull(context, "context must not be null");


        // Get the device policy.
        // Get the device policy.
@@ -459,7 +467,11 @@ public final class CredentialProviderInfoFactory {
                        context, pp, disableSystemAppVerificationForTests, providerFilter);
                        context, pp, disableSystemAppVerificationForTests, providerFilter);
        generator.addUserProviders(
        generator.addUserProviders(
                getUserProviders(
                getUserProviders(
                        context, userId, disableSystemAppVerificationForTests, enabledServices));
                        context,
                        userId,
                        disableSystemAppVerificationForTests,
                        enabledServices,
                        primaryServices));
        generator.addSystemProviders(
        generator.addSystemProviders(
                getAvailableSystemServices(
                getAvailableSystemServices(
                        context, userId, disableSystemAppVerificationForTests, enabledServices));
                        context, userId, disableSystemAppVerificationForTests, enabledServices));
@@ -475,7 +487,8 @@ public final class CredentialProviderInfoFactory {
            @NonNull Context context,
            @NonNull Context context,
            int userId,
            int userId,
            int providerFilter,
            int providerFilter,
            Set<ComponentName> enabledServices) {
            Set<ComponentName> enabledServices,
            Set<String> primaryServices) {
        requireNonNull(context, "context must not be null");
        requireNonNull(context, "context must not be null");


        // Get the device policy.
        // Get the device policy.
@@ -488,7 +501,11 @@ public final class CredentialProviderInfoFactory {
                        context, pp, disableSystemAppVerificationForTests, providerFilter);
                        context, pp, disableSystemAppVerificationForTests, providerFilter);
        generator.addUserProviders(
        generator.addUserProviders(
                getUserProviders(
                getUserProviders(
                        context, userId, disableSystemAppVerificationForTests, enabledServices));
                        context,
                        userId,
                        disableSystemAppVerificationForTests,
                        enabledServices,
                        primaryServices));
        generator.addSystemProviders(
        generator.addSystemProviders(
                getAvailableSystemServices(
                getAvailableSystemServices(
                        context, userId, disableSystemAppVerificationForTests, enabledServices));
                        context, userId, disableSystemAppVerificationForTests, enabledServices));
@@ -581,7 +598,8 @@ public final class CredentialProviderInfoFactory {
            @NonNull Context context,
            @NonNull Context context,
            @UserIdInt int userId,
            @UserIdInt int userId,
            boolean disableSystemAppVerificationForTests,
            boolean disableSystemAppVerificationForTests,
            Set<ComponentName> enabledServices) {
            Set<ComponentName> enabledServices,
            Set<String> primaryServices) {
        final List<CredentialProviderInfo> services = new ArrayList<>();
        final List<CredentialProviderInfo> services = new ArrayList<>();
        final List<ResolveInfo> resolveInfos =
        final List<ResolveInfo> resolveInfos =
                context.getPackageManager()
                context.getPackageManager()
@@ -603,7 +621,9 @@ public final class CredentialProviderInfoFactory {
                                serviceInfo,
                                serviceInfo,
                                /* isSystemProvider= */ false,
                                /* isSystemProvider= */ false,
                                disableSystemAppVerificationForTests,
                                disableSystemAppVerificationForTests,
                                enabledServices.contains(serviceInfo.getComponentName()));
                                enabledServices.contains(serviceInfo.getComponentName()),
                                primaryServices.contains(
                                        serviceInfo.getComponentName().flattenToString()));
                if (!cpi.isSystemProvider()) {
                if (!cpi.isSystemProvider()) {
                    services.add(cpi);
                    services.add(cpi);
                }
                }
+243 −194

File changed.

Preview size limit exceeded, changes collapsed.

Loading