diff options
21 files changed, 221 insertions, 184 deletions
diff --git a/services/companion/java/com/android/server/companion/AssociationRequestsProcessor.java b/services/companion/java/com/android/server/companion/AssociationRequestsProcessor.java index d0eb59d83f5a..1dab40ea5876 100644 --- a/services/companion/java/com/android/server/companion/AssociationRequestsProcessor.java +++ b/services/companion/java/com/android/server/companion/AssociationRequestsProcessor.java @@ -25,12 +25,12 @@ import static android.content.ComponentName.createRelative; import static android.content.pm.PackageManager.FEATURE_WATCH; import static com.android.server.companion.CompanionDeviceManagerService.DEBUG; -import static com.android.server.companion.MetricUtils.logCreateAssociation; -import static com.android.server.companion.PackageUtils.enforceUsesCompanionDeviceFeature; -import static com.android.server.companion.PermissionsUtils.enforcePermissionsForAssociation; -import static com.android.server.companion.RolesUtils.addRoleHolderForAssociation; -import static com.android.server.companion.RolesUtils.isRoleHolder; -import static com.android.server.companion.Utils.prepareForIpc; +import static com.android.server.companion.utils.MetricUtils.logCreateAssociation; +import static com.android.server.companion.utils.PackageUtils.enforceUsesCompanionDeviceFeature; +import static com.android.server.companion.utils.PermissionsUtils.enforcePermissionForCreatingAssociation; +import static com.android.server.companion.utils.RolesUtils.addRoleHolderForAssociation; +import static com.android.server.companion.utils.RolesUtils.isRoleHolder; +import static com.android.server.companion.utils.Utils.prepareForIpc; import static java.util.Objects.requireNonNull; @@ -59,6 +59,7 @@ import android.os.UserHandle; import android.util.Slog; import com.android.internal.R; +import com.android.server.companion.utils.PackageUtils; import java.util.List; @@ -167,7 +168,7 @@ class AssociationRequestsProcessor { } // 1. Enforce permissions and other requirements. - enforcePermissionsForAssociation(mContext, request, packageUid); + enforcePermissionForCreatingAssociation(mContext, request, packageUid); enforceUsesCompanionDeviceFeature(mContext, userId, packageName); // 2a. Check if association can be created without launching UI (i.e. CDM needs NEITHER @@ -257,7 +258,7 @@ class AssociationRequestsProcessor { // 1. Need to check permissions again in case something changed, since we first received // this request. try { - enforcePermissionsForAssociation(mContext, request, packageUid); + enforcePermissionForCreatingAssociation(mContext, request, packageUid); } catch (SecurityException e) { // Since, at this point the caller is our own UI, we need to catch the exception on // forward it back to the application via the callback. @@ -316,6 +317,9 @@ class AssociationRequestsProcessor { // If it is null, then the operation will succeed without granting any role. addRoleHolderForAssociation(mService.getContext(), association, success -> { if (success) { + Slog.i(TAG, "Added " + association.getDeviceProfile() + " role to userId=" + + association.getUserId() + ", packageName=" + + association.getPackageName()); addAssociationToStore(association); sendCallbackAndFinish(association, callback, resultReceiver); } else { diff --git a/services/companion/java/com/android/server/companion/AssociationRevokeProcessor.java b/services/companion/java/com/android/server/companion/AssociationRevokeProcessor.java index de6382e316df..10963ea37e8e 100644 --- a/services/companion/java/com/android/server/companion/AssociationRevokeProcessor.java +++ b/services/companion/java/com/android/server/companion/AssociationRevokeProcessor.java @@ -20,8 +20,8 @@ import static android.app.ActivityManager.RunningAppProcessInfo.IMPORTANCE_VISIB import static android.companion.AssociationRequest.DEVICE_PROFILE_AUTOMOTIVE_PROJECTION; import static com.android.internal.util.CollectionUtils.any; -import static com.android.server.companion.MetricUtils.logRemoveAssociation; -import static com.android.server.companion.RolesUtils.removeRoleHolderForAssociation; +import static com.android.server.companion.utils.MetricUtils.logRemoveAssociation; +import static com.android.server.companion.utils.RolesUtils.removeRoleHolderForAssociation; import static com.android.server.companion.CompanionDeviceManagerService.PerUserAssociationSet; import android.annotation.NonNull; @@ -203,7 +203,8 @@ public class AssociationRevokeProcessor { return false; } - removeRoleHolderForAssociation(mContext, association); + removeRoleHolderForAssociation(mContext, association.getUserId(), + association.getPackageName(), association.getDeviceProfile()); return true; } diff --git a/services/companion/java/com/android/server/companion/CompanionApplicationController.java b/services/companion/java/com/android/server/companion/CompanionApplicationController.java index af0777c74605..559ebbc290f6 100644 --- a/services/companion/java/com/android/server/companion/CompanionApplicationController.java +++ b/services/companion/java/com/android/server/companion/CompanionApplicationController.java @@ -38,6 +38,9 @@ import android.util.SparseArray; import com.android.internal.annotations.GuardedBy; import com.android.internal.infra.PerUser; import com.android.server.companion.presence.CompanionDevicePresenceMonitor; +import com.android.server.companion.presence.ObservableUuid; +import com.android.server.companion.presence.ObservableUuidStore; +import com.android.server.companion.utils.PackageUtils; import java.io.PrintWriter; import java.util.ArrayList; @@ -61,7 +64,7 @@ import java.util.Map; * <ul> * <li> {@link #bindCompanionApplication(int, String, boolean)} * <li> {@link #unbindCompanionApplication(int, String)} - * <li> {@link #notifyCompanionApplicationDevicePresenceEvent(AssociationInfo, int)} + * <li> {@link #notifyCompanionDevicePresenceEvent(AssociationInfo, int)} * <li> {@link #isCompanionApplicationBound(int, String)} * <li> {@link #isRebindingCompanionApplicationScheduled(int, String)} * </ul> @@ -251,7 +254,13 @@ public class CompanionApplicationController { serviceConnector.connect(); } - void notifyCompanionApplicationDeviceAppeared(AssociationInfo association) { + /** + * Notify the app that the device appeared. + * + * @deprecated use {@link #notifyCompanionDevicePresenceEvent(AssociationInfo, int)} instead + */ + @Deprecated + public void notifyCompanionApplicationDeviceAppeared(AssociationInfo association) { final int userId = association.getUserId(); final String packageName = association.getPackageName(); @@ -273,7 +282,13 @@ public class CompanionApplicationController { primaryServiceConnector.postOnDeviceAppeared(association); } - void notifyCompanionApplicationDeviceDisappeared(AssociationInfo association) { + /** + * Notify the app that the device disappeared. + * + * @deprecated use {@link #notifyCompanionDevicePresenceEvent(AssociationInfo, int)} instead + */ + @Deprecated + public void notifyCompanionApplicationDeviceDisappeared(AssociationInfo association) { final int userId = association.getUserId(); final String packageName = association.getPackageName(); @@ -295,7 +310,10 @@ public class CompanionApplicationController { primaryServiceConnector.postOnDeviceDisappeared(association); } - void notifyCompanionApplicationDevicePresenceEvent(AssociationInfo association, int event) { + /** + * Notify the app that the device appeared. + */ + public void notifyCompanionDevicePresenceEvent(AssociationInfo association, int event) { final int userId = association.getUserId(); final String packageName = association.getPackageName(); final CompanionDeviceServiceConnector primaryServiceConnector = @@ -318,7 +336,10 @@ public class CompanionApplicationController { primaryServiceConnector.postOnDevicePresenceEvent(devicePresenceEvent); } - void notifyApplicationDevicePresenceEvent(ObservableUuid uuid, int event) { + /** + * Notify the app that the device disappeared. + */ + public void notifyUuidDevicePresenceEvent(ObservableUuid uuid, int event) { final int userId = uuid.getUserId(); final ParcelUuid parcelUuid = uuid.getUuid(); final String packageName = uuid.getPackageName(); diff --git a/services/companion/java/com/android/server/companion/CompanionDeviceManagerService.java b/services/companion/java/com/android/server/companion/CompanionDeviceManagerService.java index 09c77939eb7b..a478a3d84161 100644 --- a/services/companion/java/com/android/server/companion/CompanionDeviceManagerService.java +++ b/services/companion/java/com/android/server/companion/CompanionDeviceManagerService.java @@ -38,15 +38,15 @@ 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.PackageUtils.isRestrictedSettingsAllowed; -import static com.android.server.companion.PackageUtils.enforceUsesCompanionDeviceFeature; -import static com.android.server.companion.PackageUtils.getPackageInfo; -import static com.android.server.companion.PermissionsUtils.checkCallerCanManageCompanionDevice; -import static com.android.server.companion.PermissionsUtils.enforceCallerCanManageAssociationsForPackage; -import static com.android.server.companion.PermissionsUtils.enforceCallerCanObservingDevicePresenceByUuid; -import static com.android.server.companion.PermissionsUtils.enforceCallerIsSystemOr; -import static com.android.server.companion.PermissionsUtils.enforceCallerIsSystemOrCanInteractWithUserId; -import static com.android.server.companion.PermissionsUtils.sanitizeWithCallerChecks; +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; +import static com.android.server.companion.utils.PermissionsUtils.checkCallerCanManageCompanionDevice; +import static com.android.server.companion.utils.PermissionsUtils.enforceCallerCanManageAssociationsForPackage; +import static com.android.server.companion.utils.PermissionsUtils.enforceCallerCanObservingDevicePresenceByUuid; +import static com.android.server.companion.utils.PermissionsUtils.enforceCallerIsSystemOr; +import static com.android.server.companion.utils.PermissionsUtils.enforceCallerIsSystemOrCanInteractWithUserId; +import static com.android.server.companion.utils.PermissionsUtils.sanitizeWithCallerChecks; import static java.util.Objects.requireNonNull; import static java.util.concurrent.TimeUnit.DAYS; @@ -123,6 +123,8 @@ import com.android.server.companion.datatransfer.contextsync.CrossDeviceCall; import com.android.server.companion.datatransfer.contextsync.CrossDeviceSyncController; import com.android.server.companion.datatransfer.contextsync.CrossDeviceSyncControllerCallback; import com.android.server.companion.presence.CompanionDevicePresenceMonitor; +import com.android.server.companion.presence.ObservableUuid; +import com.android.server.companion.presence.ObservableUuidStore; import com.android.server.companion.transport.CompanionTransportManager; import com.android.server.pm.UserManagerInternal; import com.android.server.wm.ActivityTaskManagerInternal; @@ -435,7 +437,7 @@ public class CompanionDeviceManagerService extends SystemService { bindApplicationIfNeeded(association); - mCompanionAppController.notifyCompanionApplicationDevicePresenceEvent( + mCompanionAppController.notifyCompanionDevicePresenceEvent( association, event); break; case EVENT_BLE_DISAPPEARED: @@ -446,7 +448,7 @@ public class CompanionDeviceManagerService extends SystemService { return; } if (association.shouldBindWhenPresent()) { - mCompanionAppController.notifyCompanionApplicationDevicePresenceEvent( + mCompanionAppController.notifyCompanionDevicePresenceEvent( association, event); } // Check if there are other devices associated to the app that are present. @@ -475,7 +477,7 @@ public class CompanionDeviceManagerService extends SystemService { Log.i(TAG, "u" + userId + "\\" + packageName + " is already bound"); } - mCompanionAppController.notifyApplicationDevicePresenceEvent(uuid, event); + mCompanionAppController.notifyUuidDevicePresenceEvent(uuid, event); break; case EVENT_BT_DISCONNECTED: @@ -484,7 +486,7 @@ public class CompanionDeviceManagerService extends SystemService { return; } - mCompanionAppController.notifyApplicationDevicePresenceEvent(uuid, event); + mCompanionAppController.notifyUuidDevicePresenceEvent(uuid, event); // Check if there are other devices associated to the app or the UUID to be // observed are present. if (shouldBindPackage(userId, packageName)) return; diff --git a/services/companion/java/com/android/server/companion/CompanionDeviceShellCommand.java b/services/companion/java/com/android/server/companion/CompanionDeviceShellCommand.java index de4f2b60170f..74b4cabbab67 100644 --- a/services/companion/java/com/android/server/companion/CompanionDeviceShellCommand.java +++ b/services/companion/java/com/android/server/companion/CompanionDeviceShellCommand.java @@ -18,7 +18,7 @@ package com.android.server.companion; import static android.companion.CompanionDeviceManager.MESSAGE_REQUEST_CONTEXT_SYNC; -import static com.android.server.companion.PermissionsUtils.sanitizeWithCallerChecks; +import static com.android.server.companion.utils.PermissionsUtils.sanitizeWithCallerChecks; import android.companion.AssociationInfo; import android.companion.ContextSyncMessage; @@ -36,6 +36,7 @@ import com.android.server.companion.datatransfer.SystemDataTransferProcessor; import com.android.server.companion.datatransfer.contextsync.BitmapUtils; import com.android.server.companion.datatransfer.contextsync.CrossDeviceSyncController; import com.android.server.companion.presence.CompanionDevicePresenceMonitor; +import com.android.server.companion.presence.ObservableUuid; import com.android.server.companion.transport.CompanionTransportManager; import java.io.PrintWriter; diff --git a/services/companion/java/com/android/server/companion/PersistentDataStore.java b/services/companion/java/com/android/server/companion/PersistentDataStore.java index 1ebe65c6aa5f..7527efb7b19a 100644 --- a/services/companion/java/com/android/server/companion/PersistentDataStore.java +++ b/services/companion/java/com/android/server/companion/PersistentDataStore.java @@ -27,11 +27,11 @@ import static com.android.internal.util.XmlUtils.writeLongAttribute; import static com.android.internal.util.XmlUtils.writeStringAttribute; import static com.android.server.companion.CompanionDeviceManagerService.getFirstAssociationIdForUser; import static com.android.server.companion.CompanionDeviceManagerService.getLastAssociationIdForUser; -import static com.android.server.companion.DataStoreUtils.createStorageFileForUser; -import static com.android.server.companion.DataStoreUtils.fileToByteArray; -import static com.android.server.companion.DataStoreUtils.isEndOfTag; -import static com.android.server.companion.DataStoreUtils.isStartOfTag; -import static com.android.server.companion.DataStoreUtils.writeToFileSafely; +import static com.android.server.companion.utils.DataStoreUtils.createStorageFileForUser; +import static com.android.server.companion.utils.DataStoreUtils.fileToByteArray; +import static com.android.server.companion.utils.DataStoreUtils.isEndOfTag; +import static com.android.server.companion.utils.DataStoreUtils.isStartOfTag; +import static com.android.server.companion.utils.DataStoreUtils.writeToFileSafely; import android.annotation.NonNull; import android.annotation.Nullable; @@ -51,6 +51,7 @@ import android.util.Xml; import com.android.internal.util.XmlUtils; import com.android.modules.utils.TypedXmlPullParser; import com.android.modules.utils.TypedXmlSerializer; +import com.android.server.companion.utils.DataStoreUtils; import org.xmlpull.v1.XmlPullParser; import org.xmlpull.v1.XmlPullParserException; diff --git a/services/companion/java/com/android/server/companion/datatransfer/SystemDataTransferProcessor.java b/services/companion/java/com/android/server/companion/datatransfer/SystemDataTransferProcessor.java index 260b21f109d0..74236a402244 100644 --- a/services/companion/java/com/android/server/companion/datatransfer/SystemDataTransferProcessor.java +++ b/services/companion/java/com/android/server/companion/datatransfer/SystemDataTransferProcessor.java @@ -23,7 +23,7 @@ import static android.companion.CompanionDeviceManager.MESSAGE_REQUEST_PERMISSIO import static android.content.ComponentName.createRelative; import static android.content.pm.PackageManager.FEATURE_WATCH; -import static com.android.server.companion.Utils.prepareForIpc; +import static com.android.server.companion.utils.Utils.prepareForIpc; import android.annotation.NonNull; import android.annotation.Nullable; @@ -54,9 +54,9 @@ import android.util.Slog; import com.android.internal.R; import com.android.server.companion.AssociationStore; import com.android.server.companion.CompanionDeviceManagerService; -import com.android.server.companion.PackageUtils; -import com.android.server.companion.PermissionsUtils; import com.android.server.companion.transport.CompanionTransportManager; +import com.android.server.companion.utils.PackageUtils; +import com.android.server.companion.utils.PermissionsUtils; import java.util.List; import java.util.concurrent.ExecutorService; diff --git a/services/companion/java/com/android/server/companion/datatransfer/SystemDataTransferRequestStore.java b/services/companion/java/com/android/server/companion/datatransfer/SystemDataTransferRequestStore.java index c4c80f907b3a..ee816a0c2cc9 100644 --- a/services/companion/java/com/android/server/companion/datatransfer/SystemDataTransferRequestStore.java +++ b/services/companion/java/com/android/server/companion/datatransfer/SystemDataTransferRequestStore.java @@ -22,11 +22,11 @@ import static com.android.internal.util.XmlUtils.readBooleanAttribute; import static com.android.internal.util.XmlUtils.readIntAttribute; import static com.android.internal.util.XmlUtils.writeBooleanAttribute; import static com.android.internal.util.XmlUtils.writeIntAttribute; -import static com.android.server.companion.DataStoreUtils.createStorageFileForUser; -import static com.android.server.companion.DataStoreUtils.fileToByteArray; -import static com.android.server.companion.DataStoreUtils.isEndOfTag; -import static com.android.server.companion.DataStoreUtils.isStartOfTag; -import static com.android.server.companion.DataStoreUtils.writeToFileSafely; +import static com.android.server.companion.utils.DataStoreUtils.createStorageFileForUser; +import static com.android.server.companion.utils.DataStoreUtils.fileToByteArray; +import static com.android.server.companion.utils.DataStoreUtils.isEndOfTag; +import static com.android.server.companion.utils.DataStoreUtils.isStartOfTag; +import static com.android.server.companion.utils.DataStoreUtils.writeToFileSafely; import android.annotation.NonNull; import android.annotation.Nullable; diff --git a/services/companion/java/com/android/server/companion/presence/BleCompanionDeviceScanner.java b/services/companion/java/com/android/server/companion/presence/BleCompanionDeviceScanner.java index 7e3079073c90..679243496e95 100644 --- a/services/companion/java/com/android/server/companion/presence/BleCompanionDeviceScanner.java +++ b/services/companion/java/com/android/server/companion/presence/BleCompanionDeviceScanner.java @@ -34,7 +34,7 @@ import static android.bluetooth.le.ScanSettings.CALLBACK_TYPE_MATCH_LOST; import static android.bluetooth.le.ScanSettings.SCAN_MODE_LOW_POWER; import static com.android.server.companion.presence.CompanionDevicePresenceMonitor.DEBUG; -import static com.android.server.companion.presence.Utils.btDeviceToString; +import static com.android.server.companion.utils.Utils.btDeviceToString; import static java.util.Objects.requireNonNull; diff --git a/services/companion/java/com/android/server/companion/presence/BluetoothCompanionDeviceConnectionListener.java b/services/companion/java/com/android/server/companion/presence/BluetoothCompanionDeviceConnectionListener.java index c514f3ef29d0..0287f6258c06 100644 --- a/services/companion/java/com/android/server/companion/presence/BluetoothCompanionDeviceConnectionListener.java +++ b/services/companion/java/com/android/server/companion/presence/BluetoothCompanionDeviceConnectionListener.java @@ -20,7 +20,7 @@ import static android.companion.DevicePresenceEvent.EVENT_BT_CONNECTED; import static android.companion.DevicePresenceEvent.EVENT_BT_DISCONNECTED; import static com.android.server.companion.presence.CompanionDevicePresenceMonitor.DEBUG; -import static com.android.server.companion.presence.Utils.btDeviceToString; +import static com.android.server.companion.utils.Utils.btDeviceToString; import android.annotation.NonNull; import android.annotation.SuppressLint; @@ -40,8 +40,6 @@ import android.util.SparseArray; import com.android.internal.annotations.GuardedBy; import com.android.internal.util.ArrayUtils; import com.android.server.companion.AssociationStore; -import com.android.server.companion.ObservableUuid; -import com.android.server.companion.ObservableUuidStore; import java.util.Arrays; import java.util.Collections; diff --git a/services/companion/java/com/android/server/companion/presence/CompanionDevicePresenceMonitor.java b/services/companion/java/com/android/server/companion/presence/CompanionDevicePresenceMonitor.java index 54a4692d964d..caca48d3aa02 100644 --- a/services/companion/java/com/android/server/companion/presence/CompanionDevicePresenceMonitor.java +++ b/services/companion/java/com/android/server/companion/presence/CompanionDevicePresenceMonitor.java @@ -43,8 +43,6 @@ import android.util.Slog; import android.util.SparseArray; import com.android.server.companion.AssociationStore; -import com.android.server.companion.ObservableUuid; -import com.android.server.companion.ObservableUuidStore; import java.io.PrintWriter; import java.util.HashSet; diff --git a/services/companion/java/com/android/server/companion/ObservableUuid.java b/services/companion/java/com/android/server/companion/presence/ObservableUuid.java index 6ab3188c8fd2..9cfa2705cb2f 100644 --- a/services/companion/java/com/android/server/companion/ObservableUuid.java +++ b/services/companion/java/com/android/server/companion/presence/ObservableUuid.java @@ -14,7 +14,7 @@ * limitations under the License. */ -package com.android.server.companion; +package com.android.server.companion.presence; import android.annotation.NonNull; import android.annotation.UserIdInt; diff --git a/services/companion/java/com/android/server/companion/ObservableUuidStore.java b/services/companion/java/com/android/server/companion/presence/ObservableUuidStore.java index 94be22afd9e2..ee8b1065b42c 100644 --- a/services/companion/java/com/android/server/companion/ObservableUuidStore.java +++ b/services/companion/java/com/android/server/companion/presence/ObservableUuidStore.java @@ -14,7 +14,7 @@ * limitations under the License. */ -package com.android.server.companion; +package com.android.server.companion.presence; import static com.android.internal.util.XmlUtils.readIntAttribute; import static com.android.internal.util.XmlUtils.readLongAttribute; @@ -22,10 +22,10 @@ import static com.android.internal.util.XmlUtils.readStringAttribute; import static com.android.internal.util.XmlUtils.writeIntAttribute; import static com.android.internal.util.XmlUtils.writeLongAttribute; import static com.android.internal.util.XmlUtils.writeStringAttribute; -import static com.android.server.companion.DataStoreUtils.createStorageFileForUser; -import static com.android.server.companion.DataStoreUtils.isEndOfTag; -import static com.android.server.companion.DataStoreUtils.isStartOfTag; -import static com.android.server.companion.DataStoreUtils.writeToFileSafely; +import static com.android.server.companion.utils.DataStoreUtils.createStorageFileForUser; +import static com.android.server.companion.utils.DataStoreUtils.isEndOfTag; +import static com.android.server.companion.utils.DataStoreUtils.isStartOfTag; +import static com.android.server.companion.utils.DataStoreUtils.writeToFileSafely; import android.annotation.NonNull; import android.annotation.Nullable; @@ -57,6 +57,9 @@ import java.util.concurrent.Future; import java.util.concurrent.TimeUnit; import java.util.concurrent.TimeoutException; +/** + * This store manages the cache and disk data for observable uuids. + */ public class ObservableUuidStore { private static final String TAG = "CDM_ObservableUuidStore"; private static final String FILE_NAME = "observing_uuids_presence.xml"; @@ -84,9 +87,9 @@ public class ObservableUuidStore { } /** - * Remove the observable uuid from the disk. + * Remove the observable uuid. */ - void removeObservableUuid(@UserIdInt int userId, ParcelUuid uuid, String packageName) { + public void removeObservableUuid(@UserIdInt int userId, ParcelUuid uuid, String packageName) { List<ObservableUuid> cachedObservableUuids; synchronized (mLock) { @@ -101,7 +104,10 @@ public class ObservableUuidStore { mExecutor.execute(() -> writeObservableUuidToStore(userId, cachedObservableUuids)); } - void writeObservableUuid(@UserIdInt int userId, ObservableUuid uuid) { + /** + * Write the observable uuid. + */ + public void writeObservableUuid(@UserIdInt int userId, ObservableUuid uuid) { Slog.i(TAG, "Writing uuid=" + uuid.getUuid() + " to store."); List<ObservableUuid> cachedObservableUuids; diff --git a/services/companion/java/com/android/server/companion/presence/Utils.java b/services/companion/java/com/android/server/companion/presence/Utils.java deleted file mode 100644 index 583b443c8cb7..000000000000 --- a/services/companion/java/com/android/server/companion/presence/Utils.java +++ /dev/null @@ -1,49 +0,0 @@ -/* - * Copyright (C) 2022 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.presence; - -import android.annotation.NonNull; -import android.bluetooth.BluetoothDevice; - -/** Utilities for working with Bluetooth and BLE devices. */ -class Utils { - - /** - * @return short String representation of {@link BluetoothDevice}. - */ - static String btDeviceToString(@NonNull BluetoothDevice btDevice) { - final StringBuilder sb = new StringBuilder(btDevice.getAddress()); - - sb.append(" [name="); - final String name = btDevice.getName(); - if (name != null) { - sb.append('\'').append(name).append('\''); - } else { - sb.append("null"); - } - - final String alias = btDevice.getAlias(); - if (alias != null) { - sb.append(", alias='").append(alias).append("'"); - } - - return sb.append(']').toString(); - } - - private Utils() { - } -} diff --git a/services/companion/java/com/android/server/companion/DataStoreUtils.java b/services/companion/java/com/android/server/companion/utils/DataStoreUtils.java index 04ce1f673124..c75b1a57206e 100644 --- a/services/companion/java/com/android/server/companion/DataStoreUtils.java +++ b/services/companion/java/com/android/server/companion/utils/DataStoreUtils.java @@ -14,7 +14,7 @@ * limitations under the License. */ -package com.android.server.companion; +package com.android.server.companion.utils; import static org.xmlpull.v1.XmlPullParser.END_TAG; import static org.xmlpull.v1.XmlPullParser.START_TAG; @@ -80,7 +80,7 @@ public 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. + * their DE (/data/system_de/[user-id]/) directory. */ public static void writeToFileSafely( @NonNull AtomicFile file, @NonNull ThrowingConsumer<FileOutputStream> consumer) { diff --git a/services/companion/java/com/android/server/companion/MetricUtils.java b/services/companion/java/com/android/server/companion/utils/MetricUtils.java index cf867b67cbca..8ea5c89116eb 100644 --- a/services/companion/java/com/android/server/companion/MetricUtils.java +++ b/services/companion/java/com/android/server/companion/utils/MetricUtils.java @@ -14,7 +14,7 @@ * limitations under the License. */ -package com.android.server.companion; +package com.android.server.companion.utils; import static android.companion.AssociationRequest.DEVICE_PROFILE_APP_STREAMING; import static android.companion.AssociationRequest.DEVICE_PROFILE_AUTOMOTIVE_PROJECTION; @@ -41,7 +41,7 @@ import android.util.ArrayMap; import java.util.Map; -final class MetricUtils { +public final class MetricUtils { private static final Map<String, Integer> METRIC_DEVICE_PROFILE; static { @@ -75,13 +75,19 @@ final class MetricUtils { METRIC_DEVICE_PROFILE = unmodifiableMap(map); } - static void logCreateAssociation(String profile) { + /** + * Log association creation + */ + public static void logCreateAssociation(String profile) { write(CDM_ASSOCIATION_ACTION, CDM_ASSOCIATION_ACTION__ACTION__CREATED, METRIC_DEVICE_PROFILE.get(profile)); } - static void logRemoveAssociation(String profile) { + /** + * Log association removal + */ + public static void logRemoveAssociation(String profile) { write(CDM_ASSOCIATION_ACTION, CDM_ASSOCIATION_ACTION__ACTION__REMOVED, METRIC_DEVICE_PROFILE.get(profile)); diff --git a/services/companion/java/com/android/server/companion/PackageUtils.java b/services/companion/java/com/android/server/companion/utils/PackageUtils.java index 3aae1ec99f55..d38590e0a251 100644 --- a/services/companion/java/com/android/server/companion/PackageUtils.java +++ b/services/companion/java/com/android/server/companion/utils/PackageUtils.java @@ -14,16 +14,13 @@ * limitations under the License. */ -package com.android.server.companion; +package com.android.server.companion.utils; import static android.content.pm.PackageManager.FEATURE_COMPANION_DEVICE_SETUP; import static android.content.pm.PackageManager.GET_CONFIGURATIONS; import static android.content.pm.PackageManager.GET_PERMISSIONS; import static android.os.Binder.getCallingUid; -import static com.android.server.companion.CompanionDeviceManagerService.DEBUG; -import static com.android.server.companion.CompanionDeviceManagerService.TAG; - import android.Manifest; import android.annotation.NonNull; import android.annotation.Nullable; @@ -44,13 +41,11 @@ import android.content.pm.ServiceInfo; import android.content.pm.Signature; import android.os.Binder; import android.os.Process; -import android.util.Log; import android.util.Slog; import com.android.internal.util.ArrayUtils; import java.util.ArrayList; -import java.util.Arrays; import java.util.HashMap; import java.util.HashSet; import java.util.List; @@ -58,16 +53,22 @@ import java.util.Map; import java.util.Set; /** - * Utility methods for working with {@link PackageInfo}-s. + * Utility methods for working with {@link PackageInfo}. */ public final class PackageUtils { + + private static final String TAG = "CDM_PackageUtils"; + private static final Intent COMPANION_SERVICE_INTENT = new Intent(CompanionDeviceService.SERVICE_INTERFACE); private static final String PROPERTY_PRIMARY_TAG = "android.companion.PROPERTY_PRIMARY_COMPANION_DEVICE_SERVICE"; + /** + * Get package info + */ @Nullable - static PackageInfo getPackageInfo(@NonNull Context context, + public static PackageInfo getPackageInfo(@NonNull Context context, @UserIdInt int userId, @NonNull String packageName) { final PackageManager pm = context.getPackageManager(); final PackageInfoFlags flags = PackageInfoFlags.of(GET_PERMISSIONS | GET_CONFIGURATIONS); @@ -81,26 +82,32 @@ public final class PackageUtils { }); } - static void enforceUsesCompanionDeviceFeature(@NonNull Context context, + /** + * Require the app to declare the companion device feature. + */ + public static void enforceUsesCompanionDeviceFeature(@NonNull Context context, @UserIdInt int userId, @NonNull String packageName) { // Allow system server to create CDM associations without FEATURE_COMPANION_DEVICE_SETUP if (getCallingUid() == Process.SYSTEM_UID) { return; } - String requiredFeature = FEATURE_COMPANION_DEVICE_SETUP; + PackageInfo packageInfo = getPackageInfo(context, userId, packageName); + if (packageInfo == null) { + throw new IllegalArgumentException("Package " + packageName + " doesn't exist."); + } - FeatureInfo[] requestedFeatures = getPackageInfo(context, userId, packageName).reqFeatures; + FeatureInfo[] requestedFeatures = packageInfo.reqFeatures; if (requestedFeatures != null) { - for (int i = 0; i < requestedFeatures.length; i++) { - if (requiredFeature.equals(requestedFeatures[i].name)) { + for (FeatureInfo requestedFeature : requestedFeatures) { + if (FEATURE_COMPANION_DEVICE_SETUP.equals(requestedFeature.name)) { return; } } } throw new IllegalStateException("Must declare uses-feature " - + requiredFeature + + FEATURE_COMPANION_DEVICE_SETUP + " in manifest to use this API"); } @@ -109,7 +116,7 @@ public final class PackageUtils { * Services marked as "primary" would always appear at the head of the lists, *before* * all non-primary services. */ - static @NonNull Map<String, List<ComponentName>> getCompanionServicesForUser( + public static @NonNull Map<String, List<ComponentName>> getCompanionServicesForUser( @NonNull Context context, @UserIdInt int userId) { final PackageManager pm = context.getPackageManager(); final List<ResolveInfo> companionServices = pm.queryIntentServicesAsUser( @@ -179,9 +186,7 @@ public final class PackageUtils { final String[] allowlistedPackages = context.getResources() .getStringArray(com.android.internal.R.array.config_companionDevicePackages); if (!ArrayUtils.contains(allowlistedPackages, packageName)) { - if (DEBUG) { - Log.d(TAG, packageName + " is not allowlisted."); - } + Slog.d(TAG, packageName + " is not allowlisted."); return false; } @@ -212,13 +217,6 @@ public final class PackageUtils { if (!requestingPackageSignatureAllowlisted) { Slog.w(TAG, "Certificate mismatch for allowlisted package " + packageName); - if (DEBUG) { - Log.d(TAG, " > allowlisted signatures for " + packageName + ": [" - + String.join(", ", allowlistedSignatureDigestsForRequestingPackage) - + "]"); - Log.d(TAG, " > actual signatures for " + packageName + ": " - + Arrays.toString(requestingPackageSignatureDigests)); - } } return requestingPackageSignatureAllowlisted; diff --git a/services/companion/java/com/android/server/companion/PermissionsUtils.java b/services/companion/java/com/android/server/companion/utils/PermissionsUtils.java index 15bebbae05b1..2cf1f462a7d1 100644 --- a/services/companion/java/com/android/server/companion/PermissionsUtils.java +++ b/services/companion/java/com/android/server/companion/utils/PermissionsUtils.java @@ -14,7 +14,7 @@ * limitations under the License. */ -package com.android.server.companion; +package com.android.server.companion.utils; import static android.Manifest.permission.INTERACT_ACROSS_USERS; import static android.Manifest.permission.MANAGE_COMPANION_DEVICES; @@ -75,16 +75,22 @@ public final class PermissionsUtils { DEVICE_PROFILE_TO_PERMISSION = unmodifiableMap(map); } - static void enforcePermissionsForAssociation(@NonNull Context context, + /** + * Require the app to declare necessary permission for creating association. + */ + public static void enforcePermissionForCreatingAssociation(@NonNull Context context, @NonNull AssociationRequest request, int packageUid) { - enforceRequestDeviceProfilePermissions(context, request.getDeviceProfile(), packageUid); + enforcePermissionForRequestingProfile(context, request.getDeviceProfile(), packageUid); if (request.isSelfManaged()) { - enforceRequestSelfManagedPermission(context, packageUid); + enforcePermissionForRequestingSelfManaged(context, packageUid); } } - static void enforceRequestDeviceProfilePermissions( + /** + * Require the app to declare necessary permission for creating association with profile. + */ + public static void enforcePermissionForRequestingProfile( @NonNull Context context, @Nullable String deviceProfile, int packageUid) { // Device profile can be null. if (deviceProfile == null) return; @@ -101,7 +107,11 @@ public final class PermissionsUtils { } } - static void enforceRequestSelfManagedPermission(@NonNull Context context, int packageUid) { + /** + * Require the app to declare necessary permission for creating self-managed association. + */ + public static void enforcePermissionForRequestingSelfManaged(@NonNull Context context, + int packageUid) { if (context.checkPermission(REQUEST_COMPANION_SELF_MANAGED, getCallingPid(), packageUid) != PERMISSION_GRANTED) { throw new SecurityException("Application does not hold " @@ -109,25 +119,39 @@ public final class PermissionsUtils { } } - static boolean checkCallerCanInteractWithUserId(@NonNull Context context, int userId) { + /** + * Check if the caller can interact with the user. + */ + public static boolean checkCallerCanInteractWithUserId(@NonNull Context context, int userId) { if (getCallingUserId() == userId) return true; return context.checkCallingPermission(INTERACT_ACROSS_USERS) == PERMISSION_GRANTED; } - static void enforceCallerCanInteractWithUserId(@NonNull Context context, int userId) { + /** + * Require the caller to be able to interact with the user. + */ + public static void enforceCallerCanInteractWithUserId(@NonNull Context context, int userId) { if (getCallingUserId() == userId) return; context.enforceCallingPermission(INTERACT_ACROSS_USERS, null); } - static void enforceCallerIsSystemOrCanInteractWithUserId(@NonNull Context context, int userId) { + /** + * Require the caller to be system UID or to be able to interact with the user. + */ + public static void enforceCallerIsSystemOrCanInteractWithUserId(@NonNull Context context, + int userId) { if (getCallingUid() == SYSTEM_UID) return; enforceCallerCanInteractWithUserId(context, userId); } - static boolean checkCallerIsSystemOr(@UserIdInt int userId, @NonNull String packageName) { + /** + * Check if the caller is system UID or the provided user. + */ + public static boolean checkCallerIsSystemOr(@UserIdInt int userId, + @NonNull String packageName) { final int callingUid = getCallingUid(); if (callingUid == SYSTEM_UID) return true; @@ -158,13 +182,19 @@ public final class PermissionsUtils { } } - static boolean checkCallerCanManageCompanionDevice(@NonNull Context context) { + /** + * Check if the caller holds the necessary permission to manage companion devices. + */ + public static boolean checkCallerCanManageCompanionDevice(@NonNull Context context) { if (getCallingUid() == SYSTEM_UID) return true; return context.checkCallingPermission(MANAGE_COMPANION_DEVICES) == PERMISSION_GRANTED; } - static void enforceCallerCanManageAssociationsForPackage(@NonNull Context context, + /** + * Require the caller to be able to manage the associations for the package. + */ + public static void enforceCallerCanManageAssociationsForPackage(@NonNull Context context, @UserIdInt int userId, @NonNull String packageName, @Nullable String actionDescription) { if (checkCallerCanManageAssociationsForPackage(context, userId, packageName)) return; @@ -175,7 +205,10 @@ public final class PermissionsUtils { + " for u" + userId + "/" + packageName); } - static void enforceCallerCanObservingDevicePresenceByUuid(@NonNull Context context) { + /** + * Require the caller to hold necessary permission to observe device presence by UUID. + */ + public static void enforceCallerCanObservingDevicePresenceByUuid(@NonNull Context context) { if (context.checkCallingPermission(REQUEST_OBSERVE_DEVICE_UUID_PRESENCE) != PERMISSION_GRANTED) { throw new SecurityException("Caller (uid=" + getCallingUid() + ") does not have " @@ -193,7 +226,7 @@ public final class PermissionsUtils { * </ul> * @return whether the caller is one of the above. */ - static boolean checkCallerCanManageAssociationsForPackage(@NonNull Context context, + public static boolean checkCallerCanManageAssociationsForPackage(@NonNull Context context, @UserIdInt int userId, @NonNull String packageName) { if (checkCallerIsSystemOr(userId, packageName)) return true; diff --git a/services/companion/java/com/android/server/companion/RolesUtils.java b/services/companion/java/com/android/server/companion/utils/RolesUtils.java index af9d2d783100..f798e218e8e0 100644 --- a/services/companion/java/com/android/server/companion/RolesUtils.java +++ b/services/companion/java/com/android/server/companion/utils/RolesUtils.java @@ -14,13 +14,10 @@ * limitations under the License. */ -package com.android.server.companion; +package com.android.server.companion.utils; import static android.app.role.RoleManager.MANAGE_HOLDERS_FLAG_DONT_KILL_APP; -import static com.android.server.companion.CompanionDeviceManagerService.DEBUG; -import static com.android.server.companion.CompanionDeviceManagerService.TAG; - import android.annotation.NonNull; import android.annotation.SuppressLint; import android.annotation.UserIdInt; @@ -29,7 +26,6 @@ import android.companion.AssociationInfo; import android.content.Context; import android.os.Binder; import android.os.UserHandle; -import android.util.Log; import android.util.Slog; import java.util.List; @@ -37,9 +33,14 @@ import java.util.function.Consumer; /** Utility methods for accessing {@link RoleManager} APIs. */ @SuppressLint("LongLogTag") -final class RolesUtils { +public final class RolesUtils { + + private static final String TAG = "CDM_RolesUtils"; - static boolean isRoleHolder(@NonNull Context context, @UserIdInt int userId, + /** + * Check if the package holds the role. + */ + public static boolean isRoleHolder(@NonNull Context context, @UserIdInt int userId, @NonNull String packageName, @NonNull String role) { final RoleManager roleManager = context.getSystemService(RoleManager.class); final List<String> roleHolders = roleManager.getRoleHoldersAsUser( @@ -58,13 +59,9 @@ final class RolesUtils { * false if failed. If the association does not have any device profile * specified, then the operation will always be successful as a no-op. */ - static void addRoleHolderForAssociation( + public static void addRoleHolderForAssociation( @NonNull Context context, @NonNull AssociationInfo associationInfo, @NonNull Consumer<Boolean> roleGrantResult) { - if (DEBUG) { - Log.d(TAG, "addRoleHolderForAssociation() associationInfo=" + associationInfo); - } - final String deviceProfile = associationInfo.getDeviceProfile(); if (deviceProfile == null) { // If no device profile is specified, then no-op and resolve callback with success. @@ -83,33 +80,30 @@ final class RolesUtils { roleGrantResult); } - static void removeRoleHolderForAssociation( - @NonNull Context context, @NonNull AssociationInfo associationInfo) { - if (DEBUG) { - Log.d(TAG, "removeRoleHolderForAssociation() associationInfo=" + associationInfo); - } - - final String deviceProfile = associationInfo.getDeviceProfile(); + /** + * Remove the role for the package association. + */ + public static void removeRoleHolderForAssociation( + @NonNull Context context, int userId, String packageName, String deviceProfile) { if (deviceProfile == null) return; final RoleManager roleManager = context.getSystemService(RoleManager.class); - final String packageName = associationInfo.getPackageName(); - final int userId = associationInfo.getUserId(); final UserHandle userHandle = UserHandle.of(userId); - Slog.i(TAG, "Removing CDM role holder, role=" + deviceProfile - + ", package=u" + userId + "\\" + packageName); + Slog.i(TAG, "Removing CDM role=" + deviceProfile + + " for userId=" + userId + ", packageName=" + packageName); final long identity = Binder.clearCallingIdentity(); try { roleManager.removeRoleHolderAsUser(deviceProfile, packageName, - MANAGE_HOLDERS_FLAG_DONT_KILL_APP, userHandle, context.getMainExecutor(), - success -> { - if (!success) { - Slog.e(TAG, "Failed to remove u" + userId + "\\" + packageName - + " from the list of " + deviceProfile + " holders."); - } - }); + MANAGE_HOLDERS_FLAG_DONT_KILL_APP, userHandle, context.getMainExecutor(), + success -> { + if (!success) { + Slog.e(TAG, "Failed to remove userId=" + userId + ", packageName=" + + packageName + " from the list of " + deviceProfile + + " holders."); + } + }); } finally { Binder.restoreCallingIdentity(identity); } diff --git a/services/companion/java/com/android/server/companion/Utils.java b/services/companion/java/com/android/server/companion/utils/Utils.java index b9f61ecd8c4f..8302997a5705 100644 --- a/services/companion/java/com/android/server/companion/Utils.java +++ b/services/companion/java/com/android/server/companion/utils/Utils.java @@ -14,8 +14,10 @@ * limitations under the License. */ -package com.android.server.companion; +package com.android.server.companion.utils; +import android.annotation.NonNull; +import android.bluetooth.BluetoothDevice; import android.os.Parcel; import android.os.ResultReceiver; @@ -43,5 +45,27 @@ public final class Utils { return ipcFriendly; } + /** + * Return a human-readable string for the BluetoothDevice. + */ + public static String btDeviceToString(@NonNull BluetoothDevice btDevice) { + final StringBuilder sb = new StringBuilder(btDevice.getAddress()); + + sb.append(" [name="); + final String name = btDevice.getName(); + if (name != null) { + sb.append('\'').append(name).append('\''); + } else { + sb.append("null"); + } + + final String alias = btDevice.getAlias(); + if (alias != null) { + sb.append(", alias='").append(alias).append("'"); + } + + return sb.append(']').toString(); + } + private Utils() {} } diff --git a/services/tests/servicestests/src/com/android/server/companion/utils/PackageUtilsTest.java b/services/tests/servicestests/src/com/android/server/companion/utils/PackageUtilsTest.java index 01159b1f901c..bcb4877f64c7 100644 --- a/services/tests/servicestests/src/com/android/server/companion/utils/PackageUtilsTest.java +++ b/services/tests/servicestests/src/com/android/server/companion/utils/PackageUtilsTest.java @@ -32,7 +32,6 @@ import android.testing.AndroidTestingRunner; import androidx.test.platform.app.InstrumentationRegistry; -import com.android.server.companion.PackageUtils; import com.android.server.pm.pkg.AndroidPackage; import org.junit.Test; |