This commit is contained in:
SessionHero01 2024-10-30 16:03:34 +11:00
parent 517f8ca62f
commit e68f69a555
No known key found for this signature in database
12 changed files with 24 additions and 157 deletions

View File

@ -19,7 +19,6 @@ import kotlinx.coroutines.launch
import network.loki.messenger.BuildConfig import network.loki.messenger.BuildConfig
import network.loki.messenger.libsession_util.util.ExpiryMode import network.loki.messenger.libsession_util.util.ExpiryMode
import org.session.libsession.messaging.messages.ExpirationConfiguration import org.session.libsession.messaging.messages.ExpirationConfiguration
import org.session.libsession.utilities.SSKEnvironment.MessageExpirationManagerProtocol
import org.session.libsession.utilities.TextSecurePreferences import org.session.libsession.utilities.TextSecurePreferences
import org.thoughtcrime.securesms.conversation.disappearingmessages.ui.ExpiryCallbacks import org.thoughtcrime.securesms.conversation.disappearingmessages.ui.ExpiryCallbacks
import org.thoughtcrime.securesms.conversation.disappearingmessages.ui.UiState import org.thoughtcrime.securesms.conversation.disappearingmessages.ui.UiState
@ -32,7 +31,6 @@ class DisappearingMessagesViewModel(
private val threadId: Long, private val threadId: Long,
private val application: Application, private val application: Application,
private val textSecurePreferences: TextSecurePreferences, private val textSecurePreferences: TextSecurePreferences,
private val messageExpirationManager: MessageExpirationManagerProtocol,
private val disappearingMessages: DisappearingMessages, private val disappearingMessages: DisappearingMessages,
private val threadDb: ThreadDatabase, private val threadDb: ThreadDatabase,
private val groupDb: GroupDatabase, private val groupDb: GroupDatabase,
@ -60,8 +58,6 @@ class DisappearingMessagesViewModel(
viewModelScope.launch { viewModelScope.launch {
val expiryMode = storage.getExpirationConfiguration(threadId)?.expiryMode ?: ExpiryMode.NONE val expiryMode = storage.getExpirationConfiguration(threadId)?.expiryMode ?: ExpiryMode.NONE
val recipient = threadDb.getRecipientForThreadId(threadId)?: return@launch val recipient = threadDb.getRecipientForThreadId(threadId)?: return@launch
val groupRecord = recipient.takeIf { it.isLegacyGroupRecipient || it.isGroupV2Recipient }
?.run { groupDb.getGroup(address.toGroupString()).orNull() }
val isAdmin = when { val isAdmin = when {
recipient.isGroupV2Recipient -> { recipient.isGroupV2Recipient -> {
@ -69,6 +65,7 @@ class DisappearingMessagesViewModel(
storage.getMembers(recipient.address.serialize()).any { it.sessionId == textSecurePreferences.getLocalNumber() && it.admin } storage.getMembers(recipient.address.serialize()).any { it.sessionId == textSecurePreferences.getLocalNumber() && it.admin }
} }
recipient.isLegacyGroupRecipient -> { recipient.isLegacyGroupRecipient -> {
val groupRecord = groupDb.getGroup(recipient.address.toGroupString()).orNull()
// Handle as legacy group // Handle as legacy group
groupRecord?.admins?.any{ it.serialize() == textSecurePreferences.getLocalNumber() } == true groupRecord?.admins?.any{ it.serialize() == textSecurePreferences.getLocalNumber() } == true
} }
@ -78,7 +75,7 @@ class DisappearingMessagesViewModel(
_state.update { _state.update {
it.copy( it.copy(
address = recipient.address, address = recipient.address,
isGroup = recipient.isGroupOrCommunityRecipient, isGroup = recipient.isGroupRecipient,
isNoteToSelf = recipient.address.serialize() == textSecurePreferences.getLocalNumber(), isNoteToSelf = recipient.address.serialize() == textSecurePreferences.getLocalNumber(),
isSelfAdmin = isAdmin, isSelfAdmin = isAdmin,
expiryMode = expiryMode, expiryMode = expiryMode,
@ -114,7 +111,6 @@ class DisappearingMessagesViewModel(
@Assisted private val threadId: Long, @Assisted private val threadId: Long,
private val application: Application, private val application: Application,
private val textSecurePreferences: TextSecurePreferences, private val textSecurePreferences: TextSecurePreferences,
private val messageExpirationManager: MessageExpirationManagerProtocol,
private val disappearingMessages: DisappearingMessages, private val disappearingMessages: DisappearingMessages,
private val threadDb: ThreadDatabase, private val threadDb: ThreadDatabase,
private val groupDb: GroupDatabase, private val groupDb: GroupDatabase,
@ -125,7 +121,6 @@ class DisappearingMessagesViewModel(
threadId, threadId,
application, application,
textSecurePreferences, textSecurePreferences,
messageExpirationManager,
disappearingMessages, disappearingMessages,
threadDb, threadDb,
groupDb, groupDb,

View File

@ -70,7 +70,6 @@ import network.loki.messenger.databinding.ActivityConversationV2Binding
import network.loki.messenger.libsession_util.util.ExpiryMode import network.loki.messenger.libsession_util.util.ExpiryMode
import nl.komponents.kovenant.ui.successUi import nl.komponents.kovenant.ui.successUi
import org.session.libsession.database.StorageProtocol import org.session.libsession.database.StorageProtocol
import org.session.libsession.messaging.MessagingModuleConfiguration
import org.session.libsession.messaging.groups.GroupManagerV2 import org.session.libsession.messaging.groups.GroupManagerV2
import org.session.libsession.messaging.messages.ExpirationConfiguration import org.session.libsession.messaging.messages.ExpirationConfiguration
import org.session.libsession.messaging.messages.applyExpiryMode import org.session.libsession.messaging.messages.applyExpiryMode
@ -279,7 +278,7 @@ class ConversationActivityV2 : PassphraseRequiredActionBarActivity(), InputBarDe
} }
private val viewModel: ConversationViewModel by viewModels { private val viewModel: ConversationViewModel by viewModels {
viewModelFactory.create(threadId, MessagingModuleConfiguration.shared.storage.getUserED25519KeyPair()) viewModelFactory.create(threadId, storage.getUserED25519KeyPair())
} }
private var actionMode: ActionMode? = null private var actionMode: ActionMode? = null
private var unreadCount = Int.MAX_VALUE private var unreadCount = Int.MAX_VALUE
@ -578,10 +577,6 @@ class ConversationActivityV2 : PassphraseRequiredActionBarActivity(), InputBarDe
} }
} }
override fun finish() {
super.finish()
}
override fun onPause() { override fun onPause() {
super.onPause() super.onPause()
ApplicationContext.getInstance(this).messageNotifier.setVisibleThread(-1) ApplicationContext.getInstance(this).messageNotifier.setVisibleThread(-1)

View File

@ -3,8 +3,8 @@ package org.thoughtcrime.securesms.conversation.v2
import android.app.Application import android.app.Application
import android.content.Context import android.content.Context
import android.view.MenuItem import android.view.MenuItem
import androidx.annotation.StringRes
import android.widget.Toast import android.widget.Toast
import androidx.annotation.StringRes
import androidx.lifecycle.ViewModel import androidx.lifecycle.ViewModel
import androidx.lifecycle.ViewModelProvider import androidx.lifecycle.ViewModelProvider
import androidx.lifecycle.viewModelScope import androidx.lifecycle.viewModelScope
@ -20,7 +20,6 @@ import kotlinx.coroutines.flow.update
import kotlinx.coroutines.launch import kotlinx.coroutines.launch
import kotlinx.coroutines.withContext import kotlinx.coroutines.withContext
import network.loki.messenger.R import network.loki.messenger.R
import network.loki.messenger.libsession_util.util.GroupMember
import org.session.libsession.database.MessageDataProvider import org.session.libsession.database.MessageDataProvider
import org.session.libsession.database.StorageProtocol import org.session.libsession.database.StorageProtocol
import org.session.libsession.messaging.groups.GroupManagerV2 import org.session.libsession.messaging.groups.GroupManagerV2
@ -33,12 +32,12 @@ import org.session.libsession.utilities.Address
import org.session.libsession.utilities.Address.Companion.fromSerialized import org.session.libsession.utilities.Address.Companion.fromSerialized
import org.session.libsession.utilities.TextSecurePreferences import org.session.libsession.utilities.TextSecurePreferences
import org.session.libsession.utilities.getGroup import org.session.libsession.utilities.getGroup
import org.session.libsession.utilities.recipients.Recipient
import org.session.libsession.utilities.recipients.MessageType import org.session.libsession.utilities.recipients.MessageType
import org.session.libsession.utilities.recipients.Recipient
import org.session.libsession.utilities.recipients.getType import org.session.libsession.utilities.recipients.getType
import org.session.libsignal.utilities.AccountId
import org.session.libsignal.utilities.IdPrefix import org.session.libsignal.utilities.IdPrefix
import org.session.libsignal.utilities.Log import org.session.libsignal.utilities.Log
import org.session.libsignal.utilities.AccountId
import org.thoughtcrime.securesms.audio.AudioSlidePlayer import org.thoughtcrime.securesms.audio.AudioSlidePlayer
import org.thoughtcrime.securesms.conversation.v2.menus.ConversationMenuHelper import org.thoughtcrime.securesms.conversation.v2.menus.ConversationMenuHelper
import org.thoughtcrime.securesms.database.GroupDatabase import org.thoughtcrime.securesms.database.GroupDatabase
@ -148,20 +147,6 @@ class ConversationViewModel(
val openGroup: OpenGroup? val openGroup: OpenGroup?
get() = _openGroup.value get() = _openGroup.value
private val closedGroupMembers: List<GroupMember>
get() {
val recipient = recipient ?: return emptyList()
if (!recipient.isGroupV2Recipient) return emptyList()
return storage.getMembers(recipient.address.serialize())
}
val isClosedGroupAdmin: Boolean
get() {
val recipient = recipient ?: return false
return !recipient.isGroupV2Recipient ||
(closedGroupMembers.firstOrNull { it.sessionId == storage.getUserPublicKey() }?.admin ?: false)
}
val serverCapabilities: List<String> val serverCapabilities: List<String>
get() = openGroup?.let { storage.getServerCapabilities(it.server) } ?: listOf() get() = openGroup?.let { storage.getServerCapabilities(it.server) } ?: listOf()
@ -767,7 +752,7 @@ class ConversationViewModel(
} }
} }
.onFailure { .onFailure {
showMessage("Couldn't accept message request due to error: $it") Log.w("Loki", "Couldn't accept message request due to error", it)
_uiState.update { state -> _uiState.update { state ->
state.copy(messageRequestState = currentState) state.copy(messageRequestState = currentState)
@ -781,7 +766,7 @@ class ConversationViewModel(
_uiState.update { it.copy(shouldExit = true) } _uiState.update { it.copy(shouldExit = true) }
} }
.onFailure { .onFailure {
showMessage("Couldn't decline message request due to error: $it") Log.w("Loki", "Couldn't decline message request due to error", it)
} }
} }

View File

@ -1,76 +0,0 @@
package org.thoughtcrime.securesms.conversation.v2
import android.os.Bundle
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import androidx.core.view.isVisible
import com.google.android.material.bottomsheet.BottomSheetDialogFragment
import dagger.hilt.android.AndroidEntryPoint
import network.loki.messenger.R
import network.loki.messenger.databinding.FragmentDeleteMessageBottomSheetBinding
import org.session.libsession.messaging.contacts.Contact
import org.session.libsession.utilities.recipients.Recipient
import org.thoughtcrime.securesms.database.SessionContactDatabase
import javax.inject.Inject
@AndroidEntryPoint
class DeleteOptionsBottomSheet : BottomSheetDialogFragment(), View.OnClickListener {
@Inject
lateinit var contactDatabase: SessionContactDatabase
lateinit var recipient: Recipient
private lateinit var binding: FragmentDeleteMessageBottomSheetBinding
val contact by lazy {
val senderId = recipient.address.serialize()
// this dialog won't show for open group contacts
contactDatabase.getContactWithAccountID(senderId)
?.displayName(Contact.ContactContext.REGULAR)
}
var onDeleteForMeTapped: (() -> Unit?)? = null
var onDeleteForEveryoneTapped: (() -> Unit)? = null
var onCancelTapped: (() -> Unit)? = null
override fun onCreateView(
inflater: LayoutInflater,
container: ViewGroup?,
savedInstanceState: Bundle?
): View {
binding = FragmentDeleteMessageBottomSheetBinding.inflate(inflater, container, false)
return binding.root
}
override fun onClick(v: View?) {
when (v) {
binding.deleteForMeTextView -> onDeleteForMeTapped?.invoke()
binding.deleteForEveryoneTextView -> onDeleteForEveryoneTapped?.invoke()
binding.cancelTextView -> onCancelTapped?.invoke()
}
}
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState)
if (!this::recipient.isInitialized) {
return dismiss()
}
if (recipient.isLocalNumber) {
binding.deleteForEveryoneTextView.text =
getString(R.string.clearMessagesForMe)
} else if (!recipient.isGroupOrCommunityRecipient && !contact.isNullOrEmpty()) {
binding.deleteForEveryoneTextView.text =
resources.getString(R.string.clearMessagesForEveryone)
}
binding.deleteForEveryoneTextView.isVisible = !recipient.isLegacyGroupRecipient
binding.deleteForMeTextView.setOnClickListener(this)
binding.deleteForEveryoneTextView.setOnClickListener(this)
binding.cancelTextView.setOnClickListener(this)
}
override fun onStart() {
super.onStart()
val window = dialog?.window ?: return
window.setDimAmount(0.6f)
}
}

View File

@ -7,7 +7,6 @@ import com.squareup.phrase.Phrase
import dagger.hilt.android.AndroidEntryPoint import dagger.hilt.android.AndroidEntryPoint
import network.loki.messenger.R import network.loki.messenger.R
import org.session.libsession.database.StorageProtocol import org.session.libsession.database.StorageProtocol
import org.session.libsession.messaging.contacts.Contact
import org.session.libsession.messaging.jobs.JobQueue import org.session.libsession.messaging.jobs.JobQueue
import org.session.libsession.messaging.sending_receiving.attachments.DatabaseAttachment import org.session.libsession.messaging.sending_receiving.attachments.DatabaseAttachment
import org.session.libsession.utilities.recipients.Recipient import org.session.libsession.utilities.recipients.Recipient
@ -28,21 +27,10 @@ class AutoDownloadDialog(private val threadRecipient: Recipient,
@Inject lateinit var contactDB: SessionContactDatabase @Inject lateinit var contactDB: SessionContactDatabase
override fun onCreateDialog(savedInstanceState: Bundle?): Dialog = createSessionDialog { override fun onCreateDialog(savedInstanceState: Bundle?): Dialog = createSessionDialog {
val threadId = storage.getThreadId(threadRecipient) ?: run {
dismiss()
return@createSessionDialog
}
val displayName = when {
threadRecipient.isCommunityRecipient -> storage.getOpenGroup(threadId)?.name ?: "UNKNOWN"
threadRecipient.isLegacyGroupRecipient -> storage.getGroup(threadRecipient.address.toGroupString())?.title ?: "UNKNOWN"
threadRecipient.isGroupV2Recipient -> threadRecipient.name ?: "UNKNOWN"
else -> storage.getContactWithAccountID(threadRecipient.address.serialize())?.displayName(Contact.ContactContext.REGULAR) ?: "UNKNOWN"
}
title(getString(R.string.attachmentsAutoDownloadModalTitle)) title(getString(R.string.attachmentsAutoDownloadModalTitle))
val explanation = Phrase.from(context, R.string.attachmentsAutoDownloadModalDescription) val explanation = Phrase.from(context, R.string.attachmentsAutoDownloadModalDescription)
.put(CONVERSATION_NAME_KEY, displayName) .put(CONVERSATION_NAME_KEY, threadRecipient.toShortString())
.format() .format()
text(explanation) text(explanation)

View File

@ -76,7 +76,7 @@ class ControlMessageView : LinearLayout {
val threadRecipient = DatabaseComponent.get(context).threadDatabase().getRecipientForThreadId(message.threadId) val threadRecipient = DatabaseComponent.get(context).threadDatabase().getRecipientForThreadId(message.threadId)
if (threadRecipient?.isGroupV2Recipient == true) { if (threadRecipient?.isGroupRecipient == true) {
expirationTimerView.setTimerIcon() expirationTimerView.setTimerIcon()
} else { } else {
expirationTimerView.setExpirationTime(message.expireStarted, message.expiresIn) expirationTimerView.setExpirationTime(message.expireStarted, message.expiresIn)

View File

@ -87,8 +87,7 @@ class SessionContactDatabase(context: Context, helper: SQLCipherOpenHelper) : Da
} }
fun contactFromCursor(cursor: Cursor): Contact { fun contactFromCursor(cursor: Cursor): Contact {
val sessionID = cursor.getString(accountID) val contact = Contact(cursor.getString(accountID))
val contact = Contact(sessionID)
contact.name = cursor.getStringOrNull(name) contact.name = cursor.getStringOrNull(name)
contact.nickname = cursor.getStringOrNull(nickname) contact.nickname = cursor.getStringOrNull(nickname)
contact.profilePictureURL = cursor.getStringOrNull(profilePictureURL) contact.profilePictureURL = cursor.getStringOrNull(profilePictureURL)

View File

@ -1549,16 +1549,12 @@ open class Storage @Inject constructor(
|| (userPublicKey == recipientPublicKey && userPublicKey == senderPublicKey) || (userPublicKey == recipientPublicKey && userPublicKey == senderPublicKey)
) return ) return
val recipientDb = recipientDatabase
val threadDB = threadDatabase
if (userPublicKey == senderPublicKey) { if (userPublicKey == senderPublicKey) {
val requestRecipient = Recipient.from(context, fromSerialized(recipientPublicKey), false) val requestRecipient = Recipient.from(context, fromSerialized(recipientPublicKey), false)
recipientDb.setApproved(requestRecipient, true) recipientDatabase.setApproved(requestRecipient, true)
val threadId = threadDB.getOrCreateThreadIdFor(requestRecipient) val threadId = threadDatabase.getOrCreateThreadIdFor(requestRecipient)
threadDB.setHasSent(threadId, true) threadDatabase.setHasSent(threadId, true)
} else { } else {
val mmsDb = mmsDatabase
val smsDb = smsDatabase
val sender = Recipient.from(context, fromSerialized(senderPublicKey), false) val sender = Recipient.from(context, fromSerialized(senderPublicKey), false)
val threadId = getOrCreateThreadIdFor(sender.address) val threadId = getOrCreateThreadIdFor(sender.address)
val profile = response.profile val profile = response.profile
@ -1578,10 +1574,10 @@ open class Storage @Inject constructor(
profileManager.setUnidentifiedAccessMode(context, sender, Recipient.UnidentifiedAccessMode.UNKNOWN) profileManager.setUnidentifiedAccessMode(context, sender, Recipient.UnidentifiedAccessMode.UNKNOWN)
} }
} }
threadDB.setHasSent(threadId, true) threadDatabase.setHasSent(threadId, true)
val mappingDb = blindedIdMappingDatabase val mappingDb = blindedIdMappingDatabase
val mappings = mutableMapOf<String, BlindedIdMapping>() val mappings = mutableMapOf<String, BlindedIdMapping>()
threadDB.readerFor(threadDB.conversationList).use { reader -> threadDatabase.readerFor(threadDatabase.conversationList).use { reader ->
while (reader.next != null) { while (reader.next != null) {
val recipient = reader.current.recipient val recipient = reader.current.recipient
val address = recipient.address.serialize() val address = recipient.address.serialize()
@ -1601,10 +1597,10 @@ open class Storage @Inject constructor(
} }
mappingDb.addBlindedIdMapping(mapping.value.copy(accountId = senderPublicKey)) mappingDb.addBlindedIdMapping(mapping.value.copy(accountId = senderPublicKey))
val blindedThreadId = threadDB.getOrCreateThreadIdFor(Recipient.from(context, fromSerialized(mapping.key), false)) val blindedThreadId = threadDatabase.getOrCreateThreadIdFor(Recipient.from(context, fromSerialized(mapping.key), false))
mmsDb.updateThreadId(blindedThreadId, threadId) mmsDatabase.updateThreadId(blindedThreadId, threadId)
smsDb.updateThreadId(blindedThreadId, threadId) smsDatabase.updateThreadId(blindedThreadId, threadId)
threadDB.deleteConversation(blindedThreadId) threadDatabase.deleteConversation(blindedThreadId)
} }
setRecipientApproved(sender, true) setRecipientApproved(sender, true)
setRecipientApprovedMe(sender, true) setRecipientApprovedMe(sender, true)
@ -1635,7 +1631,7 @@ open class Storage @Inject constructor(
Optional.absent(), Optional.absent(),
Optional.absent() Optional.absent()
) )
mmsDb.insertSecureDecryptedMessageInbox(message, threadId, runThreadUpdate = true) mmsDatabase.insertSecureDecryptedMessageInbox(message, threadId, runThreadUpdate = true)
} }
} }
@ -1645,7 +1641,6 @@ open class Storage @Inject constructor(
override fun insertMessageRequestResponseFromYou(threadId: Long){ override fun insertMessageRequestResponseFromYou(threadId: Long){
val userPublicKey = getUserPublicKey() ?: return val userPublicKey = getUserPublicKey() ?: return
val mmsDb = mmsDatabase
val message = IncomingMediaMessage( val message = IncomingMediaMessage(
fromSerialized(userPublicKey), fromSerialized(userPublicKey),
clock.currentTimeMills(), clock.currentTimeMills(),
@ -1664,7 +1659,7 @@ open class Storage @Inject constructor(
Optional.absent(), Optional.absent(),
Optional.absent() Optional.absent()
) )
mmsDb.insertSecureDecryptedMessageInbox(message, threadId, runThreadUpdate = false) mmsDatabase.insertSecureDecryptedMessageInbox(message, threadId, runThreadUpdate = false)
} }
override fun getRecipientApproved(address: Address): Boolean { override fun getRecipientApproved(address: Address): Boolean {

View File

@ -470,7 +470,6 @@ class DisappearingMessagesViewModelTest {
THREAD_ID, THREAD_ID,
application, application,
textSecurePreferences, textSecurePreferences,
messageExpirationManager,
disappearingMessages, disappearingMessages,
threadDb, threadDb,
groupDb, groupDb,

View File

@ -75,6 +75,8 @@ class MentionViewModelTest {
on { getRecipientForThreadId(threadID) } doAnswer { on { getRecipientForThreadId(threadID) } doAnswer {
mock<Recipient> { mock<Recipient> {
on { isGroupV2Recipient } doReturn false on { isGroupV2Recipient } doReturn false
on { isLegacyGroupRecipient } doReturn false
on { isGroupRecipient } doReturn false
on { isCommunityRecipient } doReturn true on { isCommunityRecipient } doReturn true
on { isContactRecipient } doReturn false on { isContactRecipient } doReturn false
} }

View File

@ -71,10 +71,6 @@ object GroupUtil {
return decodedGroupId return decodedGroupId
} }
fun isEncodedGroup(groupId: String): Boolean {
return groupId.startsWith(LEGACY_CLOSED_GROUP_PREFIX) || groupId.startsWith(COMMUNITY_PREFIX)
}
@JvmStatic @JvmStatic
fun isCommunity(groupId: String): Boolean { fun isCommunity(groupId: String): Boolean {
return groupId.startsWith(COMMUNITY_PREFIX) return groupId.startsWith(COMMUNITY_PREFIX)

View File

@ -15,7 +15,6 @@ import kotlinx.coroutines.flow.MutableStateFlow
import kotlinx.coroutines.flow.StateFlow import kotlinx.coroutines.flow.StateFlow
import kotlinx.coroutines.flow.asSharedFlow import kotlinx.coroutines.flow.asSharedFlow
import org.session.libsession.R import org.session.libsession.R
import org.session.libsession.utilities.TextSecurePreferences.Companion
import org.session.libsession.utilities.TextSecurePreferences.Companion.AUTOPLAY_AUDIO_MESSAGES import org.session.libsession.utilities.TextSecurePreferences.Companion.AUTOPLAY_AUDIO_MESSAGES
import org.session.libsession.utilities.TextSecurePreferences.Companion.CALL_NOTIFICATIONS_ENABLED import org.session.libsession.utilities.TextSecurePreferences.Companion.CALL_NOTIFICATIONS_ENABLED
import org.session.libsession.utilities.TextSecurePreferences.Companion.CLASSIC_DARK import org.session.libsession.utilities.TextSecurePreferences.Companion.CLASSIC_DARK
@ -308,16 +307,6 @@ interface TextSecurePreferences {
// for the lifetime of the Session installation. // for the lifetime of the Session installation.
const val HAVE_WARNED_USER_ABOUT_SAVING_ATTACHMENTS = "libsession.HAVE_WARNED_USER_ABOUT_SAVING_ATTACHMENTS" const val HAVE_WARNED_USER_ABOUT_SAVING_ATTACHMENTS = "libsession.HAVE_WARNED_USER_ABOUT_SAVING_ATTACHMENTS"
// @JvmStatic
// fun getLastConfigurationSyncTime(context: Context): Long {
// return getLongPreference(context, LAST_CONFIGURATION_SYNC_TIME, 0)
// }
//
// @JvmStatic
// fun setLastConfigurationSyncTime(context: Context, value: Long) {
// setLongPreference(context, LAST_CONFIGURATION_SYNC_TIME, value)
// }
//
@JvmStatic @JvmStatic
fun getConfigurationMessageSynced(context: Context): Boolean { fun getConfigurationMessageSynced(context: Context): Boolean {
return getBooleanPreference(context, CONFIGURATION_SYNCED, false) return getBooleanPreference(context, CONFIGURATION_SYNCED, false)