diff --git a/app/build.gradle b/app/build.gradle
index 8b453260bb..73a4e24d03 100644
--- a/app/build.gradle
+++ b/app/build.gradle
@@ -158,8 +158,8 @@ dependencies {
testImplementation 'org.robolectric:shadows-multidex:4.2'
}
-def canonicalVersionCode = 161
-def canonicalVersionName = "1.10.2"
+def canonicalVersionCode = 163
+def canonicalVersionName = "1.10.4"
def postFixSize = 10
def abiPostFix = ['armeabi-v7a' : 1,
diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml
index 2d8473b849..972ec30be1 100644
--- a/app/src/main/AndroidManifest.xml
+++ b/app/src/main/AndroidManifest.xml
@@ -254,6 +254,10 @@
android:name="android.support.PARENT_ACTIVITY"
android:value="org.thoughtcrime.securesms.loki.activities.HomeActivity" />
+
{
for (MessageRecord messageRecord : messageRecords) {
- Long serverID = DatabaseFactory.getLokiMessageDatabase(getContext()).getServerID(messageRecord.id, !messageRecord.isMms());
+ Long serverID = DatabaseFactory.getLokiMessageDatabase(getContext()).getServerID(messageRecord.id, !messageRecord.isMms());
if (l.contains(serverID)) {
if (messageRecord.isMms()) {
DatabaseFactory.getMmsDatabase(getActivity()).delete(messageRecord.getId());
@@ -569,7 +569,7 @@ public class ConversationFragment extends Fragment
.deleteMessage(serverId, openGroupChat.getRoom(), openGroupChat.getServer())
.success(l -> {
for (MessageRecord messageRecord : messageRecords) {
- Long serverID = DatabaseFactory.getLokiMessageDatabase(getContext()).getServerID(messageRecord.id, !messageRecord.isMms());
+ Long serverID = DatabaseFactory.getLokiMessageDatabase(getContext()).getServerID(messageRecord.id, !messageRecord.isMms());
if (serverID != null && serverID.equals(serverId)) {
MessagingModuleConfiguration.shared.getMessageDataProvider().deleteMessage(messageRecord.id, !messageRecord.isMms());
break;
diff --git a/app/src/main/java/org/thoughtcrime/securesms/loki/activities/OpenGroupGuidelinesActivity.kt b/app/src/main/java/org/thoughtcrime/securesms/loki/activities/OpenGroupGuidelinesActivity.kt
new file mode 100644
index 0000000000..2a9ebe5491
--- /dev/null
+++ b/app/src/main/java/org/thoughtcrime/securesms/loki/activities/OpenGroupGuidelinesActivity.kt
@@ -0,0 +1,37 @@
+package org.thoughtcrime.securesms.loki.activities
+
+import android.os.Bundle
+import kotlinx.android.synthetic.main.activity_open_group_guidelines.*
+import network.loki.messenger.R
+import org.thoughtcrime.securesms.BaseActionBarActivity
+
+class OpenGroupGuidelinesActivity : BaseActionBarActivity() {
+
+ // region Lifecycle
+ override fun onCreate(savedInstanceState: Bundle?) {
+ super.onCreate(savedInstanceState)
+ setContentView(R.layout.activity_open_group_guidelines)
+ communityGuidelinesTextView.text = """
+ In order for our open group to be a fun environment, full of robust and constructive discussion, please follow these four simple rules:
+
+ 1. Keep conversations on-topic and add value to the discussion (no referral links, spamming, or off-topic discussion).
+
+ 2. You don't have to love everyone, but be civil (no baiting, excessively partisan arguments, threats, and so on; use common sense).
+
+ 3. Do not be a shill. Comparison and criticism is reasonable, but blatant shilling is not.
+
+ 4. Don't post explicit content, be it excessive offensive language, or content which is sexual or violent in nature.
+
+ If you break these rules, you’ll be warned by an admin. If your behaviour doesn’t improve, you will be removed from the open group.
+
+ If you see or experience any destructive behaviour, please contact an admin.
+
+ ——————————
+
+ SCAMMER WARNING
+
+ Trust only those with an admin tag in the chat. No admin will ever DM you first. No admin will ever message you for Oxen coins.
+ """.trimIndent()
+ }
+ // endregion
+}
\ No newline at end of file
diff --git a/app/src/main/java/org/thoughtcrime/securesms/loki/database/LokiMessageDatabase.kt b/app/src/main/java/org/thoughtcrime/securesms/loki/database/LokiMessageDatabase.kt
index 85a66b159c..83dc565117 100644
--- a/app/src/main/java/org/thoughtcrime/securesms/loki/database/LokiMessageDatabase.kt
+++ b/app/src/main/java/org/thoughtcrime/securesms/loki/database/LokiMessageDatabase.kt
@@ -2,6 +2,7 @@ package org.thoughtcrime.securesms.loki.database
import android.content.ContentValues
import android.content.Context
+import net.sqlcipher.database.SQLiteDatabase.CONFLICT_REPLACE
import org.thoughtcrime.securesms.database.Database
import org.thoughtcrime.securesms.database.DatabaseFactory
import org.thoughtcrime.securesms.database.helpers.SQLCipherOpenHelper
@@ -98,11 +99,11 @@ class LokiMessageDatabase(context: Context, helper: SQLCipherOpenHelper) : Datab
override fun setServerID(messageID: Long, serverID: Long, isSms: Boolean) {
val database = databaseHelper.writableDatabase
- val contentValues = ContentValues(2)
+ val contentValues = ContentValues(3)
contentValues.put(Companion.messageID, messageID)
contentValues.put(Companion.serverID, serverID)
contentValues.put(messageType, if (isSms) SMS_TYPE else MMS_TYPE)
- database.insertOrUpdate(messageIDTable, contentValues, "${Companion.messageID} = ? AND ${Companion.serverID} = ?", arrayOf(messageID.toString(), serverID.toString()))
+ database.insertWithOnConflict(messageIDTable, null, contentValues, CONFLICT_REPLACE)
}
fun getOriginalThreadID(messageID: Long): Long {
@@ -114,11 +115,11 @@ class LokiMessageDatabase(context: Context, helper: SQLCipherOpenHelper) : Datab
fun setOriginalThreadID(messageID: Long, serverID: Long, threadID: Long) {
val database = databaseHelper.writableDatabase
- val contentValues = ContentValues(2)
+ val contentValues = ContentValues(3)
contentValues.put(Companion.messageID, messageID)
contentValues.put(Companion.serverID, serverID)
contentValues.put(Companion.threadID, threadID)
- database.insertOrUpdate(messageThreadMappingTable, contentValues, "${Companion.messageID} = ? AND ${Companion.serverID} = ?", arrayOf(messageID.toString(), serverID.toString()))
+ database.insertWithOnConflict(messageThreadMappingTable, null, contentValues, CONFLICT_REPLACE)
}
fun getErrorMessage(messageID: Long): String? {
diff --git a/app/src/main/java/org/thoughtcrime/securesms/loki/utilities/OpenGroupUtilities.kt b/app/src/main/java/org/thoughtcrime/securesms/loki/utilities/OpenGroupUtilities.kt
index cf8c747638..66d7263747 100644
--- a/app/src/main/java/org/thoughtcrime/securesms/loki/utilities/OpenGroupUtilities.kt
+++ b/app/src/main/java/org/thoughtcrime/securesms/loki/utilities/OpenGroupUtilities.kt
@@ -35,11 +35,10 @@ object OpenGroupUtilities {
val groupInfo = OpenGroupAPIV2.getInfo(room,server).get()
val application = ApplicationContext.getInstance(context)
- val group = application.publicChatManager.addChat(server, room, groupInfo, publicKey)
-
val storage = MessagingModuleConfiguration.shared.storage
storage.removeLastDeletionServerId(room, server)
storage.removeLastMessageServerId(room, server)
+ val group = application.publicChatManager.addChat(server, room, groupInfo, publicKey)
return group
}
diff --git a/app/src/main/java/org/thoughtcrime/securesms/loki/views/OpenGroupGuidelinesView.kt b/app/src/main/java/org/thoughtcrime/securesms/loki/views/OpenGroupGuidelinesView.kt
new file mode 100644
index 0000000000..d29460866c
--- /dev/null
+++ b/app/src/main/java/org/thoughtcrime/securesms/loki/views/OpenGroupGuidelinesView.kt
@@ -0,0 +1,38 @@
+package org.thoughtcrime.securesms.loki.views
+
+import android.content.Context
+import android.content.Intent
+import android.util.AttributeSet
+import android.view.LayoutInflater
+import android.widget.FrameLayout
+import kotlinx.android.synthetic.main.view_open_group_guidelines.view.*
+import network.loki.messenger.R
+import org.thoughtcrime.securesms.conversation.ConversationActivity
+import org.thoughtcrime.securesms.loki.activities.OpenGroupGuidelinesActivity
+import org.thoughtcrime.securesms.loki.utilities.push
+
+class OpenGroupGuidelinesView : FrameLayout {
+
+ constructor(context: Context) : super(context) {
+ setUpViewHierarchy()
+ }
+
+ constructor(context: Context, attrs: AttributeSet) : super(context, attrs) {
+ setUpViewHierarchy()
+ }
+
+ constructor(context: Context, attrs: AttributeSet, defStyleAttr: Int) : super(context, attrs, defStyleAttr) {
+ setUpViewHierarchy()
+ }
+
+ private fun setUpViewHierarchy() {
+ val inflater = context.getSystemService(Context.LAYOUT_INFLATER_SERVICE) as LayoutInflater
+ val contentView = inflater.inflate(R.layout.view_open_group_guidelines, null)
+ addView(contentView)
+ readButton.setOnClickListener {
+ val activity = context as ConversationActivity
+ val intent = Intent(activity, OpenGroupGuidelinesActivity::class.java)
+ activity.push(intent)
+ }
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/res/layout/activity_open_group_guidelines.xml b/app/src/main/res/layout/activity_open_group_guidelines.xml
new file mode 100644
index 0000000000..34d03a8f89
--- /dev/null
+++ b/app/src/main/res/layout/activity_open_group_guidelines.xml
@@ -0,0 +1,36 @@
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/layout/conversation_activity.xml b/app/src/main/res/layout/conversation_activity.xml
index 0b9ff3d077..ba9f7f27e1 100644
--- a/app/src/main/res/layout/conversation_activity.xml
+++ b/app/src/main/res/layout/conversation_activity.xml
@@ -134,6 +134,12 @@
android:background="?android:dividerHorizontal"
android:elevation="1dp" />
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/libsession/src/main/java/org/session/libsession/messaging/jobs/JobQueue.kt b/libsession/src/main/java/org/session/libsession/messaging/jobs/JobQueue.kt
index a2f47556bc..1fdf100a3f 100644
--- a/libsession/src/main/java/org/session/libsession/messaging/jobs/JobQueue.kt
+++ b/libsession/src/main/java/org/session/libsession/messaging/jobs/JobQueue.kt
@@ -130,12 +130,7 @@ class JobQueue : JobDelegate {
}
// Message send jobs waiting for the attachment to upload
if (job is MessageSendJob && error is MessageSendJob.AwaitingAttachmentUploadException) {
- val retryInterval: Long = 1000 * 4
Log.i("Loki", "Message send job waiting for attachment upload to finish.")
- timer.schedule(delay = retryInterval) {
- Log.i("Loki", "Retrying ${job::class.simpleName}.")
- queue.offer(job)
- }
return
}
// Regular job failure
diff --git a/libsession/src/main/java/org/session/libsession/messaging/sending_receiving/ReceivedMessageHandler.kt b/libsession/src/main/java/org/session/libsession/messaging/sending_receiving/ReceivedMessageHandler.kt
index 6059ca44cd..6a4b986744 100644
--- a/libsession/src/main/java/org/session/libsession/messaging/sending_receiving/ReceivedMessageHandler.kt
+++ b/libsession/src/main/java/org/session/libsession/messaging/sending_receiving/ReceivedMessageHandler.kt
@@ -225,7 +225,8 @@ fun MessageReceiver.handleVisibleMessage(message: VisibleMessage, proto: SignalS
}
val openGroupServerID = message.openGroupServerMessageID
if (openGroupServerID != null) {
- storage.setOpenGroupServerMessageID(messageID, openGroupServerID, threadID, !message.isMediaMessage())
+ val isSms = !(message.isMediaMessage() || attachments.isNotEmpty())
+ storage.setOpenGroupServerMessageID(messageID, openGroupServerID, threadID, isSms)
}
// Cancel any typing indicators if needed
cancelTypingIndicatorsIfNeeded(message.sender!!)
diff --git a/libsession/src/main/java/org/session/libsession/messaging/sending_receiving/pollers/OpenGroupV2Poller.kt b/libsession/src/main/java/org/session/libsession/messaging/sending_receiving/pollers/OpenGroupV2Poller.kt
index 7e40c9b2a6..439b1c3400 100644
--- a/libsession/src/main/java/org/session/libsession/messaging/sending_receiving/pollers/OpenGroupV2Poller.kt
+++ b/libsession/src/main/java/org/session/libsession/messaging/sending_receiving/pollers/OpenGroupV2Poller.kt
@@ -73,8 +73,8 @@ class OpenGroupV2Poller(private val openGroups: List, private val e
return OpenGroupAPIV2.compactPoll(rooms = rooms, server).successBackground { results ->
results.forEach { (room, results) ->
val serverRoomId = "$server.$room"
- handleDeletedMessages(serverRoomId,results.deletions)
handleNewMessages(serverRoomId, results.messages.sortedBy { it.serverID }, isBackgroundPoll)
+ handleDeletedMessages(serverRoomId,results.deletions)
}
}.always {
isPollOngoing = false
@@ -120,7 +120,11 @@ class OpenGroupV2Poller(private val openGroups: List, private val e
val threadId = messagingModule.storage.getThreadIdFor(Address.fromSerialized(address)) ?: return
val deletedMessageIDs = deletedMessageServerIDs.mapNotNull { serverId ->
- messagingModule.messageDataProvider.getMessageID(serverId, threadId)
+ val id = messagingModule.messageDataProvider.getMessageID(serverId, threadId)
+ if (id == null) {
+ Log.d("Loki", "Couldn't find server ID $serverId")
+ }
+ id
}
deletedMessageIDs.forEach { (messageId, isSms) ->
MessagingModuleConfiguration.shared.messageDataProvider.deleteMessage(messageId, isSms)
diff --git a/libsession/src/main/java/org/session/libsession/utilities/color/MaterialColor.java b/libsession/src/main/java/org/session/libsession/utilities/color/MaterialColor.java
index f68c016f0e..31e99f6632 100644
--- a/libsession/src/main/java/org/session/libsession/utilities/color/MaterialColor.java
+++ b/libsession/src/main/java/org/session/libsession/utilities/color/MaterialColor.java
@@ -58,7 +58,6 @@ public enum MaterialColor {
private final String serialized;
-
MaterialColor(@ColorRes int mainColor, @ColorRes int tintColor, @ColorRes int shadeColor, String serialized) {
this.mainColor = mainColor;
this.tintColor = tintColor;
@@ -110,9 +109,9 @@ public enum MaterialColor {
}
public boolean represents(Context context, int colorValue) {
- return context.getResources().getColor(mainColor) == colorValue ||
- context.getResources().getColor(tintColor) == colorValue ||
- context.getResources().getColor(shadeColor) == colorValue;
+ return context.getResources().getColor(mainColor) == colorValue
+ || context.getResources().getColor(tintColor) == colorValue
+ || context.getResources().getColor(shadeColor) == colorValue;
}
public String serialize() {
diff --git a/libsession/src/main/java/org/session/libsession/utilities/color/MaterialColors.java b/libsession/src/main/java/org/session/libsession/utilities/color/MaterialColors.java
deleted file mode 100644
index 4f6b936db1..0000000000
--- a/libsession/src/main/java/org/session/libsession/utilities/color/MaterialColors.java
+++ /dev/null
@@ -1,70 +0,0 @@
-package org.session.libsession.utilities.color;
-
-import android.content.Context;
-
-import androidx.annotation.NonNull;
-import androidx.annotation.Nullable;
-
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.List;
-
-public class MaterialColors {
-
- public static final MaterialColorList CONVERSATION_PALETTE = new MaterialColorList(new ArrayList<>(Arrays.asList(
- MaterialColor.PLUM,
- MaterialColor.CRIMSON,
- MaterialColor.VERMILLION,
- MaterialColor.VIOLET,
- MaterialColor.BLUE,
- MaterialColor.INDIGO,
- MaterialColor.FOREST,
- MaterialColor.WINTERGREEN,
- MaterialColor.TEAL,
- MaterialColor.BURLAP,
- MaterialColor.TAUPE,
- MaterialColor.STEEL
- )));
-
- public static class MaterialColorList {
-
- private final List colors;
-
- private MaterialColorList(List colors) {
- this.colors = colors;
- }
-
- public MaterialColor get(int index) {
- return colors.get(index);
- }
-
- public int size() {
- return colors.size();
- }
-
- public @Nullable MaterialColor getByColor(Context context, int colorValue) {
- for (MaterialColor color : colors) {
- if (color.represents(context, colorValue)) {
- return color;
- }
- }
-
- return null;
- }
-
- public int[] asConversationColorArray(@NonNull Context context) {
- int[] results = new int[colors.size()];
- int index = 0;
-
- for (MaterialColor color : colors) {
- results[index++] = color.toConversationColor(context);
- }
-
- return results;
- }
-
- }
-
-
-}
-
diff --git a/libsession/src/main/java/org/session/libsession/utilities/color/spans/CenterAlignedRelativeSizeSpan.java b/libsession/src/main/java/org/session/libsession/utilities/color/spans/CenterAlignedRelativeSizeSpan.java
index cfbb66dd93..9fca16c3c7 100644
--- a/libsession/src/main/java/org/session/libsession/utilities/color/spans/CenterAlignedRelativeSizeSpan.java
+++ b/libsession/src/main/java/org/session/libsession/utilities/color/spans/CenterAlignedRelativeSizeSpan.java
@@ -1,12 +1,10 @@
package org.session.libsession.utilities.color.spans;
-
import androidx.annotation.NonNull;
import android.text.TextPaint;
import android.text.style.MetricAffectingSpan;
public class CenterAlignedRelativeSizeSpan extends MetricAffectingSpan {
-
private final float relativeSize;
public CenterAlignedRelativeSizeSpan(float relativeSize) {