diff --git a/app/src/main/java/org/thoughtcrime/securesms/preferences/PrivacySettingsPreferenceFragment.kt b/app/src/main/java/org/thoughtcrime/securesms/preferences/PrivacySettingsPreferenceFragment.kt index eaf48f868..cf75319f1 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/preferences/PrivacySettingsPreferenceFragment.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/preferences/PrivacySettingsPreferenceFragment.kt @@ -8,6 +8,7 @@ import android.os.Build import android.os.Bundle import android.provider.Settings import androidx.preference.Preference +import dagger.hilt.android.AndroidEntryPoint import network.loki.messenger.BuildConfig import network.loki.messenger.R import org.session.libsession.utilities.TextSecurePreferences @@ -15,13 +16,22 @@ import org.session.libsession.utilities.TextSecurePreferences.Companion.isPasswo import org.session.libsession.utilities.TextSecurePreferences.Companion.setScreenLockEnabled import org.thoughtcrime.securesms.ApplicationContext import org.thoughtcrime.securesms.components.SwitchPreferenceCompat +import org.thoughtcrime.securesms.dependencies.ConfigFactory import org.thoughtcrime.securesms.permissions.Permissions import org.thoughtcrime.securesms.service.KeyCachingService import org.thoughtcrime.securesms.showSessionDialog import org.thoughtcrime.securesms.util.CallNotificationBuilder.Companion.areNotificationsEnabled +import org.thoughtcrime.securesms.util.ConfigurationMessageUtilities import org.thoughtcrime.securesms.util.IntentUtils +import java.util.prefs.PreferenceChangeEvent +import java.util.prefs.PreferenceChangeListener +import javax.inject.Inject +@AndroidEntryPoint class PrivacySettingsPreferenceFragment : ListSummaryPreferenceFragment() { + + @Inject lateinit var configFactory: ConfigFactory + override fun onCreate(paramBundle: Bundle?) { super.onCreate(paramBundle) findPreference(TextSecurePreferences.SCREEN_LOCK)!! @@ -30,6 +40,19 @@ class PrivacySettingsPreferenceFragment : ListSummaryPreferenceFragment() { .onPreferenceChangeListener = TypingIndicatorsToggleListener() findPreference(TextSecurePreferences.CALL_NOTIFICATIONS_ENABLED)!! .onPreferenceChangeListener = CallToggleListener(this) { setCall(it) } + val allowMessageRequestPref = findPreference(TextSecurePreferences.ALLOW_MESSAGE_REQUESTS)!! + configFactory.user?.let { user -> + allowMessageRequestPref.setDefaultValue(!user.getBlocksCommunityMessageRequests()) + allowMessageRequestPref + .onPreferenceChangeListener = + Preference.OnPreferenceChangeListener { _, newValue -> + user.setBlocksCommunityMessageRequests(!(newValue as Boolean)) + ConfigurationMessageUtilities.syncConfigurationIfNeeded(requireContext()) + return@OnPreferenceChangeListener true + } + } ?: run { + allowMessageRequestPref.isVisible = false + } initializeVisibility() } diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 2d46f6860..b031d37b1 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -627,6 +627,9 @@ Priority Screenshot Notifications Receive a notification when a contact takes a screenshot of a one-to-one chat. + Message Requests + Community Message Requests + Allow message requests from Community conversations diff --git a/app/src/main/res/xml/preferences_app_protection.xml b/app/src/main/res/xml/preferences_app_protection.xml index 12607ee76..3cc41e6e6 100644 --- a/app/src/main/res/xml/preferences_app_protection.xml +++ b/app/src/main/res/xml/preferences_app_protection.xml @@ -20,6 +20,16 @@ + + + + get_nts_priority(); +} +extern "C" +JNIEXPORT jboolean JNICALL +Java_network_loki_messenger_libsession_1util_UserProfile_getBlocksCommunityMessageRequests( + JNIEnv *env, jobject thiz) { + std::lock_guard lock{util::util_mutex_}; + auto profile = ptrToProfile(env, thiz); + auto blinded_msg_requests = profile->get_blinded_msgreqs(); + if (blinded_msg_requests.has_value()) { + return *blinded_msg_requests; + } + return false; +} + +extern "C" +JNIEXPORT void JNICALL +Java_network_loki_messenger_libsession_1util_UserProfile_setBlocksCommunityMessageRequests( + JNIEnv *env, jobject thiz, jboolean blocks) { + std::lock_guard lock{util::util_mutex_}; + auto profile = ptrToProfile(env, thiz); + profile->set_blinded_msgreqs(std::optional{(bool)blocks}); } \ No newline at end of file diff --git a/libsession-util/src/main/java/network/loki/messenger/libsession_util/Config.kt b/libsession-util/src/main/java/network/loki/messenger/libsession_util/Config.kt index 52fb541d7..5e93985db 100644 --- a/libsession-util/src/main/java/network/loki/messenger/libsession_util/Config.kt +++ b/libsession-util/src/main/java/network/loki/messenger/libsession_util/Config.kt @@ -126,6 +126,8 @@ class UserProfile(pointer: Long) : ConfigBase(pointer) { external fun setPic(userPic: UserPic) external fun setNtsPriority(priority: Int) external fun getNtsPriority(): Int + external fun getBlocksCommunityMessageRequests(): Boolean + external fun setBlocksCommunityMessageRequests(blocks: Boolean) } class ConversationVolatileConfig(pointer: Long): ConfigBase(pointer) { diff --git a/libsession/src/main/java/org/session/libsession/messaging/messages/visible/VisibleMessage.kt b/libsession/src/main/java/org/session/libsession/messaging/messages/visible/VisibleMessage.kt index 705fc7ce4..4a9b0cd38 100644 --- a/libsession/src/main/java/org/session/libsession/messaging/messages/visible/VisibleMessage.kt +++ b/libsession/src/main/java/org/session/libsession/messaging/messages/visible/VisibleMessage.kt @@ -25,7 +25,8 @@ class VisibleMessage( var profile: Profile? = null, var openGroupInvitation: OpenGroupInvitation? = null, var reaction: Reaction? = null, - var hasMention: Boolean = false + var hasMention: Boolean = false, + var blocksMessageRequests: Boolean = false ) : Message() { override val isSelfSendValid: Boolean = true @@ -141,6 +142,8 @@ class VisibleMessage( return null } } + // Community blocked message requests flag + dataMessage.blocksCommunityMessageRequests = blocksMessageRequests // Sync target if (syncTarget != null) { dataMessage.syncTarget = syncTarget diff --git a/libsession/src/main/java/org/session/libsession/messaging/sending_receiving/MessageSender.kt b/libsession/src/main/java/org/session/libsession/messaging/sending_receiving/MessageSender.kt index 804b2f15b..550ebbd6c 100644 --- a/libsession/src/main/java/org/session/libsession/messaging/sending_receiving/MessageSender.kt +++ b/libsession/src/main/java/org/session/libsession/messaging/sending_receiving/MessageSender.kt @@ -241,9 +241,15 @@ object MessageSender { private fun sendToOpenGroupDestination(destination: Destination, message: Message): Promise { val deferred = deferred() val storage = MessagingModuleConfiguration.shared.storage + val configFactory = MessagingModuleConfiguration.shared.configFactory if (message.sentTimestamp == null) { message.sentTimestamp = SnodeAPI.nowWithOffset } + configFactory.user?.let { user -> + if (message is VisibleMessage) { + message.blocksMessageRequests = user.getBlocksCommunityMessageRequests() + } + } val userEdKeyPair = MessagingModuleConfiguration.shared.getUserED25519KeyPair()!! var serverCapabilities = listOf() var blindedPublicKey: ByteArray? = null diff --git a/libsession/src/main/java/org/session/libsession/utilities/TextSecurePreferences.kt b/libsession/src/main/java/org/session/libsession/utilities/TextSecurePreferences.kt index d6ed96373..68c44f9e8 100644 --- a/libsession/src/main/java/org/session/libsession/utilities/TextSecurePreferences.kt +++ b/libsession/src/main/java/org/session/libsession/utilities/TextSecurePreferences.kt @@ -287,6 +287,8 @@ interface TextSecurePreferences { const val OCEAN_DARK = "ocean.dark" const val OCEAN_LIGHT = "ocean.light" + const val ALLOW_MESSAGE_REQUESTS = "libsession.ALLOW_MESSAGE_REQUESTS" + @JvmStatic fun getLastConfigurationSyncTime(context: Context): Long { return getLongPreference(context, LAST_CONFIGURATION_SYNC_TIME, 0)