Add passing the VPN connection status when rebinding to the service
This commit is contained in:
parent
5835a756ce
commit
dc6e3ec53b
8 changed files with 65 additions and 28 deletions
|
@ -15,12 +15,12 @@ namespace
|
|||
AndroidController::AndroidController() : QObject()
|
||||
{
|
||||
connect(this, &AndroidController::status, this,
|
||||
[this](bool isVpnConnected) {
|
||||
qDebug() << "Android event: status; connected:" << isVpnConnected;
|
||||
[this](AndroidController::ConnectionState state) {
|
||||
qDebug() << "Android event: status; state:" << textConnectionState(state);
|
||||
if (isWaitingStatus) {
|
||||
qDebug() << "Android VPN service is alive, initialization by service status";
|
||||
isWaitingStatus = false;
|
||||
emit serviceIsAlive(isVpnConnected);
|
||||
emit serviceIsAlive(convertState(state));
|
||||
}
|
||||
},
|
||||
Qt::QueuedConnection);
|
||||
|
@ -30,7 +30,7 @@ AndroidController::AndroidController() : QObject()
|
|||
[this]() {
|
||||
qDebug() << "Android event: service disconnected";
|
||||
isWaitingStatus = true;
|
||||
emit connectionStateChanged(Vpn::ConnectionState::Unknown);
|
||||
emit connectionStateChanged(Vpn::ConnectionState::Disconnected);
|
||||
},
|
||||
Qt::QueuedConnection);
|
||||
|
||||
|
@ -95,7 +95,7 @@ bool AndroidController::initialize()
|
|||
qDebug() << "Initialize AndroidController";
|
||||
|
||||
const JNINativeMethod methods[] = {
|
||||
{"onStatus", "(Z)V", reinterpret_cast<void *>(onStatus)},
|
||||
{"onStatus", "(I)V", reinterpret_cast<void *>(onStatus)},
|
||||
{"onServiceDisconnected", "()V", reinterpret_cast<void *>(onServiceDisconnected)},
|
||||
{"onServiceError", "()V", reinterpret_cast<void *>(onServiceError)},
|
||||
{"onVpnPermissionRejected", "()V", reinterpret_cast<void *>(onVpnPermissionRejected)},
|
||||
|
@ -179,14 +179,40 @@ void AndroidController::qtAndroidControllerInitialized()
|
|||
callActivityMethod("qtAndroidControllerInitialized", "()V");
|
||||
}
|
||||
|
||||
// static
|
||||
Vpn::ConnectionState AndroidController::convertState(AndroidController::ConnectionState state)
|
||||
{
|
||||
switch (state) {
|
||||
case AndroidController::ConnectionState::CONNECTED: return Vpn::ConnectionState::Connected;
|
||||
case AndroidController::ConnectionState::CONNECTING: return Vpn::ConnectionState::Connecting;
|
||||
case AndroidController::ConnectionState::DISCONNECTED: return Vpn::ConnectionState::Disconnected;
|
||||
case AndroidController::ConnectionState::DISCONNECTING: return Vpn::ConnectionState::Disconnecting;
|
||||
case AndroidController::ConnectionState::UNKNOWN: return Vpn::ConnectionState::Unknown;
|
||||
}
|
||||
}
|
||||
|
||||
// static
|
||||
QString AndroidController::textConnectionState(AndroidController::ConnectionState state)
|
||||
{
|
||||
switch (state) {
|
||||
case AndroidController::ConnectionState::CONNECTED: return "CONNECTED";
|
||||
case AndroidController::ConnectionState::CONNECTING: return "CONNECTING";
|
||||
case AndroidController::ConnectionState::DISCONNECTED: return "DISCONNECTED";
|
||||
case AndroidController::ConnectionState::DISCONNECTING: return "DISCONNECTING";
|
||||
case AndroidController::ConnectionState::UNKNOWN: return "UNKNOWN";
|
||||
}
|
||||
}
|
||||
|
||||
// JNI functions called by Android
|
||||
// static
|
||||
void AndroidController::onStatus(JNIEnv *env, jobject thiz, jboolean isVpnConnected)
|
||||
void AndroidController::onStatus(JNIEnv *env, jobject thiz, jint stateCode)
|
||||
{
|
||||
Q_UNUSED(env);
|
||||
Q_UNUSED(thiz);
|
||||
|
||||
emit AndroidController::instance()->status(isVpnConnected);
|
||||
auto state = ConnectionState(stateCode);
|
||||
|
||||
emit AndroidController::instance()->status(state);
|
||||
}
|
||||
|
||||
// static
|
||||
|
|
|
@ -17,6 +17,15 @@ public:
|
|||
|
||||
bool initialize();
|
||||
|
||||
// keep synchronized with org.amnezia.vpn.protocol.ProtocolState
|
||||
enum class ConnectionState {
|
||||
CONNECTED,
|
||||
CONNECTING,
|
||||
DISCONNECTED,
|
||||
DISCONNECTING,
|
||||
UNKNOWN
|
||||
};
|
||||
|
||||
ErrorCode start(const QJsonObject &vpnConfig);
|
||||
void stop();
|
||||
void setNotificationText(const QString &title, const QString &message, int timerSec);
|
||||
|
@ -25,7 +34,7 @@ public:
|
|||
|
||||
signals:
|
||||
void connectionStateChanged(Vpn::ConnectionState state);
|
||||
void status(bool isVpnConnected);
|
||||
void status(ConnectionState state);
|
||||
void serviceDisconnected();
|
||||
void serviceError();
|
||||
void vpnPermissionRejected();
|
||||
|
@ -34,15 +43,18 @@ signals:
|
|||
void statisticsUpdated(quint64 rxBytes, quint64 txBytes);
|
||||
void configImported();
|
||||
void importConfigFromOutside(QString &data);
|
||||
void serviceIsAlive(bool connected);
|
||||
void serviceIsAlive(Vpn::ConnectionState state);
|
||||
|
||||
private:
|
||||
bool isWaitingStatus = true;
|
||||
|
||||
void qtAndroidControllerInitialized();
|
||||
|
||||
static Vpn::ConnectionState convertState(ConnectionState state);
|
||||
static QString textConnectionState(ConnectionState state);
|
||||
|
||||
// JNI functions called by Android
|
||||
static void onStatus(JNIEnv *env, jobject thiz, jboolean isVpnConnected);
|
||||
static void onStatus(JNIEnv *env, jobject thiz, jint stateCode);
|
||||
static void onServiceDisconnected(JNIEnv *env, jobject thiz);
|
||||
static void onServiceError(JNIEnv *env, jobject thiz);
|
||||
static void onVpnPermissionRejected(JNIEnv *env, jobject thiz);
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue