Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
@@ -1,7 +1,6 @@
package org.session.libsession.messaging.messages.signal

import network.loki.messenger.libsession_util.protocol.ProMessageFeature
import network.loki.messenger.libsession_util.util.BitSet
import network.loki.messenger.libsession_util.protocol.ProFeature
import org.session.libsession.messaging.messages.visible.VisibleMessage
import org.session.libsession.messaging.sending_receiving.attachments.Attachment
import org.session.libsession.messaging.sending_receiving.data_extraction.DataExtractionNotificationInfoMessage
Expand All @@ -20,7 +19,7 @@ class IncomingMediaMessage(
val body: String?,
val group: Address.GroupLike?,
val attachments: List<Attachment>,
val proFeatures: BitSet<ProMessageFeature>,
val proFeatures: Set<ProFeature>,
val messageContent: MessageContent?,
val quote: QuoteModel?,
val linkPreviews: List<LinkPreview>,
Expand Down
Original file line number Diff line number Diff line change
@@ -1,7 +1,6 @@
package org.session.libsession.messaging.messages.signal

import network.loki.messenger.libsession_util.protocol.ProMessageFeature
import network.loki.messenger.libsession_util.util.BitSet
import network.loki.messenger.libsession_util.protocol.ProFeature
import org.session.libsession.messaging.calls.CallMessageType
import org.session.libsession.messaging.messages.visible.OpenGroupInvitation
import org.session.libsession.messaging.messages.visible.VisibleMessage
Expand All @@ -21,7 +20,7 @@ data class IncomingTextMessage(
val hasMention: Boolean,
val isOpenGroupInvitation: Boolean,
val isSecureMessage: Boolean,
val proFeatures: BitSet<ProMessageFeature>,
val proFeatures: Set<ProFeature>,
val isGroupMessage: Boolean = false,
val isGroupUpdateMessage: Boolean = false,
) {
Expand All @@ -34,8 +33,6 @@ data class IncomingTextMessage(
CallMessageType.CALL_FIRST_MISSED,
)

val proFeaturesRawValue: Long get() = proFeatures.rawValue

init {
check(!isGroupUpdateMessage || isGroupMessage) {
"A message cannot be a group update message if it is not a group message"
Expand Down Expand Up @@ -81,7 +78,7 @@ data class IncomingTextMessage(
hasMention = false,
isOpenGroupInvitation = false,
isSecureMessage = false,
proFeatures = BitSet(),
proFeatures = emptySet(),
)

companion object {
Expand Down Expand Up @@ -109,7 +106,7 @@ data class IncomingTextMessage(
hasMention = false,
isOpenGroupInvitation = true,
isSecureMessage = false,
proFeatures = BitSet(),
proFeatures = emptySet(),
)
}
}
Expand Down
Original file line number Diff line number Diff line change
@@ -1,7 +1,6 @@
package org.session.libsession.messaging.messages.signal

import network.loki.messenger.libsession_util.protocol.ProMessageFeature
import network.loki.messenger.libsession_util.util.BitSet
import network.loki.messenger.libsession_util.protocol.ProFeature
import org.session.libsession.messaging.messages.visible.VisibleMessage
import org.session.libsession.messaging.sending_receiving.attachments.Attachment
import org.session.libsession.messaging.sending_receiving.link_preview.LinkPreview
Expand All @@ -21,7 +20,7 @@ class OutgoingMediaMessage(
val linkPreviews: List<LinkPreview>,
val group: Address.GroupLike?,
val isGroupUpdateMessage: Boolean,
val proFeatures: BitSet<ProMessageFeature> = BitSet()
val proFeatures: Set<ProFeature> = emptySet()
) {
init {
check(!isGroupUpdateMessage || group != null) {
Expand Down
Original file line number Diff line number Diff line change
@@ -1,7 +1,6 @@
package org.session.libsession.messaging.messages.signal

import network.loki.messenger.libsession_util.protocol.ProMessageFeature
import network.loki.messenger.libsession_util.util.BitSet
import network.loki.messenger.libsession_util.protocol.ProFeature
import org.session.libsession.messaging.messages.visible.OpenGroupInvitation
import org.session.libsession.messaging.messages.visible.VisibleMessage
import org.session.libsession.messaging.utilities.UpdateMessageData
Expand All @@ -14,7 +13,7 @@ data class OutgoingTextMessage(
val expireStartedAtMillis: Long,
val sentTimestampMillis: Long,
val isOpenGroupInvitation: Boolean,
val proFeatures: BitSet<ProMessageFeature> = BitSet()
val proFeatures: Set<ProFeature> = emptySet()
) {
constructor(
message: VisibleMessage,
Expand All @@ -30,8 +29,6 @@ data class OutgoingTextMessage(
isOpenGroupInvitation = false,
)

val proFeaturesRawValue: Long get() = proFeatures.rawValue

companion object {
fun fromOpenGroupInvitation(
invitation: OpenGroupInvitation,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,14 +2,17 @@ package org.session.libsession.messaging.messages.visible

import androidx.annotation.Keep
import network.loki.messenger.BuildConfig
import network.loki.messenger.libsession_util.protocol.ProFeature
import network.loki.messenger.libsession_util.protocol.ProMessageFeature
import network.loki.messenger.libsession_util.util.BitSet
import network.loki.messenger.libsession_util.protocol.ProProfileFeature
import org.session.libsession.database.MessageDataProvider
import org.session.libsession.messaging.messages.Message
import org.session.libsession.messaging.messages.copyExpiration
import org.session.libsession.messaging.sending_receiving.attachments.DatabaseAttachment
import org.session.libsignal.protos.SignalServiceProtos
import org.session.libsignal.utilities.Log
import org.thoughtcrime.securesms.pro.toProMessageBitSetValue
import org.thoughtcrime.securesms.pro.toProProfileBitSetValue
import org.session.libsession.messaging.sending_receiving.attachments.Attachment as SignalAttachment

/**
Expand All @@ -27,12 +30,12 @@ data class VisibleMessage(
var reaction: Reaction? = null,
var hasMention: Boolean = false,
var blocksMessageRequests: Boolean = false,
var proFeatures: BitSet<ProMessageFeature> = BitSet()
var proFeatures: Set<ProFeature> = emptySet()
) : Message() {

// This empty constructor is needed for kryo serialization
@Keep
constructor(): this(proFeatures = BitSet())
constructor(): this(proFeatures = emptySet())

override val isSelfSendValid: Boolean = true

Expand Down Expand Up @@ -114,8 +117,16 @@ data class VisibleMessage(
}

// Pro features
if (!proFeatures.isEmpty) {
builder.proMessageBuilder.setMsgBitset(proFeatures.rawValue)
if (proFeatures.any { it is ProMessageFeature }) {
builder.proMessageBuilder.setMsgBitset(
proFeatures.toProMessageBitSetValue()
)
}

if (proFeatures.any { it is ProProfileFeature }) {
builder.proMessageBuilder.setProfileBitset(
proFeatures.toProProfileBitSetValue()
)
}
}
// endregion
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@ import network.loki.messenger.libsession_util.protocol.DecodedEnvelope
import network.loki.messenger.libsession_util.protocol.DecodedPro
import network.loki.messenger.libsession_util.protocol.SessionProtocol
import network.loki.messenger.libsession_util.util.BitSet
import network.loki.messenger.libsession_util.util.asSequence
import org.session.libsession.database.StorageProtocol
import org.session.libsession.messaging.messages.Message
import org.session.libsession.messaging.messages.control.CallMessage
Expand Down Expand Up @@ -137,7 +138,10 @@ class MessageParser @Inject constructor(

// Only process pro features post pro launch
if (prefs.forcePostPro()) {
(message as? VisibleMessage)?.proFeatures = pro?.proMessageFeatures ?: BitSet()
(message as? VisibleMessage)?.proFeatures = buildSet {
pro?.proMessageFeatures?.asSequence()?.let(::addAll)
pro?.proProfileFeatures?.asSequence()?.let(::addAll)
}
}

// Validate
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -161,7 +161,7 @@ class MessageRequestResponseHandler @Inject constructor(
body = null,
group = null,
attachments = emptyList(),
proFeatures = BitSet(),
proFeatures = emptySet(),
messageContent = null,
quote = null,
linkPreviews = emptyList(),
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -20,8 +20,10 @@ import kotlinx.coroutines.flow.update
import kotlinx.serialization.json.Json
import network.loki.messenger.BuildConfig
import network.loki.messenger.R
import network.loki.messenger.libsession_util.protocol.ProFeature
import network.loki.messenger.libsession_util.protocol.ProMessageFeature
import network.loki.messenger.libsession_util.util.BitSet
import network.loki.messenger.libsession_util.protocol.ProProfileFeature
import network.loki.messenger.libsession_util.util.toBitSet
import org.session.libsession.messaging.MessagingModuleConfiguration
import org.session.libsession.messaging.file_server.FileServer
import org.session.libsession.utilities.TextSecurePreferences.Companion.AUTOPLAY_AUDIO_MESSAGES
Expand Down Expand Up @@ -61,7 +63,8 @@ import org.session.libsession.utilities.TextSecurePreferences.Companion.SHOW_DON
import org.session.libsession.utilities.TextSecurePreferences.Companion._events
import org.session.libsignal.utilities.Log
import org.thoughtcrime.securesms.debugmenu.DebugMenuViewModel
import org.thoughtcrime.securesms.pro.ProStatusManager
import org.thoughtcrime.securesms.pro.toProMessageFeatures
import org.thoughtcrime.securesms.pro.toProProfileFeatures
import java.io.IOException
import java.time.ZonedDateTime
import java.util.Arrays
Expand Down Expand Up @@ -216,8 +219,8 @@ interface TextSecurePreferences {
fun forcedShortTTL(): Boolean
fun setForcedShortTTL(value: Boolean)

fun getDebugMessageFeatures(): BitSet<ProMessageFeature>
fun setDebugMessageFeatures(features: BitSet<ProMessageFeature>)
fun getDebugMessageFeatures(): Set<ProFeature>
fun setDebugMessageFeatures(features: Set<ProFeature>)

fun getDebugSubscriptionType(): DebugMenuViewModel.DebugSubscriptionStatus?
fun setDebugSubscriptionType(status: DebugMenuViewModel.DebugSubscriptionStatus?)
Expand Down Expand Up @@ -409,7 +412,8 @@ interface TextSecurePreferences {

const val IN_APP_REVIEW_STATE = "in_app_review_state"

const val DEBUG_MESSAGE_FEATURES = "debug_message_features_long"
const val DEBUG_PRO_MESSAGE_FEATURES = "debug_pro_message_features"
const val DEBUG_PRO_PROFILE_FEATURES = "debug_pro_profile_features"
const val DEBUG_SUBSCRIPTION_STATUS = "debug_subscription_status"
const val DEBUG_PRO_PLAN_STATUS = "debug_pro_plan_status"
const val DEBUG_FORCE_NO_BILLING = "debug_pro_has_billing"
Expand Down Expand Up @@ -1751,12 +1755,16 @@ class AppTextSecurePreferences @Inject constructor(
setStringPreference(TextSecurePreferences.DEPRECATING_START_TIME_OVERRIDE, value.toString())
}
}
override fun getDebugMessageFeatures(): BitSet<ProMessageFeature> {
return BitSet(getLongPreference( TextSecurePreferences.DEBUG_MESSAGE_FEATURES, 0))
override fun getDebugMessageFeatures(): Set<ProFeature> {
return buildSet {
getLongPreference(TextSecurePreferences.DEBUG_PRO_MESSAGE_FEATURES, 0L).toProMessageFeatures(this)
getLongPreference(TextSecurePreferences.DEBUG_PRO_PROFILE_FEATURES, 0L).toProProfileFeatures(this)
}
}

override fun setDebugMessageFeatures(features: BitSet<ProMessageFeature>) {
setLongPreference(TextSecurePreferences.DEBUG_MESSAGE_FEATURES, features.rawValue)
override fun setDebugMessageFeatures(features: Set<ProFeature>) {
setLongPreference(TextSecurePreferences.DEBUG_PRO_MESSAGE_FEATURES, features.filterIsInstance<ProMessageFeature>().toBitSet().rawValue)
setLongPreference(TextSecurePreferences.DEBUG_PRO_PROFILE_FEATURES, features.filterIsInstance<ProProfileFeature>().toBitSet().rawValue)
}

override fun getDebugSubscriptionType(): DebugMenuViewModel.DebugSubscriptionStatus? {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -203,7 +203,7 @@ class MessageDetailsViewModel @AssistedInject constructor(
senderIsBlinded = IdPrefix.fromValue(sender.address.toString())?.isBlinded() ?: false,
thread = conversation,
readOnly = isDeprecatedLegacyGroup,
proFeatures = proStatusManager.getMessageProFeatures(messageRecord).asSequence().toSet(),
proFeatures = proStatusManager.getMessageProFeatures(messageRecord),
proBadgeClickable = !recipientRepository.getSelf().isPro // no badge click if the current user is pro
)
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,7 @@ package org.thoughtcrime.securesms.database
import android.content.ContentValues
import android.content.Context
import android.database.Cursor
import androidx.sqlite.db.SupportSQLiteDatabase
import com.annimon.stream.Stream
import dagger.Lazy
import dagger.hilt.android.qualifiers.ApplicationContext
Expand Down Expand Up @@ -54,6 +55,10 @@ import org.thoughtcrime.securesms.database.model.content.DisappearingMessageUpda
import org.thoughtcrime.securesms.database.model.content.MessageContent
import org.thoughtcrime.securesms.mms.MmsException
import org.thoughtcrime.securesms.mms.SlideDeck
import org.thoughtcrime.securesms.pro.toProMessageBitSetValue
import org.thoughtcrime.securesms.pro.toProMessageFeatures
import org.thoughtcrime.securesms.pro.toProProfileBitSetValue
import org.thoughtcrime.securesms.pro.toProProfileFeatures
import org.thoughtcrime.securesms.util.asSequence
import java.io.Closeable
import java.io.IOException
Expand Down Expand Up @@ -442,7 +447,8 @@ class MmsDatabase @Inject constructor(
contentValues.put(MESSAGE_BOX, mailbox)
contentValues.put(THREAD_ID, threadId)
contentValues.put(STATUS, Status.DOWNLOAD_INITIALIZED)
contentValues.put(PRO_FEATURES, retrieved.proFeatures.rawValue)
contentValues.put(PRO_MESSAGE_FEATURES, retrieved.proFeatures.toProMessageBitSetValue())
contentValues.put(PRO_PROFILE_FEATURES, retrieved.proFeatures.toProProfileBitSetValue())
// In open groups messages should be sorted by their server timestamp
var receivedTimestamp = serverTimestamp
if (serverTimestamp == 0L) {
Expand Down Expand Up @@ -559,7 +565,8 @@ class MmsDatabase @Inject constructor(
contentValues.put(EXPIRES_IN, message.expiresInMillis)
contentValues.put(EXPIRE_STARTED, message.expireStartedAtMillis)
contentValues.put(ADDRESS, message.recipient.toString())
contentValues.put(PRO_FEATURES, message.proFeatures.rawValue)
contentValues.put(PRO_PROFILE_FEATURES, message.proFeatures.toProProfileBitSetValue())
contentValues.put(PRO_MESSAGE_FEATURES, message.proFeatures.toProMessageBitSetValue())
contentValues.put(
DELIVERY_RECEIPT_COUNT,
Stream.of(earlyDeliveryReceipts.values).mapToLong { obj: Long -> obj }
Expand Down Expand Up @@ -976,7 +983,11 @@ class MmsDatabase @Inject constructor(
val expireStarted = cursor.getLong(cursor.getColumnIndexOrThrow(EXPIRE_STARTED))
val hasMention = cursor.getInt(cursor.getColumnIndexOrThrow(HAS_MENTION)) == 1
val messageContentJson = cursor.getString(cursor.getColumnIndexOrThrow(MESSAGE_CONTENT))
val proFeatures = cursor.getLong(cursor.getColumnIndexOrThrow(PRO_FEATURES))

val proFeatures = buildSet {
cursor.getLong(cursor.getColumnIndexOrThrow(PRO_MESSAGE_FEATURES)).toProMessageFeatures(this)
cursor.getLong(cursor.getColumnIndexOrThrow(PRO_PROFILE_FEATURES)).toProProfileFeatures(this)
}

if (!isReadReceiptsEnabled(context)) {
readReceiptCount = 0
Expand Down Expand Up @@ -1020,7 +1031,7 @@ class MmsDatabase @Inject constructor(
/* reactions = */ reactions,
/* hasMention = */ hasMention,
/* messageContent = */ messageContent,
/* proFeaturesRawValue = */ proFeatures
/* proFeatures = */ proFeatures
)
}

Expand Down Expand Up @@ -1221,8 +1232,9 @@ class MmsDatabase @Inject constructor(
"DROP TABLE $TEMP_TABLE_NAME"
)

const val ADD_PRO_FEATURES_COLUMN = """
ALTER TABLE $TABLE_NAME ADD COLUMN $PRO_FEATURES INTEGER NOT NULL DEFAULT 0;
"""
fun addProFeatureColumns(db: SupportSQLiteDatabase) {
db.execSQL("ALTER TABLE $TABLE_NAME ADD COLUMN $PRO_PROFILE_FEATURES INTEGER NOT NULL DEFAULT 0")
db.execSQL("ALTER TABLE $TABLE_NAME ADD COLUMN $PRO_MESSAGE_FEATURES INTEGER NOT NULL DEFAULT 0")
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -43,7 +43,8 @@ public interface MmsSmsColumns {

public static final String SERVER_HASH = "server_hash";

public static final String PRO_FEATURES = "pro_features";
public static final String PRO_MESSAGE_FEATURES = "pro_message_features";
public static final String PRO_PROFILE_FEATURES = "pro_profile_features";

public static class Types {
protected static final long TOTAL_MASK = 0xFFFFFFFF;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -112,7 +112,8 @@ fun buildMmsSmsCombinedQuery(
NULL AS ${MmsDatabase.LINK_PREVIEWS},
${MmsSmsColumns.HAS_MENTION},
($smsHashQuery) AS ${MmsSmsColumns.SERVER_HASH},
${MmsSmsColumns.PRO_FEATURES}
${MmsSmsColumns.PRO_MESSAGE_FEATURES},
${MmsSmsColumns.PRO_PROFILE_FEATURES}
FROM ${SmsDatabase.TABLE_NAME}
$whereStatement
"""
Expand Down Expand Up @@ -202,7 +203,8 @@ fun buildMmsSmsCombinedQuery(
${MmsDatabase.LINK_PREVIEWS},
${MmsSmsColumns.HAS_MENTION},
($mmsHashQuery) AS ${MmsSmsColumns.SERVER_HASH},
${MmsSmsColumns.PRO_FEATURES}
${MmsSmsColumns.PRO_MESSAGE_FEATURES},
${MmsSmsColumns.PRO_PROFILE_FEATURES}
FROM ${MmsDatabase.TABLE_NAME}
$whereStatement
"""
Expand Down
Loading