switch TelecomManager List getters to ParceledListSlice

It was shown that given a large phoneAccountHandles that are
over 1 mb, a TransactionTooLarge exception can be silently thrown
causing an empty list to be returned.

In order to prevent this behavior, all Lists that return a
PhoneAccountHandle or PhoneAccount have been switched to
ParceledListSlice.

bug: 236263294

Test: manual #1 - bug exists without fix,
      manual #2 - bug is fixed with patch,
      4 new CTS tests in
      android.telecom.cts.PhoneAccountRegistrarTest

Change-Id: I025245b2a6f8cfaca86f268851a9d8f0817e07dd
Merged-In: I025245b2a6f8cfaca86f268851a9d8f0817e07dd
This commit is contained in:
Thomas Stuart
2022-06-23 14:27:43 -07:00
parent c8cf6861e8
commit 76c4d2d0b1
2 changed files with 15 additions and 14 deletions

View File

@@ -1269,7 +1269,7 @@ public class TelecomManager {
if (service != null) { if (service != null) {
try { try {
return service.getPhoneAccountsSupportingScheme(uriScheme, return service.getPhoneAccountsSupportingScheme(uriScheme,
mContext.getOpPackageName()); mContext.getOpPackageName()).getList();
} catch (RemoteException e) { } catch (RemoteException e) {
Log.e(TAG, "Error calling ITelecomService#getPhoneAccountsSupportingScheme", e); Log.e(TAG, "Error calling ITelecomService#getPhoneAccountsSupportingScheme", e);
} }
@@ -1312,7 +1312,7 @@ public class TelecomManager {
if (service != null) { if (service != null) {
try { try {
return service.getSelfManagedPhoneAccounts(mContext.getOpPackageName(), return service.getSelfManagedPhoneAccounts(mContext.getOpPackageName(),
mContext.getAttributionTag()); mContext.getAttributionTag()).getList();
} catch (RemoteException e) { } catch (RemoteException e) {
Log.e(TAG, "Error calling ITelecomService#getSelfManagedPhoneAccounts()", e); Log.e(TAG, "Error calling ITelecomService#getSelfManagedPhoneAccounts()", e);
} }
@@ -1340,7 +1340,7 @@ public class TelecomManager {
if (service != null) { if (service != null) {
try { try {
return service.getOwnSelfManagedPhoneAccounts(mContext.getOpPackageName(), return service.getOwnSelfManagedPhoneAccounts(mContext.getOpPackageName(),
mContext.getAttributionTag()); mContext.getAttributionTag()).getList();
} catch (RemoteException e) { } catch (RemoteException e) {
throw e.rethrowFromSystemServer(); throw e.rethrowFromSystemServer();
} }
@@ -1366,7 +1366,7 @@ public class TelecomManager {
if (service != null) { if (service != null) {
try { try {
return service.getCallCapablePhoneAccounts(includeDisabledAccounts, return service.getCallCapablePhoneAccounts(includeDisabledAccounts,
mContext.getOpPackageName(), mContext.getAttributionTag()); mContext.getOpPackageName(), mContext.getAttributionTag()).getList();
} catch (RemoteException e) { } catch (RemoteException e) {
Log.e(TAG, "Error calling ITelecomService#getCallCapablePhoneAccounts(" Log.e(TAG, "Error calling ITelecomService#getCallCapablePhoneAccounts("
+ includeDisabledAccounts + ")", e); + includeDisabledAccounts + ")", e);
@@ -1390,7 +1390,7 @@ public class TelecomManager {
ITelecomService service = getTelecomService(); ITelecomService service = getTelecomService();
if (service != null) { if (service != null) {
try { try {
return service.getPhoneAccountsForPackage(mContext.getPackageName()); return service.getPhoneAccountsForPackage(mContext.getPackageName()).getList();
} catch (RemoteException e) { } catch (RemoteException e) {
Log.e(TAG, "Error calling ITelecomService#getPhoneAccountsForPackage", e); Log.e(TAG, "Error calling ITelecomService#getPhoneAccountsForPackage", e);
} }
@@ -1450,7 +1450,7 @@ public class TelecomManager {
ITelecomService service = getTelecomService(); ITelecomService service = getTelecomService();
if (service != null) { if (service != null) {
try { try {
return service.getAllPhoneAccounts(); return service.getAllPhoneAccounts().getList();
} catch (RemoteException e) { } catch (RemoteException e) {
Log.e(TAG, "Error calling ITelecomService#getAllPhoneAccounts", e); Log.e(TAG, "Error calling ITelecomService#getAllPhoneAccounts", e);
} }
@@ -1469,7 +1469,7 @@ public class TelecomManager {
ITelecomService service = getTelecomService(); ITelecomService service = getTelecomService();
if (service != null) { if (service != null) {
try { try {
return service.getAllPhoneAccountHandles(); return service.getAllPhoneAccountHandles().getList();
} catch (RemoteException e) { } catch (RemoteException e) {
Log.e(TAG, "Error calling ITelecomService#getAllPhoneAccountHandles", e); Log.e(TAG, "Error calling ITelecomService#getAllPhoneAccountHandles", e);
} }

View File

@@ -24,6 +24,7 @@ import android.net.Uri;
import android.os.Bundle; import android.os.Bundle;
import android.os.UserHandle; import android.os.UserHandle;
import android.telecom.PhoneAccount; import android.telecom.PhoneAccount;
import android.content.pm.ParceledListSlice;
/** /**
* Interface used to interact with Telecom. Mostly this is used by TelephonyManager for passing * Interface used to interact with Telecom. Mostly this is used by TelephonyManager for passing
@@ -57,31 +58,31 @@ interface ITelecomService {
/** /**
* @see TelecomServiceImpl#getCallCapablePhoneAccounts * @see TelecomServiceImpl#getCallCapablePhoneAccounts
*/ */
List<PhoneAccountHandle> getCallCapablePhoneAccounts( ParceledListSlice<PhoneAccountHandle> getCallCapablePhoneAccounts(
boolean includeDisabledAccounts, String callingPackage, String callingFeatureId); boolean includeDisabledAccounts, String callingPackage, String callingFeatureId);
/** /**
* @see TelecomServiceImpl#getSelfManagedPhoneAccounts * @see TelecomServiceImpl#getSelfManagedPhoneAccounts
*/ */
List<PhoneAccountHandle> getSelfManagedPhoneAccounts(String callingPackage, ParceledListSlice<PhoneAccountHandle> getSelfManagedPhoneAccounts(String callingPackage,
String callingFeatureId); String callingFeatureId);
/** /**
* @see TelecomServiceImpl#getOwnSelfManagedPhoneAccounts * @see TelecomServiceImpl#getOwnSelfManagedPhoneAccounts
*/ */
List<PhoneAccountHandle> getOwnSelfManagedPhoneAccounts(String callingPackage, ParceledListSlice<PhoneAccountHandle> getOwnSelfManagedPhoneAccounts(String callingPackage,
String callingFeatureId); String callingFeatureId);
/** /**
* @see TelecomManager#getPhoneAccountsSupportingScheme * @see TelecomManager#getPhoneAccountsSupportingScheme
*/ */
List<PhoneAccountHandle> getPhoneAccountsSupportingScheme(in String uriScheme, ParceledListSlice<PhoneAccountHandle> getPhoneAccountsSupportingScheme(in String uriScheme,
String callingPackage); String callingPackage);
/** /**
* @see TelecomManager#getPhoneAccountsForPackage * @see TelecomManager#getPhoneAccountsForPackage
*/ */
List<PhoneAccountHandle> getPhoneAccountsForPackage(in String packageName); ParceledListSlice<PhoneAccountHandle> getPhoneAccountsForPackage(in String packageName);
/** /**
* @see TelecomManager#getPhoneAccount * @see TelecomManager#getPhoneAccount
@@ -96,12 +97,12 @@ interface ITelecomService {
/** /**
* @see TelecomManager#getAllPhoneAccounts * @see TelecomManager#getAllPhoneAccounts
*/ */
List<PhoneAccount> getAllPhoneAccounts(); ParceledListSlice<PhoneAccount> getAllPhoneAccounts();
/** /**
* @see TelecomManager#getAllPhoneAccountHandles * @see TelecomManager#getAllPhoneAccountHandles
*/ */
List<PhoneAccountHandle> getAllPhoneAccountHandles(); ParceledListSlice<PhoneAccountHandle> getAllPhoneAccountHandles();
/** /**
* @see TelecomServiceImpl#getSimCallManager * @see TelecomServiceImpl#getSimCallManager