Remove firstName and lastName from contact interface,

move some implementations from AndroidContact to Contact interface
This commit is contained in:
MM20 2025-04-04 00:25:17 +02:00
parent fb33c859d3
commit 7ec315dfc7
No known key found for this signature in database
GPG Key ID: 0B61A8F2DEAFA389
3 changed files with 41 additions and 29 deletions

View File

@ -1,17 +1,43 @@
package de.mm20.launcher2.search package de.mm20.launcher2.search
import android.content.Context
import android.net.Uri import android.net.Uri
import androidx.compose.material.icons.Icons
import androidx.compose.material.icons.rounded.Person
import de.mm20.launcher2.icons.ColorLayer
import de.mm20.launcher2.icons.StaticLauncherIcon
import de.mm20.launcher2.icons.TextLayer
import de.mm20.launcher2.icons.VectorLayer
interface Contact : SavableSearchable { interface Contact : SavableSearchable {
val firstName: String val name: String
val lastName: String
val displayName: String
val summary: String
val phoneNumbers: List<PhoneNumber> val phoneNumbers: List<PhoneNumber>
val emailAddresses: List<EmailAddress> val emailAddresses: List<EmailAddress>
val postalAddresses: List<PostalAddress> val postalAddresses: List<PostalAddress>
val contactApps: List<ContactApp> val contactApps: List<ContactApp>
val summary: String
get() {
return (phoneNumbers.map { it.number } + emailAddresses.map { it.address })
.joinToString(", ")
}
override fun getPlaceholderIcon(context: Context): StaticLauncherIcon {
val letter = (labelOverride ?: label).firstOrNull()?.toString()
if (letter != null) {
return StaticLauncherIcon(
foregroundLayer = TextLayer(text = letter, color = 0xFF2364AA.toInt()),
backgroundLayer = ColorLayer(0xFF2364AA.toInt())
)
}
return StaticLauncherIcon(
foregroundLayer = VectorLayer(Icons.Rounded.Person),
backgroundLayer = ColorLayer(0xFF2364AA.toInt())
)
}
override val preferDetailsOverLaunch: Boolean override val preferDetailsOverLaunch: Boolean
get() = true get() = true
} }

View File

@ -10,7 +10,6 @@ import de.mm20.launcher2.icons.ColorLayer
import de.mm20.launcher2.icons.LauncherIcon import de.mm20.launcher2.icons.LauncherIcon
import de.mm20.launcher2.icons.StaticIconLayer import de.mm20.launcher2.icons.StaticIconLayer
import de.mm20.launcher2.icons.StaticLauncherIcon import de.mm20.launcher2.icons.StaticLauncherIcon
import de.mm20.launcher2.icons.TextLayer
import de.mm20.launcher2.ktx.asBitmap import de.mm20.launcher2.ktx.asBitmap
import de.mm20.launcher2.ktx.tryStartActivity import de.mm20.launcher2.ktx.tryStartActivity
import de.mm20.launcher2.search.Contact import de.mm20.launcher2.search.Contact
@ -24,9 +23,7 @@ import kotlinx.coroutines.withContext
internal data class AndroidContact( internal data class AndroidContact(
internal val id: Long, internal val id: Long,
override val firstName: String, override val name: String,
override val lastName: String,
override val displayName: String,
override val phoneNumbers: List<PhoneNumber>, override val phoneNumbers: List<PhoneNumber>,
override val emailAddresses: List<EmailAddress>, override val emailAddresses: List<EmailAddress>,
override val postalAddresses: List<PostalAddress>, override val postalAddresses: List<PostalAddress>,
@ -39,8 +36,7 @@ internal data class AndroidContact(
override val domain: String = Domain override val domain: String = Domain
override val key: String override val key: String
get() = "$Domain://$id" get() = "$Domain://$id"
override val label: String override val label: String = name
get() = displayName.takeIf { it.isNotBlank() } ?: "$firstName $lastName"
override val summary: String override val summary: String
get() { get() {
@ -58,16 +54,6 @@ internal data class AndroidContact(
return context.tryStartActivity(intent, options) return context.tryStartActivity(intent, options)
} }
override fun getPlaceholderIcon(context: Context): StaticLauncherIcon {
val iconText =
if (firstName.isNotEmpty()) firstName[0].toString() else "" + if (lastName.isNotEmpty()) lastName[0].toString() else ""
return StaticLauncherIcon(
foregroundLayer = TextLayer(text = iconText, color = 0xFF2364AA.toInt()),
backgroundLayer = ColorLayer(0xFF2364AA.toInt())
)
}
override suspend fun loadIcon( override suspend fun loadIcon(
context: Context, context: Context,
size: Int, size: Int,

View File

@ -65,9 +65,9 @@ internal class ContactRepository(
ContactsContract.Data.CONTENT_URI, ContactsContract.Data.CONTENT_URI,
null, s, null, null null, s, null, null
) ?: return@withContext null ) ?: return@withContext null
var firstName = "" var firstName: String? = null
var lastName = "" var lastName: String? = null
var displayName = "" var displayName: String? = null
val phoneNumbers = mutableListOf<PhoneNumber>() val phoneNumbers = mutableListOf<PhoneNumber>()
val emailAddresses = mutableListOf<EmailAddress>() val emailAddresses = mutableListOf<EmailAddress>()
val postalAddresses = mutableListOf<PostalAddress>() val postalAddresses = mutableListOf<PostalAddress>()
@ -133,9 +133,9 @@ internal class ContactRepository(
} }
ContactsContract.CommonDataKinds.StructuredName.CONTENT_ITEM_TYPE -> { ContactsContract.CommonDataKinds.StructuredName.CONTENT_ITEM_TYPE -> {
firstName = dataCursor.getStringOrNull(givenNameColumn) ?: "" firstName = dataCursor.getStringOrNull(givenNameColumn)
lastName = dataCursor.getStringOrNull(familyNameColumn) ?: "" lastName = dataCursor.getStringOrNull(familyNameColumn)
displayName = dataCursor.getStringOrNull(displayNameColumn) ?: "" displayName = dataCursor.getStringOrNull(displayNameColumn)
} }
else -> { else -> {
@ -170,9 +170,9 @@ internal class ContactRepository(
return@withContext AndroidContact( return@withContext AndroidContact(
id = id, id = id,
firstName = firstName, name = displayName
lastName = lastName, ?: listOfNotNull(firstName, lastName).joinToString(" ").takeIf { it.isNotBlank() }
displayName = displayName, ?: return@withContext null,
phoneNumbers = phoneNumbers.sortedByDescending { phoneNumbers = phoneNumbers.sortedByDescending {
it.number.count { !PhoneNumberUtils.isReallyDialable(it) } it.number.count { !PhoneNumberUtils.isReallyDialable(it) }
}.map { }.map {