fix: Show lists sorted by title (#1218)

Some parts of the UI already showed lists sorted by title, but not all.

The areas fixed are:

- The list of lists in the main drawer (left side navitation)
- The list of lists when adding/removing an account from a list

Fixes #1168
This commit is contained in:
Nik Clayton 2025-01-18 18:02:29 +01:00 committed by GitHub
parent e45d0285b5
commit 40370e607e
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
5 changed files with 26 additions and 7 deletions

View File

@ -75,6 +75,7 @@ import app.pachli.core.common.extensions.show
import app.pachli.core.common.extensions.viewBinding
import app.pachli.core.common.util.unsafeLazy
import app.pachli.core.data.model.MastodonList
import app.pachli.core.data.repository.ListsRepository.Companion.compareByListTitle
import app.pachli.core.data.repository.PachliAccount
import app.pachli.core.data.repository.SetActiveAccountError
import app.pachli.core.database.model.AccountEntity
@ -845,7 +846,7 @@ class MainActivity : BottomSheetActivity(), ActionButtonActivity, MenuProvider {
binding.mainDrawer.removeItems(*listDrawerItems.toTypedArray())
listDrawerItems.clear()
lists.forEach { list ->
lists.sortedWith(compareByListTitle).forEach { list ->
listDrawerItems.add(
primaryDrawerItem {
nameText = list.title

View File

@ -62,6 +62,13 @@ import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.flow.collectLatest
import kotlinx.coroutines.launch
/**
* Displays the user's list of tabs, and allows them:
*
* - Drag/drop tabs to re-order.
* - Add new tabs.
* - Remove existing tabs.
*/
@AndroidEntryPoint
class TabPreferenceActivity : BaseActivity(), ItemInteractionListener {
@Inject

View File

@ -157,12 +157,15 @@ interface ListsRepository {
): Result<Unit, ListsError.DeleteAccounts>
companion object {
/** Locale aware collator lists. */
val listTitleCollator: Collator = Collator.getInstance().apply { strength = Collator.SECONDARY }
/**
* Locale-aware comparator for lists. Case-insenstive comparison by
* the list's title.
*/
val compareByListTitle: Comparator<MastodonList> = compareBy(
Collator.getInstance().apply { strength = Collator.SECONDARY },
) { it.title }
val compareByListTitle: Comparator<MastodonList> = compareBy(listTitleCollator) {
it.title
}
}
}

View File

@ -31,6 +31,7 @@ import androidx.recyclerview.widget.ListAdapter
import app.pachli.core.common.extensions.hide
import app.pachli.core.common.extensions.show
import app.pachli.core.common.extensions.viewBinding
import app.pachli.core.data.repository.ListsRepository.Companion.listTitleCollator
import app.pachli.core.designsystem.R as DR
import app.pachli.core.ui.BackgroundMessage
import app.pachli.core.ui.BindingHolder
@ -146,7 +147,7 @@ class ListsForAccountFragment : DialogFragment() {
binding.messageView.setup(BackgroundMessage.Empty(R.string.no_lists)) { load() }
} else {
binding.listsView.show()
adapter.submitList(it.listsWithMembership.values.toList())
adapter.submitList(it.listsWithMembership.values.sortedWith(compareByListWithMembershipTitle))
}
}
}
@ -230,5 +231,13 @@ class ListsForAccountFragment : DialogFragment() {
}
return ListsForAccountFragment().apply { arguments = args }
}
/**
* Locale aware comparator for [ListsWithMembership]. Case-insensitive comparison
* by the list's title.
*/
val compareByListWithMembershipTitle: Comparator<ListWithMembership> = compareBy(
listTitleCollator,
) { it.list.title }
}
}

View File

@ -23,7 +23,6 @@ import app.pachli.core.data.model.MastodonList
import app.pachli.core.data.repository.HasListId
import app.pachli.core.data.repository.ListsError
import app.pachli.core.data.repository.ListsRepository
import app.pachli.core.network.model.MastoList
import com.github.michaelbull.result.Ok
import com.github.michaelbull.result.Result
import com.github.michaelbull.result.mapEither
@ -46,7 +45,7 @@ sealed interface ListsWithMembership {
}
/**
* A [MastoList] with a property for whether [ListsForAccountViewModel.accountId] is a
* A [MastodonList] with a property for whether [ListsForAccountViewModel.accountId] is a
* member of the list.
*
* @property list The Mastodon list