Merge "Enforce run on handler thread for SatelliteAccessController" into main

This commit is contained in:
Treehugger Robot 2025-05-01 20:30:51 -07:00 • committed by Android (Google) Code Review
commit be4ecf0ac4
2 changed files with 82 additions and 60 deletions

View file

@ -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<PackageInfo> 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: "

View file

@ -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<PackageInfo>
) = 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<String>) =
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<String>())
.`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<PackageInfo>())
satelliteAccessController
.onUserAddedWithInstalledPackageList(
SECONDARY_USER_HANDLE,
emptyList<PackageInfo>()
)
satelliteAccessController.onExternalApplicationsAvailable(arrayOf(SMS_APP1, SMS_APP2))
onUserAddedWithInstalledPackageList(PRIMARY_USER_HANDLE, emptyList<PackageInfo>())
onUserAddedWithInstalledPackageList(SECONDARY_USER_HANDLE, emptyList<PackageInfo>())
onExternalApplicationsAvailable(arrayOf(SMS_APP1, SMS_APP2))
inOrder.verify(callback).accept(emptySet(), setOf(
SMS_APP_ID1.toUid(PRIMARY_USER),
SMS_APP_ID1.toUid(SECONDARY_USER),