Remove firstName and lastName from contact interface,
move some implementations from AndroidContact to Contact interface
This commit is contained in:
parent
fb33c859d3
commit
7ec315dfc7
@ -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
|
||||||
}
|
}
|
||||||
|
|||||||
@ -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,
|
||||||
|
|||||||
@ -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 {
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user