Merge pull request #158 from binwiederhier/default-server-dialog

Default server dialog
This commit is contained in:
Philipp C. Heckel 2026-02-01 22:08:46 -05:00 committed by GitHub
commit 1e2476a2a1
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
38 changed files with 357 additions and 54 deletions

View file

@ -0,0 +1,163 @@
package io.heckel.ntfy.ui
import android.app.Dialog
import android.content.Context
import android.os.Bundle
import android.view.MenuItem
import android.view.ViewGroup
import android.view.inputmethod.InputMethodManager
import androidx.fragment.app.DialogFragment
import com.google.android.material.appbar.MaterialToolbar
import com.google.android.material.textfield.TextInputEditText
import com.google.android.material.textfield.TextInputLayout
import io.heckel.ntfy.R
import io.heckel.ntfy.util.AfterChangedTextWatcher
import io.heckel.ntfy.util.normalizeBaseUrl
import io.heckel.ntfy.util.validBaseUrl
class DefaultServerFragment : DialogFragment() {
private var currentUrl: String? = null
private lateinit var listener: DefaultServerDialogListener
private lateinit var toolbar: MaterialToolbar
private lateinit var saveMenuItem: MenuItem
private lateinit var resetMenuItem: MenuItem
private lateinit var urlViewLayout: TextInputLayout
private lateinit var urlView: TextInputEditText
interface DefaultServerDialogListener {
fun onDefaultServerUpdated(dialog: DialogFragment, url: String)
}
override fun onAttach(context: Context) {
super.onAttach(context)
listener = activity as DefaultServerDialogListener
}
override fun onCreateDialog(savedInstanceState: Bundle?): Dialog {
if (activity == null) {
throw IllegalStateException("Activity cannot be null")
}
// Get current URL from arguments
currentUrl = arguments?.getString(BUNDLE_CURRENT_URL)
// Build root view
val view = requireActivity().layoutInflater.inflate(R.layout.fragment_default_server_dialog, null)
// Setup toolbar
toolbar = view.findViewById(R.id.default_server_dialog_toolbar)
toolbar.setNavigationOnClickListener {
dismiss()
}
toolbar.setOnMenuItemClickListener { menuItem ->
when (menuItem.itemId) {
R.id.default_server_dialog_action_save -> {
saveClicked()
true
}
R.id.default_server_dialog_action_reset -> {
resetClicked()
true
}
else -> false
}
}
saveMenuItem = toolbar.menu.findItem(R.id.default_server_dialog_action_save)
resetMenuItem = toolbar.menu.findItem(R.id.default_server_dialog_action_reset)
// Setup views
urlViewLayout = view.findViewById(R.id.default_server_dialog_url_layout)
urlView = view.findViewById(R.id.default_server_dialog_url)
// Set current URL
urlView.setText(currentUrl ?: "")
// Show reset option if there's a current URL
resetMenuItem.isVisible = !currentUrl.isNullOrEmpty()
// Validate input when typing
urlView.addTextChangedListener(AfterChangedTextWatcher {
validateInput()
})
// Build dialog
val dialog = Dialog(requireContext(), R.style.Theme_App_FullScreenDialog)
dialog.setContentView(view)
// Initial validation
validateInput()
return dialog
}
override fun onStart() {
super.onStart()
dialog?.window?.apply {
setLayout(
ViewGroup.LayoutParams.MATCH_PARENT,
ViewGroup.LayoutParams.MATCH_PARENT
)
}
}
override fun onResume() {
super.onResume()
// Show keyboard after the dialog is fully visible
urlView.postDelayed({
urlView.requestFocus()
urlView.text?.let { text ->
urlView.setSelection(text.length)
}
val imm = requireContext().getSystemService(Context.INPUT_METHOD_SERVICE) as? InputMethodManager
imm?.showSoftInput(urlView, InputMethodManager.SHOW_IMPLICIT)
}, 200)
}
private fun saveClicked() {
if (!this::listener.isInitialized) return
val url = urlView.text?.toString() ?: ""
val normalizedUrl = if (url.isEmpty()) "" else normalizeBaseUrl(url)
listener.onDefaultServerUpdated(this, normalizedUrl)
dismiss()
}
private fun resetClicked() {
if (!this::listener.isInitialized) return
listener.onDefaultServerUpdated(this, "")
dismiss()
}
private fun validateInput() {
if (!this::saveMenuItem.isInitialized) return
val url = urlView.text?.toString() ?: ""
// Clear previous errors
urlViewLayout.error = null
if (url.isEmpty()) {
// Empty is allowed (means use default)
saveMenuItem.isEnabled = true
} else if (!validBaseUrl(url)) {
// Show error for invalid URL
urlViewLayout.error = getString(R.string.default_server_dialog_url_error_invalid)
saveMenuItem.isEnabled = false
} else {
saveMenuItem.isEnabled = true
}
}
companion object {
const val TAG = "NtfyDefaultServerFragment"
private const val BUNDLE_CURRENT_URL = "currentUrl"
fun newInstance(currentUrl: String?): DefaultServerFragment {
val fragment = DefaultServerFragment()
val args = Bundle()
args.putString(BUNDLE_CURRENT_URL, currentUrl ?: "")
fragment.arguments = args
return fragment
}
}
}

View file

@ -51,7 +51,8 @@ import java.util.concurrent.TimeUnit
* https://github.com/googlearchive/android-preferences/blob/master/app/src/main/java/com/example/androidx/preference/sample/MainActivity.kt
*/
class SettingsActivity : AppCompatActivity(), PreferenceFragmentCompat.OnPreferenceStartFragmentCallback,
UserFragment.UserDialogListener, CustomHeaderFragment.CustomHeaderDialogListener {
UserFragment.UserDialogListener, CustomHeaderFragment.CustomHeaderDialogListener,
DefaultServerFragment.DefaultServerDialogListener {
private lateinit var settingsFragment: SettingsFragment
private lateinit var userSettingsFragment: UserSettingsFragment
private lateinit var customHeaderSettingsFragment: CustomHeaderSettingsFragment
@ -483,31 +484,22 @@ class SettingsActivity : AppCompatActivity(), PreferenceFragmentCompat.OnPrefere
// Default Base URL
val appBaseUrl = getString(R.string.app_base_url)
val defaultBaseUrlPrefId = context?.getString(R.string.settings_general_default_base_url_key) ?: return
val defaultBaseUrl: EditTextPreference? = findPreference(defaultBaseUrlPrefId)
defaultBaseUrl?.text = repository.getDefaultBaseUrl() ?: ""
defaultBaseUrl?.extras?.putString("message", getString(R.string.settings_general_default_base_url_message))
defaultBaseUrl?.extras?.putString("hint", getString(R.string.app_base_url))
defaultBaseUrl?.preferenceDataStore = object : PreferenceDataStore() {
override fun putString(key: String, value: String?) {
val baseUrl = value ?: return
repository.setDefaultBaseUrl(baseUrl)
}
override fun getString(key: String, defValue: String?): String? {
return repository.getDefaultBaseUrl()
val defaultBaseUrl: Preference? = findPreference(defaultBaseUrlPrefId)
defaultBaseUrl?.preferenceDataStore = object : PreferenceDataStore() { } // Dummy store to protect from accidentally overwriting
defaultBaseUrl?.onPreferenceClickListener = OnPreferenceClickListener {
activity?.let { activity ->
DefaultServerFragment
.newInstance(repository.getDefaultBaseUrl())
.show(activity.supportFragmentManager, DefaultServerFragment.TAG)
}
true
}
defaultBaseUrl?.setOnBindEditTextListener { editText ->
editText.addTextChangedListener(AfterChangedTextWatcher {
val okayButton: Button = editText.rootView.findViewById(android.R.id.button1)
val value = editText.text.toString()
okayButton.isEnabled = value.isEmpty() || validUrl(value)
})
}
defaultBaseUrl?.summaryProvider = Preference.SummaryProvider<EditTextPreference> { pref ->
if (TextUtils.isEmpty(pref.text)) {
defaultBaseUrl?.summaryProvider = Preference.SummaryProvider<Preference> { _ ->
val currentUrl = repository.getDefaultBaseUrl()
if (currentUrl.isNullOrEmpty()) {
getString(R.string.settings_general_default_base_url_default_summary, appBaseUrl)
} else {
pref.text
currentUrl
}
}
@ -736,6 +728,21 @@ class SettingsActivity : AppCompatActivity(), PreferenceFragmentCompat.OnPrefere
repository.setAutoDownloadMaxSize(autoDownloadSelectionCopy)
}
fun refreshDefaultServerSummary() {
val appBaseUrl = getString(R.string.app_base_url)
val defaultBaseUrlPrefId = context?.getString(R.string.settings_general_default_base_url_key) ?: return
val defaultBaseUrl: Preference? = findPreference(defaultBaseUrlPrefId)
// Re-set the summary provider to trigger a refresh
defaultBaseUrl?.summaryProvider = Preference.SummaryProvider<Preference> { _ ->
val currentUrl = repository.getDefaultBaseUrl()
if (currentUrl.isNullOrEmpty()) {
getString(R.string.settings_general_default_base_url_default_summary, appBaseUrl)
} else {
currentUrl
}
}
}
private fun copyLogsToClipboard(scrub: Boolean) {
lifecycleScope.launch(Dispatchers.IO) {
val context = context ?: return@launch
@ -1091,6 +1098,13 @@ class SettingsActivity : AppCompatActivity(), PreferenceFragmentCompat.OnPrefere
}
}
override fun onDefaultServerUpdated(dialog: DialogFragment, url: String) {
repository.setDefaultBaseUrl(url)
if (this::settingsFragment.isInitialized) {
settingsFragment.refreshDefaultServerSummary()
}
}
private fun setAutoDownload() {
if (!this::settingsFragment.isInitialized) return
settingsFragment.setAutoDownload()

View file

@ -106,6 +106,29 @@ fun validUrl(url: String): Boolean {
return "^https?://\\S+".toRegex().matches(url)
}
/**
* Validates that a URL is a valid base URL for ntfy servers.
* Only allows URLs that:
* - Start with http:// or https://
* - Do NOT have any path fragment (e.g., "https://ntfy.example.com" is allowed,
* but "https://ntfy.example.com/subpath" is not)
*/
fun validBaseUrl(url: String): Boolean {
if (!url.startsWith("http://") && !url.startsWith("https://")) {
return false
}
val httpUrl = url.toHttpUrlOrNull() ?: return false
val hasPath = httpUrl.pathSegments.any { it.isNotEmpty() } // No path (pathSegments will be [""] for "https://example.com/")
return !hasPath
}
/**
* Normalizes a base URL by removing the trailing slash if present.
*/
fun normalizeBaseUrl(url: String): String {
return url.trimEnd('/')
}
fun formatDateShort(timestampSecs: Long): String {
val date = Date(timestampSecs*1000)
return DateFormat.getDateTimeInstance(DateFormat.SHORT, DateFormat.SHORT).format(date)

View file

@ -0,0 +1,81 @@
<?xml version="1.0" encoding="utf-8"?>
<androidx.coordinatorlayout.widget.CoordinatorLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="?attr/colorSurface"
android:fitsSystemWindows="true">
<com.google.android.material.appbar.AppBarLayout
android:id="@+id/default_server_dialog_app_bar"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="?attr/colorSurface"
app:elevation="0dp"
app:liftOnScroll="false">
<com.google.android.material.appbar.MaterialToolbar
android:id="@+id/default_server_dialog_toolbar"
android:layout_width="match_parent"
android:layout_height="?attr/actionBarSize"
android:background="?attr/colorSurface"
android:paddingStart="0dp"
android:paddingEnd="12dp"
app:navigationIcon="@drawable/ic_close_white_24dp"
app:navigationIconTint="?attr/colorOnSurface"
app:title="@string/settings_general_default_base_url_title"
app:titleTextColor="?attr/colorOnSurface"
app:menu="@menu/menu_default_server_dialog" />
</com.google.android.material.appbar.AppBarLayout>
<ScrollView
android:layout_width="match_parent"
android:layout_height="match_parent"
android:paddingHorizontal="?dialogPreferredPadding"
app:layout_behavior="@string/appbar_scrolling_view_behavior">
<androidx.constraintlayout.widget.ConstraintLayout
android:layout_width="match_parent"
android:layout_height="wrap_content">
<TextView
android:id="@+id/default_server_dialog_description"
android:text="@string/default_server_dialog_description"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:paddingStart="4dp"
android:paddingEnd="4dp"
android:paddingTop="16dp"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintTop_toTopOf="parent"/>
<com.google.android.material.textfield.TextInputLayout
android:id="@+id/default_server_dialog_url_layout"
android:layout_width="match_parent"
android:layout_height="wrap_content"
app:layout_constraintTop_toBottomOf="@id/default_server_dialog_description"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintEnd_toEndOf="parent"
android:layout_marginTop="10dp"
app:errorEnabled="true">
<com.google.android.material.textfield.TextInputEditText
android:id="@+id/default_server_dialog_url"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:hint="@string/common_service_url"
android:importantForAutofill="no"
android:maxLines="1"
android:inputType="textUri"
app:placeholderText="@string/common_service_url_placeholder"/>
</com.google.android.material.textfield.TextInputLayout>
</androidx.constraintlayout.widget.ConstraintLayout>
</ScrollView>
</androidx.coordinatorlayout.widget.CoordinatorLayout>

View file

@ -0,0 +1,14 @@
<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto">
<item
android:id="@+id/default_server_dialog_action_save"
android:title="@string/common_button_save"
android:enabled="false"
app:showAsAction="always" />
<item
android:id="@+id/default_server_dialog_action_reset"
android:title="@string/common_button_reset_to_default"
android:visible="false"
app:showAsAction="never" />
</menu>

View file

@ -65,7 +65,7 @@
<string name="main_how_to_intro">Докоснете бутона с +, за да създадете тема или да се абонирате. След това ще получавате известия на устройството си, след като изпратите съобщения чрез метода PUT или POST.</string>
<string name="detail_how_to_intro">За да изпратите известия в тази тема направете заявка чрез методите PUT или POST към адреса й.</string>
<string name="detail_no_notifications_text">Липсват известия в темата</string>
<string name="settings_general_default_base_url_message">За да използвате по подразбиране собствен сървър при абониране за нови теми и/или споделяне на теми, въведете адрес на сървъра.</string>
<string name="default_server_dialog_description">За да използвате по подразбиране собствен сървър при абониране за нови теми и/или споделяне на теми, въведете адрес на сървъра.</string>
<string name="notification_dialog_muted_until_toast_message">Известията са заглушени до %1$s</string>
<string name="settings_advanced_export_logs_summary">Дневниците се копират в междинната памет или се изпращат към nopaste.net (собственост на автора на ntfy). Имената на хостовете и темите могат да бъдат цензурирани, но съдържанието на известията никога.</string>
<string name="main_menu_report_bug_title">Доклад за дефект</string>

View file

@ -194,7 +194,7 @@
<string name="settings_notifications_insistent_max_priority_summary_enabled">Alertar contínuament de les notificacions de prioritat màxima fins que es descartin</string>
<string name="settings_notifications_insistent_max_priority_summary_disabled">Alertar un sol cop per notificacions de prioritat màxima</string>
<string name="settings_general_default_base_url_title">Servidor predeterminat</string>
<string name="settings_general_default_base_url_message">Introdueix la URL base del teu servidor per usar-lo com a predeterminat a l\'hora de subscriure\'t a nous temes o compartir a temes.</string>
<string name="default_server_dialog_description">Introdueix la URL base del teu servidor per usar-lo com a predeterminat a l\'hora de subscriure\'t a nous temes o compartir a temes.</string>
<string name="settings_general_default_base_url_default_summary">%1$s (predeterminat)</string>
<string name="settings_general_users_title">Gestionar usuaris</string>
<string name="settings_general_users_prefs_user_add">Afegir usuaris</string>

View file

@ -171,7 +171,7 @@
<string name="settings_general_header">Obecné</string>
<string name="settings_appearance_header">Vzhled</string>
<string name="settings_general_default_base_url_title">Výchozí server</string>
<string name="settings_general_default_base_url_message">Zadejte kořenovou adresu URL svého serveru, jako výchozí při přihlašování k odběru nových témat nebo sdílení témat.</string>
<string name="default_server_dialog_description">Zadejte kořenovou adresu URL svého serveru, jako výchozí při přihlašování k odběru nových témat nebo sdílení témat.</string>
<string name="settings_general_users_prefs_user_add">Přidat uživatele</string>
<string name="settings_general_users_prefs_user_add_summary">Vytvořit nového uživatele pro nový server</string>
<string name="settings_general_dark_mode_title">Tmavý režim</string>

View file

@ -163,7 +163,7 @@
<string name="settings_general_header">Allgemein</string>
<string name="settings_appearance_header">Darstellung</string>
<string name="settings_general_default_base_url_title">Standard-Server</string>
<string name="settings_general_default_base_url_message">Gib hier die Basis-URL Deines Servers ein, um diesen als Standard beim Abonnieren neuer Themen und/oder beim Teilen zu verwenden.</string>
<string name="default_server_dialog_description">Gib hier die Basis-URL Deines Servers ein, um diesen als Standard beim Abonnieren neuer Themen und/oder beim Teilen zu verwenden.</string>
<string name="settings_general_default_base_url_default_summary">%1$s (Standard)</string>
<string name="settings_general_users_title">Benutzer verwalten</string>
<string name="settings_general_users_summary">Benutzer für geschützte Themen hinzufügen/löschen</string>

View file

@ -249,7 +249,7 @@
<string name="detail_menu_notifications_disabled_forever">Notificaciones silenciadas</string>
<string name="notification_dialog_2h">2 horas</string>
<string name="settings_general_dark_mode_summary_dark">Modo oscuro activado. ¿Eres un vampiro\?</string>
<string name="settings_general_default_base_url_message">Introduzca la URL base de su servidor para utilizarlo como predeterminado cuando se suscriba a nuevos tópicos y/o se comparta a ellos.</string>
<string name="default_server_dialog_description">Introduzca la URL base de su servidor para utilizarlo como predeterminado cuando se suscriba a nuevos tópicos y/o se comparta a ellos.</string>
<string name="share_suggested_topics">Tópicos sugeridos</string>
<string name="detail_action_mode_delete_dialog_cancel">Cancelar</string>
<string name="share_title">Compartir</string>

View file

@ -235,7 +235,7 @@
<string name="settings_general_header">Üldised seadistused</string>
<string name="settings_appearance_header">Välimus</string>
<string name="settings_general_default_base_url_title">Vaikimisi server</string>
<string name="settings_general_default_base_url_message">Kui soovid uute teemade tellimiseks ja/või neisse jagamiseks vaikimisi kasutada oma serverit, siis sisesta teenuse juurkausta veebiaadress.</string>
<string name="default_server_dialog_description">Kui soovid uute teemade tellimiseks ja/või neisse jagamiseks vaikimisi kasutada oma serverit, siis sisesta teenuse juurkausta veebiaadress.</string>
<string name="settings_general_default_base_url_default_summary">%1$s (vaikimisi)</string>
<string name="main_banner_websocket_reconnect_button_remind_later">Küsi hiljem</string>
<string name="main_banner_websocket_reconnect_button_dismiss">Loobu</string>

View file

@ -223,7 +223,7 @@
<string name="settings_notifications_muted_until_x">Ilmoitukset mykistetty, %1$s saakka</string>
<string name="main_banner_battery_text">Akun optimoinnin tulee olla pois päältä ilmoitusten toimitusongelmien välttämiseksi.</string>
<string name="settings_advanced_unifiedpush_title">Ota käyttöön UnifiedPush</string>
<string name="settings_general_default_base_url_message">Anna palvelimesi juurikansio URL, jotta voit käyttää omaa palvelintasi oletuksena uusien topikkien tilaamisessa ja/tai aiheiden jakamisessa.</string>
<string name="default_server_dialog_description">Anna palvelimesi juurikansio URL, jotta voit käyttää omaa palvelintasi oletuksena uusien topikkien tilaamisessa ja/tai aiheiden jakamisessa.</string>
<string name="user_dialog_password_hint_edit">Salasana (ei voi muuttaa, jos jätetään tyhjäksi)</string>
<string name="settings_advanced_record_logs_summary_disabled">Ota logaus käyttöön, jotta voit jakaa lokit myöhemmin diagnosoidaksesi ongelmia.</string>
<string name="main_action_mode_delete_dialog_message">Lopetetaanko valittujen aiheiden tilaus ja poistetaanko kaikki ilmoitukset pysyvästi \?</string>

View file

@ -261,7 +261,7 @@
<string name="settings_advanced_clear_logs_deleted_toast">Journaux supprimés</string>
<string name="settings_notifications_min_priority_summary_x_or_higher">Affiche les notifications si la priorité est %1$d (%2$s) ou supérieure</string>
<string name="settings_notifications_auto_delete_never">Jamais</string>
<string name="settings_general_default_base_url_message">Entrez l\'URL racine de votre serveur pour l\'utiliser par défaut lors de l\'abonnement à de nouveaux sujets et/ou lors du partage.</string>
<string name="default_server_dialog_description">Entrez l\'URL racine de votre serveur pour l\'utiliser par défaut lors de l\'abonnement à de nouveaux sujets et/ou lors du partage.</string>
<string name="settings_notifications_min_priority_summary_max">Affiche les notifications si la priorité est 5 (max)</string>
<string name="settings_notifications_priority_min">min</string>
<string name="settings_general_users_prefs_title">Utilisateurs</string>

View file

@ -259,7 +259,7 @@
<string name="settings_notifications_auto_delete_one_month">Após un mes</string>
<string name="settings_notifications_auto_delete_three_months">Após 3 meses</string>
<string name="settings_notifications_insistent_max_priority_title">Manter as alertas da prioridade máis alta</string>
<string name="settings_general_default_base_url_message">Escribe o enderezo URL raíz do teu servidor para usar o servidor propio por defecto cando te subscribas a novos temas e/ou compartas os temas.</string>
<string name="default_server_dialog_description">Escribe o enderezo URL raíz do teu servidor para usar o servidor propio por defecto cando te subscribas a novos temas e/ou compartas os temas.</string>
<string name="settings_general_users_prefs_user_used_by_many">Usado polos temas %1$s</string>
<string name="settings_advanced_broadcast_summary_enabled">As app poden recibir notificacións entrantes como difusións</string>
<string name="settings_advanced_broadcast_summary_disabled">As app non poden recibir notificacións entrantes como difusións</string>

View file

@ -156,7 +156,7 @@
<string name="settings_general_header">Umum</string>
<string name="settings_appearance_header">Tampilan</string>
<string name="settings_general_default_base_url_title">Server bawaan</string>
<string name="settings_general_default_base_url_message">Masukkan URL akar server Anda untuk menggunakan server Anda sendiri untuk bawaan ketika berlangganan ke topik baru dan/atau membagikan ke topik.</string>
<string name="default_server_dialog_description">Masukkan URL akar server Anda untuk menggunakan server Anda sendiri untuk bawaan ketika berlangganan ke topik baru dan/atau membagikan ke topik.</string>
<string name="settings_general_default_base_url_default_summary">%1$s (bawaan)</string>
<string name="settings_general_users_title">Kelola pengguna</string>
<string name="settings_general_users_summary">Tambahkan/hapus pengguna untuk topik yang dilindungi</string>

View file

@ -249,7 +249,7 @@
<string name="notification_dialog_8h">8 ore</string>
<string name="settings_backup_restore_backup_entry_everything_no_users">Tutto, eccetto utenti</string>
<string name="settings_advanced_header">Avanzate</string>
<string name="settings_general_default_base_url_message">Inserisci l\'URL radice del tuo server per utilizzare il tuo server come predefinito quando ti iscrivi a nuovi argomenti e/o condividi argomenti.</string>
<string name="default_server_dialog_description">Inserisci l\'URL radice del tuo server per utilizzare il tuo server come predefinito quando ti iscrivi a nuovi argomenti e/o condividi argomenti.</string>
<string name="settings_general_users_prefs_user_used_by_many">Utilizzato dagli argomenti %1$s</string>
<string name="settings_general_users_prefs_user_add">Aggiungi utente</string>
<string name="settings_general_dark_mode_entry_dark">Modalità scura</string>

View file

@ -311,7 +311,7 @@
<string name="detail_settings_notifications_instant_summary_off">התראות נמסרות דרך Firebase. המסירה עלולה להתעכב אך צריכת הסוללה תפחת.</string>
<string name="detail_instant_delivery_enabled">מסירה מיידית פעילה</string>
<string name="detail_instant_delivery_disabled">מסירה מיידית כבויה</string>
<string name="settings_general_default_base_url_message">נא למלא את כתובת היסוד של השרת שלך כדי להשתמש בשרת משלך כברירת מחדל להרשמה לנושאים חדשים ו/או לשיתוף לנושאים.</string>
<string name="default_server_dialog_description">נא למלא את כתובת היסוד של השרת שלך כדי להשתמש בשרת משלך כברירת מחדל להרשמה לנושאים חדשים ו/או לשיתוף לנושאים.</string>
<string name="detail_menu_enable_instant">הפעלת מסירה מיידית</string>
<string name="detail_menu_disable_instant">כיבוי מסירה מיידית</string>
<string name="settings_advanced_record_logs_summary_enabled">מתבצע תיעוד (עד 10,000 רשומות) למכשיר…</string>

View file

@ -223,7 +223,7 @@
\nパスワードはスクラブされましたが、ここには列挙されていません。</string>
<string name="add_dialog_use_another_server">他のサーバーを使用</string>
<string name="settings_general_users_title">ユーザー管理</string>
<string name="settings_general_default_base_url_message">新しいトピックを購読または共有する時にデフォルトで自分のサーバーを使用する場合、サーバーのルートURLを入力してください。</string>
<string name="default_server_dialog_description">新しいトピックを購読または共有する時にデフォルトで自分のサーバーを使用する場合、サーバーのルートURLを入力してください。</string>
<string name="add_dialog_use_another_server_description">他のサーバーのトピックを購読するには下欄にURLを入力してください。</string>
<string name="settings_general_users_summary">保護トピックのユーザーを追加/削除する</string>
<string name="settings_general_users_prefs_title">ユーザー</string>

View file

@ -268,7 +268,7 @@
<string name="settings_general_users_prefs_user_not_used">어떤 주제에서도 사용되지 않음</string>
<string name="settings_general_users_prefs_user_add_title">새 사용자 추가</string>
<string name="settings_backup_restore_backup_entry_everything_no_users">사용자 제외 모두</string>
<string name="settings_general_default_base_url_message">새 주제를 구독하거나 공유할 때 사용할 서버의 루트 URL을 입력하십시오.</string>
<string name="default_server_dialog_description">새 주제를 구독하거나 공유할 때 사용할 서버의 루트 URL을 입력하십시오.</string>
<string name="settings_general_users_title">사용자 관리</string>
<string name="settings_general_users_prefs_user_add">사용자 추가</string>
<string name="settings_general_users_prefs_user_add_summary">새 서버를 위한 사용자 추가</string>

View file

@ -161,7 +161,7 @@
<string name="settings_general_dark_mode_entry_dark">Mørk drakt</string>
<string name="settings_backup_restore_header">Sikkerhetskopiering og gjenoppretting</string>
<string name="settings_notifications_auto_delete_summary_one_day">Slett merknader automatisk etter én dag</string>
<string name="settings_general_default_base_url_message">Skriv inn serverens rot-URL for å bruke din egen server som standard når du abonnerer på nye emner og/eller deler til emner.</string>
<string name="default_server_dialog_description">Skriv inn serverens rot-URL for å bruke din egen server som standard når du abonnerer på nye emner og/eller deler til emner.</string>
<string name="settings_backup_restore_restore_title">Gjenopprett fra fil</string>
<string name="settings_advanced_header">Avansert</string>
<string name="settings_advanced_export_logs_entry_copy_scrubbed">Kopier til utklippstavlen (sensurert)</string>

View file

@ -252,7 +252,7 @@
<string name="settings_notifications_priority_min">min</string>
<string name="settings_notifications_priority_low">laag</string>
<string name="settings_notifications_auto_download_100k">Als kleiner dan 100 kB</string>
<string name="settings_general_default_base_url_message">Voer de root URL in van je eigen server om deze standaard te gebruiken bij abonneren op nieuwe onderwerpen en/of delen in onderwerpen.</string>
<string name="default_server_dialog_description">Voer de root URL in van je eigen server om deze standaard te gebruiken bij abonneren op nieuwe onderwerpen en/of delen in onderwerpen.</string>
<string name="detail_settings_appearance_icon_error_saving">Kan icoon: %1$s niet bewaren</string>
<string name="settings_general_users_prefs_user_used_by_many">Gebruikt in onderwerpen %1$s</string>
<string name="settings_general_users_prefs_user_not_used">In geen enkel onderwerp in gebruik</string>

View file

@ -300,7 +300,7 @@
<string name="settings_advanced_export_logs_copied_logs">Logi skopiowane do schowka</string>
<string name="settings_advanced_export_logs_uploading">Przesyłanie logów …</string>
<string name="settings_advanced_export_logs_copied_url">Logi przesłane i URL skopiowane</string>
<string name="settings_general_default_base_url_message">Wpisz tutaj główny adres URL swojego serwera, aby używać go jako domyślnego podczas subskrybowania nowych tematów i/lub udostępniania.</string>
<string name="default_server_dialog_description">Wpisz tutaj główny adres URL swojego serwera, aby używać go jako domyślnego podczas subskrybowania nowych tematów i/lub udostępniania.</string>
<string name="user_dialog_title_add">Dodaj użytkownika</string>
<string name="settings_advanced_export_logs_scrub_dialog_empty">Żadne tematy/nazwy hostów nie zostały zredagowane. Może nie masz żadnych subskrypcji\?</string>
<string name="settings_advanced_export_logs_scrub_dialog_button_ok">OK</string>

View file

@ -276,7 +276,7 @@
<string name="settings_notifications_auto_delete_summary_three_months">Apagar notificações automaticamente após 3 meses</string>
<string name="settings_notifications_auto_delete_summary_one_month">Apagar notificações automaticamente após um mês</string>
<string name="user_dialog_password_hint_add">Senha</string>
<string name="settings_general_default_base_url_message">Digite a URL raiz do seu servidor para usar seu próprio servidor como padrão ao inscrever-se em novos tópicos e/ou compartilhar aos tópicos.</string>
<string name="default_server_dialog_description">Digite a URL raiz do seu servidor para usar seu próprio servidor como padrão ao inscrever-se em novos tópicos e/ou compartilhar aos tópicos.</string>
<string name="settings_general_users_prefs_user_not_used">Não usado por nenhum tópico</string>
<string name="settings_backup_restore_restore_successful">Restauração bem-sucedida</string>
<string name="settings_general_dark_mode_summary_system">Usando o padrão do sistema</string>

View file

@ -181,7 +181,7 @@
<string name="settings_general_header">Geral</string>
<string name="settings_appearance_header">Aparência</string>
<string name="settings_general_default_base_url_title">Servidor padrão</string>
<string name="settings_general_default_base_url_message">Insira o URL raíz do servidor para utilizar seu próprio como padrão ao subscrever novos tópicos e/ou partilhar em tópicos.</string>
<string name="default_server_dialog_description">Insira o URL raíz do servidor para utilizar seu próprio como padrão ao subscrever novos tópicos e/ou partilhar em tópicos.</string>
<string name="settings_general_default_base_url_default_summary">%1$s (padrão)</string>
<string name="settings_general_users_title">Gerir utilizadores</string>
<string name="settings_general_users_summary">Adicionar/remover utilizadores em tópicos protegidos</string>

View file

@ -61,7 +61,7 @@
<string name="settings_general_header">General</string>
<string name="settings_appearance_header">Aparență</string>
<string name="settings_general_default_base_url_title">Server implicit</string>
<string name="settings_general_default_base_url_message">Introduceți URL-ul rădăcinii a serverului dvs. pentru utilizarea implicită atunci când vă abonați la topice noi și/sau când partajați în topice.</string>
<string name="default_server_dialog_description">Introduceți URL-ul rădăcinii a serverului dvs. pentru utilizarea implicită atunci când vă abonați la topice noi și/sau când partajați în topice.</string>
<string name="settings_general_default_base_url_default_summary">%1$s (implicit)</string>
<string name="settings_general_users_prefs_user_add">Adaugă utilizatori</string>
<string name="settings_general_users_prefs_user_add_summary">Crează un utilizator nou pentru un server nou</string>

View file

@ -232,7 +232,7 @@
<string name="settings_advanced_export_logs_entry_copy_original">Скопировать в буфер обмена</string>
<string name="user_dialog_username_hint">Имя пользователя</string>
<string name="common_button_save">Сохранить</string>
<string name="settings_general_default_base_url_message">Введите базовый URL вашего сервера, чтобы использовать его по умолчанию при подписке на новые темы и/или публикацию в темы.</string>
<string name="default_server_dialog_description">Введите базовый URL вашего сервера, чтобы использовать его по умолчанию при подписке на новые темы и/или публикацию в темы.</string>
<string name="settings_general_users_title">Управление пользователями</string>
<string name="settings_general_users_summary">Добавить/удалить пользователей из защищённых тем</string>
<string name="settings_general_users_prefs_title">Пользователи</string>

View file

@ -168,7 +168,7 @@
<string name="settings_notifications_insistent_max_priority_summary_disabled">Oznámenia s maximálnou prioritou upozornia len raz</string>
<string name="settings_general_header">Všeobecné</string>
<string name="settings_appearance_header">Vzhľad</string>
<string name="settings_general_default_base_url_message">Zadajte koreňovú URL adresu vášho servera, aby ste použili svoj vlastný server ako predvolený pri prihlásení na odber nových tém alebo zdieľaní tém.</string>
<string name="default_server_dialog_description">Zadajte koreňovú URL adresu vášho servera, aby ste použili svoj vlastný server ako predvolený pri prihlásení na odber nových tém alebo zdieľaní tém.</string>
<string name="settings_general_default_base_url_default_summary">%1$s (predvolené)</string>
<string name="settings_general_users_title">Správa používateľov</string>
<string name="settings_general_users_summary">Pridávanie/odstraňovanie používateľov pre chránené témy</string>

View file

@ -227,7 +227,7 @@
<string name="settings_notifications_auto_delete_three_days">Efter 3 dagar</string>
<string name="settings_general_users_summary">Lägg till/ta bort användare för privata ämnen</string>
<string name="settings_general_users_prefs_title">Användare</string>
<string name="settings_general_default_base_url_message">Ange din servers rot-URL för att använda din egen server som standard när du prenumererar på nya ämnen och/eller delar ämnen.</string>
<string name="default_server_dialog_description">Ange din servers rot-URL för att använda din egen server som standard när du prenumererar på nya ämnen och/eller delar ämnen.</string>
<string name="settings_general_default_base_url_default_summary">%1$s (standard)</string>
<string name="settings_general_users_title">Hantera användare</string>
<string name="settings_general_users_prefs_user_used_by_one">Används i ämne %1$s</string>

View file

@ -276,7 +276,7 @@
<string name="settings_general_users_prefs_user_used_by_many">%1$s தலைப்புகளால் பயன்படுத்தப்படுகிறது</string>
<string name="settings_general_users_prefs_user_add">பயனர்களைச் சேர்க்கவும்</string>
<string name="settings_general_default_base_url_title">இயல்புநிலை சேவையகம்</string>
<string name="settings_general_default_base_url_message">புதிய தலைப்புகளுக்கு குழுசேரும்போது மற்றும்/அல்லது தலைப்புகளுக்கு பகிர்வதற்கு உங்கள் சொந்த சேவையகத்தை இயல்புநிலையாகப் பயன்படுத்த உங்கள் சேவையகத்தின் ரூட் முகவரி ஐ உள்ளிடவும்.</string>
<string name="default_server_dialog_description">புதிய தலைப்புகளுக்கு குழுசேரும்போது மற்றும்/அல்லது தலைப்புகளுக்கு பகிர்வதற்கு உங்கள் சொந்த சேவையகத்தை இயல்புநிலையாகப் பயன்படுத்த உங்கள் சேவையகத்தின் ரூட் முகவரி ஐ உள்ளிடவும்.</string>
<string name="settings_general_users_prefs_user_add_summary">புதிய சேவையகத்திற்கு புதிய பயனரை உருவாக்கவும்</string>
<string name="settings_general_dark_mode_summary_system">கணினி இயல்புநிலையைப் பயன்படுத்துதல்</string>
<string name="settings_general_dark_mode_entry_system">கணினி இயல்புநிலையைப் பயன்படுத்தவும்</string>

View file

@ -256,7 +256,7 @@
<string name="settings_general_users_prefs_user_used_by_many">%1$s konu tarafından kullanılıyor</string>
<string name="settings_notifications_auto_download_500k">500 kB\'ın altındaysa</string>
<string name="settings_general_default_base_url_title">Öntanımlı sunucu</string>
<string name="settings_general_default_base_url_message">Yeni konulara abone olurken ve/veya konularda paylaşım yaparken öntanımlı olarak kendi sunucunuzu kullanmak için sunucunuzun kök URL\'sini girin.</string>
<string name="default_server_dialog_description">Yeni konulara abone olurken ve/veya konularda paylaşım yaparken öntanımlı olarak kendi sunucunuzu kullanmak için sunucunuzun kök URL\'sini girin.</string>
<string name="settings_general_default_base_url_default_summary">%1$s (öntanımlı)</string>
<string name="settings_general_users_title">Kullanıcıları yönet</string>
<string name="settings_general_users_prefs_title">Kullanıcılar</string>

View file

@ -292,7 +292,7 @@
<string name="user_dialog_title_add">Додати користувача</string>
<string name="settings_general_header">Загальний</string>
<string name="settings_appearance_header">Зовнішній вигляд</string>
<string name="settings_general_default_base_url_message">Введіть кореневу URL-адресу свого сервера, щоб використовувати свій власний сервер як стандартний під час підписки на нові теми та/або спільного доступу до тем.</string>
<string name="default_server_dialog_description">Введіть кореневу URL-адресу свого сервера, щоб використовувати свій власний сервер як стандартний під час підписки на нові теми та/або спільного доступу до тем.</string>
<string name="settings_general_default_base_url_default_summary">%1$s (за умовчанням)</string>
<string name="settings_general_users_prefs_title">Користувачі</string>
<string name="settings_general_users_prefs_user_not_used">Не використовується жодною темою</string>

View file

@ -185,7 +185,7 @@
<string name="settings_general_header">Umumiy</string>
<string name="settings_appearance_header">Tashqi ko\'rinish</string>
<string name="settings_general_default_base_url_title">Standart server</string>
<string name="settings_general_default_base_url_message">Yangi mavzularga obuna bolish va/yoki mavzularga ulashishda oz serveringizdan standart foydalanish uchun serveringizning asosiy URL manzilini kiriting.</string>
<string name="default_server_dialog_description">Yangi mavzularga obuna bolish va/yoki mavzularga ulashishda oz serveringizdan standart foydalanish uchun serveringizning asosiy URL manzilini kiriting.</string>
<string name="settings_general_default_base_url_default_summary">%1$s (standart)</string>
<string name="settings_general_users_title">Foydalanuvchilarni boshqarish</string>
<string name="settings_general_users_summary">Himoyalangan mavzular uchun foydalanuvchilarni qoshish/ochirish</string>

View file

@ -240,7 +240,7 @@
<string name="settings_general_header">Tổng quan</string>
<string name="settings_appearance_header">Giao diện</string>
<string name="settings_general_default_base_url_title">Server mặc định</string>
<string name="settings_general_default_base_url_message">Nhập URL server để dùng làm mặc định khi đăng ký/chia sẻ chủ đề mới.</string>
<string name="default_server_dialog_description">Nhập URL server để dùng làm mặc định khi đăng ký/chia sẻ chủ đề mới.</string>
<string name="settings_general_default_base_url_default_summary">%1$s (mặc định)</string>
<string name="settings_general_users_title">Quản lí tài khoản</string>
<string name="settings_general_users_summary">Thêm/xóa tài khoản cho các topic được bảo vệ</string>

View file

@ -251,7 +251,7 @@
<string name="settings_backup_restore_backup_failed">备份失败:%1$s</string>
<string name="settings_advanced_export_logs_copied_logs">日志已复制到剪贴板</string>
<string name="settings_advanced_export_logs_entry_upload_scrubbed">上传并复制链接 (屏蔽敏感信息)</string>
<string name="settings_general_default_base_url_message">请输入你的服务器的 URL 以使用你自己的服务器作为订阅主题和发送消息的默认选项。</string>
<string name="default_server_dialog_description">请输入你的服务器的 URL 以使用你自己的服务器作为订阅主题和发送消息的默认选项。</string>
<string name="settings_general_users_prefs_user_not_used">未在任何主题使用</string>
<string name="settings_general_dark_mode_entry_light">亮色模式</string>
<string name="settings_general_users_prefs_user_used_by_one">在主题 %1$s 使用</string>

View file

@ -224,7 +224,7 @@
<string name="share_content_text_hint">在此添加內容以進行分享</string>
<string name="share_suggested_topics">建議的主題</string>
<string name="share_content_file_error">無法圖取檔案資訊:%1$s</string>
<string name="settings_general_default_base_url_message">輸入你的伺服器的 root URL以便在訂閱新主題和/或分享到主題時,默認使用你自己的伺服器。</string>
<string name="default_server_dialog_description">輸入你的伺服器的 root URL以便在訂閱新主題和/或分享到主題時,默認使用你自己的伺服器。</string>
<string name="detail_item_cannot_save">無法儲存附件:%1$s</string>
<string name="detail_item_download_failed">無法下載附件:%1$s</string>
<string name="detail_item_cannot_open_apk">無法再安裝應用程式。請改為使用瀏覽器下載。詳見問題#531。</string>

View file

@ -7,6 +7,7 @@
<string name="common_button_save">Save</string>
<string name="common_button_delete">Delete</string>
<string name="common_button_copy">Copy</string>
<string name="common_button_reset_to_default">Reset to default</string>
<string name="common_copied_to_clipboard">Copied to clipboard</string>
<string name="common_service_url">Service URL</string>
<string name="common_service_url_placeholder">e.g. https://ntfy.example.com</string>
@ -369,7 +370,6 @@
<string name="settings_general_header">General</string>
<string name="settings_appearance_header">Appearance</string>
<string name="settings_general_default_base_url_title">Default server</string>
<string name="settings_general_default_base_url_message">Enter your server\'s root URL to use your own server as a default when subscribing to new topics and/or sharing to topics.</string>
<string name="settings_general_default_base_url_default_summary">%1$s (default)</string>
<string name="settings_general_users_title">Manage users</string>
<string name="settings_general_users_summary">Add/remove users for protected topics</string>
@ -503,6 +503,10 @@
<string name="user_dialog_button_cancel">Cancel</string>
<string name="user_dialog_button_delete">Delete user</string>
<!-- Default server dialog (DefaultServerFragment) -->
<string name="default_server_dialog_description">Enter your server\'s root URL to use your own server as a default when subscribing to new topics and/or sharing to topics.</string>
<string name="default_server_dialog_url_error_invalid">Enter a valid service URL, e.g. https://ntfy.example.com</string>
<!-- Custom headers dialog (CustomHeaderFragment) -->
<string name="custom_headers_dialog_title_add">Add custom header</string>
<string name="custom_headers_dialog_title_edit">Edit custom header</string>

View file

@ -35,7 +35,7 @@
app:summary="@string/settings_notifications_channel_prefs_summary"/>
</PreferenceCategory>
<PreferenceCategory app:title="@string/settings_general_header">
<EditTextPreference
<Preference
app:key="@string/settings_general_default_base_url_key"
app:title="@string/settings_general_default_base_url_title" />
<Preference

View file

@ -1,3 +1,7 @@
Bug fixes + maintenance:
* Fix crash when URL scheme is missing in default server (#1582, ntfy-android#158, thanks to @hard-zero1 for reporting)
Features:
* Search within a topic (#141, ntfy-android#153, thanks to @Copephobia and @StoyanYonkov for reporting and sponsoring)
* Add "reconnecting to N topics ..." to foreground notification (#1101, thanks to @milosivanovic for reporting)
* Default server dialog with full-screen UI and stricter URL validation (ntfy-android#158)