WIP Connection lost alert v2

This commit is contained in:
Philipp Heckel 2026-04-01 21:56:07 -04:00
parent f68280204a
commit 8577576711
23 changed files with 111 additions and 103 deletions

View file

@ -138,8 +138,9 @@
android:enabled="true"
android:exported="false">
<intent-filter>
<action android:name="io.heckel.ntfy.CONNECTION_ALERT_DISMISS"/>
<action android:name="io.heckel.ntfy.CONNECTION_ALERT_SNOOZE"/>
<action android:name="io.heckel.ntfy.CONNECTION_ALERT_DISABLE"/>
<action android:name="io.heckel.ntfy.CONNECTION_ALERT_NEVER"/>
</intent-filter>
</receiver>

View file

@ -3,8 +3,6 @@ package io.heckel.ntfy.app
import android.app.Application
import android.net.ConnectivityManager
import android.net.Network
import android.net.NetworkCapabilities
import android.net.NetworkRequest
import com.google.android.material.color.DynamicColors
import io.heckel.ntfy.db.Repository
import io.heckel.ntfy.service.SubscriberServiceManager
@ -34,10 +32,7 @@ class Application : Application() {
private fun registerNetworkCallback() {
val connectivityManager = getSystemService(CONNECTIVITY_SERVICE) as ConnectivityManager
val networkRequest = NetworkRequest.Builder()
.addCapability(NetworkCapabilities.NET_CAPABILITY_INTERNET)
.build()
connectivityManager.registerNetworkCallback(networkRequest, object : ConnectivityManager.NetworkCallback() {
connectivityManager.registerDefaultNetworkCallback(object : ConnectivityManager.NetworkCallback() {
override fun onAvailable(network: Network) {
SubscriberServiceManager.refresh(this@Application)
}

View file

@ -447,6 +447,7 @@ class Repository(private val sharedPrefs: SharedPreferences, database: Database)
fun setConnectionAlertSeconds(seconds: Long) {
sharedPrefs.edit {
putLong(SHARED_PREFS_CONNECTION_ALERT_SECONDS, seconds)
putLong(SHARED_PREFS_CONNECTION_ALERT_SNOOZE_UNTIL, 0L)
}
}

View file

@ -11,8 +11,7 @@ import android.content.BroadcastReceiver
import android.content.Context
import android.content.Intent
import android.content.pm.ServiceInfo
import android.net.ConnectivityManager
import android.net.NetworkCapabilities
import io.heckel.ntfy.util.isNetworkAvailable
import android.os.Build
import android.os.IBinder
import android.os.PowerManager
@ -30,6 +29,7 @@ import io.heckel.ntfy.ui.Colors
import io.heckel.ntfy.ui.MainActivity
import io.heckel.ntfy.util.HttpUtil
import io.heckel.ntfy.util.Log
import io.heckel.ntfy.util.shortUrl
import io.heckel.ntfy.util.topicUrl
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.GlobalScope
@ -320,7 +320,7 @@ class SubscriberService : Service() {
if (thresholdSeconds <= 0L) return
// Don't show alert if the device has no network connectivity (e.g. airplane mode)
if (!isNetworkAvailable()) return
if (!isNetworkAvailable(this)) return
val now = System.currentTimeMillis()
@ -342,14 +342,6 @@ class SubscriberService : Service() {
}
}
private fun isNetworkAvailable(): Boolean {
val connectivityManager = getSystemService(CONNECTIVITY_SERVICE) as ConnectivityManager
val network = connectivityManager.activeNetwork ?: return false
val capabilities = connectivityManager.getNetworkCapabilities(network) ?: return false
return capabilities.hasCapability(NetworkCapabilities.NET_CAPABILITY_INTERNET)
&& capabilities.hasCapability(NetworkCapabilities.NET_CAPABILITY_VALIDATED)
}
private fun maybeAutoDismissConnectionAlert() {
val allDetails = repository.getConnectionDetails()
val anyStillDisconnected = allDetails.any { (_, details) ->
@ -362,7 +354,7 @@ class SubscriberService : Service() {
private fun showConnectionAlertNotification(disconnectedUrls: Set<String>, thresholdMinutes: Int) {
val text = if (disconnectedUrls.size == 1) {
getString(R.string.connection_alert_text_one, disconnectedUrls.first(), thresholdMinutes)
getString(R.string.connection_alert_text_one, shortUrl(disconnectedUrls.first()), thresholdMinutes)
} else {
getString(R.string.connection_alert_text_multiple, disconnectedUrls.size, thresholdMinutes)
}
@ -374,11 +366,11 @@ class SubscriberService : Service() {
Intent(this, ConnectionAlertBroadcastReceiver::class.java).apply { action = CONNECTION_ALERT_ACTION_SNOOZE },
PendingIntent.FLAG_UPDATE_CURRENT or PendingIntent.FLAG_IMMUTABLE)
val disableIntent = PendingIntent.getBroadcast(this, 1,
Intent(this, ConnectionAlertBroadcastReceiver::class.java).apply { action = CONNECTION_ALERT_ACTION_DISABLE },
Intent(this, ConnectionAlertBroadcastReceiver::class.java).apply { action = CONNECTION_ALERT_ACTION_NEVER },
PendingIntent.FLAG_UPDATE_CURRENT or PendingIntent.FLAG_IMMUTABLE)
val deleteIntent = PendingIntent.getBroadcast(this, 2,
Intent(this, ConnectionAlertBroadcastReceiver::class.java).apply { action = CONNECTION_ALERT_ACTION_SNOOZE },
Intent(this, ConnectionAlertBroadcastReceiver::class.java).apply { action = CONNECTION_ALERT_ACTION_DISMISS },
PendingIntent.FLAG_UPDATE_CURRENT or PendingIntent.FLAG_IMMUTABLE)
val notification = NotificationCompat.Builder(this, NOTIFICATION_CONNECTION_ALERT_CHANNEL_ID)
@ -392,7 +384,7 @@ class SubscriberService : Service() {
.setOnlyAlertOnce(true)
.setDeleteIntent(deleteIntent)
.addAction(NotificationCompat.Action.Builder(0, getString(R.string.connection_alert_action_snooze, CONNECTION_ALERT_SNOOZE_HOURS), snoozeIntent).build())
.addAction(NotificationCompat.Action.Builder(0, getString(R.string.connection_alert_action_disable), disableIntent).build())
.addAction(NotificationCompat.Action.Builder(0, getString(R.string.connection_alert_action_never), disableIntent).build())
.build()
Log.d(TAG, "Showing connection alert notification")
@ -511,10 +503,13 @@ class SubscriberService : Service() {
val repository = Repository.getInstance(context)
val notificationManager = context.getSystemService(NOTIFICATION_SERVICE) as NotificationManager
when (intent.action) {
CONNECTION_ALERT_ACTION_DISMISS -> {
repository.setConnectionAlertSnoozeUntil(System.currentTimeMillis() + CONNECTION_ALERT_DISMISS_SNOOZE_MILLIS)
}
CONNECTION_ALERT_ACTION_SNOOZE -> {
repository.setConnectionAlertSnoozeUntil(System.currentTimeMillis() + CONNECTION_ALERT_SNOOZE_DURATION_MILLIS)
}
CONNECTION_ALERT_ACTION_DISABLE -> {
CONNECTION_ALERT_ACTION_NEVER -> {
repository.setConnectionAlertSeconds(Repository.CONNECTION_ALERT_NEVER)
}
else -> return
@ -543,7 +538,9 @@ class SubscriberService : Service() {
private const val NOTIFICATION_CONNECTION_ALERT_ID = 2587
private const val CONNECTION_ALERT_SNOOZE_HOURS = 8
private const val CONNECTION_ALERT_SNOOZE_DURATION_MILLIS = CONNECTION_ALERT_SNOOZE_HOURS * 60 * 60 * 1000L
private const val CONNECTION_ALERT_DISMISS_SNOOZE_MILLIS = 1 * 60 * 60 * 1000L /*1 hour*/
private const val CONNECTION_ALERT_ACTION_DISMISS = "io.heckel.ntfy.CONNECTION_ALERT_DISMISS"
private const val CONNECTION_ALERT_ACTION_SNOOZE = "io.heckel.ntfy.CONNECTION_ALERT_SNOOZE"
private const val CONNECTION_ALERT_ACTION_DISABLE = "io.heckel.ntfy.CONNECTION_ALERT_DISABLE"
private const val CONNECTION_ALERT_ACTION_NEVER = "io.heckel.ntfy.CONNECTION_ALERT_NEVER"
}
}

View file

@ -3,8 +3,7 @@ package io.heckel.ntfy.service
import android.app.NotificationManager
import android.content.Context
import android.content.Intent
import android.net.ConnectivityManager
import android.net.NetworkCapabilities
import io.heckel.ntfy.util.isNetworkAvailable
import androidx.core.content.ContextCompat
import androidx.work.*
import io.heckel.ntfy.app.Application
@ -82,12 +81,6 @@ class SubscriberServiceManager(private val context: Context) {
const val WORK_NAME_ONCE = "ServiceStartWorkerOnce"
private const val NOTIFICATION_CONNECTION_ALERT_ID = 2587 // Same as SubscriberService
private fun isNetworkAvailable(context: Context): Boolean {
val connectivityManager = context.getSystemService(Context.CONNECTIVITY_SERVICE) as ConnectivityManager
val network = connectivityManager.activeNetwork ?: return false
val capabilities = connectivityManager.getNetworkCapabilities(network) ?: return false
return capabilities.hasCapability(NetworkCapabilities.NET_CAPABILITY_INTERNET)
}
fun refresh(context: Context) {
val manager = SubscriberServiceManager(context)

View file

@ -11,8 +11,7 @@ import android.content.Intent
import android.content.pm.PackageManager
import android.net.ConnectivityManager
import android.net.Network
import android.net.NetworkCapabilities
import android.net.NetworkRequest
import io.heckel.ntfy.util.isNetworkAvailable
import android.os.Build
import android.os.Bundle
import android.provider.Settings
@ -359,10 +358,7 @@ class MainActivity : AppCompatActivity(), AddFragment.SubscribeListener, Notific
runOnUiThread { showHideNoNetworkBanner() }
}
}
val networkRequest = NetworkRequest.Builder()
.addCapability(NetworkCapabilities.NET_CAPABILITY_INTERNET)
.build()
connectivityManager.registerNetworkCallback(networkRequest, networkCallback!!)
connectivityManager.registerDefaultNetworkCallback(networkCallback!!)
// Hide links that lead to payments, see https://github.com/binwiederhier/ntfy/issues/1463
val howToLink = findViewById<TextView>(R.id.main_how_to_link)
@ -449,16 +445,8 @@ class MainActivity : AppCompatActivity(), AddFragment.SubscribeListener, Notific
}
private fun showHideNoNetworkBanner() {
val connectivityManager = getSystemService(CONNECTIVITY_SERVICE) as ConnectivityManager
val network = connectivityManager.activeNetwork
val hasNetwork = if (network != null) {
val capabilities = connectivityManager.getNetworkCapabilities(network)
capabilities?.hasCapability(NetworkCapabilities.NET_CAPABILITY_INTERNET) == true
} else {
false
}
val banner = findViewById<View>(R.id.main_banner_no_network)
banner.visibility = if (hasNetwork) View.GONE else View.VISIBLE
banner.visibility = if (isNetworkAvailable(this)) View.GONE else View.VISIBLE
}
override fun onDestroy() {

View file

@ -328,7 +328,7 @@ class SettingsActivity : AppCompatActivity(), PreferenceFragmentCompat.OnPrefere
}
// Connection alert
val connectionAlertPrefId = context?.getString(R.string.settings_notifications_connection_alert_key) ?: return
val connectionAlertPrefId = context?.getString(R.string.settings_advanced_connection_alert_key) ?: return
val connectionAlert: ListPreference? = findPreference(connectionAlertPrefId)
connectionAlert?.value = repository.getConnectionAlertSeconds().toString()
connectionAlert?.preferenceDataStore = object : PreferenceDataStore() {
@ -342,14 +342,14 @@ class SettingsActivity : AppCompatActivity(), PreferenceFragmentCompat.OnPrefere
}
connectionAlert?.summaryProvider = Preference.SummaryProvider<ListPreference> { pref ->
when (pref.value.toLongOrNull() ?: repository.getConnectionAlertSeconds()) {
Repository.CONNECTION_ALERT_NEVER -> getString(R.string.settings_notifications_connection_alert_summary_never)
Repository.CONNECTION_ALERT_NEVER -> getString(R.string.settings_advanced_connection_alert_summary_never)
30L -> "Alert after 30 seconds (testing)"
Repository.CONNECTION_ALERT_FIVE_MINUTES -> getString(R.string.settings_notifications_connection_alert_summary_five_minutes)
Repository.CONNECTION_ALERT_FIFTEEN_MINUTES -> getString(R.string.settings_notifications_connection_alert_summary_fifteen_minutes)
Repository.CONNECTION_ALERT_ONE_HOUR -> getString(R.string.settings_notifications_connection_alert_summary_one_hour)
Repository.CONNECTION_ALERT_THREE_HOURS -> getString(R.string.settings_notifications_connection_alert_summary_three_hours)
Repository.CONNECTION_ALERT_TWELVE_HOURS -> getString(R.string.settings_notifications_connection_alert_summary_twelve_hours)
else -> getString(R.string.settings_notifications_connection_alert_summary_never) // Must match default const
Repository.CONNECTION_ALERT_FIVE_MINUTES -> getString(R.string.settings_advanced_connection_alert_summary_five_minutes)
Repository.CONNECTION_ALERT_FIFTEEN_MINUTES -> getString(R.string.settings_advanced_connection_alert_summary_fifteen_minutes)
Repository.CONNECTION_ALERT_ONE_HOUR -> getString(R.string.settings_advanced_connection_alert_summary_one_hour)
Repository.CONNECTION_ALERT_THREE_HOURS -> getString(R.string.settings_advanced_connection_alert_summary_three_hours)
Repository.CONNECTION_ALERT_TWELVE_HOURS -> getString(R.string.settings_advanced_connection_alert_summary_twelve_hours)
else -> getString(R.string.settings_advanced_connection_alert_summary_never) // Must match default const
}
}

View file

@ -10,6 +10,7 @@ import android.content.res.Resources
import android.graphics.Bitmap
import android.graphics.BitmapFactory
import android.graphics.drawable.RippleDrawable
import android.net.ConnectivityManager
import android.net.Uri
import android.os.Build
import android.os.PowerManager
@ -53,6 +54,13 @@ import kotlin.math.abs
import kotlin.math.absoluteValue
import androidx.core.net.toUri
// We check for any active network, not specifically for internet connectivity,
// because the ntfy server may be on a LAN without internet access.
fun isNetworkAvailable(context: Context): Boolean {
val connectivityManager = context.getSystemService(Context.CONNECTIVITY_SERVICE) as ConnectivityManager
return connectivityManager.activeNetwork != null
}
fun topicUrl(baseUrl: String, topic: String) = "${baseUrl}/${topic}"
fun topicUrlUp(baseUrl: String, topic: String) = "${baseUrl}/${topic}?up=1" // UnifiedPush
fun topicUrlJson(baseUrl: String, topic: String, since: String) = "${topicUrl(baseUrl, topic)}/json?since=$since"

View file

@ -0,0 +1,9 @@
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="16dp"
android:height="16dp"
android:viewportWidth="24"
android:viewportHeight="24">
<path
android:pathData="M22.99,9C19.15,5.16 13.8,3.76 8.84,4.78l2.52,2.52c3.47,-0.17 6.99,1.05 9.63,3.7l2,-2zM18.99,13c-1.29,-1.29 -2.84,-2.13 -4.49,-2.56l3.53,3.53 0.96,-0.97zM2,3.05L5.07,6.1C3.6,6.82 2.22,7.78 1,9l2,2c1.02,-1.02 2.17,-1.78 3.38,-2.31L9.03,11.34c-1.14,0.4 -2.2,1.05 -3.04,1.95l2,2c0.73,-0.73 1.63,-1.19 2.58,-1.4l3.32,3.32L12.01,21l2,-2 -0.76,-0.76 4.78,4.78 1.41,-1.41L3.41,1.64 2,3.05z"
android:fillColor="#757575"/>
</vector>

View file

@ -232,21 +232,27 @@
</androidx.constraintlayout.widget.ConstraintLayout>
</com.google.android.material.card.MaterialCardView>
<TextView
<FrameLayout
android:id="@+id/main_banner_no_network"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="@string/main_banner_no_network_text"
android:textAlignment="center"
android:paddingTop="6dp"
android:paddingBottom="6dp"
android:background="?attr/colorSurfaceVariant"
android:textColor="?attr/colorOnSurfaceVariant"
android:textAppearance="@style/TextAppearance.AppCompat.Small"
android:visibility="gone"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintTop_toBottomOf="@id/main_banner_websocket_reconnect" />
app:layout_constraintTop_toBottomOf="@id/main_banner_websocket_reconnect">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center"
android:text="@string/main_banner_no_network_text"
android:paddingTop="6dp"
android:paddingBottom="6dp"
android:textColor="?attr/colorOnSurfaceVariant"
android:textAppearance="@style/TextAppearance.AppCompat.Small"
android:drawableStart="@drawable/ic_wifi_off_gray_24dp"
android:drawablePadding="4dp" />
</FrameLayout>
<androidx.swiperefreshlayout.widget.SwipeRefreshLayout
android:id="@+id/main_subscriptions_list_container"

View file

@ -474,5 +474,6 @@
<string name="connection_alert_title">Връзката е загубена</string>
<string name="connection_alert_text_one">От най-малко %2$d минути няма връзка с %1$s</string>
<string name="connection_alert_text_multiple">От най-малко %2$d минути няма връзка със сървърите на %1$d</string>
<string name="connection_alert_action_snooze">Отлагане с %1$dч</string>
<string name="connection_alert_action_never">Да не се показва повече</string>
</resources>

View file

@ -474,5 +474,6 @@
<string name="connection_alert_title">Verbindung verloren</string>
<string name="connection_alert_text_one">Es konnte länger als %2$d Minuten lang keine Verbindung zu %1$s hergestellt werden</string>
<string name="connection_alert_text_multiple">Es konnte länger als %2$d Minuten lang keine Verbindung zu %1$d Servern hergestellt werden</string>
<string name="connection_alert_action_snooze">%1$d Std. schlummern</string>
<string name="connection_alert_action_never">Niemals zeigen</string>
</resources>

View file

@ -413,7 +413,8 @@
<string name="connection_alert_title">Conexión perdida</string>
<string name="connection_alert_text_one">No se pudo conectar a %1$s por más de %2$d minutos</string>
<string name="connection_alert_text_multiple">No se pudo conectar a %1$d servidores por más de %2$d minutos</string>
<string name="connection_alert_action_snooze">Suspender %1$dh</string>
<string name="connection_alert_action_never">Nunca mostrar</string>
<string name="detail_no_search_results">Su búsqueda no tuvo ningún resultado</string>
<string name="detail_menu_search">Buscar notificaciones</string>
<string name="detail_menu_search_hint">Buscar en notificaciones</string>

View file

@ -464,5 +464,6 @@
<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_action_snooze">Tukasta %1$dt</string>
<string name="connection_alert_action_never">Ära näita iialgi</string>
</resources>

View file

@ -474,5 +474,6 @@
<string name="connection_alert_title">Connexion perdue</string>
<string name="connection_alert_text_one">Impossible de se connecter à %1$s depuis plus de %2$d minutes</string>
<string name="connection_alert_text_multiple">Impossible de se connecter à %1$d serveurs depuis plus de %2$d minutes</string>
<string name="connection_alert_action_snooze">Sourdine %1$dh</string>
<string name="connection_alert_action_never">Ne jamais montrer</string>
</resources>

View file

@ -474,4 +474,6 @@
<string name="connection_alert_title">接続が切断されました</string>
<string name="connection_alert_text_one">%2$d 分以上 %1$s に接続できませんでした</string>
<string name="connection_alert_text_multiple">%1$d 個のサーバーに %2$d 分以上接続できませんでした</string>
<string name="connection_alert_action_snooze">%1$d時間後に再通知</string>
<string name="connection_alert_action_never">再表示しない</string>
</resources>

View file

@ -378,7 +378,8 @@
<string name="connection_alert_title">Verbinding verbroken</string>
<string name="connection_alert_text_one">Kan geen verbinding maken met %1$s voor meer dan %2$d minuten</string>
<string name="connection_alert_text_multiple">Kan geen verbinding maken met %1$d servers voor meer dan %2$d minuten</string>
<string name="connection_alert_action_snooze">Sluimer voor %1$d uur</string>
<string name="connection_alert_action_never">Nooit laten zien</string>
<string name="publish_dialog_title">Publieer naar %1$s</string>
<string name="publish_dialog_uploading">Uploaden: %1$s (%2$s / %3$s)</string>
<string name="publish_dialog_upload_cancelled">Upload geannuleerd</string>

View file

@ -356,8 +356,7 @@
<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_action_dismiss">Dispensar</string>
<string name="connection_alert_action_snooze">Adiar 1h</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>
<string name="add_dialog_error_ssl_untrusted">Certificado do servidor não confiável</string>

View file

@ -474,5 +474,6 @@
<string name="connection_alert_title">连接丢失</string>
<string name="connection_alert_text_one">已无法连接到 %1$s 超过 %2$d 分钟</string>
<string name="connection_alert_text_multiple">已无法连接到 %1$d 台服务器超过 %2$d 分钟</string>
<string name="connection_alert_action_snooze">延后 %1$d 小时</string>
<string name="connection_alert_action_never">永不显示</string>
</resources>

View file

@ -474,5 +474,6 @@
<string name="connection_alert_title">連線已中斷</string>
<string name="connection_alert_text_one">超過 %2$d 分鐘無法連線至 %1$s</string>
<string name="connection_alert_text_multiple">超過 %2$d 分鐘無法連線至 %1$d 個伺服器</string>
<string name="connection_alert_action_snooze">延後 %1$d 小時</string>
<string name="connection_alert_action_never">永不顯示</string>
</resources>

View file

@ -52,8 +52,9 @@
<string name="connection_alert_title">Connection lost</string>
<string name="connection_alert_text_one">Unable to connect to %1$s for more than %2$d minutes. Check your network connection.</string>
<string name="connection_alert_text_multiple">Unable to connect to %1$d servers for more than %2$d minutes. Check your network connection.</string>
<!-- %1$d is the snooze duration in hours, currently set to 8 -->
<string name="connection_alert_action_snooze">Snooze %1$dh</string>
<string name="connection_alert_action_disable">Disable alerts</string>
<string name="connection_alert_action_never">Never show</string>
<!-- Common refresh toasts -->
<string name="refresh_message_result">%1$d notification(s) received</string>
@ -115,7 +116,7 @@
<string name="main_banner_websocket_reconnect_button_remind_later">Ask later</string>
<string name="main_banner_websocket_reconnect_button_dismiss">Dismiss</string>
<string name="main_banner_websocket_reconnect_button_enable_now">Grant now</string>
<string name="main_banner_no_network_text">No network</string>
<string name="main_banner_no_network_text">You\'re offline</string>
<!-- Add dialog -->
<string name="add_dialog_title">Subscribe to topic</string>
@ -371,19 +372,19 @@
<string name="settings_notifications_auto_delete_one_week">After one week</string>
<string name="settings_notifications_auto_delete_one_month">After one month</string>
<string name="settings_notifications_auto_delete_three_months">After 3 months</string>
<string name="settings_notifications_connection_alert_title">Alert when connection is lost</string>
<string name="settings_notifications_connection_alert_summary_never">Never alert when connection is lost</string>
<string name="settings_notifications_connection_alert_summary_five_minutes">Alert after 5 minutes without connection</string>
<string name="settings_notifications_connection_alert_summary_fifteen_minutes">Alert after 15 minutes without connection</string>
<string name="settings_notifications_connection_alert_summary_one_hour">Alert after 1 hour without connection</string>
<string name="settings_notifications_connection_alert_summary_three_hours">Alert after 3 hours without connection</string>
<string name="settings_notifications_connection_alert_summary_twelve_hours">Alert after 12 hours without connection</string>
<string name="settings_notifications_connection_alert_never">Never</string>
<string name="settings_notifications_connection_alert_five_minutes">After 5 minutes</string>
<string name="settings_notifications_connection_alert_fifteen_minutes">After 15 minutes</string>
<string name="settings_notifications_connection_alert_one_hour">After 1 hour</string>
<string name="settings_notifications_connection_alert_three_hours">After 3 hours</string>
<string name="settings_notifications_connection_alert_twelve_hours">After 12 hours</string>
<string name="settings_advanced_connection_alert_title">Connection lost alert</string>
<string name="settings_advanced_connection_alert_summary_never">Never alert when connection is lost</string>
<string name="settings_advanced_connection_alert_summary_five_minutes">Alert after 5 minutes without connection</string>
<string name="settings_advanced_connection_alert_summary_fifteen_minutes">Alert after 15 minutes without connection</string>
<string name="settings_advanced_connection_alert_summary_one_hour">Alert after 1 hour without connection</string>
<string name="settings_advanced_connection_alert_summary_three_hours">Alert after 3 hours without connection</string>
<string name="settings_advanced_connection_alert_summary_twelve_hours">Alert after 12 hours without connection</string>
<string name="settings_advanced_connection_alert_never">Never</string>
<string name="settings_advanced_connection_alert_five_minutes">After 5 minutes</string>
<string name="settings_advanced_connection_alert_fifteen_minutes">After 15 minutes</string>
<string name="settings_advanced_connection_alert_one_hour">After 1 hour</string>
<string name="settings_advanced_connection_alert_three_hours">After 3 hours</string>
<string name="settings_advanced_connection_alert_twelve_hours">After 12 hours</string>
<string name="settings_notifications_insistent_max_priority_title">Keep alerting for highest priority</string>
<string name="settings_notifications_insistent_max_priority_summary_enabled">Max priority notifications continuously alert until dismissed</string>
<string name="settings_notifications_insistent_max_priority_summary_disabled">Max priority notifications only alert once</string>

View file

@ -47,7 +47,7 @@
<string name="detail_settings_notifications_min_priority_key" translatable="false">SubscriptionMinPriority</string>
<string name="detail_settings_notifications_auto_delete_key" translatable="false">SubscriptionAutoDelete</string>
<string name="detail_settings_notifications_insistent_max_priority_key" translatable="false">SubscriptionInsistentMaxPriority</string>
<string name="settings_notifications_connection_alert_key" translatable="false">ConnectionAlert</string>
<string name="settings_advanced_connection_alert_key" translatable="false">ConnectionAlert</string>
<string name="detail_settings_appearance_header_key" translatable="false">SubscriptionAppearance</string>
<string name="detail_settings_appearance_icon_set_key" translatable="false">SubscriptionIconSet</string>
<string name="detail_settings_appearance_icon_remove_key" translatable="false">SubscriptionIconRemove</string>
@ -168,16 +168,16 @@
<item>1</item>
<item>0</item>
</string-array>
<string-array name="settings_notifications_connection_alert_entries">
<item>@string/settings_notifications_connection_alert_never</item>
<string-array name="settings_advanced_connection_alert_entries">
<item>@string/settings_advanced_connection_alert_never</item>
<item>After 30 seconds (testing)</item>
<item>@string/settings_notifications_connection_alert_five_minutes</item>
<item>@string/settings_notifications_connection_alert_fifteen_minutes</item>
<item>@string/settings_notifications_connection_alert_one_hour</item>
<item>@string/settings_notifications_connection_alert_three_hours</item>
<item>@string/settings_notifications_connection_alert_twelve_hours</item>
<item>@string/settings_advanced_connection_alert_five_minutes</item>
<item>@string/settings_advanced_connection_alert_fifteen_minutes</item>
<item>@string/settings_advanced_connection_alert_one_hour</item>
<item>@string/settings_advanced_connection_alert_three_hours</item>
<item>@string/settings_advanced_connection_alert_twelve_hours</item>
</string-array>
<string-array name="settings_notifications_connection_alert_values">
<string-array name="settings_advanced_connection_alert_values">
<item>0</item>
<item>30</item>
<item>300</item>

View file

@ -29,12 +29,6 @@
app:key="@string/settings_notifications_insistent_max_priority_key"
app:title="@string/settings_notifications_insistent_max_priority_title"
app:defaultValue="false"/>
<ListPreference
app:key="@string/settings_notifications_connection_alert_key"
app:title="@string/settings_notifications_connection_alert_title"
app:entries="@array/settings_notifications_connection_alert_entries"
app:entryValues="@array/settings_notifications_connection_alert_values"
app:defaultValue="0"/>
<Preference
app:key="@string/settings_notifications_channel_prefs_key"
app:title="@string/settings_notifications_channel_prefs_title"
@ -83,6 +77,12 @@
app:summary="@string/settings_backup_restore_restore_summary"/>
</PreferenceCategory>
<PreferenceCategory app:title="@string/settings_advanced_header">
<ListPreference
app:key="@string/settings_advanced_connection_alert_key"
app:title="@string/settings_advanced_connection_alert_title"
app:entries="@array/settings_advanced_connection_alert_entries"
app:entryValues="@array/settings_advanced_connection_alert_values"
app:defaultValue="0"/>
<ListPreference
app:key="@string/settings_advanced_connection_protocol_key"
app:title="@string/settings_advanced_connection_protocol_title"