Loading core/res/AndroidManifest.xml +1 −1 Original line number Diff line number Diff line Loading @@ -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> Loading services/companion/java/com/android/server/companion/AssociationStore.javadeleted 100644 → 0 +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 + ")"; } } } services/companion/java/com/android/server/companion/BackupRestoreProcessor.java +7 −4 Original line number Diff line number Diff line Loading @@ -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; Loading @@ -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 Loading @@ -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; Loading services/companion/java/com/android/server/companion/CompanionApplicationController.java +1 −0 Original line number Diff line number Diff line Loading @@ -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; Loading services/companion/java/com/android/server/companion/CompanionDeviceManagerService.java +41 −29 Original line number Diff line number Diff line Loading @@ -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; Loading Loading @@ -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; Loading Loading @@ -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"; Loading @@ -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; Loading @@ -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; /** Loading Loading @@ -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); Loading @@ -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()); Loading Loading @@ -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 = Loading @@ -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. Loading Loading @@ -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( Loading Loading @@ -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); Loading Loading @@ -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 { Loading Loading @@ -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(); Loading Loading @@ -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)); } Loading Loading @@ -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<>(); Loading Loading @@ -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 Loading
core/res/AndroidManifest.xml +1 −1 Original line number Diff line number Diff line Loading @@ -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> Loading
services/companion/java/com/android/server/companion/AssociationStore.javadeleted 100644 → 0 +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 + ")"; } } }
services/companion/java/com/android/server/companion/BackupRestoreProcessor.java +7 −4 Original line number Diff line number Diff line Loading @@ -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; Loading @@ -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 Loading @@ -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; Loading
services/companion/java/com/android/server/companion/CompanionApplicationController.java +1 −0 Original line number Diff line number Diff line Loading @@ -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; Loading
services/companion/java/com/android/server/companion/CompanionDeviceManagerService.java +41 −29 Original line number Diff line number Diff line Loading @@ -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; Loading Loading @@ -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; Loading Loading @@ -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"; Loading @@ -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; Loading @@ -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; /** Loading Loading @@ -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); Loading @@ -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()); Loading Loading @@ -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 = Loading @@ -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. Loading Loading @@ -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( Loading Loading @@ -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); Loading Loading @@ -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 { Loading Loading @@ -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(); Loading Loading @@ -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)); } Loading Loading @@ -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<>(); Loading Loading @@ -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