Skip to content

Commit 76deb15

Browse files
Added blinded contact to contact list and search result should include unapproved recipients (#1539)
1 parent 46d680f commit 76deb15

File tree

5 files changed

+60
-36
lines changed

5 files changed

+60
-36
lines changed

app/src/main/java/org/thoughtcrime/securesms/home/HomeActivity.kt

Lines changed: 9 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -163,7 +163,7 @@ class HomeActivity : ScreenLockActionBarActivity(),
163163
is GlobalSearchAdapter.Model.Contact -> ConversationActivityV2
164164
.createIntent(
165165
this,
166-
address = Address.fromSerialized(model.contact.hexString) as Address.Conversable
166+
address = model.contact
167167
)
168168

169169
is GlobalSearchAdapter.Model.GroupConversation -> ConversationActivityV2
@@ -181,13 +181,13 @@ class HomeActivity : ScreenLockActionBarActivity(),
181181
push(intent)
182182
},
183183
onContactLongPressed = { model ->
184-
onSearchContactLongPress(model.contact.hexString, model.name)
184+
onSearchContactLongPress(model.contact, model.name)
185185
}
186186
)
187187
}
188188

189-
private fun onSearchContactLongPress(accountId: String, contactName: String) {
190-
val bottomSheet = SearchContactActionBottomSheet.newInstance(accountId, contactName)
189+
private fun onSearchContactLongPress(address: Address, contactName: String) {
190+
val bottomSheet = SearchContactActionBottomSheet.newInstance(address, contactName)
191191
bottomSheet.show(supportFragmentManager, bottomSheet.tag)
192192
}
193193

@@ -408,12 +408,13 @@ class HomeActivity : ScreenLockActionBarActivity(),
408408
homeViewModel.onCancelSearchClicked()
409409
}
410410

411-
override fun onBlockContact(accountId: String) {
412-
homeViewModel.blockContact(accountId)
411+
override fun onBlockContact(address: Address) {
412+
if (address is Address.Standard) {
413+
homeViewModel.blockContact(address.address)
414+
}
413415
}
414416

415-
override fun onDeleteContact(accountId: String) {
416-
val address = accountId.toAddress()
417+
override fun onDeleteContact(address: Address) {
417418
if (address is Address.WithAccountId) {
418419
homeViewModel.deleteContact(address)
419420
}

app/src/main/java/org/thoughtcrime/securesms/home/search/GlobalSearchAdapter.kt

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -11,8 +11,10 @@ import network.loki.messenger.databinding.ViewGlobalSearchHeaderBinding
1111
import network.loki.messenger.databinding.ViewGlobalSearchResultBinding
1212
import network.loki.messenger.databinding.ViewGlobalSearchSubheaderBinding
1313
import org.session.libsession.messaging.MessagingModuleConfiguration
14+
import org.session.libsession.utilities.Address
1415
import org.session.libsession.utilities.GroupRecord
1516
import org.session.libsession.utilities.recipients.Recipient
17+
import org.session.libsession.utilities.recipients.displayName
1618
import org.session.libsignal.utilities.AccountId
1719
import org.thoughtcrime.securesms.search.model.MessageResult
1820
import org.thoughtcrime.securesms.ui.GetString
@@ -160,9 +162,9 @@ class GlobalSearchAdapter(
160162
}
161163

162164
data class SavedMessages(val currentUserPublicKey: String): Model // Note: "Note to Self" counts as SavedMessages rather than a Contact where `isSelf` is true.
163-
data class Contact(val contact: AccountId, val name: String, val isSelf: Boolean, val showProBadge: Boolean) : Model {
165+
data class Contact(val contact: Address.Conversable, val name: String, val isSelf: Boolean, val showProBadge: Boolean) : Model {
164166
constructor(contact: Recipient, isSelf: Boolean, showProBadge: Boolean):
165-
this(AccountId(contact.address.address), contact.searchName, isSelf, showProBadge)
167+
this(contact.address as Address.Conversable, contact.displayName(false), isSelf, showProBadge)
166168
}
167169
data class GroupConversation(
168170
val isLegacy: Boolean,

app/src/main/java/org/thoughtcrime/securesms/home/search/GlobalSearchAdapterUtils.kt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -140,7 +140,7 @@ fun ContentView.bindModel(query: String?, model: ContactModel) = binding.run {
140140
searchResultTimestamp.isVisible = false
141141
searchResultSubtitle.text = null
142142
val recipient = MessagingModuleConfiguration.shared.recipientRepository.getRecipientSync(
143-
Address.fromSerialized(model.contact.hexString)
143+
model.contact
144144
)
145145
searchResultProfilePicture.setThemedContent {
146146
Avatar(

app/src/main/java/org/thoughtcrime/securesms/home/search/SearchContactActionBottomSheet.kt

Lines changed: 26 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -9,10 +9,12 @@ import androidx.compose.foundation.layout.Column
99
import androidx.compose.foundation.layout.fillMaxWidth
1010
import androidx.compose.ui.Modifier
1111
import androidx.compose.ui.res.stringResource
12+
import androidx.core.os.BundleCompat
1213
import com.google.android.material.bottomsheet.BottomSheetDialogFragment
1314
import com.squareup.phrase.Phrase
1415
import dagger.hilt.android.AndroidEntryPoint
1516
import network.loki.messenger.R
17+
import org.session.libsession.utilities.Address
1618
import org.session.libsession.utilities.StringSubstitutionConstants.NAME_KEY
1719
import org.thoughtcrime.securesms.showSessionDialog
1820
import org.thoughtcrime.securesms.ui.components.ActionSheetItem
@@ -21,19 +23,19 @@ import org.thoughtcrime.securesms.ui.createThemedComposeView
2123
@AndroidEntryPoint
2224
class SearchContactActionBottomSheet : BottomSheetDialogFragment() {
2325

24-
private var accountId: String? = null
26+
private var address: Address? = null
2527
private var contactName: String? = null
2628

2729
interface Callbacks {
28-
fun onBlockContact(accountId: String)
29-
fun onDeleteContact(accountId: String)
30+
fun onBlockContact(address: Address)
31+
fun onDeleteContact(address: Address)
3032
}
3133

3234
private var callbacks: Callbacks? = null
3335

3436
override fun onCreate(savedInstanceState: Bundle?) {
3537
super.onCreate(savedInstanceState)
36-
accountId = arguments?.getString(ARG_ACCOUNT_ID)
38+
address = arguments?.let { BundleCompat.getParcelable(it, ARG_ADDRESS, Address::class.java) }
3739
contactName = arguments?.getString(ARG_CONTACT_NAME)
3840
}
3941

@@ -52,15 +54,18 @@ class SearchContactActionBottomSheet : BottomSheetDialogFragment() {
5254
Column(
5355
modifier = Modifier.fillMaxWidth()
5456
) {
55-
ActionSheetItem(
56-
text = stringResource(R.string.block),
57-
leadingIcon = R.drawable.ic_user_round_x,
58-
qaTag = stringResource(R.string.AccessibilityId_block),
59-
onClick = {
60-
showBlockConfirmation()
61-
dismiss()
62-
}
63-
)
57+
// Only standard address can be blocked
58+
if (address is Address.Standard) {
59+
ActionSheetItem(
60+
text = stringResource(R.string.block),
61+
leadingIcon = R.drawable.ic_user_round_x,
62+
qaTag = stringResource(R.string.AccessibilityId_block),
63+
onClick = {
64+
showBlockConfirmation()
65+
dismiss()
66+
}
67+
)
68+
}
6469

6570
ActionSheetItem(
6671
text = stringResource(R.string.contactDelete),
@@ -75,7 +80,7 @@ class SearchContactActionBottomSheet : BottomSheetDialogFragment() {
7580
}
7681

7782
private fun showBlockConfirmation() {
78-
val accountId = accountId ?: return
83+
val address = this@SearchContactActionBottomSheet.address ?: return
7984
val contactName = contactName ?: return
8085

8186
showSessionDialog {
@@ -85,15 +90,15 @@ class SearchContactActionBottomSheet : BottomSheetDialogFragment() {
8590
.put(NAME_KEY, contactName)
8691
.format())
8792
dangerButton(R.string.block, R.string.AccessibilityId_blockConfirm) {
88-
callbacks?.onBlockContact(accountId)
93+
callbacks?.onBlockContact(address)
8994
callbacks = null
9095
}
9196
cancelButton()
9297
}
9398
}
9499

95100
private fun showDeleteConfirmation() {
96-
val accountId = accountId ?: return
101+
val address = this@SearchContactActionBottomSheet.address ?: return
97102
val contactName = contactName ?: return
98103

99104
showSessionDialog {
@@ -104,21 +109,21 @@ class SearchContactActionBottomSheet : BottomSheetDialogFragment() {
104109
.put(NAME_KEY, contactName)
105110
.format())
106111
dangerButton(R.string.delete, R.string.AccessibilityId_delete) {
107-
callbacks?.onDeleteContact(accountId)
112+
callbacks?.onDeleteContact(address)
108113
callbacks = null
109114
}
110115
cancelButton()
111116
}
112117
}
113118

114119
companion object {
115-
private const val ARG_ACCOUNT_ID = "arg_account_id"
120+
private const val ARG_ADDRESS = "arg_address"
116121
private const val ARG_CONTACT_NAME = "arg_contact_name"
117122

118-
fun newInstance(accountId: String, contactName: String): SearchContactActionBottomSheet {
123+
fun newInstance(address: Address, contactName: String): SearchContactActionBottomSheet {
119124
return SearchContactActionBottomSheet().apply {
120-
arguments = Bundle().apply {
121-
putString(ARG_ACCOUNT_ID, accountId)
125+
arguments = Bundle(2).apply {
126+
putParcelable(ARG_ADDRESS, address)
122127
putString(ARG_CONTACT_NAME, contactName)
123128
}
124129
}

app/src/main/java/org/thoughtcrime/securesms/search/SearchRepository.kt

Lines changed: 20 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@ package org.thoughtcrime.securesms.search
33
import android.content.Context
44
import android.database.Cursor
55
import dagger.hilt.android.qualifiers.ApplicationContext
6+
import org.session.libsession.utilities.Address
67
import org.session.libsession.utilities.Address.Companion.fromSerialized
78
import org.session.libsession.utilities.Address.Companion.toAddress
89
import org.session.libsession.utilities.ConfigFactoryProtocol
@@ -12,6 +13,7 @@ import org.session.libsession.utilities.concurrent.SignalExecutors
1213
import org.session.libsession.utilities.recipients.Recipient
1314
import org.session.libsession.utilities.recipients.RecipientData
1415
import org.session.libsession.utilities.toGroupString
16+
import org.session.libsignal.utilities.AccountId
1517
import org.thoughtcrime.securesms.contacts.ContactAccessor
1618
import org.thoughtcrime.securesms.database.CursorList
1719
import org.thoughtcrime.securesms.database.GroupDatabase
@@ -89,10 +91,20 @@ class SearchRepository @Inject constructor(
8991

9092
fun queryContacts(searchName: String? = null): List<Recipient> {
9193
return configFactory.withUserConfigs { configs ->
92-
configs.contacts.all()
93-
}.asSequence()
94-
.filter { !it.blocked && it.approved }
95-
.map { it.id.toAddress() }
94+
(configs.contacts.all().asSequence()
95+
.filter { !it.blocked &&
96+
// If we are searching for contacts - we will include the unapproved ones
97+
(!searchName.isNullOrBlank() || it.approved)
98+
}
99+
.map { it.id.toAddress() }) +
100+
configs.contacts.allBlinded().asSequence()
101+
.map {
102+
Address.CommunityBlindedId(
103+
serverUrl = it.communityServer,
104+
blindedId = Address.Blinded(AccountId(it.id))
105+
)
106+
}
107+
}
96108
.map(recipientRepository::getRecipientSync)
97109
.filterNot { it.isSelf } // It is possible to have self in the contacts list so we need to weed it out
98110
.filter {
@@ -104,6 +116,10 @@ class SearchRepository @Inject constructor(
104116
it.data.name.contains(searchName, ignoreCase = true)
105117
}
106118

119+
is RecipientData.BlindedContact -> {
120+
it.data.displayName.contains(searchName, ignoreCase = true)
121+
}
122+
107123
else -> error("We should only get contacts data here but got ${it.data.javaClass}")
108124
}
109125
}

0 commit comments

Comments
 (0)