Merge branch 'main' into disable-up

This commit is contained in:
Philipp Heckel 2026-04-07 15:42:46 -04:00
commit f1ae432156
6 changed files with 72 additions and 11 deletions

View file

@ -17,8 +17,8 @@ android {
minSdkVersion 26
targetSdkVersion 36
versionCode 60
versionName "1.24.0"
versionCode 61
versionName "1.25.0"
testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"

View file

@ -10,6 +10,7 @@ import io.heckel.ntfy.util.Log
import kotlinx.coroutines.CoroutineScope
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.SupervisorJob
import kotlinx.coroutines.launch
class Application : Application() {
val ioScope = CoroutineScope(SupervisorJob() + Dispatchers.IO)
@ -34,11 +35,28 @@ class Application : Application() {
val connectivityManager = getSystemService(CONNECTIVITY_SERVICE) as ConnectivityManager
connectivityManager.registerDefaultNetworkCallback(object : ConnectivityManager.NetworkCallback() {
override fun onAvailable(network: Network) {
SubscriberServiceManager.refresh(this@Application)
// Force reconnect of all WebSocket/JSON connections so they're rebound to the new
// default network. This catches Wi-Fi <-> cellular handoffs and similar transitions
// where the underlying socket is bound to a network that's no longer the default.
// Without this, broken connections would only be detected via the (potentially
// long) ping/pong timeout.
Log.i(TAG, "Default network available ($network); forcing reconnect of all connections")
ioScope.launch {
repository.getSubscriptions()
.map { it.baseUrl }
.distinct()
.forEach { repository.incrementConnectionForceReconnectVersion(it) }
SubscriberServiceManager.refresh(this@Application)
}
}
override fun onLost(network: Network) {
Log.i(TAG, "Default network lost ($network); refreshing subscriber service")
SubscriberServiceManager.refresh(this@Application)
}
})
}
companion object {
private const val TAG = "NtfyApplication"
}
}

View file

@ -46,12 +46,24 @@ object HttpUtil {
/**
* Client for WebSocket connections.
* No read timeout, 1 minute ping interval, 10s connect timeout.
* No read timeout, 5 minute ping interval, 10s connect timeout.
*
* Dead connections are normally caught by one of two faster mechanisms:
* 1. Device-side network changes (Wi-Fi <-> cellular, network drop/return) are
* detected instantly by Application.registerNetworkCallback's onAvailable
* handler, which bumps connectionForceReconnectVersion to force a reconnect.
* 2. Server-side failures (crash, restart, server's own pong timeout) surface as
* TCP FIN/RST and are detected instantly via OkHttp's onClosed/onFailure.
*
* The 5-minute client ping is only a fallback for the rare case where neither of
* the above fires: silent server hangs, NAT eviction, asymmetric routing breaks, etc.
* We use a long interval so the modem can fully power down between pings, which is
* the dominant battery factor for the foreground service.
*/
suspend fun wsClient(context: Context, baseUrl: String): OkHttpClient {
return emptyClientBuilder(context, baseUrl)
.readTimeout(0, TimeUnit.MILLISECONDS)
.pingInterval(1, TimeUnit.MINUTES) // Technically not necessary, the server also pings us
.pingInterval(5, TimeUnit.MINUTES)
.connectTimeout(10, TimeUnit.SECONDS)
.build()
}

View file

@ -40,7 +40,7 @@
<string name="channel_subscriber_notification_title">Kuulame saabuvaid teavitusi</string>
<string name="main_item_status_reconnecting">loome uuesti ühendust …</string>
<string name="main_banner_battery_button_fix_now">Tee korda</string>
<string name="channel_subscriber_service_name">Tellimuste teenus</string>
<string name="channel_subscriber_service_name">Taustateenus</string>
<string name="main_banner_battery_button_remind_later">Küsi hiljem</string>
<string name="main_banner_battery_button_dismiss">Katkesta</string>
<string name="refresh_message_error_one">Tellimuse andmete uuendamine ei õnnestunud: %1$s</string>
@ -462,8 +462,23 @@
<string name="common_button_reset_to_default">Taasta algväärtused</string>
<string name="default_server_dialog_url_error_invalid">Sisesta korrektne teenuse võrguaadress, nt https://ntfy.toredomeen.com</string>
<string name="connection_alert_title">Ühendus on katkenud</string>
<string name="connection_alert_text_one">Ühendus %1$s teenusega toimib vaid %2$d minuti(t)</string>
<string name="connection_alert_text_multiple">Ühendus %1$d serveriga toimib vaid %2$d minuti(t)</string>
<string name="connection_alert_text_one">Ühendus %1$s teenusega toimib vaid %2$d minuti(t). Palun kontrolli seadme võrguühenduse toimimist.</string>
<string name="connection_alert_text_multiple">Ühendus %1$d serveriga toimib vaid %2$d minuti(t). Palun kontrolli seadme võrguühenduse toimimist.</string>
<string name="connection_alert_action_snooze">Tukasta %1$dt</string>
<string name="connection_alert_action_never">Ära näita iialgi</string>
<string name="channel_connection_alert_name">Ühenduse hoiatused</string>
<string name="main_banner_no_network_text">Sa pole võrgus :(</string>
<string name="settings_advanced_connection_alert_title">Hoiata ühenduse katkemisel</string>
<string name="settings_advanced_connection_alert_summary_never">Ära iialgi hoiata, kui ntfy server pole leitav</string>
<string name="settings_advanced_connection_alert_summary_five_minutes">Hoiata, kui ntfy server pole leitav enam, kui 5 minuti jooksul</string>
<string name="settings_advanced_connection_alert_summary_fifteen_minutes">Hoiata, kui ntfy server pole leitav enam, kui 15 minuti jooksul</string>
<string name="settings_advanced_connection_alert_summary_one_hour">Hoiata, kui ntfy server pole leitav enam, kui 1 tunni jooksul</string>
<string name="settings_advanced_connection_alert_summary_three_hours">Hoiata, kui ntfy server pole leitav enam, kui 3 tunni jooksul</string>
<string name="settings_advanced_connection_alert_summary_twelve_hours">Hoiata, kui ntfy server pole leitav enam, kui 12 tunni jooksul</string>
<string name="settings_advanced_connection_alert_never">Mitte kunagi</string>
<string name="settings_advanced_connection_alert_five_minutes">5 minuti möödumisel</string>
<string name="settings_advanced_connection_alert_fifteen_minutes">15 minuti möödumisel</string>
<string name="settings_advanced_connection_alert_one_hour">1 tunni möödumisel</string>
<string name="settings_advanced_connection_alert_three_hours">3 tunni möödumisel</string>
<string name="settings_advanced_connection_alert_twelve_hours">12 tunni möödumisel</string>
</resources>

View file

@ -16,7 +16,7 @@
<string name="main_item_status_reconnecting">reconectando …</string>
<string name="common_priority_high_name">Prioridade alta</string>
<string name="common_priority_max_name">Prioridade máxima</string>
<string name="channel_subscriber_service_name">Serviço de Inscrição</string>
<string name="channel_subscriber_service_name">Inscrição em background</string>
<string name="channel_subscriber_notification_title">Aguardando recepção de notificações</string>
<string name="channel_subscriber_notification_instant_text">Inscrito em tópicos de entrega instantânea</string>
<string name="channel_subscriber_notification_instant_text_one">Inscrito em um tópico de entrega instantânea</string>
@ -354,8 +354,8 @@
<string name="common_certificate_added_toast">Certificado adicionado</string>
<string name="common_certificate_deleted_toast">Certificado removido</string>
<string name="connection_alert_title">Notificação de alerta de conexão</string>
<string name="connection_alert_text_one">Não foi possível conectar à %1$s por mais de %2$d minutos</string>
<string name="connection_alert_text_multiple">Não foi possível conectar aos servidores %1$d por mais de %2$d minutos</string>
<string name="connection_alert_text_one">Não foi possível conectar à %1$s por mais de %2$d minutos. Verifique sua conexão de rede.</string>
<string name="connection_alert_text_multiple">Não foi possível conectar aos servidores %1$d por mais de %2$d minutos. Verifique sua conexão de rede.</string>
<string name="connection_alert_action_snooze">Adiar %1$dh</string>
<string name="connection_alert_action_never">Nunca mostrar</string>
<string name="main_menu_connection_error">Erro de conexão</string>
@ -472,4 +472,19 @@
<string name="trusted_certificate_dialog_not_yet_valid_warning">Alerta: Este certificado ainda não é válido.</string>
<string name="trusted_certificate_dialog_error_invalid_url">URL inválida</string>
<string name="trusted_certificate_dialog_error_parse">Não foi possível carregar certificado: %1$s</string>
<string name="channel_connection_alert_name">Alertas de conexão</string>
<string name="main_banner_no_network_text">Você está offline</string>
<string name="settings_advanced_connection_alert_title">Alertar quando desconectado</string>
<string name="settings_advanced_connection_alert_summary_never">Nunca notificar quando o servidor ntfy não puder ser atingido</string>
<string name="settings_advanced_connection_alert_summary_five_minutes">Notificar se o servidor ntfy não puder ser atingido por mais que 5 minutos</string>
<string name="settings_advanced_connection_alert_summary_fifteen_minutes">Notificar se o servidor ntfy não puder ser atingido por mais que 15 minutos</string>
<string name="settings_advanced_connection_alert_summary_one_hour">Notificar se o servidor ntfy não puder ser atingido por mais que 1 hora</string>
<string name="settings_advanced_connection_alert_summary_three_hours">Notificar se o servidor ntfy não puder ser atingido por mais que 3 horas</string>
<string name="settings_advanced_connection_alert_summary_twelve_hours">Notificar se o servidor ntfy não puder ser atingido por mais que 12 horas</string>
<string name="settings_advanced_connection_alert_never">Nunca</string>
<string name="settings_advanced_connection_alert_five_minutes">Depois de 5 minutos</string>
<string name="settings_advanced_connection_alert_fifteen_minutes">Depois de 15 minutos</string>
<string name="settings_advanced_connection_alert_one_hour">Depois de 1 hora</string>
<string name="settings_advanced_connection_alert_three_hours">Depois de 3 horas</string>
<string name="settings_advanced_connection_alert_twelve_hours">Depois de 12 horas</string>
</resources>

View file

@ -1,6 +1,7 @@
Features:
* Add configurable "Alert when connection is lost" setting (#1665, #1662, #1652, #1655, thanks to @tintamarre, @sjozs, @TheRealOne78, and @DAE51D for reporting)
* Suppress connection alerts and stop foreground service when there is no network (ntfy-android#165, thanks to @tintamarre for the contribution)
* Improve battery life by increasing WebSocket client ping interval from 1 min to 5 min, and reconnect instantly on Wi-Fi/cellular/VPN transitions (ntfy-android#113, thanks to @ftilde for the investigation)
Bug fixes + maintenance:
* Undo automatic phone number linking for numbers in message body (ntfy-android#170, thanks to @acortelyou for the contribution)