diff --git a/app/src/main/java/com/x8bit/bitwarden/data/vault/repository/VaultRepositoryImpl.kt b/app/src/main/java/com/x8bit/bitwarden/data/vault/repository/VaultRepositoryImpl.kt index 836ef82bc5..b1c3ce4ed3 100644 --- a/app/src/main/java/com/x8bit/bitwarden/data/vault/repository/VaultRepositoryImpl.kt +++ b/app/src/main/java/com/x8bit/bitwarden/data/vault/repository/VaultRepositoryImpl.kt @@ -57,6 +57,7 @@ import com.x8bit.bitwarden.data.vault.repository.model.UpdateCipherResult import com.x8bit.bitwarden.data.vault.repository.model.UpdateSendResult import com.x8bit.bitwarden.data.vault.repository.model.VaultData import com.x8bit.bitwarden.data.vault.repository.model.VaultUnlockResult +import com.x8bit.bitwarden.data.vault.repository.util.sortAlphabetically import com.x8bit.bitwarden.data.vault.repository.util.toDomainsData import com.x8bit.bitwarden.data.vault.repository.util.toEncryptedNetworkCipher import com.x8bit.bitwarden.data.vault.repository.util.toEncryptedNetworkCipherResponse @@ -1027,7 +1028,7 @@ class VaultRepositoryImpl( cipherList = it.toEncryptedSdkCipherList(), ) .fold( - onSuccess = { ciphers -> DataState.Loaded(ciphers) }, + onSuccess = { ciphers -> DataState.Loaded(ciphers.sortAlphabetically()) }, onFailure = { throwable -> DataState.Error(throwable) }, ) } @@ -1059,7 +1060,7 @@ class VaultRepositoryImpl( folderList = it.toEncryptedSdkFolderList(), ) .fold( - onSuccess = { folders -> DataState.Loaded(folders) }, + onSuccess = { folders -> DataState.Loaded(folders.sortAlphabetically()) }, onFailure = { throwable -> DataState.Error(throwable) }, ) } @@ -1078,7 +1079,11 @@ class VaultRepositoryImpl( collectionList = it.toEncryptedSdkCollectionList(), ) .fold( - onSuccess = { collections -> DataState.Loaded(collections) }, + onSuccess = { collections -> + DataState.Loaded( + collections.sortAlphabetically(), + ) + }, onFailure = { throwable -> DataState.Error(throwable) }, ) } diff --git a/app/src/main/java/com/x8bit/bitwarden/data/vault/repository/util/VaultSdkCipherExtensions.kt b/app/src/main/java/com/x8bit/bitwarden/data/vault/repository/util/VaultSdkCipherExtensions.kt index b0b52d304c..8fce977917 100644 --- a/app/src/main/java/com/x8bit/bitwarden/data/vault/repository/util/VaultSdkCipherExtensions.kt +++ b/app/src/main/java/com/x8bit/bitwarden/data/vault/repository/util/VaultSdkCipherExtensions.kt @@ -7,6 +7,7 @@ import com.bitwarden.core.Card import com.bitwarden.core.Cipher import com.bitwarden.core.CipherRepromptType import com.bitwarden.core.CipherType +import com.bitwarden.core.CipherView import com.bitwarden.core.Field import com.bitwarden.core.FieldType import com.bitwarden.core.Identity @@ -26,6 +27,7 @@ import com.x8bit.bitwarden.data.vault.datasource.network.model.SyncResponseJson import com.x8bit.bitwarden.data.vault.datasource.network.model.UriMatchTypeJson import java.time.ZoneOffset import java.time.ZonedDateTime +import java.util.Locale /** * Converts a Bitwarden SDK [Cipher] object to a corresponding @@ -491,3 +493,10 @@ fun FieldTypeJson.toSdkFieldType(): FieldType = FieldTypeJson.BOOLEAN -> FieldType.BOOLEAN FieldTypeJson.LINKED -> FieldType.LINKED } + +/** + * Sorts the data in alphabetical order by name. + */ +@JvmName("toAlphabeticallySortedCipherList") +fun List.sortAlphabetically(): List = + this.sortedBy { it.name.uppercase(Locale.getDefault()) } diff --git a/app/src/main/java/com/x8bit/bitwarden/data/vault/repository/util/VaultSdkCollectionExtensions.kt b/app/src/main/java/com/x8bit/bitwarden/data/vault/repository/util/VaultSdkCollectionExtensions.kt index 28deca62db..6444ec95b0 100644 --- a/app/src/main/java/com/x8bit/bitwarden/data/vault/repository/util/VaultSdkCollectionExtensions.kt +++ b/app/src/main/java/com/x8bit/bitwarden/data/vault/repository/util/VaultSdkCollectionExtensions.kt @@ -1,7 +1,9 @@ package com.x8bit.bitwarden.data.vault.repository.util import com.bitwarden.core.Collection +import com.bitwarden.core.CollectionView import com.x8bit.bitwarden.data.vault.datasource.network.model.SyncResponseJson +import java.util.Locale /** * Converts a [SyncResponseJson.Collection] object to a corresponding Bitwarden SDK [Collection] @@ -23,3 +25,10 @@ fun SyncResponseJson.Collection.toEncryptedSdkCollection(): Collection = */ fun List.toEncryptedSdkCollectionList(): List = map { it.toEncryptedSdkCollection() } + +/** + * Sorts the data in alphabetical order by name. + */ +@JvmName("toAlphabeticallySortedCollectionList") +fun List.sortAlphabetically(): List = + this.sortedBy { it.name.uppercase(Locale.getDefault()) } diff --git a/app/src/main/java/com/x8bit/bitwarden/data/vault/repository/util/VaultSdkFolderExtensions.kt b/app/src/main/java/com/x8bit/bitwarden/data/vault/repository/util/VaultSdkFolderExtensions.kt index f0339a41f5..00de36f123 100644 --- a/app/src/main/java/com/x8bit/bitwarden/data/vault/repository/util/VaultSdkFolderExtensions.kt +++ b/app/src/main/java/com/x8bit/bitwarden/data/vault/repository/util/VaultSdkFolderExtensions.kt @@ -1,7 +1,9 @@ package com.x8bit.bitwarden.data.vault.repository.util import com.bitwarden.core.Folder +import com.bitwarden.core.FolderView import com.x8bit.bitwarden.data.vault.datasource.network.model.SyncResponseJson +import java.util.Locale /** * Converts a list of [SyncResponseJson.Folder] objects to a list of corresponding @@ -20,3 +22,10 @@ fun SyncResponseJson.Folder.toEncryptedSdkFolder(): Folder = name = name.orEmpty(), revisionDate = revisionDate.toInstant(), ) + +/** + * Sorts the data in alphabetical order by name. + */ +@JvmName("toAlphabeticallySortedFolderList") +fun List.sortAlphabetically(): List = + this.sortedBy { it.name.uppercase(Locale.getDefault()) } diff --git a/app/src/test/java/com/x8bit/bitwarden/data/vault/repository/util/VaultSdkCipherExtensionsTest.kt b/app/src/test/java/com/x8bit/bitwarden/data/vault/repository/util/VaultSdkCipherExtensionsTest.kt index dafc937bc0..2f30b0d472 100644 --- a/app/src/test/java/com/x8bit/bitwarden/data/vault/repository/util/VaultSdkCipherExtensionsTest.kt +++ b/app/src/test/java/com/x8bit/bitwarden/data/vault/repository/util/VaultSdkCipherExtensionsTest.kt @@ -18,6 +18,7 @@ import com.x8bit.bitwarden.data.vault.datasource.network.model.createMockLogin import com.x8bit.bitwarden.data.vault.datasource.network.model.createMockPasswordHistory import com.x8bit.bitwarden.data.vault.datasource.network.model.createMockSecureNote import com.x8bit.bitwarden.data.vault.datasource.network.model.createMockUri +import com.x8bit.bitwarden.data.vault.datasource.sdk.model.createMockCipherView import com.x8bit.bitwarden.data.vault.datasource.sdk.model.createMockSdkAttachment import com.x8bit.bitwarden.data.vault.datasource.sdk.model.createMockSdkCard import com.x8bit.bitwarden.data.vault.datasource.sdk.model.createMockSdkCipher @@ -270,4 +271,29 @@ class VaultSdkCipherExtensionsTest { sdkFieldType, ) } + + @Suppress("MaxLineLength") + @Test + fun `toSortAlphabetically should sort ciphers by name`() { + val list = listOf( + createMockCipherView(1).copy(name = "c"), + createMockCipherView(1).copy(name = "B"), + createMockCipherView(1).copy(name = "z"), + createMockCipherView(1).copy(name = "A"), + createMockCipherView(1).copy(name = "D"), + ) + + val expected = listOf( + createMockCipherView(1).copy(name = "A"), + createMockCipherView(1).copy(name = "B"), + createMockCipherView(1).copy(name = "c"), + createMockCipherView(1).copy(name = "D"), + createMockCipherView(1).copy(name = "z"), + ) + + assertEquals( + expected, + list.sortAlphabetically(), + ) + } } diff --git a/app/src/test/java/com/x8bit/bitwarden/data/vault/repository/util/VaultSdkCollectionExtensionsTest.kt b/app/src/test/java/com/x8bit/bitwarden/data/vault/repository/util/VaultSdkCollectionExtensionsTest.kt index 2a1d3e6267..411e99c60c 100644 --- a/app/src/test/java/com/x8bit/bitwarden/data/vault/repository/util/VaultSdkCollectionExtensionsTest.kt +++ b/app/src/test/java/com/x8bit/bitwarden/data/vault/repository/util/VaultSdkCollectionExtensionsTest.kt @@ -2,6 +2,7 @@ package com.x8bit.bitwarden.data.vault.repository.util import com.bitwarden.core.Collection import com.x8bit.bitwarden.data.vault.datasource.network.model.SyncResponseJson +import com.x8bit.bitwarden.data.vault.datasource.sdk.model.createMockCollectionView import org.junit.Test import org.junit.jupiter.api.Assertions.assertEquals @@ -56,4 +57,29 @@ class VaultSdkCollectionExtensionsTest { ), ) } + + @Suppress("MaxLineLength") + @Test + fun `toSortAlphabetically should sort collections by name`() { + val list = listOf( + createMockCollectionView(1).copy(name = "c"), + createMockCollectionView(1).copy(name = "B"), + createMockCollectionView(1).copy(name = "z"), + createMockCollectionView(1).copy(name = "A"), + createMockCollectionView(1).copy(name = "D"), + ) + + val expected = listOf( + createMockCollectionView(1).copy(name = "A"), + createMockCollectionView(1).copy(name = "B"), + createMockCollectionView(1).copy(name = "c"), + createMockCollectionView(1).copy(name = "D"), + createMockCollectionView(1).copy(name = "z"), + ) + + assertEquals( + expected, + list.sortAlphabetically(), + ) + } } diff --git a/app/src/test/java/com/x8bit/bitwarden/data/vault/repository/util/VaultSdkFolderExtensionsTest.kt b/app/src/test/java/com/x8bit/bitwarden/data/vault/repository/util/VaultSdkFolderExtensionsTest.kt index 83bda5f074..a21cef9701 100644 --- a/app/src/test/java/com/x8bit/bitwarden/data/vault/repository/util/VaultSdkFolderExtensionsTest.kt +++ b/app/src/test/java/com/x8bit/bitwarden/data/vault/repository/util/VaultSdkFolderExtensionsTest.kt @@ -1,6 +1,7 @@ package com.x8bit.bitwarden.data.vault.repository.util import com.x8bit.bitwarden.data.vault.datasource.network.model.createMockFolder +import com.x8bit.bitwarden.data.vault.datasource.sdk.model.createMockFolderView import com.x8bit.bitwarden.data.vault.datasource.sdk.model.createMockSdkFolder import org.junit.Assert.assertEquals import org.junit.Test @@ -32,4 +33,29 @@ class VaultSdkFolderExtensionsTest { sdkFolder, ) } + + @Suppress("MaxLineLength") + @Test + fun `toSortAlphabetically should sort folders by name`() { + val list = listOf( + createMockFolderView(1).copy(name = "c"), + createMockFolderView(1).copy(name = "D"), + createMockFolderView(1).copy(name = "B"), + createMockFolderView(1).copy(name = "A"), + createMockFolderView(1).copy(name = "z"), + ) + + val expected = listOf( + createMockFolderView(1).copy(name = "A"), + createMockFolderView(1).copy(name = "B"), + createMockFolderView(1).copy(name = "c"), + createMockFolderView(1).copy(name = "D"), + createMockFolderView(1).copy(name = "z"), + ) + + assertEquals( + expected, + list.sortAlphabetically(), + ) + } }