diff --git a/client/amnezia_application.cpp b/client/amnezia_application.cpp index dcaae1b6..a3050071 100644 --- a/client/amnezia_application.cpp +++ b/client/amnezia_application.cpp @@ -91,7 +91,7 @@ void AmneziaApplication::init() initControllers(); #ifdef Q_OS_ANDROID - connect(AndroidController::instance(), &AndroidController::serviceIsAlive, this, + connect(AndroidController::instance(), &AndroidController::initConnectionState, this, [this](Vpn::ConnectionState state) { m_connectionController->onConnectionStateChanged(state); if (m_vpnConnection) diff --git a/client/android/src/org/amnezia/vpn/AmneziaActivity.kt b/client/android/src/org/amnezia/vpn/AmneziaActivity.kt index bd9d121f..df70e102 100644 --- a/client/android/src/org/amnezia/vpn/AmneziaActivity.kt +++ b/client/android/src/org/amnezia/vpn/AmneziaActivity.kt @@ -23,7 +23,9 @@ import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.SupervisorJob import kotlinx.coroutines.cancel +import kotlinx.coroutines.delay import kotlinx.coroutines.launch +import org.amnezia.vpn.protocol.ProtocolState import org.amnezia.vpn.protocol.getStatistics import org.amnezia.vpn.protocol.getStatus import org.amnezia.vpn.qt.QtAndroidController @@ -34,6 +36,7 @@ private const val TAG = "AmneziaActivity" private const val CHECK_VPN_PERMISSION_ACTION_CODE = 1 private const val CREATE_FILE_ACTION_CODE = 2 +private const val BIND_SERVICE_TIMEOUT = 1000L class AmneziaActivity : QtActivity() { @@ -205,6 +208,7 @@ class AmneziaActivity : QtActivity() { bindService(it, serviceConnection, BIND_ABOVE_CLIENT) } isInBoundState = true + handleBindTimeout() } @MainThread @@ -220,6 +224,19 @@ class AmneziaActivity : QtActivity() { } } + private fun handleBindTimeout() { + mainScope.launch { + if (isWaitingStatus) { + delay(BIND_SERVICE_TIMEOUT) + if (isWaitingStatus && !isServiceConnected) { + Log.d(TAG, "Bind timeout, reset connection status") + isWaitingStatus = false + QtAndroidController.onStatus(ProtocolState.DISCONNECTED.ordinal) + } + } + } + } + /** * Methods of starting and stopping VpnService */ diff --git a/client/platforms/android/android_controller.cpp b/client/platforms/android/android_controller.cpp index d4e7ef62..fbcc3f01 100644 --- a/client/platforms/android/android_controller.cpp +++ b/client/platforms/android/android_controller.cpp @@ -18,9 +18,9 @@ AndroidController::AndroidController() : QObject() [this](AndroidController::ConnectionState state) { qDebug() << "Android event: status; state:" << textConnectionState(state); if (isWaitingStatus) { - qDebug() << "Android VPN service is alive, initialization by service status"; + qDebug() << "Initialization by service status"; isWaitingStatus = false; - emit serviceIsAlive(convertState(state)); + emit initConnectionState(convertState(state)); } }, Qt::QueuedConnection); diff --git a/client/platforms/android/android_controller.h b/client/platforms/android/android_controller.h index 8ab92592..a4bfc890 100644 --- a/client/platforms/android/android_controller.h +++ b/client/platforms/android/android_controller.h @@ -43,7 +43,7 @@ signals: void statisticsUpdated(quint64 rxBytes, quint64 txBytes); void configImported(); void importConfigFromOutside(QString &data); - void serviceIsAlive(Vpn::ConnectionState state); + void initConnectionState(Vpn::ConnectionState state); private: bool isWaitingStatus = true;