Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
11 changes: 11 additions & 0 deletions app/src/main/java/io/heckel/ntfy/db/Repository.kt
Original file line number Diff line number Diff line change
Expand Up @@ -410,6 +410,16 @@ class Repository(private val sharedPrefs: SharedPreferences, database: Database)
}
}

fun getMessageSortAscending(): Boolean {
return sharedPrefs.getBoolean(SHARED_PREFS_MESSAGE_SORT_ASCENDING, false)
}

fun setMessageSortAscending(ascending: Boolean) {
sharedPrefs.edit {
putBoolean(SHARED_PREFS_MESSAGE_SORT_ASCENDING, ascending)
}
}

fun getBatteryOptimizationsRemindTime(): Long {
return sharedPrefs.getLong(SHARED_PREFS_BATTERY_OPTIMIZATIONS_REMIND_TIME, BATTERY_OPTIMIZATIONS_REMIND_TIME_ALWAYS)
}
Expand Down Expand Up @@ -634,6 +644,7 @@ class Repository(private val sharedPrefs: SharedPreferences, database: Database)
const val SHARED_PREFS_INSISTENT_MAX_PRIORITY_ENABLED = "InsistentMaxPriority"
const val SHARED_PREFS_RECORD_LOGS_ENABLED = "RecordLogs"
const val SHARED_PREFS_MESSAGE_BAR_ENABLED = "MessageBarEnabled"
const val SHARED_PREFS_MESSAGE_SORT_ASCENDING = "MessageSortAscending"
const val SHARED_PREFS_BATTERY_OPTIMIZATIONS_REMIND_TIME = "BatteryOptimizationsRemindTime"
const val SHARED_PREFS_WEBSOCKET_REMIND_TIME = "JsonStreamRemindTime" // "Use WebSocket" banner (used to be JSON stream deprecation banner)
const val SHARED_PREFS_WEBSOCKET_RECONNECT_REMIND_TIME = "WebSocketReconnectRemindTime"
Expand Down
16 changes: 13 additions & 3 deletions app/src/main/java/io/heckel/ntfy/ui/DetailActivity.kt
Original file line number Diff line number Diff line change
Expand Up @@ -325,8 +325,18 @@ class DetailActivity : AppCompatActivity(), NotificationFragment.NotificationSet
val howToLink: View = findViewById(R.id.detail_how_to_link)
viewModel.listFiltered(subscriptionId).observe(this) {
it?.let { notifications ->
// Sort ascending if preference is set (DB returns descending by default)
val sortedNotifications = if (repository.getMessageSortAscending()) {
notifications.sortedBy { n -> n.timestamp }
} else {
notifications.sortedByDescending { n -> n.timestamp }
}
// Show list view
adapter.submitList(notifications.toMutableList())
adapter.submitList(sortedNotifications.toMutableList()) {
if (repository.getMessageSortAscending() && sortedNotifications.isNotEmpty()) {
mainList.scrollToPosition(sortedNotifications.size - 1)
}
}
if (notifications.isEmpty()) {
mainListContainer.visibility = View.GONE
noEntriesText.visibility = View.VISIBLE
Expand Down Expand Up @@ -375,10 +385,10 @@ class DetailActivity : AppCompatActivity(), NotificationFragment.NotificationSet
val itemTouchHelper = ItemTouchHelper(itemTouchCallback)
itemTouchHelper.attachToRecyclerView(mainList)

// Scroll up when new notification is added
// Scroll to top when new notification is added (descending order only; ascending is handled in submitList callback)
adapter.registerAdapterDataObserver(object : RecyclerView.AdapterDataObserver() {
override fun onItemRangeInserted(positionStart: Int, itemCount: Int) {
if (positionStart == 0) {
if (!repository.getMessageSortAscending() && positionStart == 0) {
Log.d(TAG, "$itemCount item(s) inserted at 0, scrolling to the top")
mainList.scrollToPosition(positionStart)
}
Expand Down
20 changes: 20 additions & 0 deletions app/src/main/java/io/heckel/ntfy/ui/SettingsActivity.kt
Original file line number Diff line number Diff line change
Expand Up @@ -481,6 +481,26 @@ class SettingsActivity : AppCompatActivity(), PreferenceFragmentCompat.OnPrefere
}
}

// Message sort order
val messageSortAscendingPrefId = context?.getString(R.string.settings_general_message_sort_ascending_key) ?: return
val messageSortAscending: SwitchPreferenceCompat? = findPreference(messageSortAscendingPrefId)
messageSortAscending?.isChecked = repository.getMessageSortAscending()
messageSortAscending?.preferenceDataStore = object : PreferenceDataStore() {
override fun putBoolean(key: String?, value: Boolean) {
repository.setMessageSortAscending(value)
}
override fun getBoolean(key: String?, defValue: Boolean): Boolean {
return repository.getMessageSortAscending()
}
}
messageSortAscending?.summaryProvider = Preference.SummaryProvider<SwitchPreferenceCompat> { pref ->
if (pref.isChecked) {
getString(R.string.settings_general_message_sort_ascending_summary_enabled)
} else {
getString(R.string.settings_general_message_sort_ascending_summary_disabled)
}
}

// Default Base URL
val appBaseUrl = getString(R.string.app_base_url)
val defaultBaseUrlPrefId = context?.getString(R.string.settings_general_default_base_url_key) ?: return
Expand Down
3 changes: 3 additions & 0 deletions app/src/main/res/values/strings.xml
Original file line number Diff line number Diff line change
Expand Up @@ -402,6 +402,9 @@
<string name="settings_general_message_bar_title">Show message bar</string>
<string name="settings_general_message_bar_summary_enabled">Message bar shown at bottom of topic view</string>
<string name="settings_general_message_bar_summary_disabled">Publish button shown at bottom of topic view</string>
<string name="settings_general_message_sort_ascending_title">Sort messages oldest first</string>
<string name="settings_general_message_sort_ascending_summary_enabled">Messages sorted oldest to newest</string>
<string name="settings_general_message_sort_ascending_summary_disabled">Messages sorted newest to oldest</string>
<string name="settings_backup_restore_header">Backup &amp; Restore</string>
<string name="settings_backup_restore_backup_title">Back up to file</string>
<string name="settings_backup_restore_backup_summary">Export config, notifications, and users</string>
Expand Down
1 change: 1 addition & 0 deletions app/src/main/res/values/values.xml
Original file line number Diff line number Diff line change
Expand Up @@ -25,6 +25,7 @@
<string name="settings_general_language_key" translatable="false">Language</string>
<string name="settings_general_dynamic_colors_key" translatable="false">DynamicColors</string>
<string name="settings_general_message_bar_key" translatable="false">MessageBarEnabled</string>
<string name="settings_general_message_sort_ascending_key" translatable="false">MessageSortAscending</string>
<string name="settings_backup_restore_backup_key" translatable="false">Backup</string>
<string name="settings_backup_restore_restore_key" translatable="false">Restore</string>
<string name="settings_advanced_broadcast_key" translatable="false">BroadcastEnabled</string>
Expand Down
4 changes: 4 additions & 0 deletions app/src/main/res/xml/main_preferences.xml
Original file line number Diff line number Diff line change
Expand Up @@ -62,6 +62,10 @@
app:key="@string/settings_general_message_bar_key"
app:title="@string/settings_general_message_bar_title"
app:defaultValue="true"/>
<SwitchPreferenceCompat
app:key="@string/settings_general_message_sort_ascending_key"
app:title="@string/settings_general_message_sort_ascending_title"
app:defaultValue="false"/>
</PreferenceCategory>
<PreferenceCategory app:title="@string/settings_backup_restore_header">
<ListPreference
Expand Down