diff --git a/app/build.gradle b/app/build.gradle index c7bcec80e..2fbac7105 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -156,7 +156,7 @@ dependencies { testImplementation 'org.robolectric:shadows-multidex:4.4' } -def canonicalVersionCode = 352 +def canonicalVersionCode = 353 def canonicalVersionName = "1.17.0" def postFixSize = 10 diff --git a/app/src/main/java/org/thoughtcrime/securesms/components/ProfilePictureView.kt b/app/src/main/java/org/thoughtcrime/securesms/components/ProfilePictureView.kt index 0a6bd2ac4..0101677d8 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/components/ProfilePictureView.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/components/ProfilePictureView.kt @@ -32,10 +32,10 @@ class ProfilePictureView @JvmOverloads constructor( var isLarge = false private val profilePicturesCache = mutableMapOf() - private val unknownRecipientDrawable = ResourceContactPhoto(R.drawable.ic_profile_default) - .asDrawable(context, ContactColors.UNKNOWN_COLOR.toConversationColor(context), false) - private val unknownOpenGroupDrawable = ResourceContactPhoto(R.drawable.ic_notification) - .asDrawable(context, ContactColors.UNKNOWN_COLOR.toConversationColor(context), false) + private val unknownRecipientDrawable by lazy { ResourceContactPhoto(R.drawable.ic_profile_default) + .asDrawable(context, ContactColors.UNKNOWN_COLOR.toConversationColor(context), false) } + private val unknownOpenGroupDrawable by lazy { ResourceContactPhoto(R.drawable.ic_notification) + .asDrawable(context, ContactColors.UNKNOWN_COLOR.toConversationColor(context), false) } // endregion @@ -120,7 +120,7 @@ class ProfilePictureView @JvmOverloads constructor( if (signalProfilePicture != null && avatar != "0" && avatar != "") { glide.clear(imageView) glide.load(signalProfilePicture) - .placeholder(R.drawable.ic_profile_default) + .placeholder(unknownRecipientDrawable) .centerCrop() .error(glide.load(placeholder)) .diskCacheStrategy(DiskCacheStrategy.NONE) @@ -128,20 +128,22 @@ class ProfilePictureView @JvmOverloads constructor( .into(imageView) } else if (recipient.isOpenGroupRecipient && recipient.groupAvatarId == null) { glide.clear(imageView) - glide.load(R.drawable.ic_notification) + glide.load(unknownOpenGroupDrawable) .centerCrop() + .circleCrop() .into(imageView) } else { glide.clear(imageView) glide.load(placeholder) - .placeholder(R.drawable.ic_profile_default) + .placeholder(unknownRecipientDrawable) .centerCrop() + .circleCrop() .diskCacheStrategy(DiskCacheStrategy.NONE).circleCrop().into(imageView) } profilePicturesCache[publicKey] = recipient.profileAvatar } else { - glide.load(R.drawable.ic_profile_default) - .centerInside() + glide.load(unknownRecipientDrawable) + .centerCrop() .into(imageView) } } diff --git a/app/src/main/java/org/thoughtcrime/securesms/conversation/v2/ConversationActivityV2.kt b/app/src/main/java/org/thoughtcrime/securesms/conversation/v2/ConversationActivityV2.kt index 64c68f506..4536491ef 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/conversation/v2/ConversationActivityV2.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/conversation/v2/ConversationActivityV2.kt @@ -512,14 +512,13 @@ class ConversationActivityV2 : PassphraseRequiredActionBarActivity(), InputBarDe if (cursor != null) { val messageTimestamp = messageToScrollTimestamp.getAndSet(-1) val author = messageToScrollAuthor.getAndSet(null) - val initialUnreadCount: Int + val initialUnreadCount = mmsSmsDb.getUnreadCount(viewModel.threadId) // Update the unreadCount value to be loaded from the database since we got a new message - if (firstLoad.get() || oldCount != newCount) { + if (firstLoad.get() || oldCount != newCount || initialUnreadCount != unreadCount) { // Update the unreadCount value to be loaded from the database since we got a new // message (we need to store it in a local variable as it can get overwritten on // another thread before the 'firstLoad.getAndSet(false)' case below) - initialUnreadCount = mmsSmsDb.getUnreadCount(viewModel.threadId) unreadCount = initialUnreadCount updateUnreadCountIndicator() } diff --git a/app/src/main/java/org/thoughtcrime/securesms/database/ThreadDatabase.java b/app/src/main/java/org/thoughtcrime/securesms/database/ThreadDatabase.java index 9cbc4d718..504452998 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/database/ThreadDatabase.java +++ b/app/src/main/java/org/thoughtcrime/securesms/database/ThreadDatabase.java @@ -778,6 +778,7 @@ public class ThreadDatabase extends Database { if (reader != null) reader.close(); notifyConversationListListeners(); + notifyConversationListeners(threadId); } } @@ -794,7 +795,7 @@ public class ThreadDatabase extends Database { public boolean isPinned(long threadId) { SQLiteDatabase db = getReadableDatabase(); - Cursor cursor = db.query(TABLE_NAME, new String[]{DATE}, ID_WHERE, new String[]{String.valueOf(threadId)}, null, null, null); + Cursor cursor = db.query(TABLE_NAME, new String[]{IS_PINNED}, ID_WHERE, new String[]{String.valueOf(threadId)}, null, null, null); try { if (cursor != null && cursor.moveToFirst()) { return cursor.getInt(0) == 1; diff --git a/app/src/main/java/org/thoughtcrime/securesms/notifications/DefaultMessageNotifier.java b/app/src/main/java/org/thoughtcrime/securesms/notifications/DefaultMessageNotifier.java index a8f575d22..0157d8ad4 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/notifications/DefaultMessageNotifier.java +++ b/app/src/main/java/org/thoughtcrime/securesms/notifications/DefaultMessageNotifier.java @@ -159,8 +159,9 @@ public class DefaultMessageNotifier implements MessageNotifier { executor.cancel(); } - private void cancelActiveNotifications(@NonNull Context context) { + private boolean cancelActiveNotifications(@NonNull Context context) { NotificationManager notifications = ServiceUtil.getNotificationManager(context); + boolean hasNotifications = notifications.getActiveNotifications().length > 0; notifications.cancel(SUMMARY_NOTIFICATION_ID); try { @@ -174,6 +175,7 @@ public class DefaultMessageNotifier implements MessageNotifier { Log.w(TAG, e); notifications.cancelAll(); } + return hasNotifications; } private void cancelOrphanedNotifications(@NonNull Context context, NotificationState notificationState) { @@ -246,11 +248,21 @@ public class DefaultMessageNotifier implements MessageNotifier { return; } - if (!isVisible && !homeScreenVisible) { + if ((!isVisible && !homeScreenVisible) || hasExistingNotifications(context)) { updateNotification(context, signal, 0); } } + private boolean hasExistingNotifications(Context context) { + NotificationManager notifications = ServiceUtil.getNotificationManager(context); + try { + StatusBarNotification[] activeNotifications = notifications.getActiveNotifications(); + return activeNotifications.length > 0; + } catch (Exception e) { + return false; + } + } + @Override public void updateNotification(@NonNull Context context, boolean signal, int reminderCount) { @@ -262,8 +274,8 @@ public class DefaultMessageNotifier implements MessageNotifier { if ((telcoCursor == null || telcoCursor.isAfterLast()) || !TextSecurePreferences.hasSeenWelcomeScreen(context)) { - cancelActiveNotifications(context); updateBadge(context, 0); + cancelActiveNotifications(context); clearReminder(context); return; } diff --git a/app/src/main/res/layout/view_profile_picture.xml b/app/src/main/res/layout/view_profile_picture.xml index de6fb3bee..8179fd4de 100644 --- a/app/src/main/res/layout/view_profile_picture.xml +++ b/app/src/main/res/layout/view_profile_picture.xml @@ -31,6 +31,7 @@ diff --git a/libsession-util/libsession-util b/libsession-util/libsession-util index 97084c69f..7eb870283 160000 --- a/libsession-util/libsession-util +++ b/libsession-util/libsession-util @@ -1 +1 @@ -Subproject commit 97084c69f86e67c675095b48efacc86113ccebb0 +Subproject commit 7eb87028355bfc89950102c52d5b2927a25b2e22 diff --git a/libsession-util/src/main/cpp/config_base.cpp b/libsession-util/src/main/cpp/config_base.cpp index f59fbb1a9..eed3ec56a 100644 --- a/libsession-util/src/main/cpp/config_base.cpp +++ b/libsession-util/src/main/cpp/config_base.cpp @@ -4,24 +4,28 @@ extern "C" { JNIEXPORT jboolean JNICALL Java_network_loki_messenger_libsession_1util_ConfigBase_dirty(JNIEnv *env, jobject thiz) { + std::lock_guard lock{util::util_mutex_}; auto* configBase = ptrToConfigBase(env, thiz); return configBase->is_dirty(); } JNIEXPORT jboolean JNICALL Java_network_loki_messenger_libsession_1util_ConfigBase_needsPush(JNIEnv *env, jobject thiz) { + std::lock_guard lock{util::util_mutex_}; auto config = ptrToConfigBase(env, thiz); return config->needs_push(); } JNIEXPORT jboolean JNICALL Java_network_loki_messenger_libsession_1util_ConfigBase_needsDump(JNIEnv *env, jobject thiz) { + std::lock_guard lock{util::util_mutex_}; auto config = ptrToConfigBase(env, thiz); return config->needs_dump(); } JNIEXPORT jobject JNICALL Java_network_loki_messenger_libsession_1util_ConfigBase_push(JNIEnv *env, jobject thiz) { + std::lock_guard lock{util::util_mutex_}; auto config = ptrToConfigBase(env, thiz); auto push_tuple = config->push(); auto to_push_str = std::get<1>(push_tuple); @@ -51,6 +55,7 @@ Java_network_loki_messenger_libsession_1util_ConfigBase_free(JNIEnv *env, jobjec JNIEXPORT jbyteArray JNICALL Java_network_loki_messenger_libsession_1util_ConfigBase_dump(JNIEnv *env, jobject thiz) { + std::lock_guard lock{util::util_mutex_}; auto config = ptrToConfigBase(env, thiz); auto dumped = config->dump(); jbyteArray bytes = util::bytes_from_ustring(env, dumped); @@ -68,6 +73,7 @@ JNIEXPORT void JNICALL Java_network_loki_messenger_libsession_1util_ConfigBase_confirmPushed(JNIEnv *env, jobject thiz, jlong seq_no, jstring new_hash_jstring) { + std::lock_guard lock{util::util_mutex_}; auto conf = ptrToConfigBase(env, thiz); auto new_hash = env->GetStringUTFChars(new_hash_jstring, nullptr); conf->confirm_pushed(seq_no, new_hash); @@ -79,6 +85,7 @@ Java_network_loki_messenger_libsession_1util_ConfigBase_confirmPushed(JNIEnv *en JNIEXPORT jint JNICALL Java_network_loki_messenger_libsession_1util_ConfigBase_merge___3Lkotlin_Pair_2(JNIEnv *env, jobject thiz, jobjectArray to_merge) { + std::lock_guard lock{util::util_mutex_}; auto conf = ptrToConfigBase(env, thiz); size_t number = env->GetArrayLength(to_merge); std::vector> configs = {}; @@ -93,6 +100,7 @@ Java_network_loki_messenger_libsession_1util_ConfigBase_merge___3Lkotlin_Pair_2( JNIEXPORT jint JNICALL Java_network_loki_messenger_libsession_1util_ConfigBase_merge__Lkotlin_Pair_2(JNIEnv *env, jobject thiz, jobject to_merge) { + std::lock_guard lock{util::util_mutex_}; auto conf = ptrToConfigBase(env, thiz); std::vector> configs = {extractHashAndData(env, to_merge)}; return conf->merge(configs); @@ -132,6 +140,7 @@ Java_network_loki_messenger_libsession_1util_ConfigBase_00024Companion_kindFor(J extern "C" JNIEXPORT jobject JNICALL Java_network_loki_messenger_libsession_1util_ConfigBase_currentHashes(JNIEnv *env, jobject thiz) { + std::lock_guard lock{util::util_mutex_}; auto conf = ptrToConfigBase(env, thiz); jclass stack = env->FindClass("java/util/Stack"); jmethodID init = env->GetMethodID(stack, "", "()V"); diff --git a/libsession-util/src/main/cpp/contacts.cpp b/libsession-util/src/main/cpp/contacts.cpp index 837bc8882..7d0490480 100644 --- a/libsession-util/src/main/cpp/contacts.cpp +++ b/libsession-util/src/main/cpp/contacts.cpp @@ -5,6 +5,7 @@ extern "C" JNIEXPORT jobject JNICALL Java_network_loki_messenger_libsession_1util_Contacts_get(JNIEnv *env, jobject thiz, jstring session_id) { + std::lock_guard lock{util::util_mutex_}; auto contacts = ptrToContacts(env, thiz); auto session_id_chars = env->GetStringUTFChars(session_id, nullptr); auto contact = contacts->get(session_id_chars); @@ -18,6 +19,7 @@ extern "C" JNIEXPORT jobject JNICALL Java_network_loki_messenger_libsession_1util_Contacts_getOrConstruct(JNIEnv *env, jobject thiz, jstring session_id) { + std::lock_guard lock{util::util_mutex_}; auto contacts = ptrToContacts(env, thiz); auto session_id_chars = env->GetStringUTFChars(session_id, nullptr); auto contact = contacts->get_or_construct(session_id_chars); @@ -29,6 +31,7 @@ extern "C" JNIEXPORT void JNICALL Java_network_loki_messenger_libsession_1util_Contacts_set(JNIEnv *env, jobject thiz, jobject contact) { + std::lock_guard lock{util::util_mutex_}; auto contacts = ptrToContacts(env, thiz); auto contact_info = deserialize_contact(env, contact, contacts); contacts->set(contact_info); @@ -38,6 +41,7 @@ extern "C" JNIEXPORT jboolean JNICALL Java_network_loki_messenger_libsession_1util_Contacts_erase(JNIEnv *env, jobject thiz, jstring session_id) { + std::lock_guard lock{util::util_mutex_}; auto contacts = ptrToContacts(env, thiz); auto session_id_chars = env->GetStringUTFChars(session_id, nullptr); @@ -52,6 +56,7 @@ JNIEXPORT jobject JNICALL Java_network_loki_messenger_libsession_1util_Contacts_00024Companion_newInstance___3B(JNIEnv *env, jobject thiz, jbyteArray ed25519_secret_key) { + std::lock_guard lock{util::util_mutex_}; auto secret_key = util::ustring_from_bytes(env, ed25519_secret_key); auto* contacts = new session::config::Contacts(secret_key, std::nullopt); @@ -65,6 +70,7 @@ extern "C" JNIEXPORT jobject JNICALL Java_network_loki_messenger_libsession_1util_Contacts_00024Companion_newInstance___3B_3B( JNIEnv *env, jobject thiz, jbyteArray ed25519_secret_key, jbyteArray initial_dump) { + std::lock_guard lock{util::util_mutex_}; auto secret_key = util::ustring_from_bytes(env, ed25519_secret_key); auto initial = util::ustring_from_bytes(env, initial_dump); @@ -80,6 +86,7 @@ Java_network_loki_messenger_libsession_1util_Contacts_00024Companion_newInstance extern "C" JNIEXPORT jobject JNICALL Java_network_loki_messenger_libsession_1util_Contacts_all(JNIEnv *env, jobject thiz) { + std::lock_guard lock{util::util_mutex_}; auto contacts = ptrToContacts(env, thiz); jclass stack = env->FindClass("java/util/Stack"); jmethodID init = env->GetMethodID(stack, "", "()V"); diff --git a/libsession-util/src/main/cpp/conversation.cpp b/libsession-util/src/main/cpp/conversation.cpp index 90074c863..4f0f531de 100644 --- a/libsession-util/src/main/cpp/conversation.cpp +++ b/libsession-util/src/main/cpp/conversation.cpp @@ -8,6 +8,7 @@ extern "C" JNIEXPORT jobject JNICALL Java_network_loki_messenger_libsession_1util_ConversationVolatileConfig_00024Companion_newInstance___3B( JNIEnv *env, jobject thiz, jbyteArray ed25519_secret_key) { + std::lock_guard lock{util::util_mutex_}; auto secret_key = util::ustring_from_bytes(env, ed25519_secret_key); auto* convo_info_volatile = new session::config::ConvoInfoVolatile(secret_key, std::nullopt); @@ -22,6 +23,7 @@ extern "C" JNIEXPORT jobject JNICALL Java_network_loki_messenger_libsession_1util_ConversationVolatileConfig_00024Companion_newInstance___3B_3B( JNIEnv *env, jobject thiz, jbyteArray ed25519_secret_key, jbyteArray initial_dump) { + std::lock_guard lock{util::util_mutex_}; auto secret_key = util::ustring_from_bytes(env, ed25519_secret_key); auto initial = util::ustring_from_bytes(env, initial_dump); auto* convo_info_volatile = new session::config::ConvoInfoVolatile(secret_key, initial); @@ -39,6 +41,7 @@ extern "C" JNIEXPORT jint JNICALL Java_network_loki_messenger_libsession_1util_ConversationVolatileConfig_sizeOneToOnes(JNIEnv *env, jobject thiz) { + std::lock_guard lock{util::util_mutex_}; auto conversations = ptrToConvoInfo(env, thiz); return conversations->size_1to1(); } @@ -49,6 +52,7 @@ JNIEXPORT jint JNICALL Java_network_loki_messenger_libsession_1util_ConversationVolatileConfig_eraseAll(JNIEnv *env, jobject thiz, jobject predicate) { + std::lock_guard lock{util::util_mutex_}; auto conversations = ptrToConvoInfo(env, thiz); jclass predicate_class = env->FindClass("kotlin/jvm/functions/Function1"); @@ -58,15 +62,19 @@ Java_network_loki_messenger_libsession_1util_ConversationVolatileConfig_eraseAll jmethodID bool_get = env->GetMethodID(bool_class, "booleanValue", "()Z"); int removed = 0; + auto to_erase = std::vector(); - for (auto it = conversations->begin(); it != conversations->end(); ) { + for (auto it = conversations->begin(); it != conversations->end(); ++it) { auto result = env->CallObjectMethod(predicate, predicate_call, serialize_any(env, *it)); bool bool_result = env->CallBooleanMethod(result, bool_get); if (bool_result) { - it = conversations->erase(it); + to_erase.push_back(*it); + } + } + + for (auto & entry : to_erase) { + if (conversations->erase(entry)) { removed++; - } else { - ++it; } } @@ -77,6 +85,7 @@ extern "C" JNIEXPORT jint JNICALL Java_network_loki_messenger_libsession_1util_ConversationVolatileConfig_size(JNIEnv *env, jobject thiz) { + std::lock_guard lock{util::util_mutex_}; auto config = ptrToConvoInfo(env, thiz); return (jint)config->size(); } @@ -84,6 +93,7 @@ extern "C" JNIEXPORT jboolean JNICALL Java_network_loki_messenger_libsession_1util_ConversationVolatileConfig_empty(JNIEnv *env, jobject thiz) { + std::lock_guard lock{util::util_mutex_}; auto config = ptrToConvoInfo(env, thiz); return config->empty(); } @@ -92,6 +102,7 @@ JNIEXPORT void JNICALL Java_network_loki_messenger_libsession_1util_ConversationVolatileConfig_set(JNIEnv *env, jobject thiz, jobject to_store) { + std::lock_guard lock{util::util_mutex_}; auto convos = ptrToConvoInfo(env, thiz); @@ -116,6 +127,7 @@ JNIEXPORT jobject JNICALL Java_network_loki_messenger_libsession_1util_ConversationVolatileConfig_getOneToOne(JNIEnv *env, jobject thiz, jstring pub_key_hex) { + std::lock_guard lock{util::util_mutex_}; auto convos = ptrToConvoInfo(env, thiz); auto param = env->GetStringUTFChars(pub_key_hex, nullptr); auto internal = convos->get_1to1(param); @@ -129,6 +141,7 @@ extern "C" JNIEXPORT jobject JNICALL Java_network_loki_messenger_libsession_1util_ConversationVolatileConfig_getOrConstructOneToOne( JNIEnv *env, jobject thiz, jstring pub_key_hex) { + std::lock_guard lock{util::util_mutex_}; auto convos = ptrToConvoInfo(env, thiz); auto param = env->GetStringUTFChars(pub_key_hex, nullptr); auto internal = convos->get_or_construct_1to1(param); @@ -140,6 +153,7 @@ JNIEXPORT jboolean JNICALL Java_network_loki_messenger_libsession_1util_ConversationVolatileConfig_eraseOneToOne(JNIEnv *env, jobject thiz, jstring pub_key_hex) { + std::lock_guard lock{util::util_mutex_}; auto convos = ptrToConvoInfo(env, thiz); auto param = env->GetStringUTFChars(pub_key_hex, nullptr); auto result = convos->erase_1to1(param); @@ -151,6 +165,7 @@ extern "C" JNIEXPORT jobject JNICALL Java_network_loki_messenger_libsession_1util_ConversationVolatileConfig_getCommunity__Ljava_lang_String_2Ljava_lang_String_2( JNIEnv *env, jobject thiz, jstring base_url, jstring room) { + std::lock_guard lock{util::util_mutex_}; auto convos = ptrToConvoInfo(env, thiz); auto base_url_chars = env->GetStringUTFChars(base_url, nullptr); auto room_chars = env->GetStringUTFChars(room, nullptr); @@ -165,6 +180,7 @@ extern "C" JNIEXPORT jobject JNICALL Java_network_loki_messenger_libsession_1util_ConversationVolatileConfig_getOrConstructCommunity__Ljava_lang_String_2Ljava_lang_String_2_3B( JNIEnv *env, jobject thiz, jstring base_url, jstring room, jbyteArray pub_key) { + std::lock_guard lock{util::util_mutex_}; auto convos = ptrToConvoInfo(env, thiz); auto base_url_chars = env->GetStringUTFChars(base_url, nullptr); auto room_chars = env->GetStringUTFChars(room, nullptr); @@ -177,6 +193,7 @@ extern "C" JNIEXPORT jobject JNICALL Java_network_loki_messenger_libsession_1util_ConversationVolatileConfig_getOrConstructCommunity__Ljava_lang_String_2Ljava_lang_String_2Ljava_lang_String_2( JNIEnv *env, jobject thiz, jstring base_url, jstring room, jstring pub_key_hex) { + std::lock_guard lock{util::util_mutex_}; auto convos = ptrToConvoInfo(env, thiz); auto base_url_chars = env->GetStringUTFChars(base_url, nullptr); auto room_chars = env->GetStringUTFChars(room, nullptr); @@ -193,6 +210,7 @@ JNIEXPORT jboolean JNICALL Java_network_loki_messenger_libsession_1util_ConversationVolatileConfig_eraseCommunity__Lnetwork_loki_messenger_libsession_1util_util_Conversation_Community_2(JNIEnv *env, jobject thiz, jobject open_group) { + std::lock_guard lock{util::util_mutex_}; auto convos = ptrToConvoInfo(env, thiz); auto deserialized = deserialize_community(env, open_group, convos); return convos->erase(deserialized); @@ -201,6 +219,7 @@ extern "C" JNIEXPORT jboolean JNICALL Java_network_loki_messenger_libsession_1util_ConversationVolatileConfig_eraseCommunity__Ljava_lang_String_2Ljava_lang_String_2( JNIEnv *env, jobject thiz, jstring base_url, jstring room) { + std::lock_guard lock{util::util_mutex_}; auto convos = ptrToConvoInfo(env, thiz); auto base_url_chars = env->GetStringUTFChars(base_url, nullptr); auto room_chars = env->GetStringUTFChars(room, nullptr); @@ -213,6 +232,7 @@ extern "C" JNIEXPORT jobject JNICALL Java_network_loki_messenger_libsession_1util_ConversationVolatileConfig_getLegacyClosedGroup( JNIEnv *env, jobject thiz, jstring group_id) { + std::lock_guard lock{util::util_mutex_}; auto convos = ptrToConvoInfo(env, thiz); auto id_chars = env->GetStringUTFChars(group_id, nullptr); auto lgc = convos->get_legacy_group(id_chars); @@ -227,6 +247,7 @@ extern "C" JNIEXPORT jobject JNICALL Java_network_loki_messenger_libsession_1util_ConversationVolatileConfig_getOrConstructLegacyGroup( JNIEnv *env, jobject thiz, jstring group_id) { + std::lock_guard lock{util::util_mutex_}; auto convos = ptrToConvoInfo(env, thiz); auto id_chars = env->GetStringUTFChars(group_id, nullptr); auto lgc = convos->get_or_construct_legacy_group(id_chars); @@ -237,6 +258,7 @@ extern "C" JNIEXPORT jboolean JNICALL Java_network_loki_messenger_libsession_1util_ConversationVolatileConfig_eraseLegacyClosedGroup( JNIEnv *env, jobject thiz, jstring group_id) { + std::lock_guard lock{util::util_mutex_}; auto convos = ptrToConvoInfo(env, thiz); auto id_chars = env->GetStringUTFChars(group_id, nullptr); auto result = convos->erase_legacy_group(id_chars); @@ -248,6 +270,7 @@ JNIEXPORT jboolean JNICALL Java_network_loki_messenger_libsession_1util_ConversationVolatileConfig_erase(JNIEnv *env, jobject thiz, jobject conversation) { + std::lock_guard lock{util::util_mutex_}; auto convos = ptrToConvoInfo(env, thiz); auto deserialized = deserialize_any(env, conversation, convos); if (!deserialized.has_value()) return false; @@ -257,6 +280,7 @@ extern "C" JNIEXPORT jint JNICALL Java_network_loki_messenger_libsession_1util_ConversationVolatileConfig_sizeCommunities(JNIEnv *env, jobject thiz) { + std::lock_guard lock{util::util_mutex_}; auto convos = ptrToConvoInfo(env, thiz); return convos->size_communities(); } @@ -264,6 +288,7 @@ extern "C" JNIEXPORT jint JNICALL Java_network_loki_messenger_libsession_1util_ConversationVolatileConfig_sizeLegacyClosedGroups( JNIEnv *env, jobject thiz) { + std::lock_guard lock{util::util_mutex_}; auto convos = ptrToConvoInfo(env, thiz); return convos->size_legacy_groups(); } @@ -271,6 +296,7 @@ extern "C" JNIEXPORT jobject JNICALL Java_network_loki_messenger_libsession_1util_ConversationVolatileConfig_all(JNIEnv *env, jobject thiz) { + std::lock_guard lock{util::util_mutex_}; auto convos = ptrToConvoInfo(env, thiz); jclass stack = env->FindClass("java/util/Stack"); jmethodID init = env->GetMethodID(stack, "", "()V"); @@ -286,6 +312,7 @@ extern "C" JNIEXPORT jobject JNICALL Java_network_loki_messenger_libsession_1util_ConversationVolatileConfig_allOneToOnes(JNIEnv *env, jobject thiz) { + std::lock_guard lock{util::util_mutex_}; auto convos = ptrToConvoInfo(env, thiz); jclass stack = env->FindClass("java/util/Stack"); jmethodID init = env->GetMethodID(stack, "", "()V"); @@ -299,6 +326,7 @@ extern "C" JNIEXPORT jobject JNICALL Java_network_loki_messenger_libsession_1util_ConversationVolatileConfig_allCommunities(JNIEnv *env, jobject thiz) { + std::lock_guard lock{util::util_mutex_}; auto convos = ptrToConvoInfo(env, thiz); jclass stack = env->FindClass("java/util/Stack"); jmethodID init = env->GetMethodID(stack, "", "()V"); @@ -312,6 +340,7 @@ extern "C" JNIEXPORT jobject JNICALL Java_network_loki_messenger_libsession_1util_ConversationVolatileConfig_allLegacyClosedGroups( JNIEnv *env, jobject thiz) { + std::lock_guard lock{util::util_mutex_}; auto convos = ptrToConvoInfo(env, thiz); jclass stack = env->FindClass("java/util/Stack"); jmethodID init = env->GetMethodID(stack, "", "()V"); diff --git a/libsession-util/src/main/cpp/user_groups.cpp b/libsession-util/src/main/cpp/user_groups.cpp index 9ae524663..4f2b0e6b8 100644 --- a/libsession-util/src/main/cpp/user_groups.cpp +++ b/libsession-util/src/main/cpp/user_groups.cpp @@ -9,6 +9,7 @@ extern "C" JNIEXPORT jobject JNICALL Java_network_loki_messenger_libsession_1util_UserGroupsConfig_00024Companion_newInstance___3B( JNIEnv *env, jobject thiz, jbyteArray ed25519_secret_key) { + std::lock_guard lock{util::util_mutex_}; auto secret_key = util::ustring_from_bytes(env, ed25519_secret_key); auto* user_groups = new session::config::UserGroups(secret_key, std::nullopt); @@ -24,6 +25,7 @@ extern "C" JNIEXPORT jobject JNICALL Java_network_loki_messenger_libsession_1util_UserGroupsConfig_00024Companion_newInstance___3B_3B( JNIEnv *env, jobject thiz, jbyteArray ed25519_secret_key, jbyteArray initial_dump) { + std::lock_guard lock{util::util_mutex_}; auto secret_key = util::ustring_from_bytes(env, ed25519_secret_key); auto initial = util::ustring_from_bytes(env, initial_dump); @@ -41,6 +43,7 @@ extern "C" JNIEXPORT jint JNICALL Java_network_loki_messenger_libsession_1util_util_GroupInfo_00024LegacyGroupInfo_00024Companion_NAME_1MAX_1LENGTH( JNIEnv *env, jobject thiz) { + std::lock_guard lock{util::util_mutex_}; return session::config::legacy_group_info::NAME_MAX_LENGTH; } @@ -50,6 +53,7 @@ Java_network_loki_messenger_libsession_1util_UserGroupsConfig_getCommunityInfo(J jobject thiz, jstring base_url, jstring room) { + std::lock_guard lock{util::util_mutex_}; auto conf = ptrToUserGroups(env, thiz); auto base_url_bytes = env->GetStringUTFChars(base_url, nullptr); auto room_bytes = env->GetStringUTFChars(room, nullptr); @@ -71,6 +75,7 @@ JNIEXPORT jobject JNICALL Java_network_loki_messenger_libsession_1util_UserGroupsConfig_getLegacyGroupInfo(JNIEnv *env, jobject thiz, jstring session_id) { + std::lock_guard lock{util::util_mutex_}; auto conf = ptrToUserGroups(env, thiz); auto id_bytes = env->GetStringUTFChars(session_id, nullptr); auto legacy_group = conf->get_legacy_group(id_bytes); @@ -86,6 +91,7 @@ extern "C" JNIEXPORT jobject JNICALL Java_network_loki_messenger_libsession_1util_UserGroupsConfig_getOrConstructCommunityInfo( JNIEnv *env, jobject thiz, jstring base_url, jstring room, jstring pub_key_hex) { + std::lock_guard lock{util::util_mutex_}; auto conf = ptrToUserGroups(env, thiz); auto base_url_bytes = env->GetStringUTFChars(base_url, nullptr); auto room_bytes = env->GetStringUTFChars(room, nullptr); @@ -103,6 +109,7 @@ extern "C" JNIEXPORT jobject JNICALL Java_network_loki_messenger_libsession_1util_UserGroupsConfig_getOrConstructLegacyGroupInfo( JNIEnv *env, jobject thiz, jstring session_id) { + std::lock_guard lock{util::util_mutex_}; auto conf = ptrToUserGroups(env, thiz); auto id_bytes = env->GetStringUTFChars(session_id, nullptr); auto group = conf->get_or_construct_legacy_group(id_bytes); @@ -114,6 +121,7 @@ extern "C" JNIEXPORT void JNICALL Java_network_loki_messenger_libsession_1util_UserGroupsConfig_set__Lnetwork_loki_messenger_libsession_1util_util_GroupInfo_2( JNIEnv *env, jobject thiz, jobject group_info) { + std::lock_guard lock{util::util_mutex_}; auto conf = ptrToUserGroups(env, thiz); auto community_info = env->FindClass("network/loki/messenger/libsession_util/util/GroupInfo$CommunityGroupInfo"); auto legacy_info = env->FindClass("network/loki/messenger/libsession_util/util/GroupInfo$LegacyGroupInfo"); @@ -132,6 +140,7 @@ extern "C" JNIEXPORT void JNICALL Java_network_loki_messenger_libsession_1util_UserGroupsConfig_erase__Lnetwork_loki_messenger_libsession_1util_util_GroupInfo_2( JNIEnv *env, jobject thiz, jobject group_info) { + std::lock_guard lock{util::util_mutex_}; auto conf = ptrToUserGroups(env, thiz); auto communityInfo = env->FindClass("network/loki/messenger/libsession_util/util/GroupInfo$CommunityGroupInfo"); auto legacyInfo = env->FindClass("network/loki/messenger/libsession_util/util/GroupInfo$LegacyGroupInfo"); @@ -148,6 +157,7 @@ extern "C" JNIEXPORT jint JNICALL Java_network_loki_messenger_libsession_1util_UserGroupsConfig_sizeCommunityInfo(JNIEnv *env, jobject thiz) { + std::lock_guard lock{util::util_mutex_}; auto conf = ptrToUserGroups(env, thiz); return conf->size_communities(); } @@ -156,6 +166,7 @@ extern "C" JNIEXPORT jint JNICALL Java_network_loki_messenger_libsession_1util_UserGroupsConfig_sizeLegacyGroupInfo(JNIEnv *env, jobject thiz) { + std::lock_guard lock{util::util_mutex_}; auto conf = ptrToUserGroups(env, thiz); return conf->size_legacy_groups(); } @@ -163,6 +174,7 @@ Java_network_loki_messenger_libsession_1util_UserGroupsConfig_sizeLegacyGroupInf extern "C" JNIEXPORT jint JNICALL Java_network_loki_messenger_libsession_1util_UserGroupsConfig_size(JNIEnv *env, jobject thiz) { + std::lock_guard lock{util::util_mutex_}; auto conf = ptrToConvoInfo(env, thiz); return conf->size(); } @@ -192,6 +204,7 @@ inline jobject iterator_as_java_stack(JNIEnv *env, const session::config::UserGr extern "C" JNIEXPORT jobject JNICALL Java_network_loki_messenger_libsession_1util_UserGroupsConfig_all(JNIEnv *env, jobject thiz) { + std::lock_guard lock{util::util_mutex_}; auto conf = ptrToUserGroups(env, thiz); jobject all_stack = iterator_as_java_stack(env, conf->begin(), conf->end()); return all_stack; @@ -201,6 +214,7 @@ extern "C" JNIEXPORT jobject JNICALL Java_network_loki_messenger_libsession_1util_UserGroupsConfig_allCommunityInfo(JNIEnv *env, jobject thiz) { + std::lock_guard lock{util::util_mutex_}; auto conf = ptrToUserGroups(env, thiz); jobject community_stack = iterator_as_java_stack(env, conf->begin_communities(), conf->end()); return community_stack; @@ -210,6 +224,7 @@ extern "C" JNIEXPORT jobject JNICALL Java_network_loki_messenger_libsession_1util_UserGroupsConfig_allLegacyGroupInfo(JNIEnv *env, jobject thiz) { + std::lock_guard lock{util::util_mutex_}; auto conf = ptrToUserGroups(env, thiz); jobject legacy_stack = iterator_as_java_stack(env, conf->begin_legacy_groups(), conf->end()); return legacy_stack; @@ -220,6 +235,7 @@ JNIEXPORT jboolean JNICALL Java_network_loki_messenger_libsession_1util_UserGroupsConfig_eraseCommunity__Lnetwork_loki_messenger_libsession_1util_util_BaseCommunityInfo_2(JNIEnv *env, jobject thiz, jobject base_community_info) { + std::lock_guard lock{util::util_mutex_}; auto conf = ptrToUserGroups(env, thiz); auto base_community = util::deserialize_base_community(env, base_community_info); return conf->erase_community(base_community.base_url(),base_community.room()); @@ -229,6 +245,7 @@ extern "C" JNIEXPORT jboolean JNICALL Java_network_loki_messenger_libsession_1util_UserGroupsConfig_eraseCommunity__Ljava_lang_String_2Ljava_lang_String_2( JNIEnv *env, jobject thiz, jstring server, jstring room) { + std::lock_guard lock{util::util_mutex_}; auto conf = ptrToUserGroups(env, thiz); auto server_bytes = env->GetStringUTFChars(server, nullptr); auto room_bytes = env->GetStringUTFChars(room, nullptr); @@ -247,6 +264,7 @@ JNIEXPORT jboolean JNICALL Java_network_loki_messenger_libsession_1util_UserGroupsConfig_eraseLegacyGroup(JNIEnv *env, jobject thiz, jstring session_id) { + std::lock_guard lock{util::util_mutex_}; auto conf = ptrToUserGroups(env, thiz); auto session_id_bytes = env->GetStringUTFChars(session_id, nullptr); bool return_bool = conf->erase_legacy_group(session_id_bytes); diff --git a/libsession-util/src/main/cpp/user_profile.cpp b/libsession-util/src/main/cpp/user_profile.cpp index fb58d0291..78b671ef0 100644 --- a/libsession-util/src/main/cpp/user_profile.cpp +++ b/libsession-util/src/main/cpp/user_profile.cpp @@ -7,6 +7,7 @@ extern "C" { JNIEXPORT jobject JNICALL Java_network_loki_messenger_libsession_1util_UserProfile_00024Companion_newInstance___3B_3B( JNIEnv *env, jobject thiz, jbyteArray ed25519_secret_key, jbyteArray initial_dump) { + std::lock_guard lock{util::util_mutex_}; auto secret_key = util::ustring_from_bytes(env, ed25519_secret_key); auto initial = util::ustring_from_bytes(env, initial_dump); auto* profile = new session::config::UserProfile(secret_key, std::optional(initial)); @@ -23,7 +24,7 @@ Java_network_loki_messenger_libsession_1util_UserProfile_00024Companion_newInsta JNIEnv* env, jobject, jbyteArray secretKey) { - + std::lock_guard lock{util::util_mutex_}; auto* profile = new session::config::UserProfile(util::ustring_from_bytes(env, secretKey), std::nullopt); jclass userClass = env->FindClass("network/loki/messenger/libsession_util/UserProfile"); @@ -39,6 +40,7 @@ Java_network_loki_messenger_libsession_1util_UserProfile_setName( JNIEnv* env, jobject thiz, jstring newName) { + std::lock_guard lock{util::util_mutex_}; auto profile = ptrToProfile(env, thiz); auto name_chars = env->GetStringUTFChars(newName, nullptr); profile->set_name(name_chars); @@ -47,6 +49,7 @@ Java_network_loki_messenger_libsession_1util_UserProfile_setName( JNIEXPORT jstring JNICALL Java_network_loki_messenger_libsession_1util_UserProfile_getName(JNIEnv *env, jobject thiz) { + std::lock_guard lock{util::util_mutex_}; auto profile = ptrToProfile(env, thiz); auto name = profile->get_name(); if (name == std::nullopt) return nullptr; @@ -56,6 +59,7 @@ Java_network_loki_messenger_libsession_1util_UserProfile_getName(JNIEnv *env, jo JNIEXPORT jobject JNICALL Java_network_loki_messenger_libsession_1util_UserProfile_getPic(JNIEnv *env, jobject thiz) { + std::lock_guard lock{util::util_mutex_}; auto profile = ptrToProfile(env, thiz); auto pic = profile->get_profile_pic(); @@ -67,6 +71,7 @@ Java_network_loki_messenger_libsession_1util_UserProfile_getPic(JNIEnv *env, job JNIEXPORT void JNICALL Java_network_loki_messenger_libsession_1util_UserProfile_setPic(JNIEnv *env, jobject thiz, jobject user_pic) { + std::lock_guard lock{util::util_mutex_}; auto profile = ptrToProfile(env, thiz); auto pic = util::deserialize_user_pic(env, user_pic); auto url = env->GetStringUTFChars(pic.first, nullptr); @@ -80,12 +85,14 @@ extern "C" JNIEXPORT void JNICALL Java_network_loki_messenger_libsession_1util_UserProfile_setNtsPriority(JNIEnv *env, jobject thiz, jint priority) { + std::lock_guard lock{util::util_mutex_}; auto profile = ptrToProfile(env, thiz); profile->set_nts_priority(priority); } extern "C" JNIEXPORT jint JNICALL Java_network_loki_messenger_libsession_1util_UserProfile_getNtsPriority(JNIEnv *env, jobject thiz) { + std::lock_guard lock{util::util_mutex_}; auto profile = ptrToProfile(env, thiz); return profile->get_nts_priority(); } \ No newline at end of file diff --git a/libsession-util/src/main/cpp/util.cpp b/libsession-util/src/main/cpp/util.cpp index d168e10d7..69469eac1 100644 --- a/libsession-util/src/main/cpp/util.cpp +++ b/libsession-util/src/main/cpp/util.cpp @@ -3,6 +3,9 @@ #include namespace util { + + std::mutex util_mutex_ = std::mutex(); + jbyteArray bytes_from_ustring(JNIEnv* env, session::ustring_view from_str) { size_t length = from_str.length(); auto jlength = (jsize)length; diff --git a/libsession-util/src/main/cpp/util.h b/libsession-util/src/main/cpp/util.h index 9554b085b..9348e8bd7 100644 --- a/libsession-util/src/main/cpp/util.h +++ b/libsession-util/src/main/cpp/util.h @@ -10,6 +10,7 @@ #include "session/config/expiring.hpp" namespace util { + extern std::mutex util_mutex_; jbyteArray bytes_from_ustring(JNIEnv* env, session::ustring_view from_str); session::ustring ustring_from_bytes(JNIEnv* env, jbyteArray byteArray); jobject serialize_user_pic(JNIEnv *env, session::config::profile_pic pic); 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 cbf55b2e5..0df311649 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 @@ -26,7 +26,7 @@ sealed class ConfigBase(protected val /* yucky */ pointer: Long) { } // TODO: time in future to activate (hardcoded to 1st jan 2024 for testing, change before release) - private const val ACTIVATE_TIME = 1704027600 + private const val ACTIVATE_TIME = 1690761600000 fun isNewConfigEnabled(forced: Boolean, currentTime: Long) = forced || currentTime >= ACTIVATE_TIME diff --git a/libsession/src/main/java/org/session/libsession/messaging/jobs/BatchMessageReceiveJob.kt b/libsession/src/main/java/org/session/libsession/messaging/jobs/BatchMessageReceiveJob.kt index 2d5409867..3aea8a1e3 100644 --- a/libsession/src/main/java/org/session/libsession/messaging/jobs/BatchMessageReceiveJob.kt +++ b/libsession/src/main/java/org/session/libsession/messaging/jobs/BatchMessageReceiveJob.kt @@ -219,7 +219,7 @@ class BatchMessageReceiveJob( if (currentLastSeen > newLastSeen) { newLastSeen = currentLastSeen } - if (newLastSeen > 0) { + if (newLastSeen > 0 || currentLastSeen == 0L) { storage.markConversationAsRead(threadId, newLastSeen, force = true) } storage.updateThread(threadId, true) diff --git a/libsession/src/main/java/org/session/libsession/messaging/jobs/ConfigurationSyncJob.kt b/libsession/src/main/java/org/session/libsession/messaging/jobs/ConfigurationSyncJob.kt index fcd7dd8ea..ec8de4416 100644 --- a/libsession/src/main/java/org/session/libsession/messaging/jobs/ConfigurationSyncJob.kt +++ b/libsession/src/main/java/org/session/libsession/messaging/jobs/ConfigurationSyncJob.kt @@ -133,7 +133,7 @@ data class ConfigurationSyncJob(val destination: Destination): Job { Log.w(TAG, "No hash returned for the configuration in namespace ${config.configNamespace()}") return@forEachIndexed } - Log.d(TAG, "Hash $insertHash returned from store request for new config") + Log.d(TAG, "Hash ${insertHash.take(4)} returned from store request for new config") // confirm pushed seqno val thisSeqNo = toPushMessage.seqNo