in niap-cc/Permissions/Tester/app/src/main/java/com/android/certifications/niap/permissions/utils/Transacts.java [1289:1379]
public Parcel invokeTransactWithCharSequence(String service, String descriptor,
String transactName, boolean useCharSequence, Object... parameters) {
if (!descriptorContainsTransactName(descriptor, transactName)) {
throw new BasePermissionTester.UnexpectedPermissionTestFailureException(
"Transact action " + transactName + " does not have a corresponding ID for SDK "
+ mDeviceApiLevel);
}
int transactId = getTransactId(descriptor, transactName);
try {
// Obtain the IBinder for the specified service.
IBinder binder = (IBinder) Class.forName("android.os.ServiceManager")
.getMethod("getService", String.class).invoke(null, service);
if (binder == null) {
throw new BasePermissionTester.BypassTestException("The " + service
+ " service guarded by this permission is not available on this device");
}
Parcel reply = Parcel.obtain();
// Write all of the provided parameters to the data Parcel to be passed to the transact.
// Each parameter must be written to the Parcel based on its class; if any new classes
// need to be supported for direct transacts they should be added here with an
// appropriate means of writing the instance of the class to the Parcel.
Parcel data = Parcel.obtain();
data.writeInterfaceToken(descriptor);
for (Object parameter : parameters) {
if (parameter instanceof CharSequence && useCharSequence) {
if (parameter == null) {
data.writeInt(0);
} else {
data.writeInt(1);
TextUtils.writeToParcel((CharSequence) parameter, data, 0);
}
} else if (parameter instanceof String) {
data.writeString((String) parameter);
} else if (parameter instanceof Long) {
data.writeLong((Long) parameter);
} else if (parameter instanceof Integer) {
data.writeInt((Integer) parameter);
} else if (parameter instanceof Boolean) {
data.writeInt((Boolean) parameter ? 1 : 0);
} else if (parameter instanceof int[]) {
data.writeIntArray((int[]) parameter);
} else if (parameter instanceof IInterface) {
data.writeStrongBinder(
parameter != null ? ((IInterface) parameter).asBinder() : null);
} else if (parameter instanceof IBinder) {
data.writeStrongBinder((IBinder) parameter);
} else if (parameter instanceof byte[]) {
data.writeByteArray((byte[]) parameter);
} else if (parameter instanceof ComponentName) {
if (parameter == null) {
data.writeInt(0);
} else {
data.writeInt(1);
((ComponentName) parameter).writeToParcel(data, 0);
}
} else if (parameter instanceof Uri) {
data.writeInt(1);
((Uri) parameter).writeToParcel(data, 0);
} else if (parameter instanceof String[]) {
data.writeStringArray((String[]) parameter);
} else if (parameter instanceof Account) {
data.writeInt(1);
((Account) parameter).writeToParcel(data, 0);
} else if (parameter instanceof AccessibilityServiceInfo) {
data.writeInt(1);
((AccessibilityServiceInfo) parameter).writeToParcel(data, 0);
} else if (parameter instanceof ParcelUuid) {
data.writeInt(1);
((ParcelUuid) parameter).writeToParcel(data, 0);
} else if (parameter instanceof PendingIntent) {
data.writeInt(1);
((PendingIntent) parameter).writeToParcel(data, 0);
} else if (parameter instanceof NetworkCapabilities) {
data.writeInt(1);
((NetworkCapabilities) parameter).writeToParcel(data, 0);
}
}
binder.transact(transactId, data, reply, 0);
reply.readException();
return reply;
} catch (ReflectiveOperationException roe) {
throw new BasePermissionTester.UnexpectedPermissionTestFailureException(roe);
} catch (RemoteException re) {
Throwable cause = re.getCause();
if (cause != null && cause instanceof SecurityException) {
throw (SecurityException) cause;
} else {
throw new BasePermissionTester.UnexpectedPermissionTestFailureException(re);
}
}
}