public Parcel invokeTransactWithCharSequence()

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);
            }
        }
    }