[PM-19640] Migrate SpecialCharWithPrecedenceComparator to core module (#4942)

This commit is contained in:
Patrick Honkonen 2025-03-31 15:19:03 -04:00 committed by GitHub
parent b7948948f0
commit 75af4868e2
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
11 changed files with 10 additions and 121 deletions

View File

@ -2,6 +2,7 @@
package com.x8bit.bitwarden.data.vault.repository.util
import com.bitwarden.core.data.repository.util.SpecialCharWithPrecedenceComparator
import com.bitwarden.vault.Attachment
import com.bitwarden.vault.Card
import com.bitwarden.vault.Cipher
@ -19,7 +20,6 @@ import com.bitwarden.vault.SecureNote
import com.bitwarden.vault.SecureNoteType
import com.bitwarden.vault.SshKey
import com.bitwarden.vault.UriMatchType
import com.x8bit.bitwarden.data.platform.util.SpecialCharWithPrecedenceComparator
import com.x8bit.bitwarden.data.vault.datasource.network.model.AttachmentJsonRequest
import com.x8bit.bitwarden.data.vault.datasource.network.model.CipherJsonRequest
import com.x8bit.bitwarden.data.vault.datasource.network.model.CipherRepromptTypeJson

View File

@ -1,8 +1,8 @@
package com.x8bit.bitwarden.data.vault.repository.util
import com.bitwarden.core.data.repository.util.SpecialCharWithPrecedenceComparator
import com.bitwarden.vault.Collection
import com.bitwarden.vault.CollectionView
import com.x8bit.bitwarden.data.platform.util.SpecialCharWithPrecedenceComparator
import com.x8bit.bitwarden.data.vault.datasource.network.model.SyncResponseJson
/**

View File

@ -1,8 +1,8 @@
package com.x8bit.bitwarden.data.vault.repository.util
import com.bitwarden.core.data.repository.util.SpecialCharWithPrecedenceComparator
import com.bitwarden.vault.Folder
import com.bitwarden.vault.FolderView
import com.x8bit.bitwarden.data.platform.util.SpecialCharWithPrecedenceComparator
import com.x8bit.bitwarden.data.vault.datasource.network.model.FolderJsonRequest
import com.x8bit.bitwarden.data.vault.datasource.network.model.SyncResponseJson

View File

@ -1,11 +1,11 @@
package com.x8bit.bitwarden.data.vault.repository.util
import com.bitwarden.core.data.repository.util.SpecialCharWithPrecedenceComparator
import com.bitwarden.send.Send
import com.bitwarden.send.SendFile
import com.bitwarden.send.SendText
import com.bitwarden.send.SendType
import com.bitwarden.send.SendView
import com.x8bit.bitwarden.data.platform.util.SpecialCharWithPrecedenceComparator
import com.x8bit.bitwarden.data.vault.datasource.network.model.SendJsonRequest
import com.x8bit.bitwarden.data.vault.datasource.network.model.SendTypeJson
import com.x8bit.bitwarden.data.vault.datasource.network.model.SyncResponseJson

View File

@ -3,6 +3,7 @@
package com.x8bit.bitwarden.ui.platform.feature.search.util
import androidx.annotation.DrawableRes
import com.bitwarden.core.data.repository.util.SpecialCharWithPrecedenceComparator
import com.bitwarden.send.SendType
import com.bitwarden.send.SendView
import com.bitwarden.vault.CipherRepromptType
@ -12,7 +13,6 @@ import com.bitwarden.vault.CollectionView
import com.bitwarden.vault.FolderView
import com.x8bit.bitwarden.R
import com.x8bit.bitwarden.data.autofill.util.isActiveWithFido2Credentials
import com.x8bit.bitwarden.data.platform.util.SpecialCharWithPrecedenceComparator
import com.x8bit.bitwarden.data.platform.util.subtitle
import com.x8bit.bitwarden.ui.platform.base.util.asText
import com.x8bit.bitwarden.ui.platform.base.util.removeDiacritics

View File

@ -1,7 +1,7 @@
package com.bitwarden.authenticator.data.authenticator.repository.util
import com.bitwarden.authenticator.data.authenticator.datasource.disk.entity.AuthenticatorItemEntity
import com.bitwarden.authenticator.data.platform.util.SpecialCharWithPrecedenceComparator
import com.bitwarden.core.data.repository.util.SpecialCharWithPrecedenceComparator
/**
* Sorts the data in alphabetical order by name. Using lexicographical sorting but giving

View File

@ -1,67 +0,0 @@
package com.bitwarden.authenticator.data.platform.util
import java.util.Locale
/**
* String [Comparator] where the characters are compared giving precedence to
* special characters.
*/
object SpecialCharWithPrecedenceComparator : Comparator<String> {
override fun compare(str1: String, str2: String): Int {
val minLength = minOf(str1.length, str2.length)
for (i in 0 until minLength) {
val char1 = str1[i]
val char2 = str2[i]
val compareResult = compareCharsSpecialCharsWithPrecedence(char1, char2)
if (compareResult != 0) {
return compareResult
}
}
// If all compared chars are the same give precedence to the shorter String.
return str1.length - str2.length
}
}
/**
* Compare two characters, where a special character is considered with higher precedence over
* letters and numbers. If both characters are a letter and they are equal ignoring the case,
* give priority to the lowercase instance. If they are both a digit or a non-equal letter
* use the default [String.compareTo] converting the chars to the [Locale] specific uppercase
* String.
*/
private fun compareCharsSpecialCharsWithPrecedence(c1: Char, c2: Char): Int {
return when {
c1.isLetterOrDigit() && !c2.isLetterOrDigit() -> 1
!c1.isLetterOrDigit() && c2.isLetterOrDigit() -> -1
c1.isLetter() && c2.isLetter() && c1.equals(other = c2, ignoreCase = true) -> {
compareLettersLowerCaseFirst(c1 = c1, c2 = c2)
}
else -> {
val upperCaseStr1 = c1.toString().uppercase(Locale.getDefault())
val upperCaseStr2 = c2.toString().uppercase(Locale.getDefault())
upperCaseStr1.compareTo(upperCaseStr2)
}
}
}
/**
* Compare two equal letters ignoring case (i.e. 'A' == 'a'), give precedence to the
* the character which is lowercase. If both [c1] and [c2] are equal and the
* same case return 0 to indicate they are the same.
*/
private fun compareLettersLowerCaseFirst(c1: Char, c2: Char): Int {
require(
value = c1.isLetter() &&
c2.isLetter() &&
c1.equals(other = c2, ignoreCase = true),
) {
"Both character must be the same letter, case does not matter."
}
return when {
!c1.isLowerCase() && c2.isLowerCase() -> 1
c1.isLowerCase() && !c2.isLowerCase() -> -1
else -> 0
}
}

View File

@ -9,13 +9,13 @@ import com.bitwarden.authenticator.data.authenticator.repository.AuthenticatorRe
import com.bitwarden.authenticator.data.authenticator.repository.model.SharedVerificationCodesState
import com.bitwarden.authenticator.data.authenticator.repository.util.itemsOrEmpty
import com.bitwarden.authenticator.data.platform.manager.clipboard.BitwardenClipboardManager
import com.bitwarden.core.data.repository.model.DataState
import com.bitwarden.authenticator.data.platform.util.SpecialCharWithPrecedenceComparator
import com.bitwarden.authenticator.ui.platform.base.BaseViewModel
import com.bitwarden.authenticator.ui.platform.base.util.Text
import com.bitwarden.authenticator.ui.platform.base.util.asText
import com.bitwarden.authenticator.ui.platform.base.util.removeDiacritics
import com.bitwarden.authenticator.ui.platform.components.model.IconData
import com.bitwarden.core.data.repository.model.DataState
import com.bitwarden.core.data.repository.util.SpecialCharWithPrecedenceComparator
import dagger.hilt.android.lifecycle.HiltViewModel
import kotlinx.coroutines.flow.combine
import kotlinx.coroutines.flow.launchIn

View File

@ -1,44 +0,0 @@
package com.bitwarden.authenticator.data.platform.util
import org.junit.jupiter.api.Assertions.assertEquals
import org.junit.jupiter.api.Test
class SpecialCharWithPrecedenceComparatorTest {
@Test
fun `Sorting with comparator should return expected result of sorted string`() {
val unsortedList = listOf(
"__Za",
"z",
"___",
"1a3",
"aBc",
"__a",
"__A",
"__a",
"__4",
"Z",
"__3",
"Abc",
)
val expectedSortedList = listOf(
"___",
"__3",
"__4",
"__a",
"__a",
"__A",
"__Za",
"1a3",
"aBc",
"Abc",
"z",
"Z",
)
assertEquals(
expectedSortedList,
unsortedList.sortedWith(SpecialCharWithPrecedenceComparator),
)
}
}

View File

@ -1,4 +1,4 @@
package com.x8bit.bitwarden.data.platform.util
package com.bitwarden.core.data.repository.util
import java.util.Locale

View File

@ -1,4 +1,4 @@
package com.x8bit.bitwarden.data.platform.util
package com.bitwarden.core.data.repository.util
import org.junit.Test
import org.junit.jupiter.api.Assertions.assertEquals