From e6f27791f651d45548d91aecb792c9cacba864f4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Igor=20Danil=C4=8Denko?= Date: Thu, 7 Mar 2024 08:23:02 +0100 Subject: [PATCH] Fix crash on sending contacts using QR code (#1066) --- .../wallet/application/DeepLinkTest.kt | 4 +- .../wallet/application/deeplinks/DeepLink.kt | 101 +++++++++--------- .../deeplinks/DeeplinkFormatter.kt | 2 +- .../deeplinks/DeeplinkViewModel.kt | 3 - .../android/wallet/di/ApplicationModule.kt | 18 ++-- .../android/wallet/di/PresentationModule.kt | 5 - .../bluetooth/TariBluetoothServer.kt | 12 ++- .../wallet/ui/common/CommonViewModel.kt | 2 +- .../contact_book/data/ContactsRepository.kt | 29 +++-- .../contact_book/data/contacts/ContactDto.kt | 11 -- .../contact_book/root/ContactBookViewModel.kt | 17 ++- .../fragment/profile/WalletInfoViewModel.kt | 14 ++- .../tari/android/wallet/util/ContactUtil.kt | 19 ++++ app/src/main/res/values/strings.xml | 1 + 14 files changed, 131 insertions(+), 107 deletions(-) create mode 100644 app/src/main/java/com/tari/android/wallet/util/ContactUtil.kt diff --git a/app/src/androidTest/java/com/tari/android/wallet/application/DeepLinkTest.kt b/app/src/androidTest/java/com/tari/android/wallet/application/DeepLinkTest.kt index ec4bd8c53..b1f19b32a 100644 --- a/app/src/androidTest/java/com/tari/android/wallet/application/DeepLinkTest.kt +++ b/app/src/androidTest/java/com/tari/android/wallet/application/DeepLinkTest.kt @@ -48,14 +48,14 @@ class DeepLinkTest { @Test fun assertBaseNodeName() { - val deeplink = "tari://${currentNetwork.uriComponent}/${DeepLink.AddBaseNode.addNodeCommand}?${DeepLink.AddBaseNode.nameKey}=base_node_test" + val deeplink = "tari://${currentNetwork.uriComponent}/${DeepLink.AddBaseNode.COMMAND_ADD_NODE}?${DeepLink.AddBaseNode.KEY_NAME}=base_node_test" val result = deeplinkHandler.handle(deeplink) as? DeepLink.AddBaseNode assertEquals(result!!.name, "base_node_test") } @Test fun assertBaseNodePeer() { - val deeplink = "tari://${currentNetwork.uriComponent}/${DeepLink.AddBaseNode.addNodeCommand}?${DeepLink.AddBaseNode.peerKey}=$PEER" + val deeplink = "tari://${currentNetwork.uriComponent}/${DeepLink.AddBaseNode.COMMAND_ADD_NODE}?${DeepLink.AddBaseNode.KEY_PEER}=$PEER" val result = deeplinkHandler.handle(deeplink) as? DeepLink.AddBaseNode assertEquals(result!!.peer, PEER) } diff --git a/app/src/main/java/com/tari/android/wallet/application/deeplinks/DeepLink.kt b/app/src/main/java/com/tari/android/wallet/application/deeplinks/DeepLink.kt index df785c986..6d026e5d4 100644 --- a/app/src/main/java/com/tari/android/wallet/application/deeplinks/DeepLink.kt +++ b/app/src/main/java/com/tari/android/wallet/application/deeplinks/DeepLink.kt @@ -47,36 +47,37 @@ sealed class DeepLink { open fun getParams(): Map = emptyMap() open fun getCommand(): String = "" - // tari://esmeralda/contacts?list[0][alias]=Name&list[0][hex]=hex&list[1][alias]=Name&list[1][hex]=hex - class Contacts(val contacts: List) : DeepLink() { + data class Contacts(val contacts: List) : DeepLink() { - constructor(params: Map) : this(params.filterKeys { it.startsWith("list[") } + constructor(params: Map) : this( + contacts = params.filterKeys { it.startsWith("list[") } .map { FormatExtractor(it.key, it.value) } .groupBy { it.index } - .map { - val alias = it.value.firstOrNull { it.name == aliasKey }?.value.orEmpty() - val hex = it.value.firstOrNull { it.name == hexKey }?.value.orEmpty() + .map { param -> + val alias = param.value.firstOrNull { it.name == KEY_ALIAS }?.value.orEmpty() + val hex = param.value.firstOrNull { it.name == KEY_HEX }?.value.orEmpty() DeeplinkContact(alias, hex) } - .filter { TariWalletAddress.validate(it.hex) }) + .filter { TariWalletAddress.validate(it.hex) }, + ) override fun getParams(): Map = hashMapOf().apply { contacts.forEachIndexed { index, contact -> - put("list[$index][$aliasKey]", contact.alias) - put("list[$index][$hexKey]", contact.hex) + put("list[$index][$KEY_ALIAS]", contact.alias) + put("list[$index][$KEY_HEX]", contact.hex) } } - override fun getCommand(): String = contactsCommand + override fun getCommand(): String = COMMAND_CONTACTS companion object { - const val contactsCommand = "contacts" - const val aliasKey = "alias" - const val hexKey = "hex" + const val COMMAND_CONTACTS = "contacts" + const val KEY_ALIAS = "alias" + const val KEY_HEX = "hex" } - class DeeplinkContact(val alias: String, val hex: String) + data class DeeplinkContact(val alias: String, val hex: String) class FormatExtractor(val key: String, val value: String = "") { val index: Int @@ -94,84 +95,82 @@ sealed class DeepLink { } } - class Send(val walletAddressHex: String = "", val amount: MicroTari? = null, val note: String = "") : DeepLink() { + data class Send(val walletAddressHex: String = "", val amount: MicroTari? = null, val note: String = "") : DeepLink() { constructor(params: Map) : this( - params[tariAddressKey].orEmpty(), - params[amountKey]?.let { if (it.isEmpty()) null else MicroTari(it.parseToBigInteger()) }, - params[noteKey].orEmpty() + params[KEY_TARI_ADDRESS].orEmpty(), + params[KEY_AMOUNT]?.let { if (it.isEmpty()) null else MicroTari(it.parseToBigInteger()) }, + params[KEY_NOTE].orEmpty() ) override fun getParams(): Map = hashMapOf().apply { - put(tariAddressKey, walletAddressHex) - put(amountKey, amount?.formattedValue.orEmpty()) - put(noteKey, note) + put(KEY_TARI_ADDRESS, walletAddressHex) + put(KEY_AMOUNT, amount?.formattedValue.orEmpty()) + put(KEY_NOTE, note) } - override fun getCommand(): String = sendCommand + override fun getCommand(): String = COMMAND_SEND companion object { - const val sendCommand = "transactions/send" - const val tariAddressKey = "tariAddress" - const val amountKey = "amount" - const val noteKey = "note" + const val COMMAND_SEND = "transactions/send" + const val KEY_TARI_ADDRESS = "tariAddress" + const val KEY_AMOUNT = "amount" + const val KEY_NOTE = "note" } } - class UserProfile(val tariAddressHex: String = "", val alias: String = "") : DeepLink() { + data class UserProfile(val tariAddressHex: String = "", val alias: String = "") : DeepLink() { constructor(params: Map) : this( - params[walletAddressKey].orEmpty(), - params[aliasKey].orEmpty() + params[KEY_WALLET_ADDRESS].orEmpty(), + params[KEY_ALIAS].orEmpty(), ) override fun getParams(): Map = hashMapOf().apply { - put(walletAddressKey, tariAddressHex) - put(aliasKey, alias) + put(KEY_WALLET_ADDRESS, tariAddressHex) + put(KEY_ALIAS, alias) } - override fun getCommand(): String = profileCommand + override fun getCommand(): String = COMMAND_PROFILE companion object { - const val profileCommand = "profile" - const val walletAddressKey = "tariAddress" - const val aliasKey = "alias" + const val COMMAND_PROFILE = "profile" + const val KEY_WALLET_ADDRESS = "tariAddress" + const val KEY_ALIAS = "alias" } } - class AddBaseNode(val name: String = "", val peer: String = "") : DeepLink() { + data class AddBaseNode(val name: String = "", val peer: String = "") : DeepLink() { constructor(params: Map) : this( - params[nameKey].orEmpty(), - params[peerKey].orEmpty(), + params[KEY_NAME].orEmpty(), + params[KEY_PEER].orEmpty(), ) override fun getParams(): Map = hashMapOf().apply { - put(nameKey, name) - put(peerKey, peer) + put(KEY_NAME, name) + put(KEY_PEER, peer) } - override fun getCommand(): String = addNodeCommand + override fun getCommand(): String = COMMAND_ADD_NODE companion object { - const val addNodeCommand = "base_nodes/add" - const val nameKey = "name" - const val peerKey = "peer" + const val COMMAND_ADD_NODE = "base_nodes/add" + const val KEY_NAME = "name" + const val KEY_PEER = "peer" } } - class TorBridges(val torConfigurations: List): DeepLink() { - - } + data class TorBridges(val torConfigurations: List) : DeepLink() companion object { fun getByCommand(command: String, params: Map): DeepLink? = when (command) { - Contacts.contactsCommand -> Contacts(params) - Send.sendCommand -> Send(params) - AddBaseNode.addNodeCommand -> AddBaseNode(params) - UserProfile.profileCommand -> UserProfile(params) + Contacts.COMMAND_CONTACTS -> Contacts(params) + Send.COMMAND_SEND -> Send(params) + AddBaseNode.COMMAND_ADD_NODE -> AddBaseNode(params) + UserProfile.COMMAND_PROFILE -> UserProfile(params) else -> null } } diff --git a/app/src/main/java/com/tari/android/wallet/application/deeplinks/DeeplinkFormatter.kt b/app/src/main/java/com/tari/android/wallet/application/deeplinks/DeeplinkFormatter.kt index f73e8b20f..5e86e69fb 100644 --- a/app/src/main/java/com/tari/android/wallet/application/deeplinks/DeeplinkFormatter.kt +++ b/app/src/main/java/com/tari/android/wallet/application/deeplinks/DeeplinkFormatter.kt @@ -24,7 +24,7 @@ class DeeplinkFormatter @Inject constructor(private val networkRepository: Netwo var paramentrs = uri.queryParameterNames.associateWith { uri.getQueryParameter(it).orEmpty() }.toMutableMap() val command = uri.path.orEmpty().trimStart('/') - if (command == DeepLink.Contacts.contactsCommand) { + if (command == DeepLink.Contacts.COMMAND_CONTACTS) { val values = uri.query.orEmpty().split("&").map { val (key, value) = it.split("=") key to value diff --git a/app/src/main/java/com/tari/android/wallet/application/deeplinks/DeeplinkViewModel.kt b/app/src/main/java/com/tari/android/wallet/application/deeplinks/DeeplinkViewModel.kt index c538de353..aa8e8ff81 100644 --- a/app/src/main/java/com/tari/android/wallet/application/deeplinks/DeeplinkViewModel.kt +++ b/app/src/main/java/com/tari/android/wallet/application/deeplinks/DeeplinkViewModel.kt @@ -141,9 +141,6 @@ class DeeplinkViewModel : CommonViewModel() { }.getOrNull() private fun addContactsAction(contacts: List, isQrData: Boolean) { - if (isQrData) { - backPressed.postValue(Unit) - } contacts.forEach { contactRepository.addContact(it) } } diff --git a/app/src/main/java/com/tari/android/wallet/di/ApplicationModule.kt b/app/src/main/java/com/tari/android/wallet/di/ApplicationModule.kt index 239bb12b0..63f37e812 100644 --- a/app/src/main/java/com/tari/android/wallet/di/ApplicationModule.kt +++ b/app/src/main/java/com/tari/android/wallet/di/ApplicationModule.kt @@ -33,30 +33,24 @@ package com.tari.android.wallet.di import android.app.KeyguardManager -import android.content.* +import android.content.ClipboardManager +import android.content.Context import android.content.Context.MODE_PRIVATE +import android.content.SharedPreferences import androidx.biometric.BiometricManager import androidx.core.content.ContextCompat import com.tari.android.wallet.BuildConfig import com.tari.android.wallet.application.TariWalletApplication -import com.tari.android.wallet.application.deeplinks.DeeplinkHandler import com.tari.android.wallet.data.WalletConfig -import com.tari.android.wallet.data.sharedPrefs.SharedPrefsRepository -import com.tari.android.wallet.data.sharedPrefs.baseNode.BaseNodeSharedRepository import com.tari.android.wallet.data.sharedPrefs.network.NetworkRepository import com.tari.android.wallet.data.sharedPrefs.network.NetworkRepositoryImpl -import com.tari.android.wallet.data.sharedPrefs.securityStages.SecurityStagesRepository import com.tari.android.wallet.data.sharedPrefs.tariSettings.TariSettingsSharedRepository -import com.tari.android.wallet.data.sharedPrefs.tor.TorSharedRepository -import com.tari.android.wallet.infrastructure.logging.LoggerAdapter import com.tari.android.wallet.infrastructure.security.biometric.BiometricAuthenticationService import com.tari.android.wallet.notification.NotificationHelper import com.tari.android.wallet.service.service.WalletServiceLauncher -import com.tari.android.wallet.ui.common.domain.PaletteManager import com.tari.android.wallet.ui.common.domain.ResourceManager import com.tari.android.wallet.ui.common.gyphy.GiphyAdapter -import com.tari.android.wallet.ui.fragment.settings.backup.data.BackupSettingsRepository -import com.tari.android.wallet.yat.YatSharedRepository +import com.tari.android.wallet.util.ContactUtil import dagger.Module import dagger.Provides import java.io.File @@ -123,6 +117,10 @@ class ApplicationModule(private val app: TariWalletApplication) { @Singleton fun provideGiphyAdapter(context: Context): GiphyAdapter = GiphyAdapter(context, BuildConfig.GIPHY_KEY) + @Provides + @Singleton + fun provideContactUtil(resourceManager: ResourceManager): ContactUtil = ContactUtil(resourceManager) + companion object { const val sharedPrefsFileName = "tari_wallet_shared_prefs" } diff --git a/app/src/main/java/com/tari/android/wallet/di/PresentationModule.kt b/app/src/main/java/com/tari/android/wallet/di/PresentationModule.kt index d1f8b7096..b6e7e3e2d 100644 --- a/app/src/main/java/com/tari/android/wallet/di/PresentationModule.kt +++ b/app/src/main/java/com/tari/android/wallet/di/PresentationModule.kt @@ -32,14 +32,9 @@ */ package com.tari.android.wallet.di -import android.content.Context -import android.content.SharedPreferences import com.tari.android.wallet.BuildConfig -import com.tari.android.wallet.data.sharedPrefs.network.NetworkRepository -import com.tari.android.wallet.ui.common.gyphy.GiphyKeywordsRepository import com.tari.android.wallet.ui.common.gyphy.repository.GIFRepository import com.tari.android.wallet.ui.common.gyphy.repository.GiphyRESTRetrofitRepository -import com.tari.android.wallet.ui.fragment.settings.backup.data.BackupSettingsRepository import dagger.Module import dagger.Provides import okhttp3.Interceptor diff --git a/app/src/main/java/com/tari/android/wallet/infrastructure/bluetooth/TariBluetoothServer.kt b/app/src/main/java/com/tari/android/wallet/infrastructure/bluetooth/TariBluetoothServer.kt index a8cc28c27..7a28fdfb7 100644 --- a/app/src/main/java/com/tari/android/wallet/infrastructure/bluetooth/TariBluetoothServer.kt +++ b/app/src/main/java/com/tari/android/wallet/infrastructure/bluetooth/TariBluetoothServer.kt @@ -13,7 +13,7 @@ import com.tari.android.wallet.data.sharedPrefs.bluetooth.BluetoothServerState import com.tari.android.wallet.data.sharedPrefs.bluetooth.ShareSettingsRepository import com.tari.android.wallet.extension.addTo import com.tari.android.wallet.model.TariWalletAddress -import com.tari.android.wallet.ui.fragment.contact_book.data.contacts.ContactDto +import com.tari.android.wallet.util.ContactUtil import com.welie.blessed.BluetoothCentral import com.welie.blessed.BluetoothPeripheralManager import com.welie.blessed.BluetoothPeripheralManagerCallback @@ -30,7 +30,8 @@ import javax.inject.Singleton @Singleton class TariBluetoothServer @Inject constructor( private val shareSettingsRepository: ShareSettingsRepository, - val deeplinkHandler: DeeplinkHandler, + private val deeplinkHandler: DeeplinkHandler, + private val contactUtil: ContactUtil, ) : TariBluetoothAdapter() { private var bluetoothGattServer: BluetoothGattServer? = null @@ -147,8 +148,11 @@ class TariBluetoothServer @Inject constructor( } val data = deeplinkHandler.getDeeplink( DeepLink.UserProfile( - sharedPrefsRepository.publicKeyHexString.orEmpty(), - ContactDto.normalizeAlias((sharedPrefsRepository.name.orEmpty() + " " + sharedPrefsRepository.surname).trim(), myWalletAddress), + tariAddressHex = sharedPrefsRepository.publicKeyHexString.orEmpty(), + alias = contactUtil.normalizeAlias( + alias = (sharedPrefsRepository.name.orEmpty() + " " + sharedPrefsRepository.surname).trim(), + walletAddress = myWalletAddress, + ), ) ) logger.i("contactlessPayment: read: whole data: $data") diff --git a/app/src/main/java/com/tari/android/wallet/ui/common/CommonViewModel.kt b/app/src/main/java/com/tari/android/wallet/ui/common/CommonViewModel.kt index 4d384d22a..92c2680ec 100644 --- a/app/src/main/java/com/tari/android/wallet/ui/common/CommonViewModel.kt +++ b/app/src/main/java/com/tari/android/wallet/ui/common/CommonViewModel.kt @@ -79,7 +79,7 @@ open class CommonViewModel : ViewModel() { private var authorizedAction: (() -> Unit)? = null val logger: Printer - get() = Logger.t(this::class.simpleName).t(LoggerTags.UI.name) + get() = Logger.t(this::class.simpleName) val currentTheme = SingleLiveEvent() diff --git a/app/src/main/java/com/tari/android/wallet/ui/fragment/contact_book/data/ContactsRepository.kt b/app/src/main/java/com/tari/android/wallet/ui/fragment/contact_book/data/ContactsRepository.kt index 5df80b4be..f136aaa29 100644 --- a/app/src/main/java/com/tari/android/wallet/ui/fragment/contact_book/data/ContactsRepository.kt +++ b/app/src/main/java/com/tari/android/wallet/ui/fragment/contact_book/data/ContactsRepository.kt @@ -20,6 +20,7 @@ import com.tari.android.wallet.ui.fragment.contact_book.data.contacts.MergedCont import com.tari.android.wallet.ui.fragment.contact_book.data.contacts.PhoneContactDto import com.tari.android.wallet.ui.fragment.contact_book.data.contacts.YatDto import com.tari.android.wallet.ui.fragment.contact_book.data.localStorage.ContactSharedPrefRepository +import com.tari.android.wallet.util.ContactUtil import contacts.core.Contacts import contacts.core.Fields import contacts.core.entities.NewName @@ -43,7 +44,8 @@ import kotlin.system.measureNanoTime @Singleton class ContactsRepository @Inject constructor( val context: Context, - private val contactSharedPrefRepository: ContactSharedPrefRepository + private val contactSharedPrefRepository: ContactSharedPrefRepository, + private val contactUtil: ContactUtil, ) : CommonViewModel() { val publishSubject = BehaviorSubject.create>() @@ -223,9 +225,14 @@ class ContactsRepository @Inject constructor( viewModelScope.launch(Dispatchers.IO) { for (item in list.mapNotNull { it.getFFIDto() }) { val error = WalletError() - service.updateContact(item.walletAddress, item.getAlias(), item.isFavorite, error) + service.updateContact( + item.walletAddress, + contactUtil.normalizeAlias(item.getAlias(), item.walletAddress), + item.isFavorite, + error, + ) if (error.code != WalletError.NoError.code) { - logger.i("Error updating contact: ${error.code}, ${error.code}") + logger.i("Error updating contact: ${error.signature}") } } } @@ -454,14 +461,14 @@ class ContactsRepository @Inject constructor( for (item in contacts) { val contact = PhoneContact( - item.id, - item.firstName, - item.surname, - item.displayName, - item.avatar, - item.yat, - item.phoneEmojiId, - item.isFavorite + id = item.id, + firstName = item.firstName, + surname = item.surname, + displayName = item.displayName, + yat = item.yat, + emojiId = item.phoneEmojiId, + avatar = item.avatar, + isFavorite = item.isFavorite, ) saveNamesToPhoneBook(contact) saveStarredToPhoneBook(contact) diff --git a/app/src/main/java/com/tari/android/wallet/ui/fragment/contact_book/data/contacts/ContactDto.kt b/app/src/main/java/com/tari/android/wallet/ui/fragment/contact_book/data/contacts/ContactDto.kt index 744b9c39b..b9976bc92 100644 --- a/app/src/main/java/com/tari/android/wallet/ui/fragment/contact_book/data/contacts/ContactDto.kt +++ b/app/src/main/java/com/tari/android/wallet/ui/fragment/contact_book/data/contacts/ContactDto.kt @@ -2,9 +2,7 @@ package com.tari.android.wallet.ui.fragment.contact_book.data.contacts import com.tari.android.wallet.R import com.tari.android.wallet.data.sharedPrefs.delegates.SerializableTime -import com.tari.android.wallet.model.TariWalletAddress import com.tari.android.wallet.ui.fragment.contact_book.data.ContactAction -import com.tari.android.wallet.util.extractEmojis import java.io.Serializable import java.util.UUID @@ -64,14 +62,5 @@ data class ContactDto( fun getMergedDto(): MergedContactDto? = (contact as? MergedContactDto) - companion object { - fun getDefaultAlias(walletAddress: TariWalletAddress): String = - "Aurora User " + walletAddress.emojiId.extractEmojis().take(3).joinToString("") - - fun normalizeAlias(alias: String?, walletAddress: TariWalletAddress): String { - return alias.orEmpty().ifBlank { getDefaultAlias(walletAddress) } - } - } - override fun hashCode(): Int = HashcodeUtils.generate(contact, uuid, lastUsedDate) } \ No newline at end of file diff --git a/app/src/main/java/com/tari/android/wallet/ui/fragment/contact_book/root/ContactBookViewModel.kt b/app/src/main/java/com/tari/android/wallet/ui/fragment/contact_book/root/ContactBookViewModel.kt index dfc0d8dbf..36198b3b3 100644 --- a/app/src/main/java/com/tari/android/wallet/ui/fragment/contact_book/root/ContactBookViewModel.kt +++ b/app/src/main/java/com/tari/android/wallet/ui/fragment/contact_book/root/ContactBookViewModel.kt @@ -12,6 +12,7 @@ import com.tari.android.wallet.ui.fragment.contact_book.data.contacts.ContactDto import com.tari.android.wallet.ui.fragment.contact_book.root.share.ShareOptionArgs import com.tari.android.wallet.ui.fragment.contact_book.root.share.ShareType import com.tari.android.wallet.ui.fragment.home.navigation.Navigation +import com.tari.android.wallet.util.ContactUtil import javax.inject.Inject class ContactBookViewModel : CommonViewModel() { @@ -28,6 +29,9 @@ class ContactBookViewModel : CommonViewModel() { @Inject lateinit var deeplinkFormatter: DeeplinkFormatter + @Inject + lateinit var contactUtil: ContactUtil + val shareList = MutableLiveData>() val walletAddressViewModel = WalletAddressViewModel() @@ -90,11 +94,11 @@ class ContactBookViewModel : CommonViewModel() { navigation.postValue(Navigation.TxListNavigation.ToSendTariToUser(contact)) } - fun shareViaQrCode() = setSelectedToShareType(ShareType.QR_CODE) + private fun shareViaQrCode() = setSelectedToShareType(ShareType.QR_CODE) - fun shareViaLink() = setSelectedToShareType(ShareType.LINK) + private fun shareViaLink() = setSelectedToShareType(ShareType.LINK) - fun shareViaBLE() = setSelectedToShareType(ShareType.BLE) + private fun shareViaBLE() = setSelectedToShareType(ShareType.BLE) fun shareSelectedContacts() { val args = shareList.value!!.first { it.isSelected } @@ -105,7 +109,12 @@ class ContactBookViewModel : CommonViewModel() { } private fun getDeeplink(selectedContacts: List): String { - val contacts = selectedContacts.map { DeepLink.Contacts.DeeplinkContact(ContactDto.normalizeAlias(it.contact.getAlias(), it.contact.extractWalletAddress()), it.contact.extractWalletAddress().hexString) } + val contacts = selectedContacts.map { + DeepLink.Contacts.DeeplinkContact( + alias = contactUtil.normalizeAlias(it.contact.getAlias(), it.contact.extractWalletAddress()), + hex = it.contact.extractWalletAddress().hexString, + ) + } return deeplinkHandler.getDeeplink(DeepLink.Contacts(contacts)) } diff --git a/app/src/main/java/com/tari/android/wallet/ui/fragment/profile/WalletInfoViewModel.kt b/app/src/main/java/com/tari/android/wallet/ui/fragment/profile/WalletInfoViewModel.kt index 54f9132ce..6fbacc55e 100644 --- a/app/src/main/java/com/tari/android/wallet/ui/fragment/profile/WalletInfoViewModel.kt +++ b/app/src/main/java/com/tari/android/wallet/ui/fragment/profile/WalletInfoViewModel.kt @@ -15,10 +15,10 @@ import com.tari.android.wallet.ui.dialog.modular.DialogArgs import com.tari.android.wallet.ui.dialog.modular.ModularDialogArgs import com.tari.android.wallet.ui.dialog.modular.modules.head.HeadModule import com.tari.android.wallet.ui.dialog.modular.modules.input.InputModule -import com.tari.android.wallet.ui.fragment.contact_book.data.contacts.ContactDto import com.tari.android.wallet.ui.fragment.contact_book.root.ShareViewModel import com.tari.android.wallet.ui.fragment.contact_book.root.share.ShareType import com.tari.android.wallet.ui.fragment.home.navigation.Navigation +import com.tari.android.wallet.util.ContactUtil import com.tari.android.wallet.yat.YatAdapter import com.tari.android.wallet.yat.YatSharedRepository import kotlinx.coroutines.Dispatchers @@ -39,6 +39,9 @@ class WalletInfoViewModel : CommonViewModel() { @Inject lateinit var deeplinkHandler: DeeplinkHandler + @Inject + lateinit var contactUtil: ContactUtil + private val _emojiId: MutableLiveData = MutableLiveData() val emojiId: LiveData = _emojiId @@ -103,11 +106,14 @@ class WalletInfoViewModel : CommonViewModel() { } fun shareData(type: ShareType) { - val name = alias.value.orEmpty() - val hex = ContactDto.normalizeAlias(sharedPrefsWrapper.publicKeyHexString.orEmpty(), TariWalletAddress().apply { + val walletAddress = TariWalletAddress().apply { hexString = sharedPrefsWrapper.publicKeyHexString.orEmpty() emojiId = sharedPrefsWrapper.emojiId.orEmpty() - }) + } + + val name = contactUtil.normalizeAlias(alias.value.orEmpty(), walletAddress) + val hex = sharedPrefsWrapper.publicKeyHexString.orEmpty() + val deeplink = deeplinkHandler.getDeeplink(DeepLink.UserProfile(hex, name)) ShareViewModel.currentInstant?.share(type, deeplink) } diff --git a/app/src/main/java/com/tari/android/wallet/util/ContactUtil.kt b/app/src/main/java/com/tari/android/wallet/util/ContactUtil.kt new file mode 100644 index 000000000..e15185b45 --- /dev/null +++ b/app/src/main/java/com/tari/android/wallet/util/ContactUtil.kt @@ -0,0 +1,19 @@ +package com.tari.android.wallet.util + +import com.tari.android.wallet.R +import com.tari.android.wallet.model.TariWalletAddress +import com.tari.android.wallet.ui.common.domain.ResourceManager +import javax.inject.Inject +import javax.inject.Singleton + +@Singleton +class ContactUtil @Inject constructor( + private val resourceManager: ResourceManager, +) { + fun normalizeAlias(alias: String?, walletAddress: TariWalletAddress): String { + return alias.orEmpty().ifBlank { getDefaultAlias(walletAddress) } + } + + private fun getDefaultAlias(walletAddress: TariWalletAddress): String = + resourceManager.getString(R.string.contact_book_default_alias, walletAddress.emojiId.extractEmojis().take(3).joinToString("")) +} \ No newline at end of file diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index ef75d6f5e..f96880682 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -846,6 +846,7 @@ Edit Name Contact name here Share QR Code + Aurora user %s Share via BLE Bring the smartphone close to a BLE enabled device