Skip to content

Commit ea4f763

Browse files
Merge branch 'dev' into release/1.28.0
2 parents 7d207f3 + b60fdb5 commit ea4f763

File tree

66 files changed

+1952
-570
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

66 files changed

+1952
-570
lines changed

app/src/main/java/org/session/libsession/messaging/sending_receiving/MessageSender.kt

Lines changed: 0 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,6 @@ import nl.komponents.kovenant.Promise
1515
import nl.komponents.kovenant.deferred
1616
import org.session.libsession.messaging.MessagingModuleConfiguration
1717
import org.session.libsession.messaging.jobs.JobQueue
18-
import org.session.libsession.messaging.jobs.MessageSendJob
1918
import org.session.libsession.messaging.messages.Destination
2019
import org.session.libsession.messaging.messages.Message
2120
import org.session.libsession.messaging.messages.applyExpiryMode
@@ -33,10 +32,8 @@ import org.session.libsession.messaging.utilities.MessageWrapper
3332
import org.session.libsession.snode.SnodeAPI
3433
import org.session.libsession.snode.SnodeAPI.nowWithOffset
3534
import org.session.libsession.snode.SnodeMessage
36-
import org.session.libsession.snode.SnodeModule
3735
import org.session.libsession.snode.utilities.asyncPromise
3836
import org.session.libsession.utilities.Address
39-
import org.session.libsession.utilities.GroupUtil
4037
import org.session.libsession.utilities.SSKEnvironment
4138
import org.session.libsignal.crypto.PushTransportDetails
4239
import org.session.libsignal.protos.SignalServiceProtos
@@ -210,9 +207,6 @@ object MessageSender {
210207
// Set the failure handler (need it here already for precondition failure handling)
211208
fun handleFailure(error: Exception) {
212209
handleFailedMessageSend(message, error, isSyncMessage)
213-
if (destination is Destination.Contact && message is VisibleMessage && !isSelfSend()) {
214-
SnodeModule.shared.broadcaster.broadcast("messageFailed", message.sentTimestamp!!)
215-
}
216210
}
217211

218212
try {

app/src/main/java/org/session/libsession/snode/SnodeAPI.kt

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -58,8 +58,6 @@ import kotlin.properties.Delegates.observable
5858
object SnodeAPI {
5959
internal val database: LokiAPIDatabaseProtocol
6060
get() = SnodeModule.shared.storage
61-
private val broadcaster: Broadcaster
62-
get() = SnodeModule.shared.broadcaster
6361

6462
private var snodeFailureCount: MutableMap<Snode, Int> = mutableMapOf()
6563

@@ -1088,7 +1086,6 @@ object SnodeAPI {
10881086
400, 500, 502, 503 -> handleBadSnode()
10891087
406 -> {
10901088
Log.d("Loki", "The user's clock is out of sync with the service node network.")
1091-
broadcaster.broadcast("clockOutOfSync")
10921089
throw Error.ClockOutOfSync
10931090
}
10941091
421 -> {

app/src/main/java/org/session/libsession/snode/SnodeModule.kt

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -11,12 +11,9 @@ import javax.inject.Singleton
1111

1212
@Singleton
1313
class SnodeModule @Inject constructor(
14-
application: Application,
1514
val storage: LokiAPIDatabaseProtocol,
1615
prefs: TextSecurePreferences,
1716
) {
18-
19-
val broadcaster: Broadcaster = org.thoughtcrime.securesms.util.Broadcaster(application)
2017
val environment: Environment = prefs.getEnvironment()
2118

2219
companion object {

app/src/main/java/org/session/libsession/utilities/TextSecurePreferences.kt

Lines changed: 4 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -167,7 +167,6 @@ interface TextSecurePreferences {
167167
fun hasHiddenMessageRequests(): Boolean
168168
fun setHasHiddenMessageRequests(hidden: Boolean)
169169
fun forceCurrentUserAsPro(): Boolean
170-
fun watchProStatus(): StateFlow<Boolean>
171170
fun setForceCurrentUserAsPro(isPro: Boolean)
172171
fun forceOtherUsersAsPro(): Boolean
173172
fun setForceOtherUsersAsPro(isPro: Boolean)
@@ -971,7 +970,6 @@ class AppTextSecurePreferences @Inject constructor(
971970
@ApplicationContext private val context: Context
972971
): TextSecurePreferences {
973972
private val localNumberState = MutableStateFlow(getStringPreference(TextSecurePreferences.LOCAL_NUMBER_PREF, null))
974-
private val proState = MutableStateFlow(getBooleanPreference(SET_FORCE_CURRENT_USER_PRO, false))
975973
private val postProLaunchState = MutableStateFlow(getBooleanPreference(SET_FORCE_POST_PRO, false))
976974
private val hiddenPasswordState = MutableStateFlow(getBooleanPreference(HIDE_PASSWORD, false))
977975

@@ -1530,11 +1528,7 @@ class AppTextSecurePreferences @Inject constructor(
15301528

15311529
override fun setForceCurrentUserAsPro(isPro: Boolean) {
15321530
setBooleanPreference(SET_FORCE_CURRENT_USER_PRO, isPro)
1533-
proState.update { isPro }
1534-
}
1535-
1536-
override fun watchProStatus(): StateFlow<Boolean> {
1537-
return proState
1531+
_events.tryEmit(SET_FORCE_CURRENT_USER_PRO)
15381532
}
15391533

15401534
override fun forceOtherUsersAsPro(): Boolean {
@@ -1543,6 +1537,7 @@ class AppTextSecurePreferences @Inject constructor(
15431537

15441538
override fun setForceOtherUsersAsPro(isPro: Boolean) {
15451539
setBooleanPreference(SET_FORCE_OTHER_USERS_PRO, isPro)
1540+
_events.tryEmit(SET_FORCE_OTHER_USERS_PRO)
15461541
}
15471542

15481543
override fun forceIncomingMessagesAsPro(): Boolean {
@@ -1560,6 +1555,7 @@ class AppTextSecurePreferences @Inject constructor(
15601555
override fun setForcePostPro(postPro: Boolean) {
15611556
setBooleanPreference(SET_FORCE_POST_PRO, postPro)
15621557
postProLaunchState.update { postPro }
1558+
_events.tryEmit(SET_FORCE_POST_PRO)
15631559
}
15641560

15651561
override fun watchPostProStatus(): StateFlow<Boolean> {
@@ -1741,6 +1737,7 @@ class AppTextSecurePreferences @Inject constructor(
17411737

17421738
override fun setDebugSubscriptionType(status: DebugMenuViewModel.DebugSubscriptionStatus?) {
17431739
setStringPreference(TextSecurePreferences.DEBUG_SUBSCRIPTION_STATUS, status?.name)
1740+
_events.tryEmit(TextSecurePreferences.DEBUG_SUBSCRIPTION_STATUS)
17441741
}
17451742

17461743
override fun getSubscriptionProvider(): String? {

app/src/main/java/org/thoughtcrime/securesms/InputbarViewModel.kt

Lines changed: 14 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,9 @@ import kotlinx.coroutines.flow.StateFlow
88
import kotlinx.coroutines.flow.update
99
import network.loki.messenger.R
1010
import org.session.libsession.utilities.StringSubstitutionConstants.LIMIT_KEY
11+
import org.session.libsession.utilities.recipients.isPro
12+
import org.session.libsession.utilities.recipients.shouldShowProBadge
13+
import org.thoughtcrime.securesms.database.RecipientRepository
1114
import org.thoughtcrime.securesms.pro.ProStatusManager
1215
import org.thoughtcrime.securesms.ui.SimpleDialogData
1316
import org.thoughtcrime.securesms.util.NumberUtil
@@ -17,17 +20,20 @@ private const val CHARACTER_LIMIT_THRESHOLD = 200
1720

1821
abstract class InputbarViewModel(
1922
private val application: Application,
20-
private val proStatusManager: ProStatusManager
23+
private val proStatusManager: ProStatusManager,
24+
private val recipientRepository: RecipientRepository,
2125
): ViewModel() {
2226
protected val _inputBarState = MutableStateFlow(InputBarState())
2327
val inputBarState: StateFlow<InputBarState> get() = _inputBarState
2428

2529
private val _inputBarStateDialogsState = MutableStateFlow(InputBarDialogsState())
2630
val inputBarStateDialogsState: StateFlow<InputBarDialogsState> = _inputBarStateDialogsState
2731

32+
val currentUserProStatus by lazy { recipientRepository.getSelf().proStatus }
33+
2834
fun onTextChanged(text: CharSequence) {
2935
// check the character limit
30-
val maxChars = proStatusManager.getCharacterLimit()
36+
val maxChars = proStatusManager.getCharacterLimit(currentUserProStatus)
3137
val charsLeft = maxChars - text.length
3238

3339
// update the char limit state based on characters left
@@ -36,7 +42,7 @@ abstract class InputbarViewModel(
3642
count = charsLeft,
3743
countFormatted = NumberUtil.getFormattedNumber(charsLeft.toLong()),
3844
danger = charsLeft < 0,
39-
showProBadge = proStatusManager.isPostPro() && !proStatusManager.isCurrentUserPro() // only show the badge for non pro users POST pro launch
45+
showProBadge = proStatusManager.isPostPro() && currentUserProStatus.shouldShowProBadge() // only show the badge for non pro users POST pro launch
4046
)
4147
} else {
4248
null
@@ -52,7 +58,7 @@ abstract class InputbarViewModel(
5258
// the user is trying to send a message that is too long - we should display a dialog
5359
// we currently have different logic for PRE and POST Pro launch
5460
// which we can remove once Pro is out - currently we can switch this fro the debug menu
55-
if(!proStatusManager.isPostPro() || proStatusManager.isCurrentUserPro()){
61+
if(!proStatusManager.isPostPro() || currentUserProStatus.isPro()){
5662
showMessageTooLongSendDialog()
5763
} else {
5864
showSessionProCTA()
@@ -67,7 +73,7 @@ abstract class InputbarViewModel(
6773
fun onCharLimitTapped(){
6874
// we currently have different logic for PRE and POST Pro launch
6975
// which we can remove once Pro is out - currently we can switch this fro the debug menu
70-
if(!proStatusManager.isPostPro() || proStatusManager.isCurrentUserPro()){
76+
if(!proStatusManager.isPostPro() || currentUserProStatus.isPro()){
7177
handleCharLimitTappedForProUser()
7278
} else {
7379
handleCharLimitTappedForRegularUser()
@@ -101,7 +107,7 @@ abstract class InputbarViewModel(
101107
message = application.resources.getQuantityString(
102108
R.plurals.modalMessageCharacterDisplayDescription,
103109
charsLeft, // quantity for plural
104-
proStatusManager.getCharacterLimit(), // 1st arg: total character limit
110+
proStatusManager.getCharacterLimit(currentUserProStatus), // 1st arg: total character limit
105111
charsLeft, // 2nd arg: chars left
106112
),
107113
positiveStyleDanger = false,
@@ -119,7 +125,7 @@ abstract class InputbarViewModel(
119125
showSimpleDialog = SimpleDialogData(
120126
title = application.getString(R.string.modalMessageTooLongTitle),
121127
message = Phrase.from(application.getString(R.string.modalMessageCharacterTooLongDescription))
122-
.put(LIMIT_KEY, proStatusManager.getCharacterLimit())
128+
.put(LIMIT_KEY, proStatusManager.getCharacterLimit(currentUserProStatus))
123129
.format(),
124130
positiveStyleDanger = false,
125131
positiveText = application.getString(R.string.okay),
@@ -135,7 +141,7 @@ abstract class InputbarViewModel(
135141
showSimpleDialog = SimpleDialogData(
136142
title = application.getString(R.string.modalMessageTooLongTitle),
137143
message = Phrase.from(application.getString(R.string.modalMessageTooLongDescription))
138-
.put(LIMIT_KEY, proStatusManager.getCharacterLimit())
144+
.put(LIMIT_KEY, proStatusManager.getCharacterLimit(currentUserProStatus))
139145
.format(),
140146
positiveStyleDanger = false,
141147
positiveText = application.getString(R.string.okay),

app/src/main/java/org/thoughtcrime/securesms/ShareViewModel.kt

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,7 @@ import network.loki.messenger.libsession_util.ConfigBase.Companion.PRIORITY_HIDD
2727
import org.session.libsession.messaging.groups.LegacyGroupDeprecationManager
2828
import org.session.libsession.utilities.Address
2929
import org.session.libsession.utilities.recipients.RecipientData
30+
import org.session.libsession.utilities.recipients.shouldShowProBadge
3031
import org.session.libsignal.utilities.Log
3132
import org.thoughtcrime.securesms.conversation.v2.ConversationActivityV2
3233
import org.thoughtcrime.securesms.database.model.ThreadRecord
@@ -122,7 +123,7 @@ class ShareViewModel @Inject constructor(
122123
else recipient.searchName,
123124
address = recipient.address,
124125
avatarUIData = avatarUtils.getUIDataFromRecipient(recipient),
125-
showProBadge = proStatusManager.shouldShowProBadge(recipient.address)
126+
showProBadge = recipient.proStatus.shouldShowProBadge()
126127
)
127128
}.toList()
128129
}

app/src/main/java/org/thoughtcrime/securesms/conversation/v2/ConversationActivityV2.kt

Lines changed: 11 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -205,6 +205,7 @@ import org.thoughtcrime.securesms.util.PaddedImageSpan
205205
import org.thoughtcrime.securesms.util.SaveAttachmentTask
206206
import org.thoughtcrime.securesms.util.adapter.applyImeBottomPadding
207207
import org.thoughtcrime.securesms.util.adapter.handleScrollToBottom
208+
import org.thoughtcrime.securesms.util.adapter.runWhenLaidOut
208209
import org.thoughtcrime.securesms.util.drawToBitmap
209210
import org.thoughtcrime.securesms.util.fadeIn
210211
import org.thoughtcrime.securesms.util.fadeOut
@@ -1161,14 +1162,22 @@ class ConversationActivityV2 : ScreenLockActionBarActivity(), InputBarDelegate,
11611162
private fun scrollToFirstUnreadMessageOrBottom() {
11621163
// if there are no unread messages, go straight to the very bottom of the list
11631164
if (unreadCount == 0) {
1164-
layoutManager?.scrollToPositionWithOffset(adapter.itemCount - 1, Int.MIN_VALUE)
1165+
binding.conversationRecyclerView.runWhenLaidOut {
1166+
layoutManager?.scrollToPositionWithOffset(adapter.itemCount - 1, Int.MIN_VALUE)
1167+
}
11651168
return
11661169
}
11671170

11681171
val lastSeenTimestamp = threadDb.getLastSeenAndHasSent(viewModel.threadId).first()
11691172
val lastSeenItemPosition = adapter.findLastSeenItemPosition(lastSeenTimestamp) ?: return
11701173

1171-
layoutManager?.scrollToPositionWithOffset(lastSeenItemPosition, ((layoutManager?.height ?: 0) / 2))
1174+
binding.conversationRecyclerView.runWhenLaidOut {
1175+
layoutManager?.scrollToPositionWithOffset(
1176+
lastSeenItemPosition,
1177+
((layoutManager?.height ?: 0) / 2)
1178+
)
1179+
}
1180+
11721181
}
11731182

11741183
private fun highlightViewAtPosition(position: Int) {

app/src/main/java/org/thoughtcrime/securesms/conversation/v2/ConversationViewModel.kt

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -73,6 +73,7 @@ import org.session.libsession.utilities.recipients.displayName
7373
import org.session.libsession.utilities.recipients.effectiveNotifyType
7474
import org.session.libsession.utilities.recipients.getType
7575
import org.session.libsession.utilities.recipients.repeatedWithEffectiveNotifyTypeChange
76+
import org.session.libsession.utilities.recipients.shouldShowProBadge
7677
import org.session.libsession.utilities.toGroupString
7778
import org.session.libsession.utilities.upsertContact
7879
import org.session.libsession.utilities.userConfigsChanged
@@ -150,7 +151,8 @@ class ConversationViewModel @AssistedInject constructor(
150151
attachmentDownloadHandlerFactory: AttachmentDownloadHandler.Factory,
151152
) : InputbarViewModel(
152153
application = application,
153-
proStatusManager = proStatusManager
154+
proStatusManager = proStatusManager,
155+
recipientRepository = recipientRepository,
154156
) {
155157
private val edKeyPair by lazy {
156158
storage.getUserED25519KeyPair()
@@ -547,7 +549,7 @@ class ConversationViewModel @AssistedInject constructor(
547549
showSearch = showSearch,
548550
avatarUIData = avatarData,
549551
// show the pro badge when a conversation/user is pro, except for communities
550-
showProBadge = proStatusManager.shouldShowProBadge(conversation.address) && !conversation.isLocalNumber // do not show for note to self
552+
showProBadge = conversation.proStatus.shouldShowProBadge() && !conversation.isLocalNumber // do not show for note to self
551553
).also {
552554
// also preload the larger version of the avatar in case the user goes to the settings
553555
avatarData.elements.mapNotNull { it.remoteFile }.forEach {

app/src/main/java/org/thoughtcrime/securesms/conversation/v2/MessageDetailsViewModel.kt

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,8 @@ import org.session.libsession.utilities.isLegacyGroup
3333
import org.session.libsession.utilities.recipients.Recipient
3434
import org.session.libsession.utilities.recipients.RecipientData
3535
import org.session.libsession.utilities.recipients.displayName
36+
import org.session.libsession.utilities.recipients.isPro
37+
import org.session.libsession.utilities.recipients.shouldShowProBadge
3638
import org.session.libsignal.utilities.IdPrefix
3739
import org.thoughtcrime.securesms.ApplicationContext
3840
import org.thoughtcrime.securesms.MediaPreviewArgs
@@ -197,13 +199,13 @@ class MessageDetailsViewModel @AssistedInject constructor(
197199
)
198200
},
199201
senderAvatarData = avatarUtils.getUIDataFromRecipient(sender),
200-
senderShowProBadge = proStatusManager.shouldShowProBadge(sender.address),
202+
senderShowProBadge = sender.proStatus.shouldShowProBadge(),
201203
senderHasAdminCrown = shouldShowAdminCrown,
202204
senderIsBlinded = IdPrefix.fromValue(sender.address.toString())?.isBlinded() ?: false,
203205
thread = conversation,
204206
readOnly = isDeprecatedLegacyGroup,
205207
proFeatures = proStatusManager.getMessageProFeatures(messageRecord.messageId),
206-
proBadgeClickable = !proStatusManager.isCurrentUserPro() // no badge click if the current user is pro
208+
proBadgeClickable = !recipientRepository.getSelf().proStatus.isPro() // no badge click if the current user is pro
207209
)
208210
}
209211
}

app/src/main/java/org/thoughtcrime/securesms/conversation/v2/messages/QuoteView.kt

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@ import org.session.libsession.utilities.Address
2323
import org.session.libsession.utilities.getColorFromAttr
2424
import org.session.libsession.utilities.recipients.Recipient
2525
import org.session.libsession.utilities.recipients.displayName
26+
import org.session.libsession.utilities.recipients.shouldShowProBadge
2627
import org.thoughtcrime.securesms.conversation.v2.utilities.MentionUtilities
2728
import org.thoughtcrime.securesms.database.RecipientRepository
2829
import org.thoughtcrime.securesms.mms.SlideDeck
@@ -104,7 +105,7 @@ class QuoteView @JvmOverloads constructor(context: Context, attrs: AttributeSet?
104105
modifier = modifier,
105106
text = authorDisplayName,
106107
textStyle = LocalType.current.small.bold().copy(color = Color(textColor)),
107-
showBadge = proStatusManager.shouldShowProBadge(authorRecipient.address),
108+
showBadge = authorRecipient.proStatus.shouldShowProBadge(),
108109
badgeColors = if(isOutgoingMessage && mode == Mode.Regular) proBadgeColorOutgoing()
109110
else proBadgeColorStandard()
110111
)

0 commit comments

Comments
 (0)