WIP default server
This commit is contained in:
parent
36bc5854b3
commit
53ab3ad694
8 changed files with 127 additions and 12 deletions
|
@ -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 {
|
fun isGlobalMuted(): Boolean {
|
||||||
val mutedUntil = getGlobalMutedUntil()
|
val mutedUntil = getGlobalMutedUntil()
|
||||||
return mutedUntil == 1L || (mutedUntil > 1L && mutedUntil > System.currentTimeMillis()/1000)
|
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_BATTERY_OPTIMIZATIONS_REMIND_TIME = "BatteryOptimizationsRemindTime"
|
||||||
const val SHARED_PREFS_UNIFIED_PUSH_ENABLED = "UnifiedPushEnabled"
|
const val SHARED_PREFS_UNIFIED_PUSH_ENABLED = "UnifiedPushEnabled"
|
||||||
const val SHARED_PREFS_UNIFIED_PUSH_BASE_URL = "UnifiedPushBaseURL"
|
const val SHARED_PREFS_UNIFIED_PUSH_BASE_URL = "UnifiedPushBaseURL"
|
||||||
|
const val SHARED_PREFS_DEFAULT_BASE_URL = "DefaultBaseURL"
|
||||||
const val SHARED_PREFS_LAST_TOPICS = "LastTopics"
|
const val SHARED_PREFS_LAST_TOPICS = "LastTopics"
|
||||||
|
|
||||||
private const val LAST_TOPICS_COUNT = 3
|
private const val LAST_TOPICS_COUNT = 3
|
||||||
|
|
|
@ -7,7 +7,6 @@ import android.content.Context
|
||||||
import android.os.Bundle
|
import android.os.Bundle
|
||||||
import android.text.Editable
|
import android.text.Editable
|
||||||
import android.text.TextWatcher
|
import android.text.TextWatcher
|
||||||
import android.util.TypedValue
|
|
||||||
import android.view.View
|
import android.view.View
|
||||||
import android.view.WindowManager
|
import android.view.WindowManager
|
||||||
import android.view.inputmethod.InputMethodManager
|
import android.view.inputmethod.InputMethodManager
|
||||||
|
@ -30,6 +29,7 @@ class AddFragment : DialogFragment() {
|
||||||
|
|
||||||
private lateinit var repository: Repository
|
private lateinit var repository: Repository
|
||||||
private lateinit var subscribeListener: SubscribeListener
|
private lateinit var subscribeListener: SubscribeListener
|
||||||
|
private lateinit var appBaseUrl: String
|
||||||
|
|
||||||
private lateinit var subscribeView: View
|
private lateinit var subscribeView: View
|
||||||
private lateinit var loginView: View
|
private lateinit var loginView: View
|
||||||
|
@ -56,8 +56,6 @@ class AddFragment : DialogFragment() {
|
||||||
private lateinit var loginErrorText: TextView
|
private lateinit var loginErrorText: TextView
|
||||||
private lateinit var loginErrorTextImage: View
|
private lateinit var loginErrorTextImage: View
|
||||||
|
|
||||||
private lateinit var baseUrls: List<String> // List of base URLs already used, excluding app_base_url
|
|
||||||
|
|
||||||
interface SubscribeListener {
|
interface SubscribeListener {
|
||||||
fun onSubscribe(topic: String, baseUrl: String, instant: Boolean)
|
fun onSubscribe(topic: String, baseUrl: String, instant: Boolean)
|
||||||
}
|
}
|
||||||
|
@ -73,6 +71,7 @@ class AddFragment : DialogFragment() {
|
||||||
}
|
}
|
||||||
|
|
||||||
// Dependencies (Fragments need a default constructor)
|
// Dependencies (Fragments need a default constructor)
|
||||||
|
appBaseUrl = getString(R.string.app_base_url)
|
||||||
repository = Repository.getInstance(requireActivity())
|
repository = Repository.getInstance(requireActivity())
|
||||||
|
|
||||||
// Build root view
|
// Build root view
|
||||||
|
@ -121,12 +120,15 @@ class AddFragment : DialogFragment() {
|
||||||
|
|
||||||
// Add baseUrl auto-complete behavior
|
// Add baseUrl auto-complete behavior
|
||||||
lifecycleScope.launch(Dispatchers.IO) {
|
lifecycleScope.launch(Dispatchers.IO) {
|
||||||
val appBaseUrl = getString(R.string.app_base_url)
|
val defaultBaseUrl = repository.getDefaultBaseUrl()
|
||||||
baseUrls = repository.getSubscriptions()
|
val baseUrlsRaw = repository.getSubscriptions()
|
||||||
.groupBy { it.baseUrl }
|
.groupBy { it.baseUrl }
|
||||||
.map { it.key }
|
.map { it.key }
|
||||||
.filterNot { it == appBaseUrl }
|
val baseUrls = if (defaultBaseUrl != null) {
|
||||||
.sorted()
|
(baseUrlsRaw.filterNot { it == defaultBaseUrl } + appBaseUrl).sorted()
|
||||||
|
} else {
|
||||||
|
baseUrlsRaw.filterNot { it == appBaseUrl }.sorted()
|
||||||
|
}
|
||||||
val activity = activity ?: return@launch // We may have pressed "Cancel"
|
val activity = activity ?: return@launch // We may have pressed "Cancel"
|
||||||
activity.runOnUiThread {
|
activity.runOnUiThread {
|
||||||
initBaseUrlDropdown(baseUrls, subscribeBaseUrlText, subscribeBaseUrlLayout)
|
initBaseUrlDropdown(baseUrls, subscribeBaseUrlText, subscribeBaseUrlLayout)
|
||||||
|
@ -205,7 +207,6 @@ class AddFragment : DialogFragment() {
|
||||||
}
|
}
|
||||||
validateInputSubscribeView()
|
validateInputSubscribeView()
|
||||||
}
|
}
|
||||||
subscribeUseAnotherServerCheckbox.isChecked = this::baseUrls.isInitialized && baseUrls.count() == 1
|
|
||||||
|
|
||||||
// Focus topic text (keyboard is shown too, see above)
|
// Focus topic text (keyboard is shown too, see above)
|
||||||
subscribeTopicText.requestFocus()
|
subscribeTopicText.requestFocus()
|
||||||
|
@ -365,7 +366,7 @@ class AddFragment : DialogFragment() {
|
||||||
return if (subscribeUseAnotherServerCheckbox.isChecked) {
|
return if (subscribeUseAnotherServerCheckbox.isChecked) {
|
||||||
subscribeBaseUrlText.text.toString()
|
subscribeBaseUrlText.text.toString()
|
||||||
} else {
|
} else {
|
||||||
getString(R.string.app_base_url)
|
return repository.getDefaultBaseUrl() ?: appBaseUrl
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -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<EditTextPreference> { pref ->
|
||||||
|
if (TextUtils.isEmpty(pref.text)) {
|
||||||
|
getString(R.string.settings_advanced_default_base_url_default_summary, appBaseUrl)
|
||||||
|
} else {
|
||||||
|
pref.text
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
// Broadcast enabled
|
// Broadcast enabled
|
||||||
val broadcastEnabledPrefId = context?.getString(R.string.settings_advanced_broadcast_key) ?: return
|
val broadcastEnabledPrefId = context?.getString(R.string.settings_advanced_broadcast_key) ?: return
|
||||||
val broadcastEnabled: SwitchPreference? = findPreference(broadcastEnabledPrefId)
|
val broadcastEnabled: SwitchPreference? = findPreference(broadcastEnabledPrefId)
|
||||||
|
|
|
@ -1,5 +1,6 @@
|
||||||
<?xml version="1.0" encoding="utf-8"?>
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
<!--
|
<!--
|
||||||
|
ntfy EDIT:
|
||||||
This is a slightly edited copy of the original Android project layout
|
This is a slightly edited copy of the original Android project layout
|
||||||
to make wrapping the summary line work.
|
to make wrapping the summary line work.
|
||||||
|
|
||||||
|
|
|
@ -0,0 +1,58 @@
|
||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<!--
|
||||||
|
ntfy EDIT:
|
||||||
|
This is a slightly edited copy of the original Android project layout
|
||||||
|
to reduce the marginBottom of the message to something reasonable (was: 48dp).
|
||||||
|
|
||||||
|
~ Copyright (C) 2015 The Android Open Source Project
|
||||||
|
~
|
||||||
|
~ Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
~ you may not use this file except in compliance with the License.
|
||||||
|
~ You may obtain a copy of the License at
|
||||||
|
~
|
||||||
|
~ http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
~
|
||||||
|
~ Unless required by applicable law or agreed to in writing, software
|
||||||
|
~ distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
~ See the License for the specific language governing permissions and
|
||||||
|
~ limitations under the License
|
||||||
|
-->
|
||||||
|
|
||||||
|
<ScrollView
|
||||||
|
xmlns:android="http://schemas.android.com/apk/res/android"
|
||||||
|
android:layout_width="match_parent"
|
||||||
|
android:layout_height="match_parent"
|
||||||
|
android:layout_marginTop="48dp"
|
||||||
|
android:layout_marginBottom="48dp"
|
||||||
|
android:overScrollMode="ifContentScrolls">
|
||||||
|
|
||||||
|
<LinearLayout
|
||||||
|
android:layout_width="match_parent"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:orientation="vertical">
|
||||||
|
|
||||||
|
<TextView
|
||||||
|
android:id="@android:id/message"
|
||||||
|
style="?android:attr/textAppearanceSmall"
|
||||||
|
android:layout_marginLeft="24dp"
|
||||||
|
android:layout_marginRight="24dp"
|
||||||
|
android:layout_marginStart="24dp"
|
||||||
|
android:layout_marginEnd="24dp"
|
||||||
|
android:layout_marginBottom="4dp"
|
||||||
|
android:layout_width="match_parent"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:textColor="?android:attr/textColorSecondary"/>
|
||||||
|
|
||||||
|
<EditText
|
||||||
|
android:id="@android:id/edit"
|
||||||
|
android:layout_marginLeft="20dp"
|
||||||
|
android:layout_marginRight="20dp"
|
||||||
|
android:layout_marginStart="20dp"
|
||||||
|
android:layout_marginEnd="20dp"
|
||||||
|
android:layout_width="match_parent"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:minHeight = "48dp" />
|
||||||
|
|
||||||
|
</LinearLayout>
|
||||||
|
</ScrollView>
|
|
@ -297,8 +297,13 @@
|
||||||
<string name="settings_unified_push_enabled_summary_off">Apps cannot use ntfy as distributor</string>
|
<string name="settings_unified_push_enabled_summary_off">Apps cannot use ntfy as distributor</string>
|
||||||
<string name="settings_unified_push_base_url_key">UnifiedPushBaseURL</string>
|
<string name="settings_unified_push_base_url_key">UnifiedPushBaseURL</string>
|
||||||
<string name="settings_unified_push_base_url_title">Server URL</string>
|
<string name="settings_unified_push_base_url_title">Server URL</string>
|
||||||
|
<string name="settings_unified_push_base_url_message">Set the root server URL to be used for new UnifiedPush topics here.</string>
|
||||||
<string name="settings_unified_push_base_url_default_summary">%1$s (default)</string>
|
<string name="settings_unified_push_base_url_default_summary">%1$s (default)</string>
|
||||||
<string name="settings_advanced_header">Advanced</string>
|
<string name="settings_advanced_header">Advanced</string>
|
||||||
|
<string name="settings_advanced_default_base_url_key">DefaultBaseURL</string>
|
||||||
|
<string name="settings_advanced_default_base_url_title">Default Server URL</string>
|
||||||
|
<string name="settings_advanced_default_base_url_message">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.</string>
|
||||||
|
<string name="settings_advanced_default_base_url_default_summary">%1$s (default)</string>
|
||||||
<string name="settings_advanced_broadcast_key">BroadcastEnabled</string>
|
<string name="settings_advanced_broadcast_key">BroadcastEnabled</string>
|
||||||
<string name="settings_advanced_broadcast_title">Broadcast messages</string>
|
<string name="settings_advanced_broadcast_title">Broadcast messages</string>
|
||||||
<string name="settings_advanced_broadcast_summary_enabled">Apps can receive incoming notifications as broadcasts</string>
|
<string name="settings_advanced_broadcast_summary_enabled">Apps can receive incoming notifications as broadcasts</string>
|
||||||
|
|
|
@ -58,9 +58,16 @@
|
||||||
<EditTextPreference
|
<EditTextPreference
|
||||||
app:key="@string/settings_unified_push_base_url_key"
|
app:key="@string/settings_unified_push_base_url_key"
|
||||||
app:title="@string/settings_unified_push_base_url_title"
|
app:title="@string/settings_unified_push_base_url_title"
|
||||||
app:dependency="@string/settings_unified_push_enabled_key"/>
|
app:dependency="@string/settings_unified_push_enabled_key"
|
||||||
|
app:dialogLayout="@layout/preference_dialog_edittext_edited"
|
||||||
|
app:dialogMessage="@string/settings_unified_push_base_url_message"/>
|
||||||
</PreferenceCategory>
|
</PreferenceCategory>
|
||||||
<PreferenceCategory app:title="@string/settings_advanced_header">
|
<PreferenceCategory app:title="@string/settings_advanced_header">
|
||||||
|
<EditTextPreference
|
||||||
|
app:key="@string/settings_advanced_default_base_url_key"
|
||||||
|
app:title="@string/settings_advanced_default_base_url_title"
|
||||||
|
app:dialogLayout="@layout/preference_dialog_edittext_edited"
|
||||||
|
app:dialogMessage="@string/settings_advanced_default_base_url_message"/>
|
||||||
<SwitchPreference
|
<SwitchPreference
|
||||||
app:key="@string/settings_advanced_broadcast_key"
|
app:key="@string/settings_advanced_broadcast_key"
|
||||||
app:title="@string/settings_advanced_broadcast_title"
|
app:title="@string/settings_advanced_broadcast_title"
|
||||||
|
|
|
@ -6,3 +6,6 @@ Features:
|
||||||
Bug fixes:
|
Bug fixes:
|
||||||
* Do not attempt to download attachments if they are already expired (#135)
|
* Do not attempt to download attachments if they are already expired (#135)
|
||||||
* Fixed crash in AddFragment as seen per stack trace in Play Console (no ticket)
|
* Fixed crash in AddFragment as seen per stack trace in Play Console (no ticket)
|
||||||
|
|
||||||
|
Other thanks:
|
||||||
|
* Thanks to @rogeliodh for testing
|
||||||
|
|
Loading…
Reference in a new issue