Merge "Remove unused handover code." into main
diff --git a/res/values-sw/strings.xml b/res/values-sw/strings.xml
index 1b49990..ef58c00 100644
--- a/res/values-sw/strings.xml
+++ b/res/values-sw/strings.xml
@@ -48,11 +48,11 @@
<string name="enable_account_preference_title" msgid="6949224486748457976">"Akaunti za simu"</string>
<string name="outgoing_call_not_allowed_user_restriction" msgid="3424338207838851646">"Piga simu za dharura pekee."</string>
<string name="outgoing_call_not_allowed_no_permission" msgid="8590468836581488679">"Programu hii haiwezi kupiga simu bila ruhusa ya Simu."</string>
- <string name="outgoing_call_error_no_phone_number_supplied" msgid="7665135102566099778">"Ili upige simu, weka nambari sahihi."</string>
+ <string name="outgoing_call_error_no_phone_number_supplied" msgid="7665135102566099778">"Ili upige simu, weka namba sahihi."</string>
<string name="duplicate_video_call_not_allowed" msgid="5754746140185781159">"Hangout ya video haiwezi kuongezwa kwa wakati huu."</string>
<string name="no_vm_number" msgid="2179959110602180844">"Nambari ya sauti inayokosekana"</string>
- <string name="no_vm_number_msg" msgid="1339245731058529388">"Hakuna nambari ya ujumbe wa sauti iliyohifadhiwa katika SIM kadi."</string>
- <string name="add_vm_number_str" msgid="5179510133063168998">"Ongeza nambari"</string>
+ <string name="no_vm_number_msg" msgid="1339245731058529388">"Hakuna namba ya ujumbe wa sauti iliyohifadhiwa katika SIM kadi."</string>
+ <string name="add_vm_number_str" msgid="5179510133063168998">"Ongeza namba"</string>
<string name="change_default_dialer_dialog_title" msgid="5861469279421508060">"Unataka kufanya <xliff:g id="NEW_APP">%s</xliff:g> iwe programu chaguomsingi ya simu?"</string>
<string name="change_default_dialer_dialog_affirmative" msgid="8604665314757739550">"Fanya iwe Chaguo-Msingi"</string>
<string name="change_default_dialer_dialog_negative" msgid="8648669840052697821">"Ghairi"</string>
@@ -63,21 +63,21 @@
<string name="change_default_call_screening_dialog_affirmative" msgid="7162433828280058647">"Weka iwe Chaguomsingi"</string>
<string name="change_default_call_screening_dialog_negative" msgid="1839266125623106342">"Ghairi"</string>
<string name="blocked_numbers" msgid="8322134197039865180">"Nambari zilizozuiwa"</string>
- <string name="blocked_numbers_msg" msgid="2797422132329662697">"Hutapokea simu au SMS kutoka kwa nambari zilizozuiwa."</string>
- <string name="block_number" msgid="3784343046852802722">"Ongeza nambari"</string>
+ <string name="blocked_numbers_msg" msgid="2797422132329662697">"Hutapokea simu au SMS kutoka kwa namba zilizozuiwa."</string>
+ <string name="block_number" msgid="3784343046852802722">"Ongeza namba"</string>
<string name="unblock_dialog_body" msgid="2723393535797217261">"Ungependa kuacha kuzuia <xliff:g id="NUMBER_TO_BLOCK">%1$s</xliff:g>?"</string>
<string name="unblock_button" msgid="8732021675729981781">"Acha kuzuia"</string>
<string name="add_blocked_dialog_body" msgid="8599974422407139255">"Zuia simu na SMS kutoka kwa"</string>
<string name="add_blocked_number_hint" msgid="8769422085658041097">"Nambari ya simu"</string>
<string name="block_button" msgid="485080149164258770">"Zuia"</string>
- <string name="non_primary_user" msgid="315564589279622098">"Ni mmiliki wa kifaa pekee anayeweza kuangalia na kuthibiti nambari zilizozuiwa."</string>
+ <string name="non_primary_user" msgid="315564589279622098">"Ni mmiliki wa kifaa pekee anayeweza kuangalia na kuthibiti namba zilizozuiwa."</string>
<string name="delete_icon_description" msgid="5335959254954774373">"Acha kuzuia"</string>
<string name="blocked_numbers_butter_bar_title" msgid="582982373755950791">"Kipengele cha kuzuia kimezimwa kwa muda"</string>
- <string name="blocked_numbers_butter_bar_body" msgid="1261213114919301485">"Ukishapiga au kutuma ujumbe kwa nambari ya dharura, kipengele cha kuzuia anwani huzimwa ili watoa huduma za dharura waweze kuwasiliana nawe."</string>
+ <string name="blocked_numbers_butter_bar_body" msgid="1261213114919301485">"Ukishapiga au kutuma ujumbe kwa namba ya dharura, kipengele cha kuzuia anwani huzimwa ili watoa huduma za dharura waweze kuwasiliana nawe."</string>
<string name="blocked_numbers_butter_bar_button" msgid="2704456308072489793">"Kiwashe tena sasa"</string>
<string name="blocked_numbers_number_blocked_message" msgid="4314736791180919167">"<xliff:g id="BLOCKED_NUMBER">%1$s</xliff:g> imezuiwa"</string>
<string name="blocked_numbers_number_unblocked_message" msgid="2933071624674945601">"<xliff:g id="UNBLOCKED_NUMBER">%1$s</xliff:g> imeacha kuzuiwa"</string>
- <string name="blocked_numbers_block_emergency_number_message" msgid="4198550501500893890">"Huwezi kuzuia nambari ya dharura."</string>
+ <string name="blocked_numbers_block_emergency_number_message" msgid="4198550501500893890">"Huwezi kuzuia namba ya dharura."</string>
<string name="blocked_numbers_number_already_blocked_message" msgid="2301270825735665458">"<xliff:g id="BLOCKED_NUMBER">%1$s</xliff:g> tayari imezuiwa."</string>
<string name="toast_personal_call_msg" msgid="5817631570381795610">"Kupiga simu kwa kutumia kipiga simu cha binafsi"</string>
<string name="notification_incoming_call" msgid="1233481138362230894">"Simu ya <xliff:g id="CALL_VIA">%1$s</xliff:g> kutoka kwa <xliff:g id="CALL_FROM">%2$s</xliff:g>"</string>
@@ -104,19 +104,19 @@
<string name="alert_outgoing_call" msgid="5319895109298927431">"Ukipiga simu hii, simu yako kwenye <xliff:g id="OTHER_APP">%1$s</xliff:g> itakatwa."</string>
<string name="alert_redirect_outgoing_call_or_not" msgid="665409645789521636">"Chagua jinsi utakavyopiga simu hii"</string>
<string name="alert_place_outgoing_call_with_redirection" msgid="5221065030959024121">"Elekeza simu ukitumia <xliff:g id="OTHER_APP">%1$s</xliff:g>"</string>
- <string name="alert_place_unredirect_outgoing_call" msgid="2467608535225764006">"Piga simu ukitumia nambari yangu ya simu"</string>
+ <string name="alert_place_unredirect_outgoing_call" msgid="2467608535225764006">"Piga simu ukitumia namba yangu ya simu"</string>
<string name="alert_redirect_outgoing_call_timeout" msgid="5568101425637373060">"<xliff:g id="OTHER_APP">%1$s</xliff:g> imeshindwa kupiga simu. Jaribu kutumia programu nyingine inayoelekeza simu kwingine au uwasiliane na msanidi programu kwa usaidizi."</string>
<string name="phone_settings_call_blocking_txt" msgid="7311523114822507178">"Kuzuia Simu"</string>
<string name="phone_settings_number_not_in_contact_txt" msgid="2602249106007265757">"Nambari ambazo haziko kwenye Anwani"</string>
- <string name="phone_settings_number_not_in_contact_summary_txt" msgid="963327038085718969">"Zuia nambari ambazo hazipo kwenye orodha ya Anwani zako"</string>
+ <string name="phone_settings_number_not_in_contact_summary_txt" msgid="963327038085718969">"Zuia namba ambazo hazipo kwenye orodha ya Anwani zako"</string>
<string name="phone_settings_private_num_txt" msgid="6339272760338475619">"Faragha"</string>
- <string name="phone_settings_private_num_summary_txt" msgid="6755758240544021037">"Zuia wapigaji ambao wameficha nambari zao za simu"</string>
+ <string name="phone_settings_private_num_summary_txt" msgid="6755758240544021037">"Zuia wapigaji ambao wameficha namba zao za simu"</string>
<string name="phone_settings_payphone_txt" msgid="5003987966052543965">"Simu ya kulipia"</string>
- <string name="phone_settings_payphone_summary_txt" msgid="3936631076065563665">"Zuia simu kutoka kwa nambari ya simu za kulipia"</string>
+ <string name="phone_settings_payphone_summary_txt" msgid="3936631076065563665">"Zuia simu kutoka kwa namba ya simu za kulipia"</string>
<string name="phone_settings_unknown_txt" msgid="3577926178354772728">"Zisizojulikani"</string>
<string name="phone_settings_unknown_summary_txt" msgid="5446657192535779645">"Zuia simu kutoka kwa wapigaji wasiojulikana"</string>
<string name="phone_settings_unavailable_txt" msgid="825918186053980858">"Zisizotambulishwa"</string>
- <string name="phone_settings_unavailable_summary_txt" msgid="8221686031038282633">"Zuia simu zinazopigwa bila kutambulisha nambari ya simu"</string>
+ <string name="phone_settings_unavailable_summary_txt" msgid="8221686031038282633">"Zuia simu zinazopigwa bila kutambulisha namba ya simu"</string>
<string name="phone_strings_call_blocking_turned_off_notification_title_txt" msgid="2895809176537908791">"Kuzuia Simu"</string>
<string name="phone_strings_call_blocking_turned_off_notification_text_txt" msgid="1713632946174016619">"Kipengele cha Kuzuia Simu kimezimwa"</string>
<string name="phone_strings_emergency_call_made_dialog_title_txt" msgid="6629412508584507377">"Simu ya dharura imepigwa"</string>
diff --git a/src/com/android/server/telecom/PhoneAccountRegistrar.java b/src/com/android/server/telecom/PhoneAccountRegistrar.java
index 5f23e4d..d453019 100644
--- a/src/com/android/server/telecom/PhoneAccountRegistrar.java
+++ b/src/com/android/server/telecom/PhoneAccountRegistrar.java
@@ -181,16 +181,19 @@
private interface PhoneAccountRegistrarWriteLock {}
private final PhoneAccountRegistrarWriteLock mWriteLock =
new PhoneAccountRegistrarWriteLock() {};
+ private final com.android.internal.telephony.flags.FeatureFlags mTelephonyFeatureFlags;
@VisibleForTesting
public PhoneAccountRegistrar(Context context, TelecomSystem.SyncRoot lock,
- DefaultDialerCache defaultDialerCache, AppLabelProxy appLabelProxy) {
- this(context, lock, FILE_NAME, defaultDialerCache, appLabelProxy);
+ DefaultDialerCache defaultDialerCache, AppLabelProxy appLabelProxy,
+ com.android.internal.telephony.flags.FeatureFlags telephonyFeatureFlags) {
+ this(context, lock, FILE_NAME, defaultDialerCache, appLabelProxy, telephonyFeatureFlags);
}
@VisibleForTesting
public PhoneAccountRegistrar(Context context, TelecomSystem.SyncRoot lock, String fileName,
- DefaultDialerCache defaultDialerCache, AppLabelProxy appLabelProxy) {
+ DefaultDialerCache defaultDialerCache, AppLabelProxy appLabelProxy,
+ com.android.internal.telephony.flags.FeatureFlags telephonyFeatureFlags) {
mAtomicFile = new AtomicFile(new File(context.getFilesDir(), fileName));
@@ -204,6 +207,13 @@
mAppLabelProxy = appLabelProxy;
mCurrentUserHandle = Process.myUserHandle();
+ if (telephonyFeatureFlags != null) {
+ mTelephonyFeatureFlags = telephonyFeatureFlags;
+ } else {
+ mTelephonyFeatureFlags =
+ new com.android.internal.telephony.flags.FeatureFlagsImpl();
+ }
+
// register context based receiver to clean up orphan phone accounts
IntentFilter intentFilter = new IntentFilter(Intent.ACTION_MANAGED_PROFILE_REMOVED);
intentFilter.setPriority(IntentFilter.SYSTEM_HIGH_PRIORITY);
@@ -697,6 +707,24 @@
}
}
+ private boolean isMatchedUser(PhoneAccount account, UserHandle userHandle) {
+ if (account == null) {
+ return false;
+ }
+
+ if (userHandle == null) {
+ Log.w(this, "userHandle is null in isVisibleForUser");
+ return false;
+ }
+
+ UserHandle phoneAccountUserHandle = account.getAccountHandle().getUserHandle();
+ if (phoneAccountUserHandle == null) {
+ return false;
+ }
+
+ return phoneAccountUserHandle.equals(userHandle);
+ }
+
private boolean isVisibleForUser(PhoneAccount account, UserHandle userHandle,
boolean acrossProfiles) {
if (account == null) {
@@ -763,11 +791,11 @@
*/
public List<PhoneAccountHandle> getAllPhoneAccountHandles(UserHandle userHandle,
boolean crossUserAccess) {
- return getPhoneAccountHandles(0, null, null, false, userHandle, crossUserAccess);
+ return getPhoneAccountHandles(0, null, null, false, userHandle, crossUserAccess, true);
}
public List<PhoneAccount> getAllPhoneAccounts(UserHandle userHandle, boolean crossUserAccess) {
- return getPhoneAccounts(0, null, null, false, mCurrentUserHandle, crossUserAccess);
+ return getPhoneAccounts(0, null, null, false, mCurrentUserHandle, crossUserAccess, true);
}
/**
@@ -858,7 +886,7 @@
public List<PhoneAccountHandle> getAllPhoneAccountHandlesForPackage(UserHandle userHandle,
String packageName) {
return getPhoneAccountHandles(0, null, packageName, true /* includeDisabled */, userHandle,
- true /* crossUserAccess */);
+ true /* crossUserAccess */, true);
}
/**
@@ -1490,7 +1518,19 @@
UserHandle userHandle,
boolean crossUserAccess) {
return getPhoneAccountHandles(capabilities, 0 /*excludedCapabilities*/, uriScheme,
- packageName, includeDisabledAccounts, userHandle, crossUserAccess);
+ packageName, includeDisabledAccounts, userHandle, crossUserAccess, false);
+ }
+
+ private List<PhoneAccountHandle> getPhoneAccountHandles(
+ int capabilities,
+ String uriScheme,
+ String packageName,
+ boolean includeDisabledAccounts,
+ UserHandle userHandle,
+ boolean crossUserAccess,
+ boolean includeAll) {
+ return getPhoneAccountHandles(capabilities, 0 /*excludedCapabilities*/, uriScheme,
+ packageName, includeDisabledAccounts, userHandle, crossUserAccess, includeAll);
}
/**
@@ -1505,11 +1545,24 @@
boolean includeDisabledAccounts,
UserHandle userHandle,
boolean crossUserAccess) {
+ return getPhoneAccountHandles(capabilities, excludedCapabilities, uriScheme, packageName,
+ includeDisabledAccounts, userHandle, crossUserAccess, false);
+ }
+
+ private List<PhoneAccountHandle> getPhoneAccountHandles(
+ int capabilities,
+ int excludedCapabilities,
+ String uriScheme,
+ String packageName,
+ boolean includeDisabledAccounts,
+ UserHandle userHandle,
+ boolean crossUserAccess,
+ boolean includeAll) {
List<PhoneAccountHandle> handles = new ArrayList<>();
for (PhoneAccount account : getPhoneAccounts(
capabilities, excludedCapabilities, uriScheme, packageName,
- includeDisabledAccounts, userHandle, crossUserAccess)) {
+ includeDisabledAccounts, userHandle, crossUserAccess, includeAll)) {
handles.add(account.getAccountHandle());
}
return handles;
@@ -1523,7 +1576,19 @@
UserHandle userHandle,
boolean crossUserAccess) {
return getPhoneAccounts(capabilities, 0 /*excludedCapabilities*/, uriScheme, packageName,
- includeDisabledAccounts, userHandle, crossUserAccess);
+ includeDisabledAccounts, userHandle, crossUserAccess, false);
+ }
+
+ private List<PhoneAccount> getPhoneAccounts(
+ int capabilities,
+ String uriScheme,
+ String packageName,
+ boolean includeDisabledAccounts,
+ UserHandle userHandle,
+ boolean crossUserAccess,
+ boolean includeAll) {
+ return getPhoneAccounts(capabilities, 0 /*excludedCapabilities*/, uriScheme, packageName,
+ includeDisabledAccounts, userHandle, crossUserAccess, includeAll);
}
/**
@@ -1545,7 +1610,22 @@
boolean includeDisabledAccounts,
UserHandle userHandle,
boolean crossUserAccess) {
+ return getPhoneAccounts(capabilities, excludedCapabilities, uriScheme, packageName,
+ includeDisabledAccounts, userHandle, crossUserAccess, false);
+ }
+
+ @VisibleForTesting
+ public List<PhoneAccount> getPhoneAccounts(
+ int capabilities,
+ int excludedCapabilities,
+ String uriScheme,
+ String packageName,
+ boolean includeDisabledAccounts,
+ UserHandle userHandle,
+ boolean crossUserAccess,
+ boolean includeAll) {
List<PhoneAccount> accounts = new ArrayList<>(mState.accounts.size());
+ List<PhoneAccount> matchedAccounts = new ArrayList<>(mState.accounts.size());
for (PhoneAccount m : mState.accounts) {
if (!(m.isEnabled() || includeDisabledAccounts)) {
// Do not include disabled accounts.
@@ -1579,12 +1659,22 @@
// Not the right package name; skip this one.
continue;
}
+ if (isMatchedUser(m, userHandle)) {
+ matchedAccounts.add(m);
+ }
if (!crossUserAccess && !isVisibleForUser(m, userHandle, false)) {
// Account is not visible for the current user; skip this one.
continue;
}
accounts.add(m);
}
+
+ // Return the account if it exactly matches. Otherwise, return any account that's visible
+ if (mTelephonyFeatureFlags.workProfileApiSplit() && !crossUserAccess && !includeAll
+ && !matchedAccounts.isEmpty()) {
+ return matchedAccounts;
+ }
+
return accounts;
}
diff --git a/src/com/android/server/telecom/TelecomServiceImpl.java b/src/com/android/server/telecom/TelecomServiceImpl.java
index 1dd68c9..1701e5a 100644
--- a/src/com/android/server/telecom/TelecomServiceImpl.java
+++ b/src/com/android/server/telecom/TelecomServiceImpl.java
@@ -356,9 +356,28 @@
@Override
public ParceledListSlice<PhoneAccountHandle> getCallCapablePhoneAccounts(
- boolean includeDisabledAccounts, String callingPackage, String callingFeatureId) {
+ boolean includeDisabledAccounts, String callingPackage,
+ String callingFeatureId, boolean acrossProfiles) {
try {
Log.startSession("TSI.gCCPA", Log.getPackageAbbreviation(callingPackage));
+
+ if (mTelephonyFeatureFlags.workProfileApiSplit()) {
+ if (acrossProfiles) {
+ enforceInAppCrossProfilePermission();
+ }
+
+ if (includeDisabledAccounts && !canReadPrivilegedPhoneState(
+ callingPackage, "getCallCapablePhoneAccounts")) {
+ throw new SecurityException(
+ "Requires READ_PRIVILEGED_PHONE_STATE permission.");
+ }
+
+ if (!includeDisabledAccounts && !canReadPhoneState(callingPackage,
+ callingFeatureId, "Requires READ_PHONE_STATE permission.")) {
+ throw new SecurityException("Requires READ_PHONE_STATE permission.");
+ }
+ }
+
if (includeDisabledAccounts &&
!canReadPrivilegedPhoneState(
callingPackage, "getCallCapablePhoneAccounts")) {
@@ -370,7 +389,11 @@
}
synchronized (mLock) {
final UserHandle callingUserHandle = Binder.getCallingUserHandle();
- boolean crossUserAccess = hasInAppCrossUserPermission();
+ boolean crossUserAccess = mTelephonyFeatureFlags.workProfileApiSplit()
+ && !acrossProfiles ? false
+ : (mTelephonyFeatureFlags.workProfileApiSplit()
+ ? hasInAppCrossProfilePermission()
+ : hasInAppCrossUserPermission());
long token = Binder.clearCallingIdentity();
try {
return new ParceledListSlice<>(
@@ -638,6 +661,7 @@
public ParceledListSlice<PhoneAccountHandle> getAllPhoneAccountHandles() {
try {
Log.startSession("TSI.gAPAH");
+
try {
enforceModifyPermission(
"getAllPhoneAccountHandles requires MODIFY_PHONE_STATE permission.");
@@ -656,7 +680,7 @@
.getAllPhoneAccountHandles(callingUserHandle,
crossUserAccess));
} catch (Exception e) {
- Log.e(this, e, "getAllPhoneAccounts");
+ Log.e(this, e, "getAllPhoneAccountsHandles");
throw e;
} finally {
Binder.restoreCallingIdentity(token);
@@ -2558,6 +2582,8 @@
private TransactionManager mTransactionManager;
private final TransactionalServiceRepository mTransactionalServiceRepository;
private final FeatureFlags mFeatureFlags;
+ private final com.android.internal.telephony.flags.FeatureFlags mTelephonyFeatureFlags;
+
public TelecomServiceImpl(
Context context,
@@ -2569,6 +2595,7 @@
SubscriptionManagerAdapter subscriptionManagerAdapter,
SettingsSecureAdapter settingsSecureAdapter,
FeatureFlags featureFlags,
+ com.android.internal.telephony.flags.FeatureFlags telephonyFeatureFlags,
TelecomSystem.SyncRoot lock) {
mContext = context;
mAppOpsManager = (AppOpsManager) mContext.getSystemService(Context.APP_OPS_SERVICE);
@@ -2577,6 +2604,12 @@
mCallsManager = callsManager;
mFeatureFlags = featureFlags;
+ if (telephonyFeatureFlags != null) {
+ mTelephonyFeatureFlags = telephonyFeatureFlags;
+ } else {
+ mTelephonyFeatureFlags =
+ new com.android.internal.telephony.flags.FeatureFlagsImpl();
+ }
mLock = lock;
mPhoneAccountRegistrar = phoneAccountRegistrar;
mUserCallIntentProcessorFactory = userCallIntentProcessorFactory;
@@ -2947,12 +2980,24 @@
+ " INTERACT_ACROSS_USERS permission");
}
+ private void enforceInAppCrossProfilePermission() {
+ mContext.enforceCallingOrSelfPermission(
+ android.Manifest.permission.INTERACT_ACROSS_PROFILES, "Must be system or have"
+ + " INTERACT_ACROSS_PROFILES permission");
+ }
+
private boolean hasInAppCrossUserPermission() {
return mContext.checkCallingOrSelfPermission(
Manifest.permission.INTERACT_ACROSS_USERS)
== PackageManager.PERMISSION_GRANTED;
}
+ private boolean hasInAppCrossProfilePermission() {
+ return mContext.checkCallingOrSelfPermission(
+ Manifest.permission.INTERACT_ACROSS_PROFILES)
+ == PackageManager.PERMISSION_GRANTED;
+ }
+
// to be used for TestApi methods that can only be called with SHELL UID.
private void enforceShellOnly(int callingUid, String message) {
if (callingUid == Process.SHELL_UID || callingUid == Process.ROOT_UID) {
diff --git a/src/com/android/server/telecom/TelecomSystem.java b/src/com/android/server/telecom/TelecomSystem.java
index 101cd2d..4310945 100644
--- a/src/com/android/server/telecom/TelecomSystem.java
+++ b/src/com/android/server/telecom/TelecomSystem.java
@@ -245,7 +245,7 @@
try {
mPhoneAccountRegistrar = new PhoneAccountRegistrar(mContext, mLock, defaultDialerCache,
packageName -> AppLabelProxy.Util.getAppLabel(
- mContext.getPackageManager(), packageName));
+ mContext.getPackageManager(), packageName), null);
mContactsAsyncHelper = contactsAsyncHelperFactory.create(
new ContactsAsyncHelper.ContentResolverAdapter() {
@@ -485,6 +485,7 @@
new TelecomServiceImpl.SubscriptionManagerAdapterImpl(),
new TelecomServiceImpl.SettingsSecureAdapterImpl(),
featureFlags,
+ null,
mLock);
} finally {
Log.endSession();
diff --git a/src/com/android/server/telecom/voip/VoipCallTransactionResult.java b/src/com/android/server/telecom/voip/VoipCallTransactionResult.java
index 2916fc6..ffc0255 100644
--- a/src/com/android/server/telecom/voip/VoipCallTransactionResult.java
+++ b/src/com/android/server/telecom/voip/VoipCallTransactionResult.java
@@ -24,13 +24,14 @@
public static final int RESULT_SUCCEED = 0;
public static final int RESULT_FAILED = 1;
- private int mResult;
- private String mMessage;
- private Call mCall;
+ private final int mResult;
+ private final String mMessage;
+ private final Call mCall;
public VoipCallTransactionResult(int result, String message) {
mResult = result;
mMessage = message;
+ mCall = null;
}
public VoipCallTransactionResult(int result, Call call, String message) {
@@ -70,7 +71,7 @@
append("{ VoipCallTransactionResult: [mResult: ").
append(mResult).
append("], [mCall: ").
- append(mCall.toString()).
+ append((mCall != null) ? mCall : "null").
append("], [mMessage=").
append(mMessage).append("] }").toString();
}
diff --git a/tests/src/com/android/server/telecom/tests/PhoneAccountRegistrarTest.java b/tests/src/com/android/server/telecom/tests/PhoneAccountRegistrarTest.java
index 9fcb87a..a98136b 100644
--- a/tests/src/com/android/server/telecom/tests/PhoneAccountRegistrarTest.java
+++ b/tests/src/com/android/server/telecom/tests/PhoneAccountRegistrarTest.java
@@ -117,6 +117,7 @@
@Mock private TelecomManager mTelecomManager;
@Mock private DefaultDialerCache mDefaultDialerCache;
@Mock private AppLabelProxy mAppLabelProxy;
+ @Mock private com.android.internal.telephony.flags.FeatureFlags mTelephonyFeatureFlags;
@Override
@Before
@@ -134,8 +135,10 @@
when(mAppLabelProxy.getAppLabel(anyString()))
.thenReturn(TEST_LABEL);
mRegistrar = new PhoneAccountRegistrar(
- mComponentContextFixture.getTestDouble().getApplicationContext(),
- mLock, FILE_NAME, mDefaultDialerCache, mAppLabelProxy);
+ mComponentContextFixture.getTestDouble().getApplicationContext(), mLock, FILE_NAME,
+ mDefaultDialerCache, mAppLabelProxy, mTelephonyFeatureFlags);
+ when(mFeatureFlags.onlyUpdateTelephonyOnValidSubIds()).thenReturn(false);
+ when(mTelephonyFeatureFlags.workProfileApiSplit()).thenReturn(false);
}
@Override
@@ -1734,6 +1737,56 @@
}
}
+ @Test
+ public void testGetPhoneAccountAcrossUsers() throws Exception {
+ when(mTelephonyFeatureFlags.workProfileApiSplit()).thenReturn(true);
+ mComponentContextFixture.addConnectionService(makeQuickConnectionServiceComponentName(),
+ Mockito.mock(IConnectionService.class));
+
+ PhoneAccount accountForCurrent = makeQuickAccountBuilder("id_0", 0, UserHandle.CURRENT)
+ .setCapabilities(PhoneAccount.CAPABILITY_CONNECTION_MANAGER
+ | PhoneAccount.CAPABILITY_CALL_PROVIDER).build();
+ PhoneAccount accountForAll = makeQuickAccountBuilder("id_0", 0, UserHandle.ALL)
+ .setCapabilities(PhoneAccount.CAPABILITY_CONNECTION_MANAGER
+ | PhoneAccount.CAPABILITY_CALL_PROVIDER
+ | PhoneAccount.CAPABILITY_MULTI_USER).build();
+ PhoneAccount accountForWorkProfile = makeQuickAccountBuilder("id_1", 1, USER_HANDLE_10)
+ .setCapabilities(PhoneAccount.CAPABILITY_CONNECTION_MANAGER
+ | PhoneAccount.CAPABILITY_CALL_PROVIDER).build();
+
+ registerAndEnableAccount(accountForCurrent);
+ registerAndEnableAccount(accountForAll);
+ registerAndEnableAccount(accountForWorkProfile);
+
+ List<PhoneAccount> accountsForUser = mRegistrar.getPhoneAccounts(0, 0,
+ null, null, false, USER_HANDLE_10, false, false);
+ List<PhoneAccount> accountsVisibleUser = mRegistrar.getPhoneAccounts(0, 0,
+ null, null, false, USER_HANDLE_10, false, true);
+ List<PhoneAccount> accountsAcrossUser = mRegistrar.getPhoneAccounts(0, 0,
+ null, null, false, USER_HANDLE_10, true, false);
+
+ // Return the account exactly matching the user if it exists
+ assertEquals(1, accountsForUser.size());
+ assertTrue(accountsForUser.contains(accountForWorkProfile));
+ // The accounts visible to the user without across user permission
+ assertEquals(2, accountsVisibleUser.size());
+ assertTrue(accountsVisibleUser.containsAll(accountsForUser));
+ assertTrue(accountsVisibleUser.contains(accountForAll));
+ // The accounts visible to the user with across user permission
+ assertEquals(3, accountsAcrossUser.size());
+ assertTrue(accountsAcrossUser.containsAll(accountsVisibleUser));
+ assertTrue(accountsAcrossUser.contains(accountForCurrent));
+
+ mRegistrar.unregisterPhoneAccount(accountForWorkProfile.getAccountHandle());
+
+ accountsForUser = mRegistrar.getPhoneAccounts(0, 0,
+ null, null, false, USER_HANDLE_10, false, false);
+
+ // Return the account visible for the user if no account exactly matches the user
+ assertEquals(1, accountsForUser.size());
+ assertTrue(accountsForUser.contains(accountForAll));
+ }
+
private static PhoneAccount.Builder makeBuilderWithBindCapabilities(PhoneAccountHandle handle) {
return new PhoneAccount.Builder(handle, TEST_LABEL)
.setCapabilities(PhoneAccount.CAPABILITY_SUPPORTS_TRANSACTIONAL_OPERATIONS);
diff --git a/tests/src/com/android/server/telecom/tests/TelecomServiceImplTest.java b/tests/src/com/android/server/telecom/tests/TelecomServiceImplTest.java
index e9466ee..5831ad3 100644
--- a/tests/src/com/android/server/telecom/tests/TelecomServiceImplTest.java
+++ b/tests/src/com/android/server/telecom/tests/TelecomServiceImplTest.java
@@ -197,6 +197,7 @@
@Mock private TransactionManager mTransactionManager;
@Mock private AnomalyReporterAdapter mAnomalyReporterAdapter;
@Mock private FeatureFlags mFeatureFlags;
+ @Mock private com.android.internal.telephony.flags.FeatureFlags mTelephonyFeatureFlags;
@Mock private InCallController mInCallController;
@@ -251,6 +252,7 @@
mSubscriptionManagerAdapter,
mSettingsSecureAdapter,
mFeatureFlags,
+ mTelephonyFeatureFlags,
mLock);
telecomServiceImpl.setTransactionManager(mTransactionManager);
telecomServiceImpl.setAnomalyReporterAdapter(mAnomalyReporterAdapter);
@@ -270,6 +272,7 @@
mPackageManager = mContext.getPackageManager();
when(mPackageManager.getPackageUid(anyString(), eq(0))).thenReturn(Binder.getCallingUid());
when(mFeatureFlags.earlyBindingToIncallService()).thenReturn(true);
+ when(mTelephonyFeatureFlags.workProfileApiSplit()).thenReturn(false);
}
@Override
@@ -535,10 +538,64 @@
assertEquals(fullPHList,
mTSIBinder.getCallCapablePhoneAccounts(
- true, DEFAULT_DIALER_PACKAGE, null).getList());
+ true, DEFAULT_DIALER_PACKAGE, null, false).getList());
assertEquals(smallPHList,
mTSIBinder.getCallCapablePhoneAccounts(
- false, DEFAULT_DIALER_PACKAGE, null).getList());
+ false, DEFAULT_DIALER_PACKAGE, null, false).getList());
+ }
+
+ @SmallTest
+ @Test
+ public void testGetCallCapablePhoneAccountsAcrossProfiles() throws RemoteException {
+ List<PhoneAccountHandle> fullPHList = List.of(TEL_PA_HANDLE_16, SIP_PA_HANDLE_17);
+ List<PhoneAccountHandle> smallPHList = List.of(SIP_PA_HANDLE_17);
+
+ // Returns all accounts when getCallCapablePhoneAccounts is called with across user.
+ doReturn(fullPHList).when(mFakePhoneAccountRegistrar).getCallCapablePhoneAccounts(
+ nullable(String.class), anyBoolean(), nullable(UserHandle.class), eq(true));
+ // Returns one account when getCallCapablePhoneAccounts is called without across user.
+ doReturn(smallPHList).when(mFakePhoneAccountRegistrar).getCallCapablePhoneAccounts(
+ nullable(String.class), anyBoolean(), nullable(UserHandle.class), eq(false));
+ // With across user permission
+ doReturn(PackageManager.PERMISSION_GRANTED).when(mContext).checkCallingOrSelfPermission(
+ eq(Manifest.permission.INTERACT_ACROSS_USERS));
+
+ assertEquals(fullPHList,
+ mTSIBinder.getCallCapablePhoneAccounts(
+ true, DEFAULT_DIALER_PACKAGE, null, false).getList());
+
+ // Without across user permission
+ doReturn(PackageManager.PERMISSION_DENIED).when(mContext).checkCallingOrSelfPermission(
+ eq(Manifest.permission.INTERACT_ACROSS_USERS));
+
+ assertEquals(smallPHList,
+ mTSIBinder.getCallCapablePhoneAccounts(
+ true, DEFAULT_DIALER_PACKAGE, null, false).getList());
+
+ // Enabled the feature flag of the work profile split mode
+ when(mTelephonyFeatureFlags.workProfileApiSplit()).thenReturn(true);
+
+ // With across user permission
+ doReturn(PackageManager.PERMISSION_GRANTED).when(mContext).checkCallingOrSelfPermission(
+ eq(Manifest.permission.INTERACT_ACROSS_PROFILES));
+
+ assertEquals(fullPHList,
+ mTSIBinder.getCallCapablePhoneAccounts(
+ true, DEFAULT_DIALER_PACKAGE, null, true).getList());
+ assertEquals(smallPHList,
+ mTSIBinder.getCallCapablePhoneAccounts(
+ true, DEFAULT_DIALER_PACKAGE, null, false).getList());
+
+ // Without across user permission
+ doReturn(PackageManager.PERMISSION_DENIED).when(mContext).checkCallingOrSelfPermission(
+ eq(Manifest.permission.INTERACT_ACROSS_PROFILES));
+
+ assertEquals(smallPHList,
+ mTSIBinder.getCallCapablePhoneAccounts(
+ true, DEFAULT_DIALER_PACKAGE, null, true).getList());
+ assertEquals(smallPHList,
+ mTSIBinder.getCallCapablePhoneAccounts(
+ true, DEFAULT_DIALER_PACKAGE, null, false).getList());
}
@SmallTest
@@ -550,7 +607,7 @@
argThat(new AnyStringIn(enforcedPermissions)), anyString());
assertThrows(SecurityException.class,
- () -> mTSIBinder.getCallCapablePhoneAccounts(true, "", null));
+ () -> mTSIBinder.getCallCapablePhoneAccounts(true, "", null, false));
}
@SmallTest