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

Commit 0a7f284d authored by Guojing Yuan's avatar Guojing Yuan
Browse files

[CDM perm sync] Add SystemDataTransferProcessor

Bug: 193583135

Test: m and flash
Change-Id: Ic5cc249f64d76ccd5280bcb6a0fae23e388a13d4
parent 8ddc2550
Loading
Loading
Loading
Loading
+66 −6
Original line number Diff line number Diff line
@@ -17,7 +17,7 @@
package android.companion;

import android.annotation.NonNull;
import android.annotation.Nullable;
import android.annotation.UserIdInt;
import android.os.Parcel;
import android.os.Parcelable;
import android.provider.OneTimeUseBuilder;
@@ -38,10 +38,25 @@ public final class SystemDataTransferRequest implements Parcelable {
    private final List<String> mPermissionSyncPackages;

    /**
     * User Id that the request belongs to.
     * Populated by the system.
     *
     * @hide
     */
    @UserIdInt
    private int mUserId;

    /**
     * Whether the request is consented by the user.
     * Populated by the system.
     *
     * @hide
     */
    private boolean mUserConsented = false;

    /* @hide */
    public SystemDataTransferRequest(int associationId, boolean syncAllPackages,
            @Nullable List<String> permissionSyncPackages) {
            @NonNull List<String> permissionSyncPackages) {
        mAssociationId = associationId;
        mPermissionSyncAllPackages = syncAllPackages;
        mPermissionSyncPackages = permissionSyncPackages;
@@ -61,6 +76,37 @@ public final class SystemDataTransferRequest implements Parcelable {
        return mPermissionSyncPackages;
    }

    /* @hide */
    public int getUserId() {
        return mUserId;
    }

    /* @hide */
    public boolean isUserConsented() {
        return mUserConsented;
    }

    /* @hide */
    public void setUserId(@UserIdInt int userId) {
        mUserId = userId;
    }

    /* @hide */
    public void setUserConsented(boolean isUserConsented) {
        mUserConsented = isUserConsented;
    }

    /* @hide */
    @Override
    public String toString() {
        return "SystemDataTransferRequest("
                + "associationId=" + mAssociationId
                + ", isPermissionSyncAllPackages=" + mPermissionSyncAllPackages
                + ", permissionSyncPackages=[" + String.join(",", mPermissionSyncPackages) + "]"
                + ", isUserConsented=" + mUserConsented
                + ")";
    }

    /**
     * A builder for {@link SystemDataTransferRequest}.
     *
@@ -90,9 +136,8 @@ public final class SystemDataTransferRequest implements Parcelable {
         * <p>If a system or policy granted or revoked permission is granted or revoked by the user
         * later, the permission will be ignored.</p>
         *
         * @see #setPermissionSyncPackages(List)
         *
         * @return the builder
         * @see #setPermissionSyncPackages(List)
         */
        @NonNull
        public Builder setPermissionSyncAllPackages() {
@@ -104,10 +149,9 @@ public final class SystemDataTransferRequest implements Parcelable {
         * Set a list of packages to sync permissions. You can optionally call
         * {@link #setPermissionSyncAllPackages()} to sync permissions for all the packages.
         *
         * @see #setPermissionSyncAllPackages()
         *
         * @param permissionSyncPackages packages to sync permissions
         * @return builder
         * @see #setPermissionSyncAllPackages()
         */
        @NonNull
        public Builder setPermissionSyncPackages(@NonNull List<String> permissionSyncPackages) {
@@ -127,6 +171,8 @@ public final class SystemDataTransferRequest implements Parcelable {
        mAssociationId = in.readInt();
        mPermissionSyncAllPackages = in.readBoolean();
        mPermissionSyncPackages = Arrays.asList(in.createString8Array());
        mUserId = in.readInt();
        mUserConsented = in.readBoolean();
    }

    @Override
@@ -134,6 +180,8 @@ public final class SystemDataTransferRequest implements Parcelable {
        dest.writeInt(mAssociationId);
        dest.writeBoolean(mPermissionSyncAllPackages);
        dest.writeString8Array(mPermissionSyncPackages.toArray(new String[0]));
        dest.writeInt(mUserId);
        dest.writeBoolean(mUserConsented);
    }

    @Override
@@ -141,6 +189,18 @@ public final class SystemDataTransferRequest implements Parcelable {
        return 0;
    }

    /**
     * Check if two requests have the same data type.
     */
    public boolean hasSameDataType(SystemDataTransferRequest request) {
        // Check if they are permission sync requests.
        if (this.isPermissionSyncAllPackages() || !this.getPermissionSyncPackages().isEmpty()) {
            return request.isPermissionSyncAllPackages() || !request.getPermissionSyncPackages()
                    .isEmpty();
        }
        return false;
    }

    @NonNull
    public static final Creator<SystemDataTransferRequest> CREATOR =
            new Creator<SystemDataTransferRequest>() {
+1 −17
Original line number Diff line number Diff line
@@ -26,6 +26,7 @@ import static com.android.server.companion.CompanionDeviceManagerService.DEBUG;
import static com.android.server.companion.PackageUtils.enforceUsesCompanionDeviceFeature;
import static com.android.server.companion.PermissionsUtils.enforcePermissionsForAssociation;
import static com.android.server.companion.RolesUtils.isRoleHolder;
import static com.android.server.companion.Utils.prepareForIpc;

import static java.util.Objects.requireNonNull;

@@ -47,7 +48,6 @@ import android.net.MacAddress;
import android.os.Binder;
import android.os.Bundle;
import android.os.Handler;
import android.os.Parcel;
import android.os.RemoteException;
import android.os.ResultReceiver;
import android.util.PackageUtils;
@@ -397,20 +397,4 @@ class AssociationRequestsProcessor {

        return sameOemPackageCerts;
    }

    /**
     * Convert an instance of a "locally-defined" ResultReceiver to an instance of
     * {@link android.os.ResultReceiver} itself, which the receiving process will be able to
     * unmarshall.
     */
    private static <T extends ResultReceiver> ResultReceiver prepareForIpc(T resultReceiver) {
        final Parcel parcel = Parcel.obtain();
        resultReceiver.writeToParcel(parcel, 0);
        parcel.setDataPosition(0);

        final ResultReceiver ipcFriendly = ResultReceiver.CREATOR.createFromParcel(parcel);
        parcel.recycle();

        return ipcFriendly;
    }
}
+1 −1
Original line number Diff line number Diff line
@@ -54,7 +54,7 @@ import java.util.StringJoiner;
 * should use public {@link AssociationStore} interface.
 */
@SuppressLint("LongLogTag")
class AssociationStoreImpl implements AssociationStore {
public class AssociationStoreImpl implements AssociationStore {
    private static final boolean DEBUG = false;
    private static final String TAG = "CompanionDevice_AssociationStore";

+14 −5
Original line number Diff line number Diff line
@@ -33,15 +33,24 @@ import org.xmlpull.v1.XmlPullParserException;
import java.io.File;
import java.io.FileOutputStream;

final class DataStoreUtils {
/**
 * Util class for CDM data stores
 */
public final class DataStoreUtils {
    private static final String TAG = "CompanionDevice_DataStoreUtils";

    static boolean isStartOfTag(@NonNull XmlPullParser parser, @NonNull String tag)
    /**
     * Check if the parser pointer is at the start of the tag
     */
    public static boolean isStartOfTag(@NonNull XmlPullParser parser, @NonNull String tag)
            throws XmlPullParserException {
        return parser.getEventType() == START_TAG && tag.equals(parser.getName());
    }

    static boolean isEndOfTag(@NonNull XmlPullParser parser, @NonNull String tag)
    /**
     * Check if the parser pointer is at the end of the tag
     */
    public static boolean isEndOfTag(@NonNull XmlPullParser parser, @NonNull String tag)
            throws XmlPullParserException {
        return parser.getEventType() == END_TAG && tag.equals(parser.getName());
    }
@@ -57,7 +66,7 @@ final class DataStoreUtils {
     * @return an AtomicFile for the user
     */
    @NonNull
    static AtomicFile createStorageFileForUser(@UserIdInt int userId, String fileName) {
    public static AtomicFile createStorageFileForUser(@UserIdInt int userId, String fileName) {
        return new AtomicFile(getBaseStorageFileForUser(userId, fileName));
    }

@@ -70,7 +79,7 @@ final class DataStoreUtils {
     * Writing to file could fail, for example, if the user has been recently removed and so was
     * their DE (/data/system_de/<user-id>/) directory.
     */
    static void writeToFileSafely(
    public static void writeToFileSafely(
            @NonNull AtomicFile file, @NonNull ThrowingConsumer<FileOutputStream> consumer) {
        try {
            file.write(consumer);
+1 −1
Original line number Diff line number Diff line
@@ -101,7 +101,7 @@ import java.util.concurrent.ConcurrentMap;
 * Since Android T the data is stored to "companion_device_manager.xml" file in
 * {@link Environment#getDataSystemDeDirectory(int) /data/system_de/}.
 *
 * See {@link #getBaseStorageFileForUser(int) getBaseStorageFileForUser()}
 * See {@link #getStorageFileForUser(int)}
 *
 * <p>
 * Since Android T the data is stored using the v1 schema.
Loading