fix: foreground service crash on older devices

Fixes a bug where older device take a longer time to launch the foreground service and connect to the VPN. Combined with a delayed launch of foreground notification until VPN connection is confirmed, this would break foreground service,s 5 second notification rule.

Fixed by adding a new attempting connection notification to launch on vpn initial connection attempt.
This commit is contained in:
Zane Schepke 2023-09-04 05:52:15 -04:00
parent 20cc2c09b0
commit 9d9b7bebca
4 changed files with 26 additions and 2 deletions

View File

@ -17,7 +17,7 @@ android {
val versionMajor = 2
val versionMinor = 4
val versionPatch = 1
val versionPatch = 2
val versionBuild = 0
defaultConfig {

View File

@ -9,6 +9,7 @@ import android.content.Intent
import com.google.firebase.crashlytics.ktx.crashlytics
import com.google.firebase.ktx.Firebase
import com.zaneschepke.wireguardautotunnel.R
import timber.log.Timber
object ServiceManager {
@Suppress("DEPRECATION")
@ -35,7 +36,14 @@ object ServiceManager {
intent.component?.javaClass
try {
when(action) {
Action.START -> context.startForegroundService(intent)
Action.START -> {
try {
context.startForegroundService(intent)
} catch (e : Exception) {
Timber.e("Unable to start service foreground ${e.message}")
context.startService(intent)
}
}
Action.STOP -> context.startService(intent)
}
} catch (e : Exception) {

View File

@ -47,6 +47,7 @@ class WireGuardTunnelService : ForegroundService() {
val tunnelConfig = TunnelConfig.from(tunnelConfigString)
tunnelName = tunnelConfig.name
vpnService.startTunnel(tunnelConfig)
launchVpnStartingNotification()
} catch (e : Exception) {
Timber.e("Problem starting tunnel: ${e.message}")
stopService(extras)
@ -60,6 +61,7 @@ class WireGuardTunnelService : ForegroundService() {
val tunnelConfig = TunnelConfig.from(setting.defaultTunnel!!)
tunnelName = tunnelConfig.name
vpnService.startTunnel(tunnelConfig)
launchVpnStartingNotification()
}
}
}
@ -117,6 +119,18 @@ class WireGuardTunnelService : ForegroundService() {
super.startForeground(foregroundId, notification)
}
private fun launchVpnStartingNotification() {
val notification = notificationService.createNotification(
channelId = getString(R.string.vpn_channel_id),
channelName = getString(R.string.vpn_channel_name),
title = getString(R.string.vpn_starting),
onGoing = false,
showTimestamp = true,
description = getString(R.string.attempt_connection)
)
super.startForeground(foregroundId, notification)
}
private fun launchVpnConnectionFailedNotification(message : String) {
val notification = notificationService.createNotification(
channelId = getString(R.string.vpn_channel_id),

View File

@ -89,4 +89,6 @@
<string name="hint_search_packages">Search packages</string>
<string name="clear_icon">Clear Icon</string>
<string name="search_icon">Search Icon</string>
<string name="attempt_connection">Attempting connection..</string>
<string name="vpn_starting">VPN Starting</string>
</resources>