mirror of
https://github.com/bitwarden/android.git
synced 2025-12-10 20:07:59 -06:00
[PM-19640] Migrate SpecialCharWithPrecedenceComparator to core module (#4942)
This commit is contained in:
parent
b7948948f0
commit
75af4868e2
@ -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
|
||||
|
||||
@ -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
|
||||
|
||||
/**
|
||||
|
||||
@ -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
|
||||
|
||||
|
||||
@ -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
|
||||
|
||||
@ -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
|
||||
|
||||
@ -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
|
||||
|
||||
@ -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
|
||||
}
|
||||
}
|
||||
@ -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
|
||||
|
||||
@ -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),
|
||||
)
|
||||
}
|
||||
}
|
||||
@ -1,4 +1,4 @@
|
||||
package com.x8bit.bitwarden.data.platform.util
|
||||
package com.bitwarden.core.data.repository.util
|
||||
|
||||
import java.util.Locale
|
||||
|
||||
@ -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
|
||||
Loading…
x
Reference in New Issue
Block a user