bool QSerialPortPrivate::clear(QSerialPort::Directions directions)
{
    if (deviceId == BAD_PORT)
    {
        q_ptr->setError(QSerialPort::NotOpenError);
        return false;
    }

    bool inputL = false;
    bool outputL = false;

    if (directions == QSerialPort::AllDirections)
        inputL = outputL = true;
    else
    {
        if (directions & QSerialPort::Input)
            inputL = true;

        if (directions & QSerialPort::Output)
            outputL = true;
    }

    cleanJavaException();
    bool res = QAndroidJniObject::callStaticMethod<jboolean>(
        kJniClassName,
        "purgeBuffers",
        "(IZZ)Z",
        deviceId,
        inputL,
        outputL);

    cleanJavaException();
    return res;
}
bool QSerialPortPrivate::setParameters(int baudRateA, int dataBitsA, int stopBitsA, int parityA)
{
    if (deviceId == BAD_PORT)
    {
        q_ptr->setError(QSerialPort::NotOpenError);
        return false;
    }

    cleanJavaException();
    jboolean resultL = QAndroidJniObject::callStaticMethod<jboolean>(
        kJniClassName,
        "setParameters",
        "(IIIII)Z",
        deviceId,
        baudRateA,
        dataBitsA,
        stopBitsA,
        parityA);
    cleanJavaException();

    if(resultL)
    {
        //  SET THE JNI VALUES TO WHAT WAS SENT
        inputBaudRate = outputBaudRate = baudRateA;
        jniDataBits = dataBitsA;
        jniStopBits = stopBitsA;
        jniParity = parityA;
    }

    return resultL;
}
bool QSerialPortPrivate::open(QIODevice::OpenMode mode)
{
    rwMode = mode;
    qCDebug(AndroidSerialPortLog) << "Opening" << systemLocation.toLatin1().data();

    QAndroidJniObject jnameL = QAndroidJniObject::fromString(systemLocation);
    cleanJavaException();
    deviceId = QAndroidJniObject::callStaticMethod<jint>(
        kJniClassName,
        "open",
        "(Landroid/content/Context;Ljava/lang/String;I)I",
        QtAndroid::androidActivity().object(),
        jnameL.object<jstring>(),
        (jint)this);
    cleanJavaException();

    isReadStopped = false;

    if (deviceId == BAD_PORT)
    {
        qWarning() << "Error opening %s" << systemLocation.toLatin1().data();
        q_ptr->setError(QSerialPort::DeviceNotFoundError);
        return false;
    }

    if (rwMode == QIODevice::WriteOnly)
        stopReadThread();

    return true;
}
bool QSerialPortInfo::isValid() const
{
    QAndroidJniObject jstrL = QAndroidJniObject::fromString(d_ptr->portName);
    cleanJavaException();
    jboolean resultL = QAndroidJniObject::callStaticMethod<jboolean>(
        V_jniClassName,
        "isDeviceNameValid",
        "(Ljava/lang/String;)Z",
        jstrL.object<jstring>());
    cleanJavaException();
    return resultL;
}
void QSerialPortPrivate::startReadThread()
{
    if (!isReadStopped)
        return;
    cleanJavaException();
    QAndroidJniObject::callStaticMethod<void>(
        kJniClassName,
        "startIoManager",
        "(I)V",
        deviceId);
    cleanJavaException();
    isReadStopped = false;
}
bool QSerialPortPrivate::setRequestToSend(bool set)
{
    if (deviceId == BAD_PORT)
    {
        q_ptr->setError(QSerialPort::NotOpenError);
        return false;
    }
    cleanJavaException();
    bool res = QAndroidJniObject::callStaticMethod<jboolean>(
        kJniClassName,
        "setRequestToSend",
        "(IZ)Z",
        deviceId,
        set);
    cleanJavaException();
    return res;
}
void QSerialPortPrivate::close()
{
    if (deviceId == BAD_PORT)
        return;

    qCDebug(AndroidSerialPortLog) << "Closing" << systemLocation.toLatin1().data();
    cleanJavaException();
    jboolean resultL = QAndroidJniObject::callStaticMethod<jboolean>(
        kJniClassName,
        "close",
        "(I)Z",
        deviceId);
    cleanJavaException();

    descriptor = -1;
    isCustomBaudRateSupported = false;
    pendingBytesWritten = 0;
    deviceId = BAD_PORT;

    if (!resultL)
        q_ptr->setErrorString(QStringLiteral("Closing device failed"));
}