Add service bind timeout

This commit is contained in:
albexk 2023-12-06 15:36:26 +03:00
parent d2207a5255
commit 508f1d3a42
4 changed files with 21 additions and 4 deletions

View file

@ -91,7 +91,7 @@ void AmneziaApplication::init()
initControllers(); initControllers();
#ifdef Q_OS_ANDROID #ifdef Q_OS_ANDROID
connect(AndroidController::instance(), &AndroidController::serviceIsAlive, this, connect(AndroidController::instance(), &AndroidController::initConnectionState, this,
[this](Vpn::ConnectionState state) { [this](Vpn::ConnectionState state) {
m_connectionController->onConnectionStateChanged(state); m_connectionController->onConnectionStateChanged(state);
if (m_vpnConnection) if (m_vpnConnection)

View file

@ -23,7 +23,9 @@ import kotlinx.coroutines.CoroutineScope
import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.SupervisorJob import kotlinx.coroutines.SupervisorJob
import kotlinx.coroutines.cancel import kotlinx.coroutines.cancel
import kotlinx.coroutines.delay
import kotlinx.coroutines.launch import kotlinx.coroutines.launch
import org.amnezia.vpn.protocol.ProtocolState
import org.amnezia.vpn.protocol.getStatistics import org.amnezia.vpn.protocol.getStatistics
import org.amnezia.vpn.protocol.getStatus import org.amnezia.vpn.protocol.getStatus
import org.amnezia.vpn.qt.QtAndroidController 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 CHECK_VPN_PERMISSION_ACTION_CODE = 1
private const val CREATE_FILE_ACTION_CODE = 2 private const val CREATE_FILE_ACTION_CODE = 2
private const val BIND_SERVICE_TIMEOUT = 1000L
class AmneziaActivity : QtActivity() { class AmneziaActivity : QtActivity() {
@ -205,6 +208,7 @@ class AmneziaActivity : QtActivity() {
bindService(it, serviceConnection, BIND_ABOVE_CLIENT) bindService(it, serviceConnection, BIND_ABOVE_CLIENT)
} }
isInBoundState = true isInBoundState = true
handleBindTimeout()
} }
@MainThread @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 * Methods of starting and stopping VpnService
*/ */

View file

@ -18,9 +18,9 @@ AndroidController::AndroidController() : QObject()
[this](AndroidController::ConnectionState state) { [this](AndroidController::ConnectionState state) {
qDebug() << "Android event: status; state:" << textConnectionState(state); qDebug() << "Android event: status; state:" << textConnectionState(state);
if (isWaitingStatus) { if (isWaitingStatus) {
qDebug() << "Android VPN service is alive, initialization by service status"; qDebug() << "Initialization by service status";
isWaitingStatus = false; isWaitingStatus = false;
emit serviceIsAlive(convertState(state)); emit initConnectionState(convertState(state));
} }
}, },
Qt::QueuedConnection); Qt::QueuedConnection);

View file

@ -43,7 +43,7 @@ signals:
void statisticsUpdated(quint64 rxBytes, quint64 txBytes); void statisticsUpdated(quint64 rxBytes, quint64 txBytes);
void configImported(); void configImported();
void importConfigFromOutside(QString &data); void importConfigFromOutside(QString &data);
void serviceIsAlive(Vpn::ConnectionState state); void initConnectionState(Vpn::ConnectionState state);
private: private:
bool isWaitingStatus = true; bool isWaitingStatus = true;