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();
#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)

View file

@ -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
*/

View file

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

View file

@ -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;