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

Commit 8b7f0c35 authored by Guojing Yuan's avatar Guojing Yuan Committed by Android (Google) Code Review
Browse files

Merge "[CDM][Refactoring 2/N] Move association related files to association folder" into main

parents a18444b9 0201be28
Loading
Loading
Loading
Loading
+1 −1
Original line number Diff line number Diff line
@@ -8679,7 +8679,7 @@
                 android:permission="android.permission.BIND_JOB_SERVICE">
        </service>

        <service android:name="com.android.server.companion.InactiveAssociationsRemovalService"
        <service android:name="com.android.server.companion.association.InactiveAssociationsRemovalService"
                 android:permission="android.permission.BIND_JOB_SERVICE">
        </service>

+0 −144
Original line number Diff line number Diff line
/*
 * Copyright (C) 2021 The Android Open Source Project
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

package com.android.server.companion;

import android.annotation.IntDef;
import android.annotation.NonNull;
import android.annotation.Nullable;
import android.annotation.UserIdInt;
import android.companion.AssociationInfo;

import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.util.Collection;
import java.util.List;

/**
 * Interface for a store of {@link AssociationInfo}-s.
 */
public interface AssociationStore {

    @IntDef(prefix = { "CHANGE_TYPE_" }, value = {
            CHANGE_TYPE_ADDED,
            CHANGE_TYPE_REMOVED,
            CHANGE_TYPE_UPDATED_ADDRESS_CHANGED,
            CHANGE_TYPE_UPDATED_ADDRESS_UNCHANGED,
    })
    @Retention(RetentionPolicy.SOURCE)
    @interface ChangeType {}

    int CHANGE_TYPE_ADDED = 0;
    int CHANGE_TYPE_REMOVED = 1;
    int CHANGE_TYPE_UPDATED_ADDRESS_CHANGED = 2;
    int CHANGE_TYPE_UPDATED_ADDRESS_UNCHANGED = 3;

    /**  Listener for any changes to {@link AssociationInfo}-s. */
    interface OnChangeListener {
        default void onAssociationChanged(
                @ChangeType int changeType, AssociationInfo association) {
            switch (changeType) {
                case CHANGE_TYPE_ADDED:
                    onAssociationAdded(association);
                    break;

                case CHANGE_TYPE_REMOVED:
                    onAssociationRemoved(association);
                    break;

                case CHANGE_TYPE_UPDATED_ADDRESS_CHANGED:
                    onAssociationUpdated(association, true);
                    break;

                case CHANGE_TYPE_UPDATED_ADDRESS_UNCHANGED:
                    onAssociationUpdated(association, false);
                    break;
            }
        }

        default void onAssociationAdded(AssociationInfo association) {}

        default void onAssociationRemoved(AssociationInfo association) {}

        default void onAssociationUpdated(AssociationInfo association, boolean addressChanged) {}
    }

    /**
     * @return all CDM associations.
     */
    @NonNull
    Collection<AssociationInfo> getAssociations();

    /**
     * @return a {@link List} of associations that belong to the user.
     */
    @NonNull
    List<AssociationInfo> getAssociationsForUser(@UserIdInt int userId);

    /**
     * @return a {@link List} of association that belong to the package.
     */
    @NonNull
    List<AssociationInfo> getAssociationsForPackage(
            @UserIdInt int userId, @NonNull String packageName);

    /**
     * @return an association with the given address that belong to the given package if such an
     * association exists, otherwise {@code null}.
     */
    @Nullable
    AssociationInfo getAssociationsForPackageWithAddress(
            @UserIdInt int userId, @NonNull String packageName, @NonNull String macAddress);

    /**
     * @return an association with the given id if such an association exists, otherwise
     * {@code null}.
     */
    @Nullable
    AssociationInfo getAssociationById(int id);

    /**
     * @return all associations with the given MAc address.
     */
    @NonNull
    List<AssociationInfo> getAssociationsByAddress(@NonNull String macAddress);

    /** Register a {@link OnChangeListener} */
    void registerListener(@NonNull OnChangeListener listener);

    /** Un-register a previously registered {@link OnChangeListener} */
    void unregisterListener(@NonNull OnChangeListener listener);

    /** @hide */
    static String changeTypeToString(@ChangeType int changeType) {
        switch (changeType) {
            case CHANGE_TYPE_ADDED:
                return "ASSOCIATION_ADDED";

            case CHANGE_TYPE_REMOVED:
                return "ASSOCIATION_REMOVED";

            case CHANGE_TYPE_UPDATED_ADDRESS_CHANGED:
                return "ASSOCIATION_UPDATED";

            case CHANGE_TYPE_UPDATED_ADDRESS_UNCHANGED:
                return "ASSOCIATION_UPDATED_ADDRESS_UNCHANGED";

            default:
                return "Unknown (" + changeType + ")";
        }
    }
}
+7 −4
Original line number Diff line number Diff line
@@ -34,6 +34,9 @@ import android.util.Slog;

import com.android.internal.annotations.GuardedBy;
import com.android.internal.util.CollectionUtils;
import com.android.server.companion.association.AssociationDiskStore;
import com.android.server.companion.association.AssociationRequestsProcessor;
import com.android.server.companion.association.AssociationStore;
import com.android.server.companion.datatransfer.SystemDataTransferRequestStore;

import java.nio.ByteBuffer;
@@ -54,9 +57,9 @@ class BackupRestoreProcessor {
    @NonNull
    private final PackageManagerInternal mPackageManager;
    @NonNull
    private final AssociationStoreImpl mAssociationStore;
    private final AssociationStore mAssociationStore;
    @NonNull
    private final PersistentDataStore mPersistentStore;
    private final AssociationDiskStore mPersistentStore;
    @NonNull
    private final SystemDataTransferRequestStore mSystemDataTransferRequestStore;
    @NonNull
@@ -71,8 +74,8 @@ class BackupRestoreProcessor {
            new PerUserAssociationSet();

    BackupRestoreProcessor(@NonNull CompanionDeviceManagerService service,
                           @NonNull AssociationStoreImpl associationStore,
                           @NonNull PersistentDataStore persistentStore,
                           @NonNull AssociationStore associationStore,
                           @NonNull AssociationDiskStore persistentStore,
                           @NonNull SystemDataTransferRequestStore systemDataTransferRequestStore,
                           @NonNull AssociationRequestsProcessor associationRequestsProcessor) {
        mService = service;
+1 −0
Original line number Diff line number Diff line
@@ -37,6 +37,7 @@ import android.util.SparseArray;

import com.android.internal.annotations.GuardedBy;
import com.android.internal.infra.PerUser;
import com.android.server.companion.association.AssociationStore;
import com.android.server.companion.presence.CompanionDevicePresenceMonitor;
import com.android.server.companion.presence.ObservableUuid;
import com.android.server.companion.presence.ObservableUuidStore;
+41 −29
Original line number Diff line number Diff line
@@ -37,7 +37,9 @@ import static android.os.UserHandle.getCallingUserId;
import static com.android.internal.util.CollectionUtils.any;
import static com.android.internal.util.Preconditions.checkState;
import static com.android.internal.util.function.pooled.PooledLambda.obtainMessage;
import static com.android.server.companion.AssociationStore.CHANGE_TYPE_UPDATED_ADDRESS_UNCHANGED;
import static com.android.server.companion.association.AssociationStore.CHANGE_TYPE_UPDATED_ADDRESS_UNCHANGED;
import static com.android.server.companion.utils.AssociationUtils.getFirstAssociationIdForUser;
import static com.android.server.companion.utils.AssociationUtils.getLastAssociationIdForUser;
import static com.android.server.companion.utils.PackageUtils.isRestrictedSettingsAllowed;
import static com.android.server.companion.utils.PackageUtils.enforceUsesCompanionDeviceFeature;
import static com.android.server.companion.utils.PackageUtils.getPackageInfo;
@@ -117,6 +119,11 @@ import com.android.internal.util.DumpUtils;
import com.android.server.FgThread;
import com.android.server.LocalServices;
import com.android.server.SystemService;
import com.android.server.companion.association.AssociationDiskStore;
import com.android.server.companion.association.AssociationRequestsProcessor;
import com.android.server.companion.association.AssociationRevokeProcessor;
import com.android.server.companion.association.AssociationStore;
import com.android.server.companion.association.InactiveAssociationsRemovalService;
import com.android.server.companion.datatransfer.SystemDataTransferProcessor;
import com.android.server.companion.datatransfer.SystemDataTransferRequestStore;
import com.android.server.companion.datatransfer.contextsync.CrossDeviceCall;
@@ -147,8 +154,6 @@ public class CompanionDeviceManagerService extends SystemService {
    static final String TAG = "CDM_CompanionDeviceManagerService";
    static final boolean DEBUG = false;

    /** Range of Association IDs allocated for a user. */
    private static final int ASSOCIATIONS_IDS_PER_USER_RANGE = 100000;
    private static final long PAIR_WITHOUT_PROMPT_WINDOW_MS = 10 * 60 * 1000; // 10 min

    private static final String PREF_FILE_NAME = "companion_device_preferences.xml";
@@ -160,10 +165,10 @@ public class CompanionDeviceManagerService extends SystemService {
    private static final int MAX_CN_LENGTH = 500;

    private final ActivityManager mActivityManager;
    private PersistentDataStore mPersistentStore;
    private AssociationDiskStore mAssociationDiskStore;
    private final PersistUserStateHandler mUserPersistenceHandler;

    private final AssociationStoreImpl mAssociationStore;
    private final AssociationStore mAssociationStore;
    private final SystemDataTransferRequestStore mSystemDataTransferRequestStore;
    private AssociationRequestsProcessor mAssociationRequestsProcessor;
    private SystemDataTransferProcessor mSystemDataTransferProcessor;
@@ -178,7 +183,7 @@ public class CompanionDeviceManagerService extends SystemService {
    private final IAppOpsService mAppOpsManager;
    private final PowerWhitelistManager mPowerWhitelistManager;
    private final UserManager mUserManager;
    final PackageManagerInternal mPackageManagerInternal;
    public final PackageManagerInternal mPackageManagerInternal;
    private final PowerManagerInternal mPowerManagerInternal;

    /**
@@ -210,7 +215,7 @@ public class CompanionDeviceManagerService extends SystemService {
        mUserManager = context.getSystemService(UserManager.class);

        mUserPersistenceHandler = new PersistUserStateHandler();
        mAssociationStore = new AssociationStoreImpl();
        mAssociationStore = new AssociationStore();
        mSystemDataTransferRequestStore = new SystemDataTransferRequestStore();

        mPowerManagerInternal = LocalServices.getService(PowerManagerInternal.class);
@@ -221,11 +226,11 @@ public class CompanionDeviceManagerService extends SystemService {
    public void onStart() {
        final Context context = getContext();

        mPersistentStore = new PersistentDataStore();
        mAssociationDiskStore = new AssociationDiskStore();
        mAssociationRequestsProcessor = new AssociationRequestsProcessor(
                /* cdmService */ this, mAssociationStore);
        mBackupRestoreProcessor = new BackupRestoreProcessor(
                /* cdmService */ this, mAssociationStore, mPersistentStore,
                /* cdmService */ this, mAssociationStore, mAssociationDiskStore,
                mSystemDataTransferRequestStore, mAssociationRequestsProcessor);

        mObservableUuidStore.getObservableUuidsForUser(getContext().getUserId());
@@ -264,10 +269,13 @@ public class CompanionDeviceManagerService extends SystemService {
    void loadAssociationsFromDisk() {
        final Set<AssociationInfo> allAssociations = new ArraySet<>();
        synchronized (mPreviouslyUsedIds) {
            List<Integer> userIds = new ArrayList<>();
            for (UserInfo user : mUserManager.getAliveUsers()) {
                userIds.add(user.id);
            }
            // The data is stored in DE directories, so we can read the data for all users now
            // (which would not be possible if the data was stored to CE directories).
            mPersistentStore.readStateForUsers(
                    mUserManager.getAliveUsers(), allAssociations, mPreviouslyUsedIds);
            mAssociationDiskStore.readStateForUsers(userIds, allAssociations, mPreviouslyUsedIds);
        }

        final Set<AssociationInfo> activeAssociations =
@@ -291,7 +299,7 @@ public class CompanionDeviceManagerService extends SystemService {
            }
        }

        mAssociationStore.setAssociations(activeAssociations);
        mAssociationStore.setAssociationsToCache(activeAssociations);

        // IMPORTANT: only do this AFTER mAssociationStore.setAssociations(), because
        // persistStateForUser() queries AssociationStore.
@@ -582,7 +590,7 @@ public class CompanionDeviceManagerService extends SystemService {

        final Map<String, Set<Integer>> usedIdsForUser = getPreviouslyUsedIdsForUser(userId);

        mPersistentStore.persistStateForUser(userId, allAssociations, usedIdsForUser);
        mAssociationDiskStore.persistStateForUser(userId, allAssociations, usedIdsForUser);
    }

    private void notifyListeners(
@@ -646,7 +654,8 @@ public class CompanionDeviceManagerService extends SystemService {
        final List<AssociationInfo> associationsForPackage =
                mAssociationStore.getAssociationsForPackage(userId, packageName);
        for (AssociationInfo association : associationsForPackage) {
            updateSpecialAccessPermissionForAssociatedPackage(association);
            updateSpecialAccessPermissionForAssociatedPackage(association.getUserId(),
                    association.getPackageName());
        }

        mCompanionAppController.onPackagesChanged(userId);
@@ -692,7 +701,7 @@ public class CompanionDeviceManagerService extends SystemService {
        }
    }

    class CompanionDeviceManagerImpl extends ICompanionDeviceManager.Stub {
    public class CompanionDeviceManagerImpl extends ICompanionDeviceManager.Stub {
        @Override
        public boolean onTransact(int code, Parcel data, Parcel reply, int flags)
                throws RemoteException {
@@ -1338,7 +1347,10 @@ public class CompanionDeviceManagerService extends SystemService {
        return usedIdsForPackage;
    }

    int getNewAssociationIdForPackage(@UserIdInt int userId, @NonNull String packageName) {
    /**
     * Get a new association id for the package.
     */
    public int getNewAssociationIdForPackage(@UserIdInt int userId, @NonNull String packageName) {
        synchronized (mPreviouslyUsedIds) {
            // First: collect all IDs currently in use for this user's Associations.
            final SparseBooleanArray usedIds = new SparseBooleanArray();
@@ -1383,9 +1395,12 @@ public class CompanionDeviceManagerService extends SystemService {
        }
    }

    void updateSpecialAccessPermissionForAssociatedPackage(AssociationInfo association) {
    /**
     * Update special access for the association's package
     */
    public void updateSpecialAccessPermissionForAssociatedPackage(int userId, String packageName) {
        final PackageInfo packageInfo =
                getPackageInfo(getContext(), association.getUserId(), association.getPackageName());
                getPackageInfo(getContext(), userId, packageName);

        Binder.withCleanCallingIdentity(() -> updateSpecialAccessPermissionAsSystem(packageInfo));
    }
@@ -1539,15 +1554,6 @@ public class CompanionDeviceManagerService extends SystemService {
        }
    };

    static int getFirstAssociationIdForUser(@UserIdInt int userId) {
        // We want the IDs to start from 1, not 0.
        return userId * ASSOCIATIONS_IDS_PER_USER_RANGE + 1;
    }

    static int getLastAssociationIdForUser(@UserIdInt int userId) {
        return (userId + 1) * ASSOCIATIONS_IDS_PER_USER_RANGE;
    }

    private static Map<String, Set<Integer>> deepUnmodifiableCopy(Map<String, Set<Integer>> orig) {
        final Map<String, Set<Integer>> copy = new HashMap<>();

@@ -1671,11 +1677,17 @@ public class CompanionDeviceManagerService extends SystemService {
        }
    }

    void postPersistUserState(@UserIdInt int userId) {
    /**
     * Persist associations
     */
    public void postPersistUserState(@UserIdInt int userId) {
        mUserPersistenceHandler.postPersistUserState(userId);
    }

    static class PerUserAssociationSet extends PerUser<Set<AssociationInfo>> {
    /**
     * Set to store associations
     */
    public static class PerUserAssociationSet extends PerUser<Set<AssociationInfo>> {
        @Override
        protected @NonNull Set<AssociationInfo> create(int userId) {
            return new ArraySet<>();
Loading