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

Commit 4895be22 authored by Philip P. Moltmann's avatar Philip P. Moltmann
Browse files

Allow to find qualified packages via RoleBehavior

Sometimes finding qualified packages is to complex to be described in the
roles.xml.

Hence allow the RoleBehavior to override the logic if needed.

Bug: 110557011
Test: Created a role with custom behavior. Looked at old and new roles.
Change-Id: I5c8f6875504cb7e84bc45762227d0649fee0d6b7
parent ab313f29
Loading
Loading
Loading
Loading
+28 −4
Original line number Original line Diff line number Diff line
@@ -245,11 +245,17 @@ public class Role {
     * @return whether the package is qualified for a role
     * @return whether the package is qualified for a role
     */
     */
    public boolean isPackageQualified(@NonNull String packageName, @NonNull Context context) {
    public boolean isPackageQualified(@NonNull String packageName, @NonNull Context context) {
        if (!isPackageQualifiedWithoutCheckingRequiredComponentsAsUser(packageName,
        if (!isPackageMinimallyQualifiedAsUser(packageName, Process.myUserHandle(), context)) {
                Process.myUserHandle(), context)) {
            return false;
            return false;
        }
        }


        if (mBehavior != null) {
            Boolean isPackageQualified = mBehavior.isPackageQualified(packageName, context);
            if (isPackageQualified != null) {
                return isPackageQualified;
            }
        }

        int requiredComponentsSize = mRequiredComponents.size();
        int requiredComponentsSize = mRequiredComponents.size();
        for (int i = 0; i < requiredComponentsSize; i++) {
        for (int i = 0; i < requiredComponentsSize; i++) {
            RequiredComponent requiredComponent = mRequiredComponents.get(i);
            RequiredComponent requiredComponent = mRequiredComponents.get(i);
@@ -275,6 +281,24 @@ public class Role {
    @NonNull
    @NonNull
    public List<String> getQualifyingPackagesAsUser(@NonNull UserHandle user,
    public List<String> getQualifyingPackagesAsUser(@NonNull UserHandle user,
            @NonNull Context context) {
            @NonNull Context context) {
        if (mBehavior != null) {
            List<String> qualifyingPackages = mBehavior.getQualifyingPackagesAsUser(user, context);

            if (qualifyingPackages != null) {
                // Still check generic properties of the packages
                int numQualifyingPackages = qualifyingPackages.size();
                for (int i = 0; i < numQualifyingPackages; i++) {
                    if (!isPackageMinimallyQualifiedAsUser(qualifyingPackages.get(i), user,
                            context)) {
                        qualifyingPackages.remove(i);
                        i--;
                    }
                }

                return qualifyingPackages;
            }
        }

        ArrayMap<String, Integer> packageComponentCountMap = new ArrayMap<>();
        ArrayMap<String, Integer> packageComponentCountMap = new ArrayMap<>();
        int requiredComponentsSize = mRequiredComponents.size();
        int requiredComponentsSize = mRequiredComponents.size();
        for (int requiredComponentsIndex = 0; requiredComponentsIndex < requiredComponentsSize;
        for (int requiredComponentsIndex = 0; requiredComponentsIndex < requiredComponentsSize;
@@ -306,7 +330,7 @@ public class Role {
                continue;
                continue;
            }
            }
            String packageName = packageComponentCountMap.keyAt(i);
            String packageName = packageComponentCountMap.keyAt(i);
            if (!isPackageQualifiedWithoutCheckingRequiredComponentsAsUser(packageName, user,
            if (!isPackageMinimallyQualifiedAsUser(packageName, user,
                    context)) {
                    context)) {
                continue;
                continue;
            }
            }
@@ -316,7 +340,7 @@ public class Role {
        return qualifyingPackages;
        return qualifyingPackages;
    }
    }


    private boolean isPackageQualifiedWithoutCheckingRequiredComponentsAsUser(
    private boolean isPackageMinimallyQualifiedAsUser(
            @NonNull String packageName, @NonNull UserHandle user, @NonNull Context context) {
            @NonNull String packageName, @NonNull UserHandle user, @NonNull Context context) {
        if (Objects.equals(packageName, PACKAGE_NAME_ANDROID_SYSTEM)) {
        if (Objects.equals(packageName, PACKAGE_NAME_ANDROID_SYSTEM)) {
            return false;
            return false;
+30 −0
Original line number Original line Diff line number Diff line
@@ -62,4 +62,34 @@ public interface RoleBehavior {
            @NonNull Context context) {
            @NonNull Context context) {
        return null;
        return null;
    }
    }

    /**
     * Gets the packages that qualify to hold the role.
     *
     * @param user The user the package belong to
     * @param context A context to use
     *
     * @return the list of qualifying packages (might be empty) or {@code null} if the role
     *         description is enough to find the qualified packages
     */
    @Nullable
    default List<String> getQualifyingPackagesAsUser(@NonNull UserHandle user,
            @NonNull Context context) {
        return null;
    }

    /**
     * Check whether a package is qualified for this role, i.e. whether it contains all the required
     * components (plus meeting some other general restrictions).
     *
     * @param packageName the package name to check for
     * @param context the {@code Context} to retrieve system services
     *
     * @return whether the package is qualified for a role of {@code null} if the role description
     *         is enough to find the qualified packages
     */
    @Nullable
    default Boolean isPackageQualified(@NonNull String packageName, @NonNull Context context) {
        return null;
    }
}
}