diff --git a/service/src/com/android/server/connectivity/SatelliteAccessController.java b/service/src/com/android/server/connectivity/SatelliteAccessController.java index 3055b27eab..bbbd4aabea 100644 --- a/service/src/com/android/server/connectivity/SatelliteAccessController.java +++ b/service/src/com/android/server/connectivity/SatelliteAccessController.java @@ -39,6 +39,7 @@ import com.android.internal.annotations.VisibleForTesting; import com.android.internal.util.IndentingPrintWriter; import com.android.net.module.util.CollectionUtils; import com.android.net.module.util.DeviceConfigUtils; +import com.android.net.module.util.HandlerUtils; import com.android.net.module.util.SharedLog; import java.util.List; @@ -52,10 +53,14 @@ import javax.annotation.CheckReturnValue; * Tracks the uid of all the default messaging application which are role_sms role and * satellite_communication permission complaint and requests ConnectivityService to create multi * layer request with satellite internet access support for the default message application. + * + * Note that this class is not thread safe and should only be accessed on the handler + * thread, except {@link #start()}. */ public class SatelliteAccessController { private static final String TAG = SatelliteAccessController.class.getSimpleName(); // Shamelessly copied from telephony/satellite/SatelliteManager.java. + // TODO: Import from SatelliteManager when it is available. @VisibleForTesting public static final String PROPERTY_SATELLITE_DATA_OPTIMIZED = "android.telephony.PROPERTY_SATELLITE_DATA_OPTIMIZED"; @@ -93,6 +98,7 @@ public class SatelliteAccessController { implements OnRoleHoldersChangedListener { @Override public void onRoleHoldersChanged(String role, UserHandle userHandle) { + HandlerUtils.ensureRunningOnHandlerThread(mConnectivityServiceHandler); if (RoleManager.ROLE_SMS.equals(role) && updateSatelliteRoleSmsUids(userHandle)) { mLog.i("ROLE_SMS Change detected "); reportSatelliteNetworkFallbackUids(); @@ -267,6 +273,7 @@ public class SatelliteAccessController { */ public void onUserAddedWithInstalledPackageList(@NonNull UserHandle userHandle, @NonNull List apps) { + HandlerUtils.ensureRunningOnHandlerThread(mConnectivityServiceHandler); // Obtain uids with role sms and satellite communication permission for the added user. final boolean roleSmsUidsChanged = updateSatelliteRoleSmsUids(userHandle); @@ -297,6 +304,7 @@ public class SatelliteAccessController { * @param userHandle The integer userHandle of the removed user. See {@link #EXTRA_USER_HANDLE}. */ public void onUserRemoved(@NonNull UserHandle userHandle) { + HandlerUtils.ensureRunningOnHandlerThread(mConnectivityServiceHandler); final boolean smsRoleUidsChanged = updateSatelliteRoleSmsUidListOnUserRemoval(userHandle.getIdentifier()); final boolean satelliteOptInUidsChanged; @@ -319,6 +327,7 @@ public class SatelliteAccessController { * @param uid The uid of the new package. */ public void onPackageAdded(@NonNull final String packageName, final int uid) { + HandlerUtils.ensureRunningOnHandlerThread(mConnectivityServiceHandler); if (!mSupportConstrainedDataSatelliteOptIn) return; if (addSatelliteDataOptInUid(packageName, uid)) { reportSatelliteNetworkFallbackUids(); @@ -340,6 +349,7 @@ public class SatelliteAccessController { * @param pkgList An array of package names that have become available. */ public void onExternalApplicationsAvailable(String[] pkgList) { + HandlerUtils.ensureRunningOnHandlerThread(mConnectivityServiceHandler); if (!mSupportConstrainedDataSatelliteOptIn) return; if (CollectionUtils.isEmpty(pkgList)) { mLog.e("No available external application."); @@ -367,6 +377,7 @@ public class SatelliteAccessController { * @param uid containing the integer uid previously assigned to the package. */ public void onPackageRemoved(@NonNull final String packageName, final int uid) { + HandlerUtils.ensureRunningOnHandlerThread(mConnectivityServiceHandler); if (!mSupportConstrainedDataSatelliteOptIn) return; // Scan for all apps sharing the same uid. @@ -414,6 +425,7 @@ public class SatelliteAccessController { /** Dump info to dumpsys */ public void dump(@NonNull IndentingPrintWriter pw) { + HandlerUtils.ensureRunningOnHandlerThread(mConnectivityServiceHandler); pw.println("SatelliteAccessController:"); pw.increaseIndent(); pw.println("SupportConstrainedDataSatelliteOptIn: " diff --git a/tests/unit/java/com/android/server/connectivity/SatelliteAccessControllerTest.kt b/tests/unit/java/com/android/server/connectivity/SatelliteAccessControllerTest.kt index 4c157d4370..3bb1c92bf3 100644 --- a/tests/unit/java/com/android/server/connectivity/SatelliteAccessControllerTest.kt +++ b/tests/unit/java/com/android/server/connectivity/SatelliteAccessControllerTest.kt @@ -159,13 +159,13 @@ class SatelliteAccessControllerTest { RoleManager.ROLE_SMS, PRIMARY_USER_HANDLE ) - roleHolderChangedListener.onRoleHoldersChanged(RoleManager.ROLE_SMS, PRIMARY_USER_HANDLE) + onRoleHoldersChanged(RoleManager.ROLE_SMS, PRIMARY_USER_HANDLE) verify(callback, never()).accept(any(), any()) // check DEFAULT_MESSAGING_APP1 is available as satellite network fallback uid doReturn(listOf(SMS_APP1)) .`when`(deps).getRoleHoldersAsUser(RoleManager.ROLE_SMS, PRIMARY_USER_HANDLE) - roleHolderChangedListener.onRoleHoldersChanged(RoleManager.ROLE_SMS, PRIMARY_USER_HANDLE) + onRoleHoldersChanged(RoleManager.ROLE_SMS, PRIMARY_USER_HANDLE) verify(callback).accept(setOf(SMS_APP_ID1.toUid(PRIMARY_USER)), emptySet()) // check SMS_APP2 is available as satellite network Fallback uid @@ -173,7 +173,7 @@ class SatelliteAccessControllerTest { RoleManager.ROLE_SMS, PRIMARY_USER_HANDLE ) - roleHolderChangedListener.onRoleHoldersChanged(RoleManager.ROLE_SMS, PRIMARY_USER_HANDLE) + onRoleHoldersChanged(RoleManager.ROLE_SMS, PRIMARY_USER_HANDLE) verify(callback).accept(setOf(SMS_APP_ID2.toUid(PRIMARY_USER)), emptySet()) // check no uid is available as satellite network fallback uid @@ -181,7 +181,7 @@ class SatelliteAccessControllerTest { RoleManager.ROLE_SMS, PRIMARY_USER_HANDLE ) - roleHolderChangedListener.onRoleHoldersChanged(RoleManager.ROLE_SMS, PRIMARY_USER_HANDLE) + onRoleHoldersChanged(RoleManager.ROLE_SMS, PRIMARY_USER_HANDLE) verify(callback).accept(emptySet(), emptySet()) } @@ -192,7 +192,7 @@ class SatelliteAccessControllerTest { RoleManager.ROLE_SMS, PRIMARY_USER_HANDLE ) - roleHolderChangedListener.onRoleHoldersChanged(RoleManager.ROLE_SMS, PRIMARY_USER_HANDLE) + onRoleHoldersChanged(RoleManager.ROLE_SMS, PRIMARY_USER_HANDLE) verify(callback, never()).accept(any(), any()) // Check DEFAULT_MESSAGING_APP1 is not available as satellite network fallback uid @@ -202,7 +202,7 @@ class SatelliteAccessControllerTest { .checkPermission(Manifest.permission.SATELLITE_COMMUNICATION, SMS_APP1) doReturn(listOf(SMS_APP1)) .`when`(deps).getRoleHoldersAsUser(RoleManager.ROLE_SMS, PRIMARY_USER_HANDLE) - roleHolderChangedListener.onRoleHoldersChanged(RoleManager.ROLE_SMS, PRIMARY_USER_HANDLE) + onRoleHoldersChanged(RoleManager.ROLE_SMS, PRIMARY_USER_HANDLE) verify(callback, never()).accept(any(), any()) } @@ -211,10 +211,7 @@ class SatelliteAccessControllerTest { startSatelliteAccessController() doReturn(listOf(SMS_APP1)) .`when`(deps).getRoleHoldersAsUser(RoleManager.ROLE_SMS, PRIMARY_USER_HANDLE) - roleHolderChangedListener.onRoleHoldersChanged( - RoleManager.ROLE_BROWSER, - PRIMARY_USER_HANDLE - ) + onRoleHoldersChanged(RoleManager.ROLE_BROWSER, PRIMARY_USER_HANDLE) verify(callback, never()).accept(any(), any()) } @@ -225,13 +222,13 @@ class SatelliteAccessControllerTest { RoleManager.ROLE_SMS, PRIMARY_USER_HANDLE ) - roleHolderChangedListener.onRoleHoldersChanged(RoleManager.ROLE_SMS, PRIMARY_USER_HANDLE) + onRoleHoldersChanged(RoleManager.ROLE_SMS, PRIMARY_USER_HANDLE) verify(callback, never()).accept(any(), any()) // check SMS_APP1 is available as satellite network fallback uid at primary user doReturn(listOf(SMS_APP1)) .`when`(deps).getRoleHoldersAsUser(RoleManager.ROLE_SMS, PRIMARY_USER_HANDLE) - roleHolderChangedListener.onRoleHoldersChanged(RoleManager.ROLE_SMS, PRIMARY_USER_HANDLE) + onRoleHoldersChanged(RoleManager.ROLE_SMS, PRIMARY_USER_HANDLE) verify(callback).accept(setOf(SMS_APP_ID1.toUid(PRIMARY_USER)), emptySet()) // check SMS_APP2 is available as satellite network fallback uid at primary user @@ -239,7 +236,7 @@ class SatelliteAccessControllerTest { RoleManager.ROLE_SMS, PRIMARY_USER_HANDLE ) - roleHolderChangedListener.onRoleHoldersChanged(RoleManager.ROLE_SMS, PRIMARY_USER_HANDLE) + onRoleHoldersChanged(RoleManager.ROLE_SMS, PRIMARY_USER_HANDLE) verify(callback).accept(setOf(SMS_APP_ID2.toUid(PRIMARY_USER)), emptySet()) // check SMS_APP1 is available as satellite network fallback uid at secondary user @@ -247,7 +244,7 @@ class SatelliteAccessControllerTest { RoleManager.ROLE_SMS, SECONDARY_USER_HANDLE ) - roleHolderChangedListener.onRoleHoldersChanged(RoleManager.ROLE_SMS, SECONDARY_USER_HANDLE) + onRoleHoldersChanged(RoleManager.ROLE_SMS, SECONDARY_USER_HANDLE) verify(callback).accept( setOf(SMS_APP_ID2.toUid(PRIMARY_USER), SMS_APP_ID1.toUid(SECONDARY_USER)), emptySet() @@ -258,16 +255,13 @@ class SatelliteAccessControllerTest { RoleManager.ROLE_SMS, PRIMARY_USER_HANDLE ) - roleHolderChangedListener.onRoleHoldersChanged( - RoleManager.ROLE_SMS, - PRIMARY_USER_HANDLE - ) + onRoleHoldersChanged(RoleManager.ROLE_SMS, PRIMARY_USER_HANDLE) verify(callback).accept(setOf(SMS_APP_ID1.toUid(SECONDARY_USER)), emptySet()) // check SMS_APP2 is available as satellite network fallback uid at secondary user doReturn(listOf(SMS_APP2)) .`when`(deps).getRoleHoldersAsUser(RoleManager.ROLE_SMS, SECONDARY_USER_HANDLE) - roleHolderChangedListener.onRoleHoldersChanged(RoleManager.ROLE_SMS, SECONDARY_USER_HANDLE) + onRoleHoldersChanged(RoleManager.ROLE_SMS, SECONDARY_USER_HANDLE) verify(callback).accept(setOf(SMS_APP_ID2.toUid(SECONDARY_USER)), emptySet()) // check no uid is available as satellite network fallback uid at secondary user @@ -275,7 +269,7 @@ class SatelliteAccessControllerTest { RoleManager.ROLE_SMS, SECONDARY_USER_HANDLE ) - roleHolderChangedListener.onRoleHoldersChanged(RoleManager.ROLE_SMS, SECONDARY_USER_HANDLE) + onRoleHoldersChanged(RoleManager.ROLE_SMS, SECONDARY_USER_HANDLE) verify(callback).accept(emptySet(), emptySet()) } @@ -287,7 +281,7 @@ class SatelliteAccessControllerTest { RoleManager.ROLE_SMS, PRIMARY_USER_HANDLE ) - roleHolderChangedListener.onRoleHoldersChanged(RoleManager.ROLE_SMS, PRIMARY_USER_HANDLE) + onRoleHoldersChanged(RoleManager.ROLE_SMS, PRIMARY_USER_HANDLE) verify(callback).accept(setOf(SMS_APP_ID2.toUid(PRIMARY_USER)), emptySet()) // check SMS_APP1 is available as satellite network fallback uid at secondary user @@ -295,14 +289,12 @@ class SatelliteAccessControllerTest { RoleManager.ROLE_SMS, SECONDARY_USER_HANDLE ) - roleHolderChangedListener.onRoleHoldersChanged(RoleManager.ROLE_SMS, SECONDARY_USER_HANDLE) + onRoleHoldersChanged(RoleManager.ROLE_SMS, SECONDARY_USER_HANDLE) verify(callback).accept( setOf(SMS_APP_ID2.toUid(PRIMARY_USER), SMS_APP_ID1.toUid(SECONDARY_USER)), emptySet() ) - processOnHandlerThread { - satelliteAccessController.onUserRemoved(SECONDARY_USER_HANDLE) - } + onUserRemoved(SECONDARY_USER_HANDLE) verify(callback, times(2)).accept( setOf(SMS_APP_ID2.toUid(PRIMARY_USER)), emptySet() @@ -315,6 +307,33 @@ class SatelliteAccessControllerTest { return future.get() } + private fun onRoleHoldersChanged(roleName: String, userHandle: UserHandle) = + processOnHandlerThread { + roleHolderChangedListener.onRoleHoldersChanged(roleName, userHandle) + } + + private fun onUserAddedWithInstalledPackageList( + userHandle: UserHandle, + apps: List + ) = processOnHandlerThread { + satelliteAccessController.onUserAddedWithInstalledPackageList(userHandle, apps) + } + + private fun onUserRemoved(userHandle: UserHandle) = processOnHandlerThread { + satelliteAccessController.onUserRemoved(userHandle) + } + + private fun onPackageAdded(packageName: String, uid: Int) = + processOnHandlerThread { satelliteAccessController.onPackageAdded(packageName, uid) } + + private fun onPackageRemoved(packageName: String, uid: Int) = + processOnHandlerThread { satelliteAccessController.onPackageRemoved(packageName, uid) } + + private fun onExternalApplicationsAvailable(pkgList: Array) = + processOnHandlerThread { + satelliteAccessController.onExternalApplicationsAvailable(pkgList) + } + private fun startSatelliteAccessController() { satelliteAccessController.start() // Get registered listener using captor @@ -352,7 +371,7 @@ class SatelliteAccessControllerTest { @Test fun testSatelliteOptInUids_onPackageAdded() { mockIsSatelliteDataOptimizedApp(TEST_PACKAGE1, true) - satelliteAccessController.onPackageAdded(TEST_PACKAGE1, TEST_UID1) + onPackageAdded(TEST_PACKAGE1, TEST_UID1) verify(callback).accept(emptySet(), setOf(TEST_UID1)) } @@ -360,7 +379,7 @@ class SatelliteAccessControllerTest { @Test fun testSatelliteOptInUids_onPackageAdded_ignoresIfNotSatelliteOptimized() { mockIsSatelliteDataOptimizedApp(TEST_PACKAGE1, false) - satelliteAccessController.onPackageAdded(TEST_PACKAGE1, TEST_UID1) + onPackageAdded(TEST_PACKAGE1, TEST_UID1) verify(callback, never()).accept(any(), any()) } @@ -370,9 +389,9 @@ class SatelliteAccessControllerTest { mockIsSatelliteDataOptimizedApp(TEST_PACKAGE1, true) mockGetPackagesForUid(TEST_UID1, arrayOf(TEST_PACKAGE1)) - satelliteAccessController.onPackageAdded(TEST_PACKAGE1, TEST_UID1) + onPackageAdded(TEST_PACKAGE1, TEST_UID1) verify(callback).accept(emptySet(), setOf(TEST_UID1)) - satelliteAccessController.onPackageRemoved(TEST_PACKAGE1, TEST_UID1) + onPackageRemoved(TEST_PACKAGE1, TEST_UID1) verify(callback).accept(emptySet(), emptySet()) } @@ -385,14 +404,14 @@ class SatelliteAccessControllerTest { // Verify uid is not removed if there is still another package shares the same uid. val inOrder = inOrder(callback) - satelliteAccessController.onPackageAdded(TEST_PACKAGE1, TEST_UID1) + onPackageAdded(TEST_PACKAGE1, TEST_UID1) inOrder.verify(callback).accept(emptySet(), setOf(TEST_UID1)) - satelliteAccessController.onPackageRemoved(TEST_PACKAGE1, TEST_UID1) + onPackageRemoved(TEST_PACKAGE1, TEST_UID1) inOrder.verifyNoMoreInteractions() // Verify uid is removed if there is no other package with shared uid. mockGetPackagesForUid(TEST_UID1, null) - satelliteAccessController.onPackageRemoved(TEST_PACKAGE2, TEST_UID1) + onPackageRemoved(TEST_PACKAGE2, TEST_UID1) inOrder.verify(callback).accept(emptySet(), emptySet()) } @@ -405,18 +424,16 @@ class SatelliteAccessControllerTest { val packageInfo2 = makePackageInfo(TEST_PACKAGE2, TEST_UID2) val inOrder = inOrder(callback) - satelliteAccessController - .onUserAddedWithInstalledPackageList(PRIMARY_USER_HANDLE, listOf(packageInfo1)) - satelliteAccessController - .onUserAddedWithInstalledPackageList(SECONDARY_USER_HANDLE, listOf(packageInfo2)) + onUserAddedWithInstalledPackageList(PRIMARY_USER_HANDLE, listOf(packageInfo1)) + onUserAddedWithInstalledPackageList(SECONDARY_USER_HANDLE, listOf(packageInfo2)) inOrder.verify(callback).accept(emptySet(), setOf(TEST_UID1)) inOrder.verify(callback).accept(emptySet(), setOf(TEST_UID1, TEST_UID2)) - satelliteAccessController.onUserRemoved(SECONDARY_USER_HANDLE) + onUserRemoved(SECONDARY_USER_HANDLE) // Verify that the app associated with the non-removed user is not removed. inOrder.verify(callback).accept(emptySet(), setOf(TEST_UID1)) - satelliteAccessController.onUserRemoved(PRIMARY_USER_HANDLE) + onUserRemoved(PRIMARY_USER_HANDLE) // Verify everything is removed. inOrder.verify(callback).accept(emptySet(), emptySet()) inOrder.verifyNoMoreInteractions() @@ -429,12 +446,11 @@ class SatelliteAccessControllerTest { val packageInfo1 = makePackageInfo(TEST_PACKAGE1, TEST_UID1) // Verify nothing changes and nothing crashes. - satelliteAccessController - .onUserAddedWithInstalledPackageList(PRIMARY_USER_HANDLE, listOf(packageInfo1)) - satelliteAccessController.onPackageAdded(TEST_PACKAGE1, TEST_UID1) - satelliteAccessController.onPackageRemoved(TEST_PACKAGE1, TEST_UID1) - satelliteAccessController.onExternalApplicationsAvailable(arrayOf(SMS_APP1, SMS_APP2)) - satelliteAccessController.onUserRemoved(PRIMARY_USER_HANDLE) + onUserAddedWithInstalledPackageList(PRIMARY_USER_HANDLE, listOf(packageInfo1)) + onPackageAdded(TEST_PACKAGE1, TEST_UID1) + onPackageRemoved(TEST_PACKAGE1, TEST_UID1) + onExternalApplicationsAvailable(arrayOf(SMS_APP1, SMS_APP2)) + onUserRemoved(PRIMARY_USER_HANDLE) verify(callback, never()).accept(any(), any()) } @@ -445,12 +461,12 @@ class SatelliteAccessControllerTest { // Set SMS_APP1 under primary user as a role-sms Uid. doReturn(listOf(SMS_APP1)) .`when`(deps).getRoleHoldersAsUser(RoleManager.ROLE_SMS, PRIMARY_USER_HANDLE) - roleHolderChangedListener.onRoleHoldersChanged(RoleManager.ROLE_SMS, PRIMARY_USER_HANDLE) + onRoleHoldersChanged(RoleManager.ROLE_SMS, PRIMARY_USER_HANDLE) verify(callback).accept(setOf(SMS_APP_ID1.toUid(PRIMARY_USER)), emptySet()) // Mock another opt-in uid, verify they both reported via the callback. mockIsSatelliteDataOptimizedApp(TEST_PACKAGE1, true) - satelliteAccessController.onPackageAdded(TEST_PACKAGE1, TEST_UID1) + onPackageAdded(TEST_PACKAGE1, TEST_UID1) verify(callback).accept(setOf(SMS_APP_ID1.toUid(PRIMARY_USER)), setOf(TEST_UID1)) } @@ -463,8 +479,7 @@ class SatelliteAccessControllerTest { .`when`(deps).getRoleHoldersAsUser(RoleManager.ROLE_SMS, PRIMARY_USER_HANDLE) val inOrder = inOrder(callback) - satelliteAccessController - .onUserAddedWithInstalledPackageList(PRIMARY_USER_HANDLE, listOf(packageInfo1)) + onUserAddedWithInstalledPackageList(PRIMARY_USER_HANDLE, listOf(packageInfo1)) // Verify the callback only fired once after both lists are ready. inOrder.verify(callback, never()) .accept(setOf(SMS_APP_ID1.toUid(PRIMARY_USER)), emptySet()) @@ -483,23 +498,23 @@ class SatelliteAccessControllerTest { // However, one opt-in uid is a messaging app and will surprise us later. mockIsSatelliteDataOptimizedApp(TEST_PACKAGE1, true) mockIsSatelliteDataOptimizedApp(SMS_APP1, true) - satelliteAccessController.onPackageAdded(TEST_PACKAGE1, TEST_UID1) + onPackageAdded(TEST_PACKAGE1, TEST_UID1) inOrder.verify(callback).accept(emptySet(), setOf(TEST_UID1)) - satelliteAccessController.onPackageAdded(SMS_APP1, smsUid) + onPackageAdded(SMS_APP1, smsUid) inOrder.verify(callback).accept(emptySet(), setOf(TEST_UID1, smsUid)) // Set SMS_APP1 as a role-sms Uid. // Verify the role-sms Uid is excluded from the opt-in Uid list. doReturn(listOf(SMS_APP1)) .`when`(deps).getRoleHoldersAsUser(RoleManager.ROLE_SMS, PRIMARY_USER_HANDLE) - roleHolderChangedListener.onRoleHoldersChanged(RoleManager.ROLE_SMS, PRIMARY_USER_HANDLE) + onRoleHoldersChanged(RoleManager.ROLE_SMS, PRIMARY_USER_HANDLE) inOrder.verify(callback).accept(setOf(smsUid), setOf(TEST_UID1)) // Unset SMS_APP1 as the role-sms Uid. // Verify the role-sms Uid is included to the opt-in Uid list again. doReturn(emptyList()) .`when`(deps).getRoleHoldersAsUser(RoleManager.ROLE_SMS, PRIMARY_USER_HANDLE) - roleHolderChangedListener.onRoleHoldersChanged(RoleManager.ROLE_SMS, PRIMARY_USER_HANDLE) + onRoleHoldersChanged(RoleManager.ROLE_SMS, PRIMARY_USER_HANDLE) inOrder.verify(callback).accept(emptySet(), setOf(TEST_UID1, smsUid)) } @@ -511,14 +526,9 @@ class SatelliteAccessControllerTest { mockIsSatelliteDataOptimizedApp(SMS_APP2, true) val inOrder = inOrder(callback) - satelliteAccessController - .onUserAddedWithInstalledPackageList(PRIMARY_USER_HANDLE, emptyList()) - satelliteAccessController - .onUserAddedWithInstalledPackageList( - SECONDARY_USER_HANDLE, - emptyList() - ) - satelliteAccessController.onExternalApplicationsAvailable(arrayOf(SMS_APP1, SMS_APP2)) + onUserAddedWithInstalledPackageList(PRIMARY_USER_HANDLE, emptyList()) + onUserAddedWithInstalledPackageList(SECONDARY_USER_HANDLE, emptyList()) + onExternalApplicationsAvailable(arrayOf(SMS_APP1, SMS_APP2)) inOrder.verify(callback).accept(emptySet(), setOf( SMS_APP_ID1.toUid(PRIMARY_USER), SMS_APP_ID1.toUid(SECONDARY_USER),