diff --git a/app/src/main/java/io/heckel/ntfy/db/Repository.kt b/app/src/main/java/io/heckel/ntfy/db/Repository.kt index a85b7b7..bd14638 100644 --- a/app/src/main/java/io/heckel/ntfy/db/Repository.kt +++ b/app/src/main/java/io/heckel/ntfy/db/Repository.kt @@ -320,6 +320,23 @@ class Repository(private val sharedPrefs: SharedPreferences, private val databas } } + fun getDefaultBaseUrl(): String? { + return sharedPrefs.getString(SHARED_PREFS_DEFAULT_BASE_URL, null) + } + + fun setDefaultBaseUrl(baseUrl: String) { + if (baseUrl == "") { + sharedPrefs + .edit() + .remove(SHARED_PREFS_DEFAULT_BASE_URL) + .apply() + } else { + sharedPrefs.edit() + .putString(SHARED_PREFS_DEFAULT_BASE_URL, baseUrl) + .apply() + } + } + fun isGlobalMuted(): Boolean { val mutedUntil = getGlobalMutedUntil() return mutedUntil == 1L || (mutedUntil > 1L && mutedUntil > System.currentTimeMillis()/1000) @@ -435,6 +452,7 @@ class Repository(private val sharedPrefs: SharedPreferences, private val databas const val SHARED_PREFS_BATTERY_OPTIMIZATIONS_REMIND_TIME = "BatteryOptimizationsRemindTime" const val SHARED_PREFS_UNIFIED_PUSH_ENABLED = "UnifiedPushEnabled" const val SHARED_PREFS_UNIFIED_PUSH_BASE_URL = "UnifiedPushBaseURL" + const val SHARED_PREFS_DEFAULT_BASE_URL = "DefaultBaseURL" const val SHARED_PREFS_LAST_TOPICS = "LastTopics" private const val LAST_TOPICS_COUNT = 3 diff --git a/app/src/main/java/io/heckel/ntfy/ui/AddFragment.kt b/app/src/main/java/io/heckel/ntfy/ui/AddFragment.kt index be11dd5..2d262f0 100644 --- a/app/src/main/java/io/heckel/ntfy/ui/AddFragment.kt +++ b/app/src/main/java/io/heckel/ntfy/ui/AddFragment.kt @@ -7,7 +7,6 @@ import android.content.Context import android.os.Bundle import android.text.Editable import android.text.TextWatcher -import android.util.TypedValue import android.view.View import android.view.WindowManager import android.view.inputmethod.InputMethodManager @@ -30,6 +29,7 @@ class AddFragment : DialogFragment() { private lateinit var repository: Repository private lateinit var subscribeListener: SubscribeListener + private lateinit var appBaseUrl: String private lateinit var subscribeView: View private lateinit var loginView: View @@ -56,8 +56,6 @@ class AddFragment : DialogFragment() { private lateinit var loginErrorText: TextView private lateinit var loginErrorTextImage: View - private lateinit var baseUrls: List // List of base URLs already used, excluding app_base_url - interface SubscribeListener { fun onSubscribe(topic: String, baseUrl: String, instant: Boolean) } @@ -73,6 +71,7 @@ class AddFragment : DialogFragment() { } // Dependencies (Fragments need a default constructor) + appBaseUrl = getString(R.string.app_base_url) repository = Repository.getInstance(requireActivity()) // Build root view @@ -121,12 +120,15 @@ class AddFragment : DialogFragment() { // Add baseUrl auto-complete behavior lifecycleScope.launch(Dispatchers.IO) { - val appBaseUrl = getString(R.string.app_base_url) - baseUrls = repository.getSubscriptions() + val defaultBaseUrl = repository.getDefaultBaseUrl() + val baseUrlsRaw = repository.getSubscriptions() .groupBy { it.baseUrl } .map { it.key } - .filterNot { it == appBaseUrl } - .sorted() + val baseUrls = if (defaultBaseUrl != null) { + (baseUrlsRaw.filterNot { it == defaultBaseUrl } + appBaseUrl).sorted() + } else { + baseUrlsRaw.filterNot { it == appBaseUrl }.sorted() + } val activity = activity ?: return@launch // We may have pressed "Cancel" activity.runOnUiThread { initBaseUrlDropdown(baseUrls, subscribeBaseUrlText, subscribeBaseUrlLayout) @@ -205,7 +207,6 @@ class AddFragment : DialogFragment() { } validateInputSubscribeView() } - subscribeUseAnotherServerCheckbox.isChecked = this::baseUrls.isInitialized && baseUrls.count() == 1 // Focus topic text (keyboard is shown too, see above) subscribeTopicText.requestFocus() @@ -365,7 +366,7 @@ class AddFragment : DialogFragment() { return if (subscribeUseAnotherServerCheckbox.isChecked) { subscribeBaseUrlText.text.toString() } else { - getString(R.string.app_base_url) + return repository.getDefaultBaseUrl() ?: appBaseUrl } } diff --git a/app/src/main/java/io/heckel/ntfy/ui/SettingsActivity.kt b/app/src/main/java/io/heckel/ntfy/ui/SettingsActivity.kt index de35b79..faa7d5e 100644 --- a/app/src/main/java/io/heckel/ntfy/ui/SettingsActivity.kt +++ b/app/src/main/java/io/heckel/ntfy/ui/SettingsActivity.kt @@ -325,6 +325,28 @@ class SettingsActivity : AppCompatActivity(), PreferenceFragmentCompat.OnPrefere } } + + // Default Base URL + val defaultBaseUrlPrefId = context?.getString(R.string.settings_advanced_default_base_url_key) ?: return + val defaultBaseUrl: EditTextPreference? = findPreference(defaultBaseUrlPrefId) + defaultBaseUrl?.text = repository.getDefaultBaseUrl() ?: "" + 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() + } + } + defaultBaseUrl?.summaryProvider = Preference.SummaryProvider { pref -> + if (TextUtils.isEmpty(pref.text)) { + getString(R.string.settings_advanced_default_base_url_default_summary, appBaseUrl) + } else { + pref.text + } + } + // Broadcast enabled val broadcastEnabledPrefId = context?.getString(R.string.settings_advanced_broadcast_key) ?: return val broadcastEnabled: SwitchPreference? = findPreference(broadcastEnabledPrefId) diff --git a/app/src/main/res/layout/preference_category_material_edited.xml b/app/src/main/res/layout/preference_category_material_edited.xml index f0a481a..984e712 100644 --- a/app/src/main/res/layout/preference_category_material_edited.xml +++ b/app/src/main/res/layout/preference_category_material_edited.xml @@ -1,7 +1,8 @@ + + + + + + + + + + + diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index b95d6a2..e2a6b8b 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -297,8 +297,13 @@ Apps cannot use ntfy as distributor UnifiedPushBaseURL Server URL + Set the root server URL to be used for new UnifiedPush topics here. %1$s (default) Advanced + DefaultBaseURL + Default Server URL + Set the default server URL to be used for new topics here. Topics on other hosts can still be subscribed to using the "use another server" checkbox. + %1$s (default) BroadcastEnabled Broadcast messages Apps can receive incoming notifications as broadcasts diff --git a/app/src/main/res/xml/main_preferences.xml b/app/src/main/res/xml/main_preferences.xml index a68cee3..5178ff0 100644 --- a/app/src/main/res/xml/main_preferences.xml +++ b/app/src/main/res/xml/main_preferences.xml @@ -58,9 +58,16 @@ + app:dependency="@string/settings_unified_push_enabled_key" + app:dialogLayout="@layout/preference_dialog_edittext_edited" + app:dialogMessage="@string/settings_unified_push_base_url_message"/> +