From b346a85d5713fa54d7db4cd8dd7a7145769667d1 Mon Sep 17 00:00:00 2001 From: nielsandriesse Date: Mon, 31 May 2021 14:06:02 +1000 Subject: [PATCH 001/240] Add basic conversation screen components --- .../conversation/v2/ConversationActivityV2.kt | 35 ++++++++++++++++++ .../conversation/v2/ConversationAdapter.kt | 35 ++++++++++++++++++ .../conversation/v2/messages/MessageView.kt | 37 +++++++++++++++++++ .../res/layout/activity_conversation_v2.xml | 14 +++++++ 4 files changed, 121 insertions(+) create mode 100644 app/src/main/java/org/thoughtcrime/securesms/conversation/v2/ConversationActivityV2.kt create mode 100644 app/src/main/java/org/thoughtcrime/securesms/conversation/v2/ConversationAdapter.kt create mode 100644 app/src/main/java/org/thoughtcrime/securesms/conversation/v2/messages/MessageView.kt create mode 100644 app/src/main/res/layout/activity_conversation_v2.xml 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 new file mode 100644 index 0000000000..0ae4adf548 --- /dev/null +++ b/app/src/main/java/org/thoughtcrime/securesms/conversation/v2/ConversationActivityV2.kt @@ -0,0 +1,35 @@ +package org.thoughtcrime.securesms.conversation.v2 + +import android.os.Bundle +import androidx.recyclerview.widget.LinearLayoutManager +import kotlinx.android.synthetic.main.activity_home.* +import network.loki.messenger.R +import org.thoughtcrime.securesms.PassphraseRequiredActionBarActivity +import org.thoughtcrime.securesms.database.DatabaseFactory + +class ConversationActivityV2 : PassphraseRequiredActionBarActivity() { + private var threadID: Long = -1 + + // region Settings + companion object { + const val THREAD_ID = "thread_id" + } + // endregion + + // region Lifecycle + override fun onCreate(savedInstanceState: Bundle?, isReady: Boolean) { + super.onCreate(savedInstanceState, isReady) + setContentView(R.layout.activity_conversation_v2) + threadID = intent.getLongExtra(THREAD_ID, -1) + setUpRecyclerView() + } + + private fun setUpRecyclerView() { + val cursor = DatabaseFactory.getMmsSmsDatabase(this).getConversation(threadID) + val adapter = ConversationAdapter(this, cursor) + adapter.setHasStableIds(true) + recyclerView.adapter = adapter + recyclerView.layoutManager = LinearLayoutManager(this) + } + // endregion +} \ No newline at end of file diff --git a/app/src/main/java/org/thoughtcrime/securesms/conversation/v2/ConversationAdapter.kt b/app/src/main/java/org/thoughtcrime/securesms/conversation/v2/ConversationAdapter.kt new file mode 100644 index 0000000000..8a08ac2678 --- /dev/null +++ b/app/src/main/java/org/thoughtcrime/securesms/conversation/v2/ConversationAdapter.kt @@ -0,0 +1,35 @@ +package org.thoughtcrime.securesms.conversation.v2 + +import android.content.Context +import android.database.Cursor +import android.view.ViewGroup +import androidx.recyclerview.widget.RecyclerView +import org.thoughtcrime.securesms.conversation.v2.messages.MessageView +import org.thoughtcrime.securesms.database.CursorRecyclerViewAdapter +import org.thoughtcrime.securesms.database.DatabaseFactory +import org.thoughtcrime.securesms.database.model.MessageRecord + +class ConversationAdapter(context: Context, cursor: Cursor) : CursorRecyclerViewAdapter(context, cursor) { + private val messageDB = DatabaseFactory.getMmsSmsDatabase(context) + + class ViewHolder(val view: MessageView) : RecyclerView.ViewHolder(view) + + override fun onCreateItemViewHolder(parent: ViewGroup, viewType: Int): ViewHolder { + val view = MessageView(context) + return ViewHolder(view) + } + + override fun onBindItemViewHolder(viewHolder: ViewHolder, cursor: Cursor) { + val message = getMessage(cursor)!! + viewHolder.view.bind(message) + } + + override fun onItemViewRecycled(holder: ViewHolder?) { + holder?.view?.recycle() + super.onItemViewRecycled(holder) + } + + private fun getMessage(cursor: Cursor): MessageRecord? { + return messageDB.readerFor(cursor).current + } +} \ No newline at end of file diff --git a/app/src/main/java/org/thoughtcrime/securesms/conversation/v2/messages/MessageView.kt b/app/src/main/java/org/thoughtcrime/securesms/conversation/v2/messages/MessageView.kt new file mode 100644 index 0000000000..6f239ed9a3 --- /dev/null +++ b/app/src/main/java/org/thoughtcrime/securesms/conversation/v2/messages/MessageView.kt @@ -0,0 +1,37 @@ +package org.thoughtcrime.securesms.conversation.v2.messages + +import android.content.Context +import android.util.AttributeSet +import android.widget.LinearLayout +import org.thoughtcrime.securesms.database.model.MessageRecord + +class MessageView : LinearLayout { + + // region Lifecycle + 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() { + // TODO: Implement + } + // endregion + + // region Updating + fun bind(message: MessageRecord) { + + } + + fun recycle() { + // TODO: Implement + } + // endregion +} \ No newline at end of file diff --git a/app/src/main/res/layout/activity_conversation_v2.xml b/app/src/main/res/layout/activity_conversation_v2.xml new file mode 100644 index 0000000000..13dc9d7e4c --- /dev/null +++ b/app/src/main/res/layout/activity_conversation_v2.xml @@ -0,0 +1,14 @@ + + + + + + \ No newline at end of file From 502d485235b0f3d3c499fe645c5cdc4c5bf3a287 Mon Sep 17 00:00:00 2001 From: nielsandriesse Date: Mon, 31 May 2021 14:29:11 +1000 Subject: [PATCH 002/240] Hook up message body --- app/src/main/AndroidManifest.xml | 5 +++++ .../conversation/v2/ConversationActivityV2.kt | 6 +++--- .../conversation/v2/messages/MessageView.kt | 7 +++++-- .../securesms/loki/activities/HomeActivity.kt | 10 +++------- app/src/main/res/layout/view_message.xml | 17 +++++++++++++++++ 5 files changed, 33 insertions(+), 12 deletions(-) create mode 100644 app/src/main/res/layout/view_message.xml diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 34321f8552..988705979d 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -232,6 +232,11 @@ android:name="android.support.PARENT_ACTIVITY" android:value="org.thoughtcrime.securesms.loki.activities.HomeActivity" /> + + + + + + + \ No newline at end of file From 1952b0e3be1a941a5400c39be17ba46504e255ea Mon Sep 17 00:00:00 2001 From: nielsandriesse Date: Mon, 31 May 2021 15:53:25 +1000 Subject: [PATCH 003/240] Clean up DisplayRecord --- .../securesms/MessageDetailsActivity.java | 4 +- .../components/ConversationItemFooter.java | 11 +- .../conversation/ConversationFragment.java | 7 +- .../conversation/ConversationItem.java | 7 +- .../conversation/ConversationUpdateItem.java | 11 +- .../securesms/database/ThreadDatabase.java | 2 +- .../database/model/DisplayRecord.java | 152 +++++------------- .../database/model/MessageRecord.java | 28 +--- .../database/model/SmsMessageRecord.java | 12 -- .../database/model/ThreadRecord.java | 10 +- .../securesms/loki/views/ConversationView.kt | 2 +- 11 files changed, 66 insertions(+), 180 deletions(-) diff --git a/app/src/main/java/org/thoughtcrime/securesms/MessageDetailsActivity.java b/app/src/main/java/org/thoughtcrime/securesms/MessageDetailsActivity.java index 314653743c..07abcc8c76 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/MessageDetailsActivity.java +++ b/app/src/main/java/org/thoughtcrime/securesms/MessageDetailsActivity.java @@ -272,9 +272,7 @@ public class MessageDetailsActivity extends PassphraseRequiredActionBarActivity private void inflateMessageViewIfAbsent(MessageRecord messageRecord) { if (conversationItem == null) { - if (messageRecord.isGroupAction()) { - conversationItem = (ConversationItem) inflater.inflate(R.layout.conversation_item_update, itemParent, false); - } else if (messageRecord.isOutgoing()) { + if (messageRecord.isOutgoing()) { conversationItem = (ConversationItem) inflater.inflate(R.layout.conversation_item_sent, itemParent, false); } else { conversationItem = (ConversationItem) inflater.inflate(R.layout.conversation_item_received, itemParent, false); diff --git a/app/src/main/java/org/thoughtcrime/securesms/components/ConversationItemFooter.java b/app/src/main/java/org/thoughtcrime/securesms/components/ConversationItemFooter.java index 2715d9b773..c8942b0298 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/components/ConversationItemFooter.java +++ b/app/src/main/java/org/thoughtcrime/securesms/components/ConversationItemFooter.java @@ -4,14 +4,15 @@ import android.annotation.SuppressLint; import android.content.Context; import android.content.res.TypedArray; import android.os.AsyncTask; -import androidx.annotation.NonNull; -import androidx.annotation.Nullable; import android.util.AttributeSet; import android.view.View; import android.widget.ImageView; import android.widget.LinearLayout; import android.widget.TextView; +import androidx.annotation.NonNull; +import androidx.annotation.Nullable; + import org.thoughtcrime.securesms.ApplicationContext; import org.thoughtcrime.securesms.database.DatabaseFactory; import org.thoughtcrime.securesms.database.model.MessageRecord; @@ -88,8 +89,6 @@ public class ConversationItemFooter extends LinearLayout { if (messageRecord.isFailed()) { dateView.setText(R.string.ConversationItem_error_not_delivered); - } else if (messageRecord.isPendingInsecureSmsFallback()) { - dateView.setText(R.string.ConversationItem_click_to_approve_unencrypted); } else { dateView.setText(DateUtils.getExtendedRelativeTimeSpanString(getContext(), locale, messageRecord.getTimestamp())); } @@ -135,10 +134,10 @@ public class ConversationItemFooter extends LinearLayout { } private void presentDeliveryStatus(@NonNull MessageRecord messageRecord) { - if (!messageRecord.isFailed() && !messageRecord.isPendingInsecureSmsFallback()) { + if (!messageRecord.isFailed()) { if (!messageRecord.isOutgoing()) deliveryStatusView.setNone(); else if (messageRecord.isPending()) deliveryStatusView.setPending(); - else if (messageRecord.isRemoteRead()) deliveryStatusView.setRead(); + else if (messageRecord.isRead()) deliveryStatusView.setRead(); else if (messageRecord.isDelivered()) deliveryStatusView.setDelivered(); else deliveryStatusView.setSent(); } else { diff --git a/app/src/main/java/org/thoughtcrime/securesms/conversation/ConversationFragment.java b/app/src/main/java/org/thoughtcrime/securesms/conversation/ConversationFragment.java index 425160b45d..7f86e69002 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/conversation/ConversationFragment.java +++ b/app/src/main/java/org/thoughtcrime/securesms/conversation/ConversationFragment.java @@ -351,10 +351,9 @@ public class ConversationFragment extends Fragment } for (MessageRecord messageRecord : messageRecords) { - if (messageRecord.isGroupAction() || messageRecord.isCallLog() || - messageRecord.isJoined() || messageRecord.isExpirationTimerUpdate() || - messageRecord.isEndSession() || messageRecord.isIdentityUpdate() || - messageRecord.isIdentityVerified() || messageRecord.isIdentityDefault() || messageRecord.isLokiSessionRestoreSent() || messageRecord.isLokiSessionRestoreDone()) + if (messageRecord.isCallLog() || messageRecord.isExpirationTimerUpdate() || + messageRecord.isIdentityUpdate() || messageRecord.isIdentityVerified() || + messageRecord.isIdentityDefault()) { actionMessage = true; } diff --git a/app/src/main/java/org/thoughtcrime/securesms/conversation/ConversationItem.java b/app/src/main/java/org/thoughtcrime/securesms/conversation/ConversationItem.java index 344dfc93ee..67324c8584 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/conversation/ConversationItem.java +++ b/app/src/main/java/org/thoughtcrime/securesms/conversation/ConversationItem.java @@ -784,12 +784,10 @@ public class ConversationItem extends LinearLayout } private void setStatusIcons(MessageRecord messageRecord) { - bodyText.setCompoundDrawablesWithIntrinsicBounds(0, 0, messageRecord.isKeyExchange() ? R.drawable.ic_menu_login : 0, 0); + bodyText.setCompoundDrawablesWithIntrinsicBounds(0, 0, 0, 0); if (messageRecord.isFailed()) { alertView.setFailed(); - } else if (messageRecord.isPendingInsecureSmsFallback()) { - alertView.setPendingApproval(); } else { alertView.setNone(); } @@ -859,7 +857,7 @@ public class ConversationItem extends LinearLayout boolean differentTimestamps = next.isPresent() && !DateUtils.isSameExtendedRelativeTimestamp(context, locale, next.get().getTimestamp(), current.getTimestamp()); - if (current.getExpiresIn() > 0 || !current.isSecure() || current.isPending() || current.isPendingInsecureSmsFallback() || + if (current.getExpiresIn() > 0 || !current.isSecure() || current.isPending() || current.isFailed() || differentTimestamps || isEndOfMessageCluster(current, next, isGroupThread)) { ConversationItemFooter activeFooter = getActiveFooter(current); @@ -883,7 +881,6 @@ public class ConversationItem extends LinearLayout private boolean shouldInterceptClicks(MessageRecord messageRecord) { return batchSelected.isEmpty() && ((messageRecord.isFailed() && !messageRecord.isMmsNotification()) || - messageRecord.isPendingInsecureSmsFallback() || messageRecord.isBundleKeyExchange()); } diff --git a/app/src/main/java/org/thoughtcrime/securesms/conversation/ConversationUpdateItem.java b/app/src/main/java/org/thoughtcrime/securesms/conversation/ConversationUpdateItem.java index 3800f29dac..4dd5a96c04 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/conversation/ConversationUpdateItem.java +++ b/app/src/main/java/org/thoughtcrime/securesms/conversation/ConversationUpdateItem.java @@ -101,18 +101,13 @@ public class ConversationUpdateItem extends LinearLayout this.sender.addListener(this); - if (messageRecord.isGroupAction()) setGroupRecord(messageRecord); - else if (messageRecord.isCallLog()) setCallRecord(messageRecord); - else if (messageRecord.isJoined()) setJoinedRecord(messageRecord); + if (messageRecord.isCallLog()) setCallRecord(messageRecord); else if (messageRecord.isExpirationTimerUpdate()) setTimerRecord(messageRecord); - else if (messageRecord.isScreenshotExtraction()) setDataExtractionRecord(messageRecord, DataExtractionNotificationInfoMessage.Kind.SCREENSHOT); - else if (messageRecord.isMediaSavedExtraction()) setDataExtractionRecord(messageRecord, DataExtractionNotificationInfoMessage.Kind.MEDIA_SAVED); - else if (messageRecord.isEndSession()) setEndSessionRecord(messageRecord); + else if (messageRecord.isScreenshotNotification()) setDataExtractionRecord(messageRecord, DataExtractionNotificationInfoMessage.Kind.SCREENSHOT); + else if (messageRecord.isMediaSavedNotification()) setDataExtractionRecord(messageRecord, DataExtractionNotificationInfoMessage.Kind.MEDIA_SAVED); else if (messageRecord.isIdentityUpdate()) setIdentityRecord(messageRecord); else if (messageRecord.isIdentityVerified() || messageRecord.isIdentityDefault()) setIdentityVerifyUpdate(messageRecord); - else if (messageRecord.isLokiSessionRestoreSent()) setTextMessageRecord(messageRecord); - else if (messageRecord.isLokiSessionRestoreDone()) setTextMessageRecord(messageRecord); else throw new AssertionError("Neither group nor log nor joined."); if (batchSelected.contains(messageRecord)) setSelected(true); 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 2ba85ca66b..5643340ec9 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/database/ThreadDatabase.java +++ b/app/src/main/java/org/thoughtcrime/securesms/database/ThreadDatabase.java @@ -582,7 +582,7 @@ public class ThreadDatabase extends Database { } private @Nullable Uri getAttachmentUriFor(MessageRecord record) { - if (!record.isMms() || record.isMmsNotification() || record.isGroupAction()) return null; + if (!record.isMms() || record.isMmsNotification()) return null; SlideDeck slideDeck = ((MediaMmsMessageRecord)record).getSlideDeck(); Slide thumbnail = slideDeck.getThumbnailSlide(); diff --git a/app/src/main/java/org/thoughtcrime/securesms/database/model/DisplayRecord.java b/app/src/main/java/org/thoughtcrime/securesms/database/model/DisplayRecord.java index f592d47e9d..c8b7ca648b 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/database/model/DisplayRecord.java +++ b/app/src/main/java/org/thoughtcrime/securesms/database/model/DisplayRecord.java @@ -17,12 +17,13 @@ package org.thoughtcrime.securesms.database.model; import android.content.Context; -import androidx.annotation.NonNull; import android.text.SpannableString; +import androidx.annotation.NonNull; + +import org.session.libsession.utilities.recipients.Recipient; import org.thoughtcrime.securesms.database.MmsSmsColumns; import org.thoughtcrime.securesms.database.SmsDatabase; -import org.session.libsession.utilities.recipients.Recipient; /** * The base class for all message record models. Encapsulates basic data @@ -33,9 +34,7 @@ import org.session.libsession.utilities.recipients.Recipient; */ public abstract class DisplayRecord { - protected final long type; - private final Recipient recipient; private final long dateSent; private final long dateReceived; @@ -46,8 +45,8 @@ public abstract class DisplayRecord { private final int readReceiptCount; DisplayRecord(String body, Recipient recipient, long dateSent, - long dateReceived, long threadId, int deliveryStatus, int deliveryReceiptCount, - long type, int readReceiptCount) + long dateReceived, long threadId, int deliveryStatus, int deliveryReceiptCount, + long type, int readReceiptCount) { this.threadId = threadId; this.recipient = recipient; @@ -63,138 +62,69 @@ public abstract class DisplayRecord { public @NonNull String getBody() { return body == null ? "" : body; } - - public boolean isFailed() { - return - MmsSmsColumns.Types.isFailedMessageType(type) || - MmsSmsColumns.Types.isPendingSecureSmsFallbackType(type) || - deliveryStatus >= SmsDatabase.Status.STATUS_FAILED; - } - - public boolean isPending() { - return MmsSmsColumns.Types.isPendingMessageType(type) && - !MmsSmsColumns.Types.isIdentityVerified(type) && - !MmsSmsColumns.Types.isIdentityDefault(type); - } - - public boolean isOutgoing() { - return MmsSmsColumns.Types.isOutgoingMessageType(type); - } - public abstract SpannableString getDisplayBody(@NonNull Context context); - public Recipient getRecipient() { return recipient; } - public long getDateSent() { return dateSent; } - public long getDateReceived() { return dateReceived; } - public long getThreadId() { return threadId; } - - public boolean isKeyExchange() { - return SmsDatabase.Types.isKeyExchangeType(type); - } - - public boolean isEndSession() { return SmsDatabase.Types.isEndSessionType(type); } - - public boolean isLokiSessionRestoreSent() { return SmsDatabase.Types.isLokiSessionRestoreSentType(type); } - - public boolean isLokiSessionRestoreDone() { return SmsDatabase.Types.isLokiSessionRestoreDoneType(type); } - - // TODO isGroupUpdate and isGroupQuit are kept for compatibility with old update messages, they can be removed later on - public boolean isGroupUpdate() { - return SmsDatabase.Types.isGroupUpdate(type); - } - - public boolean isGroupQuit() { - return SmsDatabase.Types.isGroupQuit(type); - } - - public boolean isGroupUpdateMessage() { - return SmsDatabase.Types.isGroupUpdateMessage(type); - } - - //TODO isGroupAction can be replaced by isGroupUpdateMessage in the code when the 2 functions above are removed - public boolean isGroupAction() { - return isGroupUpdate() || isGroupQuit() || isGroupUpdateMessage(); - } - - public boolean isExpirationTimerUpdate() { - return SmsDatabase.Types.isExpirationTimerUpdate(type); - } - - // Data extraction - - public boolean isMediaSavedExtraction() { - return MmsSmsColumns.Types.isMediaSavedExtraction(type); - } - - public boolean isScreenshotExtraction() { - return MmsSmsColumns.Types.isScreenshotExtraction(type); - } - - public boolean isDataExtraction() { - return isMediaSavedExtraction() || isScreenshotExtraction(); - } - - public boolean isOpenGroupInvitation() { - return MmsSmsColumns.Types.isOpenGroupInvitation(type); - } - - public boolean isCallLog() { - return SmsDatabase.Types.isCallLog(type); - } - - public boolean isJoined() { - return SmsDatabase.Types.isJoinedType(type); - } - - public boolean isIncomingCall() { - return SmsDatabase.Types.isIncomingCall(type); - } - - public boolean isOutgoingCall() { - return SmsDatabase.Types.isOutgoingCall(type); - } - - public boolean isMissedCall() { - return SmsDatabase.Types.isMissedCall(type); - } - - public boolean isVerificationStatusChange() { - return SmsDatabase.Types.isIdentityDefault(type) || SmsDatabase.Types.isIdentityVerified(type); - } - public int getDeliveryStatus() { return deliveryStatus; } - public int getDeliveryReceiptCount() { return deliveryReceiptCount; } - public int getReadReceiptCount() { return readReceiptCount; } public boolean isDelivered() { - return (deliveryStatus >= SmsDatabase.Status.STATUS_COMPLETE && - deliveryStatus < SmsDatabase.Status.STATUS_PENDING) || deliveryReceiptCount > 0; + return (deliveryStatus >= SmsDatabase.Status.STATUS_COMPLETE + && deliveryStatus < SmsDatabase.Status.STATUS_PENDING) || deliveryReceiptCount > 0; } - public boolean isRemoteRead() { - return readReceiptCount > 0; + public boolean isFailed() { + return MmsSmsColumns.Types.isFailedMessageType(type) + || MmsSmsColumns.Types.isPendingSecureSmsFallbackType(type) + || deliveryStatus >= SmsDatabase.Status.STATUS_FAILED; } - public boolean isPendingInsecureSmsFallback() { - return SmsDatabase.Types.isPendingInsecureSmsFallbackType(type); + public boolean isPending() { + return MmsSmsColumns.Types.isPendingMessageType(type) + && !MmsSmsColumns.Types.isIdentityVerified(type) + && !MmsSmsColumns.Types.isIdentityDefault(type); + } + + public boolean isRead() { return readReceiptCount > 0; } + + public boolean isOutgoing() { + return MmsSmsColumns.Types.isOutgoingMessageType(type); + } + public boolean isGroupUpdateMessage() { + return SmsDatabase.Types.isGroupUpdateMessage(type); + } + public boolean isExpirationTimerUpdate() { return SmsDatabase.Types.isExpirationTimerUpdate(type); } + public boolean isMediaSavedNotification() { return MmsSmsColumns.Types.isMediaSavedExtraction(type); } + public boolean isScreenshotNotification() { return MmsSmsColumns.Types.isScreenshotExtraction(type); } + public boolean isDataExtractionNotification() { return isMediaSavedNotification() || isScreenshotNotification(); } + public boolean isOpenGroupInvitation() { return MmsSmsColumns.Types.isOpenGroupInvitation(type); } + public boolean isCallLog() { + return SmsDatabase.Types.isCallLog(type); + } + public boolean isIncomingCall() { + return SmsDatabase.Types.isIncomingCall(type); + } + public boolean isOutgoingCall() { + return SmsDatabase.Types.isOutgoingCall(type); + } + public boolean isMissedCall() { + return SmsDatabase.Types.isMissedCall(type); } } diff --git a/app/src/main/java/org/thoughtcrime/securesms/database/model/MessageRecord.java b/app/src/main/java/org/thoughtcrime/securesms/database/model/MessageRecord.java index 13a9b4911a..8aa4d804e1 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/database/model/MessageRecord.java +++ b/app/src/main/java/org/thoughtcrime/securesms/database/model/MessageRecord.java @@ -17,23 +17,21 @@ package org.thoughtcrime.securesms.database.model; import android.content.Context; -import androidx.annotation.NonNull; import android.text.Spannable; import android.text.SpannableString; import android.text.style.RelativeSizeSpan; import android.text.style.StyleSpan; -import network.loki.messenger.R; +import androidx.annotation.NonNull; import org.session.libsession.messaging.sending_receiving.data_extraction.DataExtractionNotificationInfoMessage; import org.session.libsession.messaging.utilities.UpdateMessageBuilder; import org.session.libsession.messaging.utilities.UpdateMessageData; -import org.thoughtcrime.securesms.database.MmsSmsColumns; -import org.thoughtcrime.securesms.database.SmsDatabase; import org.session.libsession.utilities.IdentityKeyMismatch; import org.session.libsession.utilities.NetworkFailure; - import org.session.libsession.utilities.recipients.Recipient; +import org.thoughtcrime.securesms.database.MmsSmsColumns; +import org.thoughtcrime.securesms.database.SmsDatabase; import java.util.List; @@ -98,19 +96,9 @@ public abstract class MessageRecord extends DisplayRecord { } else if (isExpirationTimerUpdate()) { int seconds = (int) (getExpiresIn() / 1000); return new SpannableString(UpdateMessageBuilder.INSTANCE.buildExpirationTimerMessage(context, seconds, getIndividualRecipient().getAddress().serialize(), isOutgoing())); - } else if (isDataExtraction()) { - if (isScreenshotExtraction()) return new SpannableString((UpdateMessageBuilder.INSTANCE.buildDataExtractionMessage(context, DataExtractionNotificationInfoMessage.Kind.SCREENSHOT, getIndividualRecipient().getAddress().serialize()))); - else if (isMediaSavedExtraction()) return new SpannableString((UpdateMessageBuilder.INSTANCE.buildDataExtractionMessage(context, DataExtractionNotificationInfoMessage.Kind.MEDIA_SAVED, getIndividualRecipient().getAddress().serialize()))); - } - // TODO below lines are left here for compatibility with older group update messages, it can be deleted later on - else if (isGroupUpdate() && isOutgoing()) { - return new SpannableString(context.getString(R.string.MessageRecord_you_updated_group)); - } else if (isGroupUpdate()) { - return new SpannableString(context.getString(R.string.MessageRecord_s_updated_group, getIndividualRecipient().toShortString())); - } else if (isGroupQuit() && isOutgoing()) { - return new SpannableString(context.getString(R.string.MessageRecord_left_group)); - } else if (isGroupQuit()) { - return new SpannableString(context.getString(R.string.ConversationItem_group_action_left, getIndividualRecipient().toShortString())); + } else if (isDataExtractionNotification()) { + if (isScreenshotNotification()) return new SpannableString((UpdateMessageBuilder.INSTANCE.buildDataExtractionMessage(context, DataExtractionNotificationInfoMessage.Kind.SCREENSHOT, getIndividualRecipient().getAddress().serialize()))); + else if (isMediaSavedNotification()) return new SpannableString((UpdateMessageBuilder.INSTANCE.buildDataExtractionMessage(context, DataExtractionNotificationInfoMessage.Kind.MEDIA_SAVED, getIndividualRecipient().getAddress().serialize()))); } return new SpannableString(getBody()); @@ -163,8 +151,8 @@ public abstract class MessageRecord extends DisplayRecord { } public boolean isUpdate() { - return isGroupAction() || isJoined() || isExpirationTimerUpdate() || isCallLog() || isDataExtraction() || - isEndSession() || isIdentityUpdate() || isIdentityVerified() || isIdentityDefault() || isLokiSessionRestoreSent() || isLokiSessionRestoreDone(); + return isExpirationTimerUpdate() || isCallLog() || isDataExtractionNotification() || + isIdentityUpdate() || isIdentityVerified() || isIdentityDefault(); } public boolean isMediaPending() { diff --git a/app/src/main/java/org/thoughtcrime/securesms/database/model/SmsMessageRecord.java b/app/src/main/java/org/thoughtcrime/securesms/database/model/SmsMessageRecord.java index 08328aaaef..07d8bc818d 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/database/model/SmsMessageRecord.java +++ b/app/src/main/java/org/thoughtcrime/securesms/database/model/SmsMessageRecord.java @@ -74,22 +74,10 @@ public class SmsMessageRecord extends MessageRecord { return emphasisAdded(context.getString(R.string.MessageRecord_message_encrypted_with_a_legacy_protocol_version_that_is_no_longer_supported)); } else if (isBundleKeyExchange()) { return emphasisAdded(context.getString(R.string.SmsMessageRecord_received_message_with_new_safety_number_tap_to_process)); - } else if (isKeyExchange() && isOutgoing()) { - return new SpannableString(""); - } else if (isKeyExchange() && !isOutgoing()) { - return emphasisAdded(context.getString(R.string.ConversationItem_received_key_exchange_message_tap_to_process)); } else if (SmsDatabase.Types.isDuplicateMessageType(type)) { return emphasisAdded(context.getString(R.string.SmsMessageRecord_duplicate_message)); } else if (SmsDatabase.Types.isNoRemoteSessionType(type)) { return emphasisAdded(context.getString(R.string.MessageDisplayHelper_message_encrypted_for_non_existing_session)); - } else if (isLokiSessionRestoreSent()) { - return emphasisAdded(context.getString(R.string.SmsMessageRecord_secure_session_reset)); - } else if (isLokiSessionRestoreDone()) { - return emphasisAdded(context.getString(R.string.view_reset_secure_session_done_message)); - } else if (isEndSession() && isOutgoing()) { - return emphasisAdded(context.getString(R.string.SmsMessageRecord_secure_session_reset)); - } else if (isEndSession()) { - return emphasisAdded(context.getString(R.string.SmsMessageRecord_secure_session_reset_s, getIndividualRecipient().toShortString())); } else { return super.getDisplayBody(context); } diff --git a/app/src/main/java/org/thoughtcrime/securesms/database/model/ThreadRecord.java b/app/src/main/java/org/thoughtcrime/securesms/database/model/ThreadRecord.java index c5091651a2..91c2729573 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/database/model/ThreadRecord.java +++ b/app/src/main/java/org/thoughtcrime/securesms/database/model/ThreadRecord.java @@ -73,22 +73,14 @@ public class ThreadRecord extends DisplayRecord { @Override public SpannableString getDisplayBody(@NonNull Context context) { Recipient recipient = getRecipient(); - if (isGroupUpdate() || isGroupUpdateMessage()) { + if (isGroupUpdateMessage()) { return emphasisAdded(context.getString(R.string.ThreadRecord_group_updated)); - } else if (isGroupQuit()) { - return emphasisAdded(context.getString(R.string.ThreadRecord_left_the_group)); } else if (isOpenGroupInvitation()) { return emphasisAdded(context.getString(R.string.ThreadRecord_open_group_invitation)); - } else if (isKeyExchange()) { - return emphasisAdded(context.getString(R.string.ConversationListItem_key_exchange_message)); } else if (SmsDatabase.Types.isFailedDecryptType(type)) { return emphasisAdded(context.getString(R.string.MessageDisplayHelper_bad_encrypted_message)); } else if (SmsDatabase.Types.isNoRemoteSessionType(type)) { return emphasisAdded(context.getString(R.string.MessageDisplayHelper_message_encrypted_for_non_existing_session)); - } else if (isLokiSessionRestoreSent()) { - return emphasisAdded(context.getString(R.string.SmsMessageRecord_secure_session_reset)); - } else if (isLokiSessionRestoreDone()) { - return emphasisAdded(context.getString(R.string.view_reset_secure_session_done_message)); } else if (SmsDatabase.Types.isEndSessionType(type)) { return emphasisAdded(context.getString(R.string.ThreadRecord_secure_session_reset)); } else if (MmsSmsColumns.Types.isLegacyType(type)) { diff --git a/app/src/main/java/org/thoughtcrime/securesms/loki/views/ConversationView.kt b/app/src/main/java/org/thoughtcrime/securesms/loki/views/ConversationView.kt index 7ef90c0129..02a863d687 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/loki/views/ConversationView.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/loki/views/ConversationView.kt @@ -73,7 +73,7 @@ class ConversationView : LinearLayout { !thread.isOutgoing -> statusIndicatorImageView.visibility = View.GONE thread.isFailed -> statusIndicatorImageView.setImageResource(R.drawable.ic_error) thread.isPending -> statusIndicatorImageView.setImageResource(R.drawable.ic_circle_dot_dot_dot) - thread.isRemoteRead -> statusIndicatorImageView.setImageResource(R.drawable.ic_filled_circle_check) + thread.isRead -> statusIndicatorImageView.setImageResource(R.drawable.ic_filled_circle_check) else -> statusIndicatorImageView.setImageResource(R.drawable.ic_circle_check) } } From 7e9116df9c8c8e98426df743df91a73d3fb6b3b5 Mon Sep 17 00:00:00 2001 From: nielsandriesse Date: Mon, 31 May 2021 16:20:46 +1000 Subject: [PATCH 004/240] Clean up MessageRecord --- .../securesms/MessageDetailsActivity.java | 10 +- .../components/ConversationItemFooter.java | 2 +- .../conversation/ConversationFragment.java | 9 +- .../conversation/ConversationItem.java | 8 +- .../conversation/ConversationUpdateItem.java | 96 +----------- .../securesms/database/SmsDatabase.java | 25 ++- .../database/model/MediaMmsMessageRecord.java | 22 +-- .../database/model/MessageRecord.java | 148 +++++------------- .../database/model/MmsMessageRecord.java | 6 +- .../model/NotificationMmsMessageRecord.java | 21 ++- .../database/model/SmsMessageRecord.java | 19 +-- 11 files changed, 91 insertions(+), 275 deletions(-) diff --git a/app/src/main/java/org/thoughtcrime/securesms/MessageDetailsActivity.java b/app/src/main/java/org/thoughtcrime/securesms/MessageDetailsActivity.java index 07abcc8c76..27526e9485 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/MessageDetailsActivity.java +++ b/app/src/main/java/org/thoughtcrime/securesms/MessageDetailsActivity.java @@ -187,8 +187,6 @@ public class MessageDetailsActivity extends PassphraseRequiredActionBarActivity transportText = "-"; } else if (messageRecord.isPending()) { transportText = getString(R.string.ConversationFragment_pending); - } else if (messageRecord.isPush()) { - transportText = getString(R.string.ConversationFragment_push); } else if (messageRecord.isMms()) { transportText = getString(R.string.ConversationFragment_mms); } else { @@ -252,9 +250,7 @@ public class MessageDetailsActivity extends PassphraseRequiredActionBarActivity private void updateRecipients(MessageRecord messageRecord, Recipient recipient, List recipients) { final int toFromRes; - if (messageRecord.isMms() && !messageRecord.isPush() && !messageRecord.isOutgoing()) { - toFromRes = R.string.message_details_header__with; - } else if (messageRecord.isOutgoing()) { + if (messageRecord.isOutgoing()) { toFromRes = R.string.message_details_header__to; } else { toFromRes = R.string.message_details_header__from; @@ -360,7 +356,7 @@ public class MessageDetailsActivity extends PassphraseRequiredActionBarActivity List recipients = new LinkedList<>(); if (!messageRecord.getRecipient().isGroupRecipient()) { - recipients.add(new RecipientDeliveryStatus(messageRecord.getRecipient(), getStatusFor(messageRecord.getDeliveryReceiptCount(), messageRecord.getReadReceiptCount(), messageRecord.isPending()), messageRecord.isUnidentified(), -1)); + recipients.add(new RecipientDeliveryStatus(messageRecord.getRecipient(), getStatusFor(messageRecord.getDeliveryReceiptCount(), messageRecord.getReadReceiptCount(), messageRecord.isPending()), true, -1)); } else { List receiptInfoList = DatabaseFactory.getGroupReceiptDatabase(context).getGroupReceiptInfo(messageRecord.getId()); @@ -394,7 +390,7 @@ public class MessageDetailsActivity extends PassphraseRequiredActionBarActivity updateRecipients(messageRecord, messageRecord.getRecipient(), recipients); boolean isGroupNetworkFailure = messageRecord.isFailed() && !messageRecord.getNetworkFailures().isEmpty(); - boolean isIndividualNetworkFailure = messageRecord.isFailed() && !isPushGroup && messageRecord.getIdentityKeyMismatches().isEmpty(); + boolean isIndividualNetworkFailure = messageRecord.isFailed() && !isPushGroup; LokiMessageDatabase lokiMessageDatabase = DatabaseFactory.getLokiMessageDatabase(getContext()); String errorMessage = lokiMessageDatabase.getErrorMessage(messageRecord.id); diff --git a/app/src/main/java/org/thoughtcrime/securesms/components/ConversationItemFooter.java b/app/src/main/java/org/thoughtcrime/securesms/components/ConversationItemFooter.java index c8942b0298..ac5ee5004c 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/components/ConversationItemFooter.java +++ b/app/src/main/java/org/thoughtcrime/securesms/components/ConversationItemFooter.java @@ -130,7 +130,7 @@ public class ConversationItemFooter extends LinearLayout { } private void presentInsecureIndicator(@NonNull MessageRecord messageRecord) { - insecureIndicatorView.setVisibility(messageRecord.isSecure() ? View.GONE : View.VISIBLE); + insecureIndicatorView.setVisibility(View.GONE); } private void presentDeliveryStatus(@NonNull MessageRecord messageRecord) { diff --git a/app/src/main/java/org/thoughtcrime/securesms/conversation/ConversationFragment.java b/app/src/main/java/org/thoughtcrime/securesms/conversation/ConversationFragment.java index 7f86e69002..1953568d6e 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/conversation/ConversationFragment.java +++ b/app/src/main/java/org/thoughtcrime/securesms/conversation/ConversationFragment.java @@ -351,9 +351,7 @@ public class ConversationFragment extends Fragment } for (MessageRecord messageRecord : messageRecords) { - if (messageRecord.isCallLog() || messageRecord.isExpirationTimerUpdate() || - messageRecord.isIdentityUpdate() || messageRecord.isIdentityVerified() || - messageRecord.isIdentityDefault()) + if (messageRecord.isCallLog() || messageRecord.isExpirationTimerUpdate()) { actionMessage = true; } @@ -384,8 +382,7 @@ public class ConversationFragment extends Fragment menu.findItem(R.id.menu_context_reply).setVisible(!actionMessage && !messageRecord.isPending() && - !messageRecord.isFailed() && - messageRecord.isSecure()); + !messageRecord.isFailed()); } menu.findItem(R.id.menu_context_copy).setVisible(!actionMessage && hasText); @@ -625,7 +622,7 @@ public class ConversationFragment extends Fragment intent.putExtra(MessageDetailsActivity.THREAD_ID_EXTRA, threadId); intent.putExtra(MessageDetailsActivity.TYPE_EXTRA, message.isMms() ? MmsSmsDatabase.MMS_TRANSPORT : MmsSmsDatabase.SMS_TRANSPORT); intent.putExtra(MessageDetailsActivity.ADDRESS_EXTRA, recipient.getAddress()); - intent.putExtra(MessageDetailsActivity.IS_PUSH_GROUP_EXTRA, recipient.isGroupRecipient() && message.isPush()); + intent.putExtra(MessageDetailsActivity.IS_PUSH_GROUP_EXTRA, recipient.isGroupRecipient()); startActivity(intent); } diff --git a/app/src/main/java/org/thoughtcrime/securesms/conversation/ConversationItem.java b/app/src/main/java/org/thoughtcrime/securesms/conversation/ConversationItem.java index 67324c8584..aa60603074 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/conversation/ConversationItem.java +++ b/app/src/main/java/org/thoughtcrime/securesms/conversation/ConversationItem.java @@ -857,7 +857,7 @@ public class ConversationItem extends LinearLayout boolean differentTimestamps = next.isPresent() && !DateUtils.isSameExtendedRelativeTimestamp(context, locale, next.get().getTimestamp(), current.getTimestamp()); - if (current.getExpiresIn() > 0 || !current.isSecure() || current.isPending() || + if (current.getExpiresIn() > 0 || current.isPending() || current.isFailed() || differentTimestamps || isEndOfMessageCluster(current, next, isGroupThread)) { ConversationItemFooter activeFooter = getActiveFooter(current); @@ -879,9 +879,7 @@ public class ConversationItem extends LinearLayout } private boolean shouldInterceptClicks(MessageRecord messageRecord) { - return batchSelected.isEmpty() && - ((messageRecord.isFailed() && !messageRecord.isMmsNotification()) || - messageRecord.isBundleKeyExchange()); + return batchSelected.isEmpty() && (messageRecord.isFailed() && !messageRecord.isMmsNotification()); } @SuppressLint("SetTextI18n") @@ -1196,7 +1194,7 @@ public class ConversationItem extends LinearLayout intent.putExtra(MessageDetailsActivity.MESSAGE_ID_EXTRA, messageRecord.getId()); intent.putExtra(MessageDetailsActivity.THREAD_ID_EXTRA, messageRecord.getThreadId()); intent.putExtra(MessageDetailsActivity.TYPE_EXTRA, messageRecord.isMms() ? MmsSmsDatabase.MMS_TRANSPORT : MmsSmsDatabase.SMS_TRANSPORT); - intent.putExtra(MessageDetailsActivity.IS_PUSH_GROUP_EXTRA, groupThread && messageRecord.isPush()); + intent.putExtra(MessageDetailsActivity.IS_PUSH_GROUP_EXTRA, groupThread); intent.putExtra(MessageDetailsActivity.ADDRESS_EXTRA, conversationRecipient.getAddress()); context.startActivity(intent); } diff --git a/app/src/main/java/org/thoughtcrime/securesms/conversation/ConversationUpdateItem.java b/app/src/main/java/org/thoughtcrime/securesms/conversation/ConversationUpdateItem.java index 4dd5a96c04..6dfd2fa887 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/conversation/ConversationUpdateItem.java +++ b/app/src/main/java/org/thoughtcrime/securesms/conversation/ConversationUpdateItem.java @@ -1,7 +1,6 @@ package org.thoughtcrime.securesms.conversation; import android.content.Context; -import android.graphics.Color; import android.graphics.PorterDuff; import android.graphics.PorterDuffColorFilter; import android.util.AttributeSet; @@ -15,17 +14,16 @@ import androidx.annotation.NonNull; import androidx.annotation.Nullable; import org.session.libsession.messaging.sending_receiving.data_extraction.DataExtractionNotificationInfoMessage; +import org.session.libsession.utilities.ExpirationUtil; +import org.session.libsession.utilities.Util; +import org.session.libsession.utilities.recipients.Recipient; +import org.session.libsession.utilities.recipients.RecipientModifiedListener; +import org.session.libsignal.utilities.guava.Optional; import org.thoughtcrime.securesms.BindableConversationItem; import org.thoughtcrime.securesms.database.model.MessageRecord; import org.thoughtcrime.securesms.loki.utilities.GeneralUtilitiesKt; import org.thoughtcrime.securesms.mms.GlideRequests; import org.thoughtcrime.securesms.util.DateUtils; -import org.session.libsignal.utilities.guava.Optional; - -import org.session.libsession.utilities.recipients.Recipient; -import org.session.libsession.utilities.recipients.RecipientModifiedListener; -import org.session.libsession.utilities.ExpirationUtil; -import org.session.libsession.utilities.Util; import java.util.Locale; import java.util.Set; @@ -105,9 +103,6 @@ public class ConversationUpdateItem extends LinearLayout else if (messageRecord.isExpirationTimerUpdate()) setTimerRecord(messageRecord); else if (messageRecord.isScreenshotNotification()) setDataExtractionRecord(messageRecord, DataExtractionNotificationInfoMessage.Kind.SCREENSHOT); else if (messageRecord.isMediaSavedNotification()) setDataExtractionRecord(messageRecord, DataExtractionNotificationInfoMessage.Kind.MEDIA_SAVED); - else if (messageRecord.isIdentityUpdate()) setIdentityRecord(messageRecord); - else if (messageRecord.isIdentityVerified() || - messageRecord.isIdentityDefault()) setIdentityVerifyUpdate(messageRecord); else throw new AssertionError("Neither group nor log nor joined."); if (batchSelected.contains(messageRecord)) setSelected(true); @@ -161,58 +156,6 @@ public class ConversationUpdateItem extends LinearLayout date.setVisibility(GONE); } - private void setIdentityRecord(final MessageRecord messageRecord) { - icon.setImageResource(R.drawable.ic_security_white_24dp); - icon.setColorFilter(new PorterDuffColorFilter(Color.parseColor("#757575"), PorterDuff.Mode.MULTIPLY)); - body.setText(messageRecord.getDisplayBody(getContext())); - - title.setVisibility(GONE); - body.setVisibility(VISIBLE); - date.setVisibility(GONE); - } - - private void setIdentityVerifyUpdate(final MessageRecord messageRecord) { - if (messageRecord.isIdentityVerified()) icon.setImageResource(R.drawable.ic_check_white_24dp); - else icon.setImageResource(R.drawable.ic_info_outline_white_24dp); - - icon.setColorFilter(new PorterDuffColorFilter(Color.parseColor("#757575"), PorterDuff.Mode.MULTIPLY)); - body.setText(messageRecord.getDisplayBody(getContext())); - - title.setVisibility(GONE); - body.setVisibility(VISIBLE); - date.setVisibility(GONE); - } - - private void setGroupRecord(MessageRecord messageRecord) { - icon.setImageResource(R.drawable.ic_group_grey600_24dp); - icon.clearColorFilter(); - body.setText(messageRecord.getDisplayBody(getContext())); - - title.setVisibility(GONE); - body.setVisibility(VISIBLE); - date.setVisibility(GONE); - } - - private void setJoinedRecord(MessageRecord messageRecord) { - icon.setImageResource(R.drawable.ic_favorite_grey600_24dp); - icon.clearColorFilter(); - body.setText(messageRecord.getDisplayBody(getContext())); - - title.setVisibility(GONE); - body.setVisibility(VISIBLE); - date.setVisibility(GONE); - } - - private void setEndSessionRecord(MessageRecord messageRecord) { - icon.setImageResource(R.drawable.ic_refresh_white_24dp); - icon.setColorFilter(new PorterDuffColorFilter(Color.parseColor("#757575"), PorterDuff.Mode.MULTIPLY)); - body.setText(messageRecord.getDisplayBody(getContext())); - - title.setVisibility(GONE); - body.setVisibility(VISIBLE); - date.setVisibility(GONE); - } - private void setTextMessageRecord(MessageRecord messageRecord) { body.setText(messageRecord.getDisplayBody(getContext())); @@ -249,36 +192,7 @@ public class ConversationUpdateItem extends LinearLayout @Override public void onClick(View v) { - if ((!messageRecord.isIdentityUpdate() && - !messageRecord.isIdentityDefault() && - !messageRecord.isIdentityVerified()) || - !batchSelected.isEmpty()) - { - if (parent != null) parent.onClick(v); - return; - } - final Recipient sender = ConversationUpdateItem.this.sender; - -// IdentityUtil.getRemoteIdentityKey(getContext(), sender).addListener(new ListenableFuture.Listener>() { -// @Override -// public void onSuccess(Optional result) { -// if (result.isPresent()) { -// Intent intent = new Intent(getContext(), VerifyIdentityActivity.class); -// intent.putExtra(VerifyIdentityActivity.ADDRESS_EXTRA, sender.getAddress()); -// intent.putExtra(VerifyIdentityActivity.IDENTITY_EXTRA, new IdentityKeyParcelable(result.get().getIdentityKey())); -// intent.putExtra(VerifyIdentityActivity.VERIFIED_EXTRA, result.get().getVerifiedStatus() == IdentityDatabase.VerifiedStatus.VERIFIED); -// -// getContext().startActivity(intent); -// } -// } -// -// @Override -// public void onFailure(ExecutionException e) { -// Log.w(TAG, e); -// } -// }); } } - } diff --git a/app/src/main/java/org/thoughtcrime/securesms/database/SmsDatabase.java b/app/src/main/java/org/thoughtcrime/securesms/database/SmsDatabase.java index dfbc39f156..d241db9862 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/database/SmsDatabase.java +++ b/app/src/main/java/org/thoughtcrime/securesms/database/SmsDatabase.java @@ -28,23 +28,21 @@ import com.annimon.stream.Stream; import net.sqlcipher.database.SQLiteDatabase; import net.sqlcipher.database.SQLiteStatement; -import org.session.libsignal.utilities.Log; -import org.thoughtcrime.securesms.ApplicationContext; -import org.session.libsession.utilities.IdentityKeyMismatch; -import org.session.libsession.utilities.IdentityKeyMismatchList; -import org.thoughtcrime.securesms.database.helpers.SQLCipherOpenHelper; -import org.thoughtcrime.securesms.database.model.MessageRecord; -import org.thoughtcrime.securesms.database.model.SmsMessageRecord; import org.session.libsession.messaging.messages.signal.IncomingGroupMessage; import org.session.libsession.messaging.messages.signal.IncomingTextMessage; import org.session.libsession.messaging.messages.signal.OutgoingTextMessage; - import org.session.libsession.utilities.Address; -import org.session.libsession.utilities.recipients.Recipient; -import org.session.libsignal.utilities.JsonUtil; +import org.session.libsession.utilities.IdentityKeyMismatch; +import org.session.libsession.utilities.IdentityKeyMismatchList; import org.session.libsession.utilities.TextSecurePreferences; import org.session.libsession.utilities.Util; +import org.session.libsession.utilities.recipients.Recipient; +import org.session.libsignal.utilities.JsonUtil; +import org.session.libsignal.utilities.Log; import org.session.libsignal.utilities.guava.Optional; +import org.thoughtcrime.securesms.database.helpers.SQLCipherOpenHelper; +import org.thoughtcrime.securesms.database.model.MessageRecord; +import org.thoughtcrime.securesms.database.model.SmsMessageRecord; import java.io.IOException; import java.security.SecureRandom; @@ -641,10 +639,10 @@ public class SmsDatabase extends MessagingDatabase { public MessageRecord getCurrent() { return new SmsMessageRecord(id, message.getMessageBody(), message.getRecipient(), message.getRecipient(), - 1, System.currentTimeMillis(), System.currentTimeMillis(), + System.currentTimeMillis(), System.currentTimeMillis(), 0, message.isSecureMessage() ? MmsSmsColumns.Types.getOutgoingEncryptedMessageType() : MmsSmsColumns.Types.getOutgoingSmsMessageType(), threadId, 0, new LinkedList(), - message.getSubscriptionId(), message.getExpiresIn(), + message.getExpiresIn(), System.currentTimeMillis(), 0, false); } } @@ -696,9 +694,8 @@ public class SmsDatabase extends MessagingDatabase { return new SmsMessageRecord(messageId, body, recipient, recipient, - addressDeviceId, dateSent, dateReceived, deliveryReceiptCount, type, - threadId, status, mismatches, subscriptionId, + threadId, status, mismatches, expiresIn, expireStarted, readReceiptCount, unidentified); } diff --git a/app/src/main/java/org/thoughtcrime/securesms/database/model/MediaMmsMessageRecord.java b/app/src/main/java/org/thoughtcrime/securesms/database/model/MediaMmsMessageRecord.java index 97b7329bc4..fa03a101b5 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/database/model/MediaMmsMessageRecord.java +++ b/app/src/main/java/org/thoughtcrime/securesms/database/model/MediaMmsMessageRecord.java @@ -17,22 +17,24 @@ package org.thoughtcrime.securesms.database.model; import android.content.Context; -import androidx.annotation.NonNull; -import androidx.annotation.Nullable; import android.text.SpannableString; -import network.loki.messenger.R; -import org.session.libsession.utilities.Contact; +import androidx.annotation.NonNull; +import androidx.annotation.Nullable; + import org.session.libsession.messaging.sending_receiving.link_preview.LinkPreview; -import org.thoughtcrime.securesms.database.MmsDatabase; -import org.thoughtcrime.securesms.database.SmsDatabase.Status; +import org.session.libsession.utilities.Contact; import org.session.libsession.utilities.IdentityKeyMismatch; import org.session.libsession.utilities.NetworkFailure; -import org.thoughtcrime.securesms.mms.SlideDeck; import org.session.libsession.utilities.recipients.Recipient; +import org.thoughtcrime.securesms.database.MmsDatabase; +import org.thoughtcrime.securesms.database.SmsDatabase.Status; +import org.thoughtcrime.securesms.mms.SlideDeck; import java.util.List; +import network.loki.messenger.R; + /** * Represents the message record model for MMS messages that contain * media (ie: they've been downloaded). @@ -58,9 +60,9 @@ public class MediaMmsMessageRecord extends MmsMessageRecord { @Nullable Quote quote, @NonNull List contacts, @NonNull List linkPreviews, boolean unidentified) { - super(id, body, conversationRecipient, individualRecipient, recipientDeviceId, dateSent, + super(id, body, conversationRecipient, individualRecipient, dateSent, dateReceived, threadId, Status.STATUS_NONE, deliveryReceiptCount, mailbox, mismatches, failures, - subscriptionId, expiresIn, expireStarted, slideDeck, readReceiptCount, quote, contacts, + expiresIn, expireStarted, slideDeck, readReceiptCount, quote, contacts, linkPreviews, unidentified); this.partCount = partCount; } @@ -82,8 +84,6 @@ public class MediaMmsMessageRecord extends MmsMessageRecord { return emphasisAdded(context.getString(R.string.SmsMessageRecord_duplicate_message)); } else if (MmsDatabase.Types.isNoRemoteSessionType(type)) { return emphasisAdded(context.getString(R.string.MmsMessageRecord_mms_message_encrypted_for_non_existing_session)); - } else if (isLegacyMessage()) { - return emphasisAdded(context.getString(R.string.MessageRecord_message_encrypted_with_a_legacy_protocol_version_that_is_no_longer_supported)); } return super.getDisplayBody(context); diff --git a/app/src/main/java/org/thoughtcrime/securesms/database/model/MessageRecord.java b/app/src/main/java/org/thoughtcrime/securesms/database/model/MessageRecord.java index 8aa4d804e1..ebbd1ea8de 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/database/model/MessageRecord.java +++ b/app/src/main/java/org/thoughtcrime/securesms/database/model/MessageRecord.java @@ -30,8 +30,6 @@ import org.session.libsession.messaging.utilities.UpdateMessageData; import org.session.libsession.utilities.IdentityKeyMismatch; import org.session.libsession.utilities.NetworkFailure; import org.session.libsession.utilities.recipients.Recipient; -import org.thoughtcrime.securesms.database.MmsSmsColumns; -import org.thoughtcrime.securesms.database.SmsDatabase; import java.util.List; @@ -44,48 +42,62 @@ import java.util.List; * */ public abstract class MessageRecord extends DisplayRecord { - private final Recipient individualRecipient; - private final int recipientDeviceId; - public final long id; private final List mismatches; private final List networkFailures; - private final int subscriptionId; private final long expiresIn; private final long expireStarted; private final boolean unidentified; + public final long id; + + public abstract boolean isMms(); + public abstract boolean isMmsNotification(); MessageRecord(long id, String body, Recipient conversationRecipient, - Recipient individualRecipient, int recipientDeviceId, - long dateSent, long dateReceived, long threadId, - int deliveryStatus, int deliveryReceiptCount, long type, - List mismatches, - List networkFailures, - int subscriptionId, long expiresIn, long expireStarted, - int readReceiptCount, boolean unidentified) + Recipient individualRecipient, + long dateSent, long dateReceived, long threadId, + int deliveryStatus, int deliveryReceiptCount, long type, + List mismatches, + List networkFailures, + long expiresIn, long expireStarted, + int readReceiptCount, boolean unidentified) { super(body, conversationRecipient, dateSent, dateReceived, - threadId, deliveryStatus, deliveryReceiptCount, type, readReceiptCount); + threadId, deliveryStatus, deliveryReceiptCount, type, readReceiptCount); this.id = id; this.individualRecipient = individualRecipient; - this.recipientDeviceId = recipientDeviceId; this.mismatches = mismatches; this.networkFailures = networkFailures; - this.subscriptionId = subscriptionId; this.expiresIn = expiresIn; this.expireStarted = expireStarted; this.unidentified = unidentified; } - public abstract boolean isMms(); - public abstract boolean isMmsNotification(); - - public boolean isSecure() { - return MmsSmsColumns.Types.isSecureType(type); + public long getId() { + return id; + } + public long getTimestamp() { + return getDateSent(); + } + public Recipient getIndividualRecipient() { + return individualRecipient; + } + public long getType() { + return type; + } + public List getNetworkFailures() { + return networkFailures; + } + public long getExpiresIn() { + return expiresIn; + } + public long getExpireStarted() { return expireStarted; } + public boolean isMediaPending() { + return false; } - public boolean isLegacyMessage() { - return MmsSmsColumns.Types.isLegacyType(type); + public boolean isUpdate() { + return isExpirationTimerUpdate() || isCallLog() || isDataExtractionNotification(); } @Override @@ -104,77 +116,6 @@ public abstract class MessageRecord extends DisplayRecord { return new SpannableString(getBody()); } - public long getId() { - return id; - } - - public boolean isPush() { - return SmsDatabase.Types.isPushType(type) && !SmsDatabase.Types.isForcedSms(type); - } - - public long getTimestamp() { - if (getRecipient().getAddress().isOpenGroup()) { - return getDateReceived(); - } - if (isPush() && getDateSent() < getDateReceived()) { - return getDateSent(); - } - return getDateReceived(); - } - - public boolean isForcedSms() { - return SmsDatabase.Types.isForcedSms(type); - } - - public boolean isIdentityVerified() { - return SmsDatabase.Types.isIdentityVerified(type); - } - - public boolean isIdentityDefault() { - return SmsDatabase.Types.isIdentityDefault(type); - } - - public boolean isBundleKeyExchange() { - return SmsDatabase.Types.isBundleKeyExchange(type); - } - - public boolean isIdentityUpdate() { - return SmsDatabase.Types.isIdentityUpdate(type); - } - - public boolean isCorruptedKeyExchange() { - return SmsDatabase.Types.isCorruptedKeyExchange(type); - } - - public boolean isInvalidVersionKeyExchange() { - return SmsDatabase.Types.isInvalidVersionKeyExchange(type); - } - - public boolean isUpdate() { - return isExpirationTimerUpdate() || isCallLog() || isDataExtractionNotification() || - isIdentityUpdate() || isIdentityVerified() || isIdentityDefault(); - } - - public boolean isMediaPending() { - return false; - } - - public Recipient getIndividualRecipient() { - return individualRecipient; - } - - public long getType() { - return type; - } - - public List getIdentityKeyMismatches() { - return mismatches; - } - - public List getNetworkFailures() { - return networkFailures; - } - protected SpannableString emphasisAdded(String sequence) { SpannableString spannable = new SpannableString(sequence); spannable.setSpan(new RelativeSizeSpan(0.9f), 0, sequence.length(), Spannable.SPAN_EXCLUSIVE_EXCLUSIVE); @@ -184,25 +125,12 @@ public abstract class MessageRecord extends DisplayRecord { } public boolean equals(Object other) { - return other != null && - other instanceof MessageRecord && - ((MessageRecord) other).getId() == getId() && - ((MessageRecord) other).isMms() == isMms(); + return other instanceof MessageRecord + && ((MessageRecord) other).getId() == getId() + && ((MessageRecord) other).isMms() == isMms(); } public int hashCode() { return (int)getId(); } - - public long getExpiresIn() { - return expiresIn; - } - - public long getExpireStarted() { - return expireStarted; - } - - public boolean isUnidentified() { - return unidentified; - } } diff --git a/app/src/main/java/org/thoughtcrime/securesms/database/model/MmsMessageRecord.java b/app/src/main/java/org/thoughtcrime/securesms/database/model/MmsMessageRecord.java index 528720547c..29e01fff2a 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/database/model/MmsMessageRecord.java +++ b/app/src/main/java/org/thoughtcrime/securesms/database/model/MmsMessageRecord.java @@ -25,15 +25,15 @@ public abstract class MmsMessageRecord extends MessageRecord { private final @NonNull List linkPreviews = new LinkedList<>(); MmsMessageRecord(long id, String body, Recipient conversationRecipient, - Recipient individualRecipient, int recipientDeviceId, long dateSent, + Recipient individualRecipient, long dateSent, long dateReceived, long threadId, int deliveryStatus, int deliveryReceiptCount, long type, List mismatches, - List networkFailures, int subscriptionId, long expiresIn, + List networkFailures, long expiresIn, long expireStarted, @NonNull SlideDeck slideDeck, int readReceiptCount, @Nullable Quote quote, @NonNull List contacts, @NonNull List linkPreviews, boolean unidentified) { - super(id, body, conversationRecipient, individualRecipient, recipientDeviceId, dateSent, dateReceived, threadId, deliveryStatus, deliveryReceiptCount, type, mismatches, networkFailures, subscriptionId, expiresIn, expireStarted, readReceiptCount, unidentified); + super(id, body, conversationRecipient, individualRecipient, dateSent, dateReceived, threadId, deliveryStatus, deliveryReceiptCount, type, mismatches, networkFailures, expiresIn, expireStarted, readReceiptCount, unidentified); this.slideDeck = slideDeck; this.quote = quote; diff --git a/app/src/main/java/org/thoughtcrime/securesms/database/model/NotificationMmsMessageRecord.java b/app/src/main/java/org/thoughtcrime/securesms/database/model/NotificationMmsMessageRecord.java index 361be34d39..ee6e75647b 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/database/model/NotificationMmsMessageRecord.java +++ b/app/src/main/java/org/thoughtcrime/securesms/database/model/NotificationMmsMessageRecord.java @@ -17,20 +17,22 @@ package org.thoughtcrime.securesms.database.model; import android.content.Context; -import androidx.annotation.NonNull; import android.text.SpannableString; -import network.loki.messenger.R; -import org.thoughtcrime.securesms.database.MmsDatabase; -import org.thoughtcrime.securesms.database.SmsDatabase.Status; +import androidx.annotation.NonNull; + import org.session.libsession.utilities.IdentityKeyMismatch; import org.session.libsession.utilities.NetworkFailure; -import org.thoughtcrime.securesms.mms.SlideDeck; import org.session.libsession.utilities.recipients.Recipient; +import org.thoughtcrime.securesms.database.MmsDatabase; +import org.thoughtcrime.securesms.database.SmsDatabase.Status; +import org.thoughtcrime.securesms.mms.SlideDeck; import java.util.Collections; import java.util.LinkedList; +import network.loki.messenger.R; + /** * Represents the message record model for MMS messages that are * notifications (ie: they're pointers to undownloaded media). @@ -54,9 +56,9 @@ public class NotificationMmsMessageRecord extends MmsMessageRecord { long expiry, int status, byte[] transactionId, long mailbox, int subscriptionId, SlideDeck slideDeck, int readReceiptCount) { - super(id, "", conversationRecipient, individualRecipient, recipientDeviceId, + super(id, "", conversationRecipient, individualRecipient, dateSent, dateReceived, threadId, Status.STATUS_NONE, deliveryReceiptCount, mailbox, - new LinkedList(), new LinkedList(), subscriptionId, + new LinkedList(), new LinkedList(), 0, 0, slideDeck, readReceiptCount, null, Collections.emptyList(), Collections.emptyList(), false); this.contentLocation = contentLocation; @@ -91,11 +93,6 @@ public class NotificationMmsMessageRecord extends MmsMessageRecord { return false; } - @Override - public boolean isSecure() { - return false; - } - @Override public boolean isPending() { return false; diff --git a/app/src/main/java/org/thoughtcrime/securesms/database/model/SmsMessageRecord.java b/app/src/main/java/org/thoughtcrime/securesms/database/model/SmsMessageRecord.java index 07d8bc818d..f757d96fac 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/database/model/SmsMessageRecord.java +++ b/app/src/main/java/org/thoughtcrime/securesms/database/model/SmsMessageRecord.java @@ -22,10 +22,9 @@ import android.text.SpannableString; import androidx.annotation.NonNull; -import org.thoughtcrime.securesms.database.MmsSmsColumns; -import org.thoughtcrime.securesms.database.SmsDatabase; import org.session.libsession.utilities.IdentityKeyMismatch; import org.session.libsession.utilities.recipients.Recipient; +import org.thoughtcrime.securesms.database.SmsDatabase; import java.util.LinkedList; import java.util.List; @@ -43,17 +42,16 @@ public class SmsMessageRecord extends MessageRecord { public SmsMessageRecord(long id, String body, Recipient recipient, Recipient individualRecipient, - int recipientDeviceId, long dateSent, long dateReceived, int deliveryReceiptCount, long type, long threadId, int status, List mismatches, - int subscriptionId, long expiresIn, long expireStarted, + long expiresIn, long expireStarted, int readReceiptCount, boolean unidentified) { - super(id, body, recipient, individualRecipient, recipientDeviceId, + super(id, body, recipient, individualRecipient, dateSent, dateReceived, threadId, status, deliveryReceiptCount, type, - mismatches, new LinkedList<>(), subscriptionId, + mismatches, new LinkedList<>(), expiresIn, expireStarted, readReceiptCount, unidentified); } @@ -63,17 +61,8 @@ public class SmsMessageRecord extends MessageRecord { @Override public SpannableString getDisplayBody(@NonNull Context context) { - Recipient recipient = getRecipient(); if (SmsDatabase.Types.isFailedDecryptType(type)) { return emphasisAdded(context.getString(R.string.MessageDisplayHelper_bad_encrypted_message)); - } else if (isCorruptedKeyExchange()) { - return emphasisAdded(context.getString(R.string.SmsMessageRecord_received_corrupted_key_exchange_message)); - } else if (isInvalidVersionKeyExchange()) { - return emphasisAdded(context.getString(R.string.SmsMessageRecord_received_key_exchange_message_for_invalid_protocol_version)); - } else if (MmsSmsColumns.Types.isLegacyType(type)) { - return emphasisAdded(context.getString(R.string.MessageRecord_message_encrypted_with_a_legacy_protocol_version_that_is_no_longer_supported)); - } else if (isBundleKeyExchange()) { - return emphasisAdded(context.getString(R.string.SmsMessageRecord_received_message_with_new_safety_number_tap_to_process)); } else if (SmsDatabase.Types.isDuplicateMessageType(type)) { return emphasisAdded(context.getString(R.string.SmsMessageRecord_duplicate_message)); } else if (SmsDatabase.Types.isNoRemoteSessionType(type)) { From 7ab9d3d8dcd47ecc67124c0f409c89d3a02f8f2e Mon Sep 17 00:00:00 2001 From: nielsandriesse Date: Mon, 31 May 2021 16:26:46 +1000 Subject: [PATCH 005/240] Clean remaining message record classes --- .../securesms/database/MmsDatabase.java | 47 +++++++++---------- .../database/model/MediaMmsMessageRecord.java | 34 ++++++-------- .../database/model/MessageRecord.java | 3 +- .../database/model/MmsMessageRecord.java | 25 +++------- .../model/NotificationMmsMessageRecord.java | 25 ++++------ .../database/model/SmsMessageRecord.java | 26 +++++----- 6 files changed, 64 insertions(+), 96 deletions(-) diff --git a/app/src/main/java/org/thoughtcrime/securesms/database/MmsDatabase.java b/app/src/main/java/org/thoughtcrime/securesms/database/MmsDatabase.java index 75dca96013..ed443591f0 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/database/MmsDatabase.java +++ b/app/src/main/java/org/thoughtcrime/securesms/database/MmsDatabase.java @@ -34,42 +34,39 @@ import net.sqlcipher.database.SQLiteDatabase; import org.json.JSONArray; import org.json.JSONException; import org.json.JSONObject; +import org.session.libsession.messaging.messages.signal.IncomingMediaMessage; +import org.session.libsession.messaging.messages.signal.OutgoingExpirationUpdateMessage; +import org.session.libsession.messaging.messages.signal.OutgoingGroupMediaMessage; +import org.session.libsession.messaging.messages.signal.OutgoingMediaMessage; +import org.session.libsession.messaging.messages.signal.OutgoingSecureMediaMessage; +import org.session.libsession.messaging.sending_receiving.attachments.Attachment; +import org.session.libsession.messaging.sending_receiving.attachments.AttachmentId; +import org.session.libsession.messaging.sending_receiving.attachments.DatabaseAttachment; +import org.session.libsession.messaging.sending_receiving.link_preview.LinkPreview; +import org.session.libsession.messaging.sending_receiving.quotes.QuoteModel; +import org.session.libsession.utilities.Address; +import org.session.libsession.utilities.Contact; import org.session.libsession.utilities.GroupUtil; -import org.thoughtcrime.securesms.ApplicationContext; -import org.thoughtcrime.securesms.attachments.MmsNotificationAttachment; import org.session.libsession.utilities.IdentityKeyMismatch; import org.session.libsession.utilities.IdentityKeyMismatchList; import org.session.libsession.utilities.NetworkFailure; import org.session.libsession.utilities.NetworkFailureList; +import org.session.libsession.utilities.TextSecurePreferences; +import org.session.libsession.utilities.Util; +import org.session.libsession.utilities.recipients.Recipient; +import org.session.libsession.utilities.recipients.RecipientFormattingException; +import org.session.libsignal.utilities.JsonUtil; +import org.session.libsignal.utilities.Log; +import org.session.libsignal.utilities.guava.Optional; +import org.thoughtcrime.securesms.attachments.MmsNotificationAttachment; import org.thoughtcrime.securesms.database.helpers.SQLCipherOpenHelper; import org.thoughtcrime.securesms.database.model.MediaMmsMessageRecord; import org.thoughtcrime.securesms.database.model.MessageRecord; import org.thoughtcrime.securesms.database.model.NotificationMmsMessageRecord; import org.thoughtcrime.securesms.database.model.Quote; -import org.session.libsession.messaging.messages.signal.IncomingMediaMessage; import org.thoughtcrime.securesms.mms.MmsException; -import org.session.libsession.messaging.messages.signal.OutgoingExpirationUpdateMessage; -import org.session.libsession.messaging.messages.signal.OutgoingGroupMediaMessage; -import org.session.libsession.messaging.messages.signal.OutgoingMediaMessage; -import org.session.libsession.messaging.messages.signal.OutgoingSecureMediaMessage; import org.thoughtcrime.securesms.mms.SlideDeck; -import org.session.libsession.messaging.sending_receiving.attachments.Attachment; -import org.session.libsession.messaging.sending_receiving.attachments.AttachmentId; -import org.session.libsession.messaging.sending_receiving.attachments.DatabaseAttachment; -import org.session.libsession.utilities.Contact; -import org.session.libsession.messaging.sending_receiving.link_preview.LinkPreview; -import org.session.libsession.messaging.sending_receiving.quotes.QuoteModel; -import org.session.libsession.utilities.Address; -import org.session.libsession.utilities.recipients.Recipient; -import org.session.libsession.utilities.recipients.RecipientFormattingException; -import org.session.libsignal.utilities.JsonUtil; -import org.session.libsession.utilities.TextSecurePreferences; -import org.session.libsession.utilities.Util; - -import org.session.libsignal.utilities.Log; -import org.session.libsignal.utilities.guava.Optional; - import java.io.Closeable; import java.io.IOException; import java.security.SecureRandom; @@ -1171,9 +1168,9 @@ public class MmsDatabase extends MessagingDatabase { return new NotificationMmsMessageRecord(id, recipient, recipient, - addressDeviceId, dateSent, dateReceived, deliveryReceiptCount, threadId, + dateSent, dateReceived, deliveryReceiptCount, threadId, contentLocationBytes, messageSize, expiry, status, - transactionIdBytes, mailbox, subscriptionId, slideDeck, + transactionIdBytes, mailbox, slideDeck, readReceiptCount); } diff --git a/app/src/main/java/org/thoughtcrime/securesms/database/model/MediaMmsMessageRecord.java b/app/src/main/java/org/thoughtcrime/securesms/database/model/MediaMmsMessageRecord.java index fa03a101b5..3385ba3a56 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/database/model/MediaMmsMessageRecord.java +++ b/app/src/main/java/org/thoughtcrime/securesms/database/model/MediaMmsMessageRecord.java @@ -18,10 +18,8 @@ package org.thoughtcrime.securesms.database.model; import android.content.Context; import android.text.SpannableString; - import androidx.annotation.NonNull; import androidx.annotation.Nullable; - import org.session.libsession.messaging.sending_receiving.link_preview.LinkPreview; import org.session.libsession.utilities.Contact; import org.session.libsession.utilities.IdentityKeyMismatch; @@ -30,9 +28,7 @@ import org.session.libsession.utilities.recipients.Recipient; import org.thoughtcrime.securesms.database.MmsDatabase; import org.thoughtcrime.securesms.database.SmsDatabase.Status; import org.thoughtcrime.securesms.mms.SlideDeck; - import java.util.List; - import network.loki.messenger.R; /** @@ -44,26 +40,24 @@ import network.loki.messenger.R; */ public class MediaMmsMessageRecord extends MmsMessageRecord { - private final static String TAG = MediaMmsMessageRecord.class.getSimpleName(); - - private final int partCount; + private final int partCount; public MediaMmsMessageRecord(long id, Recipient conversationRecipient, - Recipient individualRecipient, int recipientDeviceId, - long dateSent, long dateReceived, int deliveryReceiptCount, - long threadId, String body, - @NonNull SlideDeck slideDeck, - int partCount, long mailbox, - List mismatches, - List failures, int subscriptionId, - long expiresIn, long expireStarted, int readReceiptCount, - @Nullable Quote quote, @NonNull List contacts, - @NonNull List linkPreviews, boolean unidentified) + Recipient individualRecipient, int recipientDeviceId, + long dateSent, long dateReceived, int deliveryReceiptCount, + long threadId, String body, + @NonNull SlideDeck slideDeck, + int partCount, long mailbox, + List mismatches, + List failures, int subscriptionId, + long expiresIn, long expireStarted, int readReceiptCount, + @Nullable Quote quote, @NonNull List contacts, + @NonNull List linkPreviews, boolean unidentified) { super(id, body, conversationRecipient, individualRecipient, dateSent, - dateReceived, threadId, Status.STATUS_NONE, deliveryReceiptCount, mailbox, mismatches, failures, - expiresIn, expireStarted, slideDeck, readReceiptCount, quote, contacts, - linkPreviews, unidentified); + dateReceived, threadId, Status.STATUS_NONE, deliveryReceiptCount, mailbox, mismatches, failures, + expiresIn, expireStarted, slideDeck, readReceiptCount, quote, contacts, + linkPreviews, unidentified); this.partCount = partCount; } diff --git a/app/src/main/java/org/thoughtcrime/securesms/database/model/MessageRecord.java b/app/src/main/java/org/thoughtcrime/securesms/database/model/MessageRecord.java index ebbd1ea8de..31db5b4514 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/database/model/MessageRecord.java +++ b/app/src/main/java/org/thoughtcrime/securesms/database/model/MessageRecord.java @@ -92,6 +92,7 @@ public abstract class MessageRecord extends DisplayRecord { return expiresIn; } public long getExpireStarted() { return expireStarted; } + public boolean isMediaPending() { return false; } @@ -102,7 +103,7 @@ public abstract class MessageRecord extends DisplayRecord { @Override public SpannableString getDisplayBody(@NonNull Context context) { - if(isGroupUpdateMessage()) { + if (isGroupUpdateMessage()) { UpdateMessageData updateMessageData = UpdateMessageData.Companion.fromJSON(getBody()); return new SpannableString(UpdateMessageBuilder.INSTANCE.buildGroupUpdateMessage(context, updateMessageData, getIndividualRecipient().getAddress().serialize(), isOutgoing())); } else if (isExpirationTimerUpdate()) { diff --git a/app/src/main/java/org/thoughtcrime/securesms/database/model/MmsMessageRecord.java b/app/src/main/java/org/thoughtcrime/securesms/database/model/MmsMessageRecord.java index 29e01fff2a..937b74ec58 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/database/model/MmsMessageRecord.java +++ b/app/src/main/java/org/thoughtcrime/securesms/database/model/MmsMessageRecord.java @@ -1,43 +1,35 @@ package org.thoughtcrime.securesms.database.model; - import androidx.annotation.NonNull; import androidx.annotation.Nullable; - import org.session.libsession.utilities.Contact; import org.session.libsession.messaging.sending_receiving.link_preview.LinkPreview; import org.session.libsession.utilities.recipients.Recipient; - import org.session.libsession.utilities.IdentityKeyMismatch; import org.session.libsession.utilities.NetworkFailure; import org.thoughtcrime.securesms.mms.Slide; import org.thoughtcrime.securesms.mms.SlideDeck; - - import java.util.LinkedList; import java.util.List; public abstract class MmsMessageRecord extends MessageRecord { - private final @NonNull SlideDeck slideDeck; private final @Nullable Quote quote; private final @NonNull List contacts = new LinkedList<>(); private final @NonNull List linkPreviews = new LinkedList<>(); MmsMessageRecord(long id, String body, Recipient conversationRecipient, - Recipient individualRecipient, long dateSent, - long dateReceived, long threadId, int deliveryStatus, int deliveryReceiptCount, - long type, List mismatches, - List networkFailures, long expiresIn, - long expireStarted, @NonNull SlideDeck slideDeck, int readReceiptCount, - @Nullable Quote quote, @NonNull List contacts, - @NonNull List linkPreviews, boolean unidentified) + Recipient individualRecipient, long dateSent, + long dateReceived, long threadId, int deliveryStatus, int deliveryReceiptCount, + long type, List mismatches, + List networkFailures, long expiresIn, + long expireStarted, @NonNull SlideDeck slideDeck, int readReceiptCount, + @Nullable Quote quote, @NonNull List contacts, + @NonNull List linkPreviews, boolean unidentified) { super(id, body, conversationRecipient, individualRecipient, dateSent, dateReceived, threadId, deliveryStatus, deliveryReceiptCount, type, mismatches, networkFailures, expiresIn, expireStarted, readReceiptCount, unidentified); - this.slideDeck = slideDeck; this.quote = quote; - this.contacts.addAll(contacts); this.linkPreviews.addAll(linkPreviews); } @@ -66,15 +58,12 @@ public abstract class MmsMessageRecord extends MessageRecord { public boolean containsMediaSlide() { return slideDeck.containsMediaSlide(); } - public @Nullable Quote getQuote() { return quote; } - public @NonNull List getSharedContacts() { return contacts; } - public @NonNull List getLinkPreviews() { return linkPreviews; } diff --git a/app/src/main/java/org/thoughtcrime/securesms/database/model/NotificationMmsMessageRecord.java b/app/src/main/java/org/thoughtcrime/securesms/database/model/NotificationMmsMessageRecord.java index ee6e75647b..4c3aa98868 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/database/model/NotificationMmsMessageRecord.java +++ b/app/src/main/java/org/thoughtcrime/securesms/database/model/NotificationMmsMessageRecord.java @@ -18,19 +18,15 @@ package org.thoughtcrime.securesms.database.model; import android.content.Context; import android.text.SpannableString; - import androidx.annotation.NonNull; - import org.session.libsession.utilities.IdentityKeyMismatch; import org.session.libsession.utilities.NetworkFailure; import org.session.libsession.utilities.recipients.Recipient; import org.thoughtcrime.securesms.database.MmsDatabase; import org.thoughtcrime.securesms.database.SmsDatabase.Status; import org.thoughtcrime.securesms.mms.SlideDeck; - import java.util.Collections; import java.util.LinkedList; - import network.loki.messenger.R; /** @@ -42,7 +38,6 @@ import network.loki.messenger.R; */ public class NotificationMmsMessageRecord extends MmsMessageRecord { - private final byte[] contentLocation; private final long messageSize; private final long expiry; @@ -50,16 +45,16 @@ public class NotificationMmsMessageRecord extends MmsMessageRecord { private final byte[] transactionId; public NotificationMmsMessageRecord(long id, Recipient conversationRecipient, - Recipient individualRecipient, int recipientDeviceId, - long dateSent, long dateReceived, int deliveryReceiptCount, - long threadId, byte[] contentLocation, long messageSize, - long expiry, int status, byte[] transactionId, long mailbox, - int subscriptionId, SlideDeck slideDeck, int readReceiptCount) + Recipient individualRecipient, + long dateSent, long dateReceived, int deliveryReceiptCount, + long threadId, byte[] contentLocation, long messageSize, + long expiry, int status, byte[] transactionId, long mailbox, + SlideDeck slideDeck, int readReceiptCount) { super(id, "", conversationRecipient, individualRecipient, - dateSent, dateReceived, threadId, Status.STATUS_NONE, deliveryReceiptCount, mailbox, - new LinkedList(), new LinkedList(), - 0, 0, slideDeck, readReceiptCount, null, Collections.emptyList(), Collections.emptyList(), false); + dateSent, dateReceived, threadId, Status.STATUS_NONE, deliveryReceiptCount, mailbox, + new LinkedList(), new LinkedList(), + 0, 0, slideDeck, readReceiptCount, null, Collections.emptyList(), Collections.emptyList(), false); this.contentLocation = contentLocation; this.messageSize = messageSize; @@ -71,19 +66,15 @@ public class NotificationMmsMessageRecord extends MmsMessageRecord { public byte[] getTransactionId() { return transactionId; } - public int getStatus() { return this.status; } - public byte[] getContentLocation() { return contentLocation; } - public long getMessageSize() { return (messageSize + 1023) / 1024; } - public long getExpiration() { return expiry * 1000; } diff --git a/app/src/main/java/org/thoughtcrime/securesms/database/model/SmsMessageRecord.java b/app/src/main/java/org/thoughtcrime/securesms/database/model/SmsMessageRecord.java index f757d96fac..319ff6fcaf 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/database/model/SmsMessageRecord.java +++ b/app/src/main/java/org/thoughtcrime/securesms/database/model/SmsMessageRecord.java @@ -19,16 +19,12 @@ package org.thoughtcrime.securesms.database.model; import android.content.Context; import android.text.SpannableString; - import androidx.annotation.NonNull; - import org.session.libsession.utilities.IdentityKeyMismatch; import org.session.libsession.utilities.recipients.Recipient; import org.thoughtcrime.securesms.database.SmsDatabase; - import java.util.LinkedList; import java.util.List; - import network.loki.messenger.R; /** @@ -40,19 +36,19 @@ import network.loki.messenger.R; public class SmsMessageRecord extends MessageRecord { public SmsMessageRecord(long id, - String body, Recipient recipient, - Recipient individualRecipient, - long dateSent, long dateReceived, - int deliveryReceiptCount, - long type, long threadId, - int status, List mismatches, - long expiresIn, long expireStarted, - int readReceiptCount, boolean unidentified) + String body, Recipient recipient, + Recipient individualRecipient, + long dateSent, long dateReceived, + int deliveryReceiptCount, + long type, long threadId, + int status, List mismatches, + long expiresIn, long expireStarted, + int readReceiptCount, boolean unidentified) { super(id, body, recipient, individualRecipient, - dateSent, dateReceived, threadId, status, deliveryReceiptCount, type, - mismatches, new LinkedList<>(), - expiresIn, expireStarted, readReceiptCount, unidentified); + dateSent, dateReceived, threadId, status, deliveryReceiptCount, type, + mismatches, new LinkedList<>(), + expiresIn, expireStarted, readReceiptCount, unidentified); } public long getType() { From 7710a2c32f1a8df45b91a611da327137009cff5d Mon Sep 17 00:00:00 2001 From: nielsandriesse Date: Tue, 1 Jun 2021 09:48:02 +1000 Subject: [PATCH 006/240] Distinguish between control messages and visible messages --- .../conversation/v2/ConversationAdapter.kt | 59 +++++++++++++++---- .../{MessageView.kt => ControlMessageView.kt} | 8 +-- .../v2/messages/VisibleMessageView.kt | 40 +++++++++++++ ...w_message.xml => view_control_message.xml} | 0 .../main/res/layout/view_visible_message.xml | 17 ++++++ 5 files changed, 110 insertions(+), 14 deletions(-) rename app/src/main/java/org/thoughtcrime/securesms/conversation/v2/messages/{MessageView.kt => ControlMessageView.kt} (77%) create mode 100644 app/src/main/java/org/thoughtcrime/securesms/conversation/v2/messages/VisibleMessageView.kt rename app/src/main/res/layout/{view_message.xml => view_control_message.xml} (100%) create mode 100644 app/src/main/res/layout/view_visible_message.xml diff --git a/app/src/main/java/org/thoughtcrime/securesms/conversation/v2/ConversationAdapter.kt b/app/src/main/java/org/thoughtcrime/securesms/conversation/v2/ConversationAdapter.kt index 8a08ac2678..f68ea1da4a 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/conversation/v2/ConversationAdapter.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/conversation/v2/ConversationAdapter.kt @@ -3,30 +3,69 @@ package org.thoughtcrime.securesms.conversation.v2 import android.content.Context import android.database.Cursor import android.view.ViewGroup -import androidx.recyclerview.widget.RecyclerView -import org.thoughtcrime.securesms.conversation.v2.messages.MessageView +import androidx.recyclerview.widget.RecyclerView.ViewHolder +import org.thoughtcrime.securesms.conversation.v2.messages.ControlMessageView +import org.thoughtcrime.securesms.conversation.v2.messages.VisibleMessageView import org.thoughtcrime.securesms.database.CursorRecyclerViewAdapter import org.thoughtcrime.securesms.database.DatabaseFactory import org.thoughtcrime.securesms.database.model.MessageRecord +import java.lang.IllegalStateException -class ConversationAdapter(context: Context, cursor: Cursor) : CursorRecyclerViewAdapter(context, cursor) { +class ConversationAdapter(context: Context, cursor: Cursor) : CursorRecyclerViewAdapter(context, cursor) { private val messageDB = DatabaseFactory.getMmsSmsDatabase(context) - class ViewHolder(val view: MessageView) : RecyclerView.ViewHolder(view) + sealed class ViewType(val rawValue: Int) { + object Visible : ViewType(0) + object Control : ViewType(1) + + companion object { + + val allValues: Map get() = mapOf( + Visible.rawValue to Visible, + Control.rawValue to Control + ) + } + } + + class VisibleMessageViewHolder(val view: VisibleMessageView) : ViewHolder(view) + class ControlMessageViewHolder(val view: ControlMessageView) : ViewHolder(view) + + override fun getItemViewType(cursor: Cursor): Int { + val message = getMessage(cursor)!! + if (message.isExpirationTimerUpdate) { return ViewType.Control.rawValue } + return ViewType.Visible.rawValue + } override fun onCreateItemViewHolder(parent: ViewGroup, viewType: Int): ViewHolder { - val view = MessageView(context) - return ViewHolder(view) + @Suppress("NAME_SHADOWING") + val viewType = ViewType.allValues[viewType] + when (viewType) { + ViewType.Visible -> { + val view = VisibleMessageView(context) + return VisibleMessageViewHolder(view) + } + ViewType.Control -> { + val view = ControlMessageView(context) + return ControlMessageViewHolder(view) + } + else -> throw IllegalStateException("Unexpected view type: $viewType.") + } } override fun onBindItemViewHolder(viewHolder: ViewHolder, cursor: Cursor) { val message = getMessage(cursor)!! - viewHolder.view.bind(message) + when (viewHolder) { + is VisibleMessageViewHolder -> viewHolder.view.bind(message) + is ControlMessageViewHolder -> viewHolder.view.bind(message) + } } - override fun onItemViewRecycled(holder: ViewHolder?) { - holder?.view?.recycle() - super.onItemViewRecycled(holder) + override fun onItemViewRecycled(viewHolder: ViewHolder?) { + when (viewHolder) { + is VisibleMessageViewHolder -> viewHolder.view.recycle() + is ControlMessageViewHolder -> viewHolder.view.recycle() + } + super.onItemViewRecycled(viewHolder) } private fun getMessage(cursor: Cursor): MessageRecord? { diff --git a/app/src/main/java/org/thoughtcrime/securesms/conversation/v2/messages/MessageView.kt b/app/src/main/java/org/thoughtcrime/securesms/conversation/v2/messages/ControlMessageView.kt similarity index 77% rename from app/src/main/java/org/thoughtcrime/securesms/conversation/v2/messages/MessageView.kt rename to app/src/main/java/org/thoughtcrime/securesms/conversation/v2/messages/ControlMessageView.kt index 1c7b9941da..f7e23bc19b 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/conversation/v2/messages/MessageView.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/conversation/v2/messages/ControlMessageView.kt @@ -4,11 +4,11 @@ import android.content.Context import android.util.AttributeSet import android.view.LayoutInflater import android.widget.LinearLayout -import kotlinx.android.synthetic.main.view_message.view.* +import kotlinx.android.synthetic.main.view_visible_message.view.* import network.loki.messenger.R import org.thoughtcrime.securesms.database.model.MessageRecord -class MessageView : LinearLayout { +class ControlMessageView : LinearLayout { // region Lifecycle constructor(context: Context) : super(context) { @@ -24,13 +24,13 @@ class MessageView : LinearLayout { } private fun setUpViewHierarchy() { - LayoutInflater.from(context).inflate(R.layout.view_message, this) + LayoutInflater.from(context).inflate(R.layout.view_control_message, this) } // endregion // region Updating fun bind(message: MessageRecord) { - testTextView.text = message.body + testTextView.text = "Control message: ${message.body}" } fun recycle() { diff --git a/app/src/main/java/org/thoughtcrime/securesms/conversation/v2/messages/VisibleMessageView.kt b/app/src/main/java/org/thoughtcrime/securesms/conversation/v2/messages/VisibleMessageView.kt new file mode 100644 index 0000000000..684bb03f13 --- /dev/null +++ b/app/src/main/java/org/thoughtcrime/securesms/conversation/v2/messages/VisibleMessageView.kt @@ -0,0 +1,40 @@ +package org.thoughtcrime.securesms.conversation.v2.messages + +import android.content.Context +import android.util.AttributeSet +import android.view.LayoutInflater +import android.widget.LinearLayout +import kotlinx.android.synthetic.main.view_visible_message.view.* +import network.loki.messenger.R +import org.thoughtcrime.securesms.database.model.MessageRecord + +class VisibleMessageView : LinearLayout { + + // region Lifecycle + 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() { + LayoutInflater.from(context).inflate(R.layout.view_visible_message, this) + } + // endregion + + // region Updating + fun bind(message: MessageRecord) { + testTextView.text = "Visible message: ${message.body}" + } + + fun recycle() { + // TODO: Implement + } + // endregion +} \ No newline at end of file diff --git a/app/src/main/res/layout/view_message.xml b/app/src/main/res/layout/view_control_message.xml similarity index 100% rename from app/src/main/res/layout/view_message.xml rename to app/src/main/res/layout/view_control_message.xml diff --git a/app/src/main/res/layout/view_visible_message.xml b/app/src/main/res/layout/view_visible_message.xml new file mode 100644 index 0000000000..f9c3545d87 --- /dev/null +++ b/app/src/main/res/layout/view_visible_message.xml @@ -0,0 +1,17 @@ + + + + + + \ No newline at end of file From b000be903765ed5bd1f146aecdf275f36b53d8fa Mon Sep 17 00:00:00 2001 From: nielsandriesse Date: Tue, 1 Jun 2021 10:02:20 +1000 Subject: [PATCH 007/240] Add isControlMessage convenience variable --- .../securesms/conversation/v2/ConversationAdapter.kt | 2 +- .../thoughtcrime/securesms/database/model/DisplayRecord.java | 4 ++++ 2 files changed, 5 insertions(+), 1 deletion(-) diff --git a/app/src/main/java/org/thoughtcrime/securesms/conversation/v2/ConversationAdapter.kt b/app/src/main/java/org/thoughtcrime/securesms/conversation/v2/ConversationAdapter.kt index f68ea1da4a..adebfc5375 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/conversation/v2/ConversationAdapter.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/conversation/v2/ConversationAdapter.kt @@ -32,7 +32,7 @@ class ConversationAdapter(context: Context, cursor: Cursor) : CursorRecyclerView override fun getItemViewType(cursor: Cursor): Int { val message = getMessage(cursor)!! - if (message.isExpirationTimerUpdate) { return ViewType.Control.rawValue } + if (message.isControlMessage) { return ViewType.Control.rawValue } return ViewType.Visible.rawValue } diff --git a/app/src/main/java/org/thoughtcrime/securesms/database/model/DisplayRecord.java b/app/src/main/java/org/thoughtcrime/securesms/database/model/DisplayRecord.java index c8b7ca648b..6e3f63c5ec 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/database/model/DisplayRecord.java +++ b/app/src/main/java/org/thoughtcrime/securesms/database/model/DisplayRecord.java @@ -127,4 +127,8 @@ public abstract class DisplayRecord { public boolean isMissedCall() { return SmsDatabase.Types.isMissedCall(type); } + + public boolean isControlMessage() { + return isGroupUpdateMessage() || isExpirationTimerUpdate() || isDataExtractionNotification(); + } } From a23cfbc11d290a41ed9dd635ed793c1005a7fdfb Mon Sep 17 00:00:00 2001 From: nielsandriesse Date: Tue, 1 Jun 2021 13:01:03 +1000 Subject: [PATCH 008/240] Implement parts of the visible message view --- .../v2/messages/ControlMessageView.kt | 8 ++- .../v2/messages/VisibleMessageView.kt | 27 ++++++- .../drawable/message_bubble_background.xml | 1 - ...ssage_bubble_background_received_alone.xml | 1 - ...message_bubble_background_received_end.xml | 1 - ...sage_bubble_background_received_middle.xml | 1 - ...ssage_bubble_background_received_start.xml | 1 - .../message_bubble_background_sent_alone.xml | 1 - .../message_bubble_background_sent_end.xml | 1 - .../message_bubble_background_sent_middle.xml | 1 - .../message_bubble_background_sent_start.xml | 1 - .../main/res/layout/view_control_message.xml | 7 +- .../main/res/layout/view_visible_message.xml | 71 ++++++++++++++++--- 13 files changed, 97 insertions(+), 25 deletions(-) diff --git a/app/src/main/java/org/thoughtcrime/securesms/conversation/v2/messages/ControlMessageView.kt b/app/src/main/java/org/thoughtcrime/securesms/conversation/v2/messages/ControlMessageView.kt index f7e23bc19b..1de54f89f6 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/conversation/v2/messages/ControlMessageView.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/conversation/v2/messages/ControlMessageView.kt @@ -4,7 +4,7 @@ import android.content.Context import android.util.AttributeSet import android.view.LayoutInflater import android.widget.LinearLayout -import kotlinx.android.synthetic.main.view_visible_message.view.* +import kotlinx.android.synthetic.main.view_control_message.view.* import network.loki.messenger.R import org.thoughtcrime.securesms.database.model.MessageRecord @@ -30,7 +30,11 @@ class ControlMessageView : LinearLayout { // region Updating fun bind(message: MessageRecord) { - testTextView.text = "Control message: ${message.body}" + // TODO: Localize strings, make the view look better, handle closed group control messages + if (message.isExpirationTimerUpdate) { textView.text = "Expiration timer update" } + else if (message.isScreenshotNotification) { textView.text = "Screenshot notification" } + else if (message.isMediaSavedNotification) { textView.text = "Media saved notification" } + else { textView.text = "Control message not yet handled" } } fun recycle() { diff --git a/app/src/main/java/org/thoughtcrime/securesms/conversation/v2/messages/VisibleMessageView.kt b/app/src/main/java/org/thoughtcrime/securesms/conversation/v2/messages/VisibleMessageView.kt index 684bb03f13..2b87668f93 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/conversation/v2/messages/VisibleMessageView.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/conversation/v2/messages/VisibleMessageView.kt @@ -3,9 +3,12 @@ package org.thoughtcrime.securesms.conversation.v2.messages import android.content.Context import android.util.AttributeSet import android.view.LayoutInflater +import android.view.View import android.widget.LinearLayout import kotlinx.android.synthetic.main.view_visible_message.view.* import network.loki.messenger.R +import org.session.libsession.messaging.contacts.Contact.ContactContext +import org.thoughtcrime.securesms.database.DatabaseFactory import org.thoughtcrime.securesms.database.model.MessageRecord class VisibleMessageView : LinearLayout { @@ -30,11 +33,31 @@ class VisibleMessageView : LinearLayout { // region Updating fun bind(message: MessageRecord) { - testTextView.text = "Visible message: ${message.body}" + val sender = message.individualRecipient + val senderSessionID = sender.address.serialize() + val threadID = message.threadId + val threadDB = DatabaseFactory.getThreadDatabase(context) + val thread = threadDB.getRecipientForThreadId(threadID) + val contactDB = DatabaseFactory.getSessionContactDatabase(context) + val isGroupThread = (thread?.isGroupRecipient == true) + // Show profile picture and sender name if this is a group thread + if (isGroupThread) { + profilePictureContainer.visibility = View.VISIBLE + profilePictureView.publicKey = senderSessionID + // TODO: Set glide on the profile picture view and update it + // TODO: Show crown if this is an open group and the user is a moderator; otherwise hide it + senderNameTextView.visibility = View.VISIBLE + val context = if (thread?.isOpenGroupRecipient == true) ContactContext.OPEN_GROUP else ContactContext.REGULAR + senderNameTextView.text = contactDB.getContactWithSessionID(senderSessionID)?.displayName(context) ?: senderSessionID + } else { + profilePictureContainer.visibility = View.GONE + senderNameTextView.visibility = View.GONE + } + // TODO: Populate content view } fun recycle() { - // TODO: Implement + profilePictureView.recycle() } // endregion } \ No newline at end of file diff --git a/app/src/main/res/drawable/message_bubble_background.xml b/app/src/main/res/drawable/message_bubble_background.xml index cda641b1da..9c4347ae6e 100644 --- a/app/src/main/res/drawable/message_bubble_background.xml +++ b/app/src/main/res/drawable/message_bubble_background.xml @@ -4,7 +4,6 @@ - diff --git a/app/src/main/res/drawable/message_bubble_background_received_alone.xml b/app/src/main/res/drawable/message_bubble_background_received_alone.xml index cda641b1da..9c4347ae6e 100644 --- a/app/src/main/res/drawable/message_bubble_background_received_alone.xml +++ b/app/src/main/res/drawable/message_bubble_background_received_alone.xml @@ -4,7 +4,6 @@ - diff --git a/app/src/main/res/drawable/message_bubble_background_received_end.xml b/app/src/main/res/drawable/message_bubble_background_received_end.xml index 3e4e2c0562..c31ca989d0 100644 --- a/app/src/main/res/drawable/message_bubble_background_received_end.xml +++ b/app/src/main/res/drawable/message_bubble_background_received_end.xml @@ -4,7 +4,6 @@ - - - - diff --git a/app/src/main/res/drawable/message_bubble_background_sent_end.xml b/app/src/main/res/drawable/message_bubble_background_sent_end.xml index 5bc4597c03..33fac83ec3 100644 --- a/app/src/main/res/drawable/message_bubble_background_sent_end.xml +++ b/app/src/main/res/drawable/message_bubble_background_sent_end.xml @@ -4,7 +4,6 @@ - - - + android:orientation="horizontal" + android:gravity="center"> + android:orientation="horizontal" + android:gravity="bottom"> - + + + android:orientation="horizontal"> + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file From 7f3b7144011b056d80b2bda1cc4804c83a2859e0 Mon Sep 17 00:00:00 2001 From: nielsandriesse Date: Tue, 1 Jun 2021 13:26:57 +1000 Subject: [PATCH 009/240] Add VisibleMessageContentView --- .../v2/messages/VisibleMessageContentView.kt | 52 +++++++++++++++++++ .../v2/messages/VisibleMessageView.kt | 3 +- .../main/res/layout/view_visible_message.xml | 8 ++- .../layout/view_visible_message_content.xml | 15 ++++++ 4 files changed, 72 insertions(+), 6 deletions(-) create mode 100644 app/src/main/java/org/thoughtcrime/securesms/conversation/v2/messages/VisibleMessageContentView.kt create mode 100644 app/src/main/res/layout/view_visible_message_content.xml diff --git a/app/src/main/java/org/thoughtcrime/securesms/conversation/v2/messages/VisibleMessageContentView.kt b/app/src/main/java/org/thoughtcrime/securesms/conversation/v2/messages/VisibleMessageContentView.kt new file mode 100644 index 0000000000..227cebbbb4 --- /dev/null +++ b/app/src/main/java/org/thoughtcrime/securesms/conversation/v2/messages/VisibleMessageContentView.kt @@ -0,0 +1,52 @@ +package org.thoughtcrime.securesms.conversation.v2.messages + +import android.content.Context +import android.util.AttributeSet +import android.util.Log +import android.view.LayoutInflater +import android.widget.LinearLayout +import androidx.core.content.res.ResourcesCompat +import androidx.core.graphics.BlendModeColorFilterCompat +import androidx.core.graphics.BlendModeCompat +import kotlinx.android.synthetic.main.view_visible_message_content.view.* +import network.loki.messenger.R +import org.session.libsession.utilities.ThemeUtil +import org.thoughtcrime.securesms.database.model.MessageRecord + +class VisibleMessageContentView : LinearLayout { + + // region Lifecycle + 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() { + LayoutInflater.from(context).inflate(R.layout.view_visible_message_content, this) + } + // endregion + + // region Updating + fun bind(message: MessageRecord) { + // Background + // TODO: Set background to one of sent/received + top/middle/bottom + color + val background = ResourcesCompat.getDrawable(resources, R.drawable.message_bubble_background, context.theme)!! + val colorID = if (message.isOutgoing) R.attr.message_sent_background_color else R.attr.message_received_background_color + val color = ThemeUtil.getThemedColor(context, colorID) + val filter = BlendModeColorFilterCompat.createBlendModeColorFilterCompat(color, BlendModeCompat.SRC_IN) + background.colorFilter = filter + setBackground(background) + // Body + bodyTextView.text = message.body + // TODO: All the other things that can show up in a visible message, such as link previews, + // attachments (incl. multiple at once), open group invitations, voice messages, etc. + } + // endregion +} \ No newline at end of file diff --git a/app/src/main/java/org/thoughtcrime/securesms/conversation/v2/messages/VisibleMessageView.kt b/app/src/main/java/org/thoughtcrime/securesms/conversation/v2/messages/VisibleMessageView.kt index 2b87668f93..07ec78dbe0 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/conversation/v2/messages/VisibleMessageView.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/conversation/v2/messages/VisibleMessageView.kt @@ -53,7 +53,8 @@ class VisibleMessageView : LinearLayout { profilePictureContainer.visibility = View.GONE senderNameTextView.visibility = View.GONE } - // TODO: Populate content view + // Populate content view + messageContentView.bind(message) } fun recycle() { diff --git a/app/src/main/res/layout/view_visible_message.xml b/app/src/main/res/layout/view_visible_message.xml index 9c7b492fa4..a638cee67b 100644 --- a/app/src/main/res/layout/view_visible_message.xml +++ b/app/src/main/res/layout/view_visible_message.xml @@ -60,12 +60,10 @@ android:maxLines="1" android:ellipsize="end" /> - + android:layout_height="wrap_content" /> diff --git a/app/src/main/res/layout/view_visible_message_content.xml b/app/src/main/res/layout/view_visible_message_content.xml new file mode 100644 index 0000000000..b829043b42 --- /dev/null +++ b/app/src/main/res/layout/view_visible_message_content.xml @@ -0,0 +1,15 @@ + + + + + + \ No newline at end of file From e177fc4689a33e7192a48c3dbf944d71a188f7ea Mon Sep 17 00:00:00 2001 From: nielsandriesse Date: Tue, 1 Jun 2021 14:28:14 +1000 Subject: [PATCH 010/240] Fix outgoing message layout --- .../v2/messages/ControlMessageView.kt | 7 ++----- .../v2/messages/VisibleMessageView.kt | 15 +++++++++++++-- app/src/main/res/layout/view_visible_message.xml | 2 +- 3 files changed, 16 insertions(+), 8 deletions(-) diff --git a/app/src/main/java/org/thoughtcrime/securesms/conversation/v2/messages/ControlMessageView.kt b/app/src/main/java/org/thoughtcrime/securesms/conversation/v2/messages/ControlMessageView.kt index 1de54f89f6..6553073518 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/conversation/v2/messages/ControlMessageView.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/conversation/v2/messages/ControlMessageView.kt @@ -30,11 +30,8 @@ class ControlMessageView : LinearLayout { // region Updating fun bind(message: MessageRecord) { - // TODO: Localize strings, make the view look better, handle closed group control messages - if (message.isExpirationTimerUpdate) { textView.text = "Expiration timer update" } - else if (message.isScreenshotNotification) { textView.text = "Screenshot notification" } - else if (message.isMediaSavedNotification) { textView.text = "Media saved notification" } - else { textView.text = "Control message not yet handled" } + // TODO: Make view look better + textView.text = message.getDisplayBody(context) } fun recycle() { diff --git a/app/src/main/java/org/thoughtcrime/securesms/conversation/v2/messages/VisibleMessageView.kt b/app/src/main/java/org/thoughtcrime/securesms/conversation/v2/messages/VisibleMessageView.kt index 07ec78dbe0..3821e64f75 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/conversation/v2/messages/VisibleMessageView.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/conversation/v2/messages/VisibleMessageView.kt @@ -2,8 +2,10 @@ package org.thoughtcrime.securesms.conversation.v2.messages import android.content.Context import android.util.AttributeSet +import android.view.Gravity import android.view.LayoutInflater import android.view.View +import android.view.ViewGroup import android.widget.LinearLayout import kotlinx.android.synthetic.main.view_visible_message.view.* import network.loki.messenger.R @@ -28,6 +30,7 @@ class VisibleMessageView : LinearLayout { private fun setUpViewHierarchy() { LayoutInflater.from(context).inflate(R.layout.view_visible_message, this) + layoutParams = ViewGroup.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.WRAP_CONTENT) } // endregion @@ -40,8 +43,9 @@ class VisibleMessageView : LinearLayout { val thread = threadDB.getRecipientForThreadId(threadID) val contactDB = DatabaseFactory.getSessionContactDatabase(context) val isGroupThread = (thread?.isGroupRecipient == true) - // Show profile picture and sender name if this is a group thread - if (isGroupThread) { + // Show profile picture and sender name if this is a group thread AND + // the message is incoming + if (isGroupThread && !message.isOutgoing) { profilePictureContainer.visibility = View.VISIBLE profilePictureView.publicKey = senderSessionID // TODO: Set glide on the profile picture view and update it @@ -53,6 +57,13 @@ class VisibleMessageView : LinearLayout { profilePictureContainer.visibility = View.GONE senderNameTextView.visibility = View.GONE } + // Margins + val messageContentViewLayoutParams = messageContentView.layoutParams as LinearLayout.LayoutParams + messageContentViewLayoutParams.leftMargin = if (message.isOutgoing) resources.getDimension(R.dimen.very_large_spacing).toInt() else 0 + messageContentViewLayoutParams.rightMargin = if (message.isOutgoing) 0 else resources.getDimension(R.dimen.very_large_spacing).toInt() + messageContentView.layoutParams = messageContentViewLayoutParams + // Gravity + gravity = if (message.isOutgoing) Gravity.RIGHT else Gravity.LEFT // Populate content view messageContentView.bind(message) } diff --git a/app/src/main/res/layout/view_visible_message.xml b/app/src/main/res/layout/view_visible_message.xml index a638cee67b..de0d628c2a 100644 --- a/app/src/main/res/layout/view_visible_message.xml +++ b/app/src/main/res/layout/view_visible_message.xml @@ -1,7 +1,7 @@ From 3b18b0985b7633181e3f5877bf51a283563ed91f Mon Sep 17 00:00:00 2001 From: nielsandriesse Date: Tue, 1 Jun 2021 14:38:52 +1000 Subject: [PATCH 011/240] Add date break header --- .../v2/messages/ControlMessageView.kt | 1 - .../v2/messages/VisibleMessageView.kt | 6 +- .../main/res/layout/view_visible_message.xml | 121 ++++++++++-------- .../layout/view_visible_message_content.xml | 2 +- 4 files changed, 75 insertions(+), 55 deletions(-) diff --git a/app/src/main/java/org/thoughtcrime/securesms/conversation/v2/messages/ControlMessageView.kt b/app/src/main/java/org/thoughtcrime/securesms/conversation/v2/messages/ControlMessageView.kt index 6553073518..793f60c66a 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/conversation/v2/messages/ControlMessageView.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/conversation/v2/messages/ControlMessageView.kt @@ -30,7 +30,6 @@ class ControlMessageView : LinearLayout { // region Updating fun bind(message: MessageRecord) { - // TODO: Make view look better textView.text = message.getDisplayBody(context) } diff --git a/app/src/main/java/org/thoughtcrime/securesms/conversation/v2/messages/VisibleMessageView.kt b/app/src/main/java/org/thoughtcrime/securesms/conversation/v2/messages/VisibleMessageView.kt index 3821e64f75..98aa02d06b 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/conversation/v2/messages/VisibleMessageView.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/conversation/v2/messages/VisibleMessageView.kt @@ -57,13 +57,17 @@ class VisibleMessageView : LinearLayout { profilePictureContainer.visibility = View.GONE senderNameTextView.visibility = View.GONE } + // Date break + dateBreakTextView.text = "The Ancient Past" // Margins val messageContentViewLayoutParams = messageContentView.layoutParams as LinearLayout.LayoutParams messageContentViewLayoutParams.leftMargin = if (message.isOutgoing) resources.getDimension(R.dimen.very_large_spacing).toInt() else 0 messageContentViewLayoutParams.rightMargin = if (message.isOutgoing) 0 else resources.getDimension(R.dimen.very_large_spacing).toInt() messageContentView.layoutParams = messageContentViewLayoutParams + // TODO: Inter-message spacing // Gravity - gravity = if (message.isOutgoing) Gravity.RIGHT else Gravity.LEFT + val gravity = if (message.isOutgoing) Gravity.RIGHT else Gravity.LEFT + mainContainer.gravity = gravity or Gravity.BOTTOM // Populate content view messageContentView.bind(message) } diff --git a/app/src/main/res/layout/view_visible_message.xml b/app/src/main/res/layout/view_visible_message.xml index de0d628c2a..7cf579d17c 100644 --- a/app/src/main/res/layout/view_visible_message.xml +++ b/app/src/main/res/layout/view_visible_message.xml @@ -1,69 +1,86 @@ + android:orientation="vertical" > - + + android:orientation="horizontal" + android:gravity="bottom"> - + - - - - - - - - - - - - - - - + android:orientation="horizontal"> - + + + + + + + + + + + + + + + android:layout_height="wrap_content" + android:orientation="vertical"> + + + + + + diff --git a/app/src/main/res/layout/view_visible_message_content.xml b/app/src/main/res/layout/view_visible_message_content.xml index b829043b42..45faa14465 100644 --- a/app/src/main/res/layout/view_visible_message_content.xml +++ b/app/src/main/res/layout/view_visible_message_content.xml @@ -10,6 +10,6 @@ android:layout_width="wrap_content" android:layout_height="wrap_content" android:textColor="@color/text" - android:textSize="@dimen/small_font_size" /> + android:textSize="@dimen/medium_font_size" /> \ No newline at end of file From 958cd54b753fcada79beb85935cdf6cc32b01fc3 Mon Sep 17 00:00:00 2001 From: nielsandriesse Date: Tue, 1 Jun 2021 14:56:58 +1000 Subject: [PATCH 012/240] Stub views for different message types --- .../conversation/v2/messages/DocumentView.kt | 40 +++++++++++++++++++ .../v2/messages/LinkPreviewView.kt | 40 +++++++++++++++++++ .../conversation/v2/messages/QuoteView.kt | 40 +++++++++++++++++++ .../v2/messages/VisibleMessageContentView.kt | 34 ++++++++++++++-- .../v2/messages/VisibleMessageView.kt | 1 + .../v2/messages/VoiceMessageView.kt | 40 +++++++++++++++++++ app/src/main/res/layout/view_document.xml | 16 ++++++++ app/src/main/res/layout/view_link_preview.xml | 16 ++++++++ app/src/main/res/layout/view_quote.xml | 16 ++++++++ .../layout/view_visible_message_content.xml | 12 +----- .../main/res/layout/view_voice_message.xml | 16 ++++++++ 11 files changed, 257 insertions(+), 14 deletions(-) create mode 100644 app/src/main/java/org/thoughtcrime/securesms/conversation/v2/messages/DocumentView.kt create mode 100644 app/src/main/java/org/thoughtcrime/securesms/conversation/v2/messages/LinkPreviewView.kt create mode 100644 app/src/main/java/org/thoughtcrime/securesms/conversation/v2/messages/QuoteView.kt create mode 100644 app/src/main/java/org/thoughtcrime/securesms/conversation/v2/messages/VoiceMessageView.kt create mode 100644 app/src/main/res/layout/view_document.xml create mode 100644 app/src/main/res/layout/view_link_preview.xml create mode 100644 app/src/main/res/layout/view_quote.xml create mode 100644 app/src/main/res/layout/view_voice_message.xml diff --git a/app/src/main/java/org/thoughtcrime/securesms/conversation/v2/messages/DocumentView.kt b/app/src/main/java/org/thoughtcrime/securesms/conversation/v2/messages/DocumentView.kt new file mode 100644 index 0000000000..240c2c64bd --- /dev/null +++ b/app/src/main/java/org/thoughtcrime/securesms/conversation/v2/messages/DocumentView.kt @@ -0,0 +1,40 @@ +package org.thoughtcrime.securesms.conversation.v2.messages + +import android.content.Context +import android.util.AttributeSet +import android.view.LayoutInflater +import android.widget.LinearLayout +import kotlinx.android.synthetic.main.view_document.view.* +import network.loki.messenger.R +import org.thoughtcrime.securesms.database.model.MessageRecord + +class DocumentView : LinearLayout { + + // region Lifecycle + 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() { + LayoutInflater.from(context).inflate(R.layout.view_document, this) + } + // endregion + + // region Updating + fun bind(message: MessageRecord) { + textView.text = "I'm a document" + } + + fun recycle() { + // TODO: Implement + } + // endregion +} \ No newline at end of file diff --git a/app/src/main/java/org/thoughtcrime/securesms/conversation/v2/messages/LinkPreviewView.kt b/app/src/main/java/org/thoughtcrime/securesms/conversation/v2/messages/LinkPreviewView.kt new file mode 100644 index 0000000000..e9f951593b --- /dev/null +++ b/app/src/main/java/org/thoughtcrime/securesms/conversation/v2/messages/LinkPreviewView.kt @@ -0,0 +1,40 @@ +package org.thoughtcrime.securesms.conversation.v2.messages + +import android.content.Context +import android.util.AttributeSet +import android.view.LayoutInflater +import android.widget.LinearLayout +import kotlinx.android.synthetic.main.view_link_preview.view.* +import network.loki.messenger.R +import org.thoughtcrime.securesms.database.model.MessageRecord + +class LinkPreviewView : LinearLayout { + + // region Lifecycle + 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() { + LayoutInflater.from(context).inflate(R.layout.view_link_preview, this) + } + // endregion + + // region Updating + fun bind(message: MessageRecord) { + textView.text = "I'm a link preview" + } + + fun recycle() { + // TODO: Implement + } + // endregion +} \ No newline at end of file diff --git a/app/src/main/java/org/thoughtcrime/securesms/conversation/v2/messages/QuoteView.kt b/app/src/main/java/org/thoughtcrime/securesms/conversation/v2/messages/QuoteView.kt new file mode 100644 index 0000000000..36508c94b7 --- /dev/null +++ b/app/src/main/java/org/thoughtcrime/securesms/conversation/v2/messages/QuoteView.kt @@ -0,0 +1,40 @@ +package org.thoughtcrime.securesms.conversation.v2.messages + +import android.content.Context +import android.util.AttributeSet +import android.view.LayoutInflater +import android.widget.LinearLayout +import kotlinx.android.synthetic.main.view_quote.view.* +import network.loki.messenger.R +import org.thoughtcrime.securesms.database.model.MessageRecord + +class QuoteView : LinearLayout { + + // region Lifecycle + 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() { + LayoutInflater.from(context).inflate(R.layout.view_link_preview, this) + } + // endregion + + // region Updating + fun bind(message: MessageRecord) { + textView.text = "I'm a quote" + } + + fun recycle() { + // TODO: Implement + } + // endregion +} \ No newline at end of file diff --git a/app/src/main/java/org/thoughtcrime/securesms/conversation/v2/messages/VisibleMessageContentView.kt b/app/src/main/java/org/thoughtcrime/securesms/conversation/v2/messages/VisibleMessageContentView.kt index 227cebbbb4..9710082d80 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/conversation/v2/messages/VisibleMessageContentView.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/conversation/v2/messages/VisibleMessageContentView.kt @@ -2,9 +2,9 @@ package org.thoughtcrime.securesms.conversation.v2.messages import android.content.Context import android.util.AttributeSet -import android.util.Log import android.view.LayoutInflater import android.widget.LinearLayout +import android.widget.TextView import androidx.core.content.res.ResourcesCompat import androidx.core.graphics.BlendModeColorFilterCompat import androidx.core.graphics.BlendModeCompat @@ -12,6 +12,8 @@ import kotlinx.android.synthetic.main.view_visible_message_content.view.* import network.loki.messenger.R import org.session.libsession.utilities.ThemeUtil import org.thoughtcrime.securesms.database.model.MessageRecord +import org.thoughtcrime.securesms.database.model.MmsMessageRecord +import java.lang.IllegalStateException class VisibleMessageContentView : LinearLayout { @@ -44,9 +46,33 @@ class VisibleMessageContentView : LinearLayout { background.colorFilter = filter setBackground(background) // Body - bodyTextView.text = message.body - // TODO: All the other things that can show up in a visible message, such as link previews, - // attachments (incl. multiple at once), open group invitations, voice messages, etc. + if (message is MmsMessageRecord && message.linkPreviews.isNotEmpty()) { + val linkPreviewView = LinkPreviewView(context) + mainContainer.addView(linkPreviewView) + } else if (message is MmsMessageRecord && message.quote != null) { + val quoteView = QuoteView(context) + mainContainer.addView(quoteView) + } else if (message is MmsMessageRecord && message.slideDeck.audioSlide != null) { + val voiceMessageView = VoiceMessageView(context) + mainContainer.addView(voiceMessageView) + } else if (message is MmsMessageRecord && message.slideDeck.documentSlide != null) { + val documentView = DocumentView(context) + mainContainer.addView(documentView) + } else if (message is MmsMessageRecord && message.slideDeck.asAttachments().isNotEmpty()) { + throw IllegalStateException("Not yet implemented; we may want to use Signal's album view here.") + } else { + val bodyTextView = getBodyTextView(message.body) + mainContainer.addView(bodyTextView) + } + } + // endregion + + // region Convenience + private fun getBodyTextView(body: String): TextView { + val result = TextView(context) + result.text = body + // TODO: Styling + return result } // endregion } \ No newline at end of file diff --git a/app/src/main/java/org/thoughtcrime/securesms/conversation/v2/messages/VisibleMessageView.kt b/app/src/main/java/org/thoughtcrime/securesms/conversation/v2/messages/VisibleMessageView.kt index 98aa02d06b..7fa23a0836 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/conversation/v2/messages/VisibleMessageView.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/conversation/v2/messages/VisibleMessageView.kt @@ -59,6 +59,7 @@ class VisibleMessageView : LinearLayout { } // Date break dateBreakTextView.text = "The Ancient Past" + dateBreakTextView.visibility = View.GONE // TODO: Set this correctly // Margins val messageContentViewLayoutParams = messageContentView.layoutParams as LinearLayout.LayoutParams messageContentViewLayoutParams.leftMargin = if (message.isOutgoing) resources.getDimension(R.dimen.very_large_spacing).toInt() else 0 diff --git a/app/src/main/java/org/thoughtcrime/securesms/conversation/v2/messages/VoiceMessageView.kt b/app/src/main/java/org/thoughtcrime/securesms/conversation/v2/messages/VoiceMessageView.kt new file mode 100644 index 0000000000..a04c429ac9 --- /dev/null +++ b/app/src/main/java/org/thoughtcrime/securesms/conversation/v2/messages/VoiceMessageView.kt @@ -0,0 +1,40 @@ +package org.thoughtcrime.securesms.conversation.v2.messages + +import android.content.Context +import android.util.AttributeSet +import android.view.LayoutInflater +import android.widget.LinearLayout +import kotlinx.android.synthetic.main.view_voice_message.view.* +import network.loki.messenger.R +import org.thoughtcrime.securesms.database.model.MessageRecord + +class VoiceMessageView : LinearLayout { + + // region Lifecycle + 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() { + LayoutInflater.from(context).inflate(R.layout.view_document, this) + } + // endregion + + // region Updating + fun bind(message: MessageRecord) { + textView.text = "I'm a voice message" + } + + fun recycle() { + // TODO: Implement + } + // endregion +} \ No newline at end of file diff --git a/app/src/main/res/layout/view_document.xml b/app/src/main/res/layout/view_document.xml new file mode 100644 index 0000000000..e54f8e930c --- /dev/null +++ b/app/src/main/res/layout/view_document.xml @@ -0,0 +1,16 @@ + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/view_link_preview.xml b/app/src/main/res/layout/view_link_preview.xml new file mode 100644 index 0000000000..e54f8e930c --- /dev/null +++ b/app/src/main/res/layout/view_link_preview.xml @@ -0,0 +1,16 @@ + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/view_quote.xml b/app/src/main/res/layout/view_quote.xml new file mode 100644 index 0000000000..e54f8e930c --- /dev/null +++ b/app/src/main/res/layout/view_quote.xml @@ -0,0 +1,16 @@ + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/view_visible_message_content.xml b/app/src/main/res/layout/view_visible_message_content.xml index 45faa14465..9e1ea861d8 100644 --- a/app/src/main/res/layout/view_visible_message_content.xml +++ b/app/src/main/res/layout/view_visible_message_content.xml @@ -1,15 +1,7 @@ - - - - \ No newline at end of file + android:orientation="vertical" /> \ No newline at end of file diff --git a/app/src/main/res/layout/view_voice_message.xml b/app/src/main/res/layout/view_voice_message.xml new file mode 100644 index 0000000000..e54f8e930c --- /dev/null +++ b/app/src/main/res/layout/view_voice_message.xml @@ -0,0 +1,16 @@ + + + + + + \ No newline at end of file From dc4a7d0761b7a0f8af78109218d27b20eaf0c2bf Mon Sep 17 00:00:00 2001 From: nielsandriesse Date: Tue, 1 Jun 2021 15:43:37 +1000 Subject: [PATCH 013/240] Apply correct message bubble margins --- .../v2/messages/ControlMessageView.kt | 7 +++++++ .../v2/messages/VisibleMessageContentView.kt | 7 ++++++- .../v2/messages/VisibleMessageView.kt | 10 ++++++++-- app/src/main/res/layout/view_control_message.xml | 15 ++++++++++++--- 4 files changed, 33 insertions(+), 6 deletions(-) diff --git a/app/src/main/java/org/thoughtcrime/securesms/conversation/v2/messages/ControlMessageView.kt b/app/src/main/java/org/thoughtcrime/securesms/conversation/v2/messages/ControlMessageView.kt index 793f60c66a..630fdadfa9 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/conversation/v2/messages/ControlMessageView.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/conversation/v2/messages/ControlMessageView.kt @@ -3,7 +3,9 @@ package org.thoughtcrime.securesms.conversation.v2.messages import android.content.Context import android.util.AttributeSet import android.view.LayoutInflater +import android.view.View import android.widget.LinearLayout +import androidx.core.content.res.ResourcesCompat import kotlinx.android.synthetic.main.view_control_message.view.* import network.loki.messenger.R import org.thoughtcrime.securesms.database.model.MessageRecord @@ -30,6 +32,11 @@ class ControlMessageView : LinearLayout { // region Updating fun bind(message: MessageRecord) { + iconImageView.visibility = View.GONE + if (message.isExpirationTimerUpdate) { + iconImageView.setImageDrawable(ResourcesCompat.getDrawable(resources, R.drawable.ic_timer, context.theme)) + iconImageView.visibility = View.VISIBLE + } textView.text = message.getDisplayBody(context) } diff --git a/app/src/main/java/org/thoughtcrime/securesms/conversation/v2/messages/VisibleMessageContentView.kt b/app/src/main/java/org/thoughtcrime/securesms/conversation/v2/messages/VisibleMessageContentView.kt index 9710082d80..6dcb0c97e5 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/conversation/v2/messages/VisibleMessageContentView.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/conversation/v2/messages/VisibleMessageContentView.kt @@ -2,12 +2,15 @@ package org.thoughtcrime.securesms.conversation.v2.messages import android.content.Context import android.util.AttributeSet +import android.util.TypedValue import android.view.LayoutInflater import android.widget.LinearLayout import android.widget.TextView import androidx.core.content.res.ResourcesCompat import androidx.core.graphics.BlendModeColorFilterCompat import androidx.core.graphics.BlendModeCompat +import androidx.core.view.setMargins +import androidx.core.view.setPadding import kotlinx.android.synthetic.main.view_visible_message_content.view.* import network.loki.messenger.R import org.session.libsession.utilities.ThemeUtil @@ -70,8 +73,10 @@ class VisibleMessageContentView : LinearLayout { // region Convenience private fun getBodyTextView(body: String): TextView { val result = TextView(context) + result.setPadding(resources.getDimension(R.dimen.small_spacing).toInt()) result.text = body - // TODO: Styling + result.setTextSize(TypedValue.COMPLEX_UNIT_PX, resources.getDimension(R.dimen.medium_font_size)) + // TODO: Further styling return result } // endregion diff --git a/app/src/main/java/org/thoughtcrime/securesms/conversation/v2/messages/VisibleMessageView.kt b/app/src/main/java/org/thoughtcrime/securesms/conversation/v2/messages/VisibleMessageView.kt index 7fa23a0836..99283d04d6 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/conversation/v2/messages/VisibleMessageView.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/conversation/v2/messages/VisibleMessageView.kt @@ -62,8 +62,14 @@ class VisibleMessageView : LinearLayout { dateBreakTextView.visibility = View.GONE // TODO: Set this correctly // Margins val messageContentViewLayoutParams = messageContentView.layoutParams as LinearLayout.LayoutParams - messageContentViewLayoutParams.leftMargin = if (message.isOutgoing) resources.getDimension(R.dimen.very_large_spacing).toInt() else 0 - messageContentViewLayoutParams.rightMargin = if (message.isOutgoing) 0 else resources.getDimension(R.dimen.very_large_spacing).toInt() + if (isGroupThread) { + messageContentViewLayoutParams.leftMargin = if (message.isOutgoing) resources.getDimension(R.dimen.very_large_spacing).toInt() else 0 + } else { + messageContentViewLayoutParams.leftMargin = if (message.isOutgoing) resources.getDimension(R.dimen.very_large_spacing).toInt() + else resources.getDimension(R.dimen.medium_spacing).toInt() + } + messageContentViewLayoutParams.rightMargin = if (message.isOutgoing) resources.getDimension(R.dimen.medium_spacing).toInt() + else resources.getDimension(R.dimen.very_large_spacing).toInt() messageContentView.layoutParams = messageContentViewLayoutParams // TODO: Inter-message spacing // Gravity diff --git a/app/src/main/res/layout/view_control_message.xml b/app/src/main/res/layout/view_control_message.xml index e54f8e930c..e759969fff 100644 --- a/app/src/main/res/layout/view_control_message.xml +++ b/app/src/main/res/layout/view_control_message.xml @@ -3,14 +3,23 @@ xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="wrap_content" - android:orientation="horizontal" + android:orientation="vertical" + android:paddingVertical="@dimen/medium_spacing" + android:paddingHorizontal="@dimen/massive_spacing" android:gravity="center"> + + + android:textColor="@color/text" + android:gravity="center" /> \ No newline at end of file From 8b084c89b9c4dee9cd8697a4ddb0ce1bef92173a Mon Sep 17 00:00:00 2001 From: nielsandriesse Date: Tue, 1 Jun 2021 16:17:14 +1000 Subject: [PATCH 014/240] Implement conversation activity toolbar --- .../conversation/v2/ConversationActivityV2.kt | 23 ++++++++++ .../res/layout/activity_conversation_v2.xml | 46 +++++++++++++++++++ 2 files changed, 69 insertions(+) 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 2b70bb5d39..5633627037 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 @@ -4,12 +4,20 @@ import android.os.Bundle import androidx.recyclerview.widget.LinearLayoutManager import kotlinx.android.synthetic.main.activity_conversation_v2.* import network.loki.messenger.R +import org.session.libsession.utilities.TextSecurePreferences import org.thoughtcrime.securesms.PassphraseRequiredActionBarActivity import org.thoughtcrime.securesms.database.DatabaseFactory +import org.thoughtcrime.securesms.mms.GlideApp class ConversationActivityV2 : PassphraseRequiredActionBarActivity() { private var threadID: Long = -1 + private val thread by lazy { + DatabaseFactory.getThreadDatabase(this).getRecipientForThreadId(threadID)!! + } + + private val glide by lazy { GlideApp.with(this) } + // region Settings companion object { const val THREAD_ID = "thread_id" @@ -22,6 +30,7 @@ class ConversationActivityV2 : PassphraseRequiredActionBarActivity() { setContentView(R.layout.activity_conversation_v2) threadID = intent.getLongExtra(THREAD_ID, -1) setUpRecyclerView() + setUpToolbar() } private fun setUpRecyclerView() { @@ -31,5 +40,19 @@ class ConversationActivityV2 : PassphraseRequiredActionBarActivity() { conversationRecyclerView.adapter = adapter conversationRecyclerView.layoutManager = LinearLayoutManager(this) } + + private fun setUpToolbar() { + backButton.setOnClickListener { onBackPressed() } + conversationTitleView.text = thread.toShortString() + conversationSettingsButton.glide = glide + conversationSettingsButton.update(thread, threadID) + conversationSettingsButton.setOnClickListener { showConversationSettings() } + } + // endregion + + // region Interaction + private fun showConversationSettings() { + // TODO: Implement + } // endregion } \ No newline at end of file diff --git a/app/src/main/res/layout/activity_conversation_v2.xml b/app/src/main/res/layout/activity_conversation_v2.xml index 13dc9d7e4c..d76737410e 100644 --- a/app/src/main/res/layout/activity_conversation_v2.xml +++ b/app/src/main/res/layout/activity_conversation_v2.xml @@ -1,11 +1,57 @@ + + + + + + + + + + + + + + Date: Wed, 2 Jun 2021 09:38:22 +1000 Subject: [PATCH 015/240] Update documentation --- .../src/main/java/org/session/libsession/snode/SnodeMessage.kt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/libsession/src/main/java/org/session/libsession/snode/SnodeMessage.kt b/libsession/src/main/java/org/session/libsession/snode/SnodeMessage.kt index 95ff6cb565..0a4def6f5c 100644 --- a/libsession/src/main/java/org/session/libsession/snode/SnodeMessage.kt +++ b/libsession/src/main/java/org/session/libsession/snode/SnodeMessage.kt @@ -8,7 +8,7 @@ data class SnodeMessage( */ val recipient: String, /** - * The content of the message. + * The base64 encoded content of the message. */ val data: String, /** From 23100962e356d299f999a7c766580ac3a17e9fc7 Mon Sep 17 00:00:00 2001 From: nielsandriesse Date: Wed, 2 Jun 2021 10:12:49 +1000 Subject: [PATCH 016/240] Clean --- .../securesms/conversation/v2/messages/QuoteView.kt | 2 +- .../securesms/conversation/v2/messages/VoiceMessageView.kt | 2 +- app/src/main/res/layout/view_visible_message.xml | 4 ---- 3 files changed, 2 insertions(+), 6 deletions(-) diff --git a/app/src/main/java/org/thoughtcrime/securesms/conversation/v2/messages/QuoteView.kt b/app/src/main/java/org/thoughtcrime/securesms/conversation/v2/messages/QuoteView.kt index 36508c94b7..d13391113b 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/conversation/v2/messages/QuoteView.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/conversation/v2/messages/QuoteView.kt @@ -24,7 +24,7 @@ class QuoteView : LinearLayout { } private fun setUpViewHierarchy() { - LayoutInflater.from(context).inflate(R.layout.view_link_preview, this) + LayoutInflater.from(context).inflate(R.layout.view_quote, this) } // endregion diff --git a/app/src/main/java/org/thoughtcrime/securesms/conversation/v2/messages/VoiceMessageView.kt b/app/src/main/java/org/thoughtcrime/securesms/conversation/v2/messages/VoiceMessageView.kt index a04c429ac9..6a999f30f7 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/conversation/v2/messages/VoiceMessageView.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/conversation/v2/messages/VoiceMessageView.kt @@ -24,7 +24,7 @@ class VoiceMessageView : LinearLayout { } private fun setUpViewHierarchy() { - LayoutInflater.from(context).inflate(R.layout.view_document, this) + LayoutInflater.from(context).inflate(R.layout.view_voice_message, this) } // endregion diff --git a/app/src/main/res/layout/view_visible_message.xml b/app/src/main/res/layout/view_visible_message.xml index 7cf579d17c..758a92328a 100644 --- a/app/src/main/res/layout/view_visible_message.xml +++ b/app/src/main/res/layout/view_visible_message.xml @@ -21,10 +21,6 @@ android:orientation="horizontal" android:gravity="bottom"> - - Date: Wed, 2 Jun 2021 10:51:36 +1000 Subject: [PATCH 017/240] Clean up join open group screen --- .../loki/activities/JoinPublicChatActivity.kt | 5 ++- .../fragment_enter_chat_url.xml | 38 +++++++++++++------ .../res/layout/fragment_enter_chat_url.xml | 36 +++++++++++++----- .../org/session/libsession/snode/SnodeAPI.kt | 2 +- 4 files changed, 57 insertions(+), 24 deletions(-) diff --git a/app/src/main/java/org/thoughtcrime/securesms/loki/activities/JoinPublicChatActivity.kt b/app/src/main/java/org/thoughtcrime/securesms/loki/activities/JoinPublicChatActivity.kt index 78b7ced770..deec2bf434 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/loki/activities/JoinPublicChatActivity.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/loki/activities/JoinPublicChatActivity.kt @@ -40,6 +40,7 @@ import org.thoughtcrime.securesms.loki.fragments.ScanQRCodeWrapperFragmentDelega import org.thoughtcrime.securesms.loki.protocol.MultiDeviceProtocol import org.thoughtcrime.securesms.loki.viewmodel.DefaultGroupsViewModel import org.thoughtcrime.securesms.loki.viewmodel.State +import java.util.* class JoinPublicChatActivity : PassphraseRequiredActionBarActivity(), ScanQRCodeWrapperFragmentDelegate { private val adapter = JoinPublicChatActivityAdapter(this) @@ -179,6 +180,7 @@ class EnterChatURLFragment : Fragment() { joinPublicChatButton.setOnClickListener { joinPublicChatIfPossible() } viewModel.defaultRooms.observe(viewLifecycleOwner) { state -> defaultRoomsContainer.isVisible = state is State.Success + defaultRoomsLoaderContainer.isVisible = state is State.Loading defaultRoomsLoader.isVisible = state is State.Loading when (state) { State.Loading -> { @@ -210,7 +212,6 @@ class EnterChatURLFragment : Fragment() { chip.setOnClickListener { (requireActivity() as JoinPublicChatActivity).joinPublicChatIfPossible(defaultGroup.joinURL) } - defaultRoomsGridLayout.addView(chip) } if ((groups.size and 1) != 0) { // This checks that the number of rooms is even @@ -222,7 +223,7 @@ class EnterChatURLFragment : Fragment() { private fun joinPublicChatIfPossible() { val inputMethodManager = requireContext().getSystemService(BaseActionBarActivity.INPUT_METHOD_SERVICE) as InputMethodManager inputMethodManager.hideSoftInputFromWindow(chatURLEditText.windowToken, 0) - val chatURL = chatURLEditText.text.trim().toString().toLowerCase() + val chatURL = chatURLEditText.text.trim().toString().toLowerCase(Locale.US) (requireActivity() as JoinPublicChatActivity).joinPublicChatIfPossible(chatURL) } // endregion diff --git a/app/src/main/res/layout-sw400dp/fragment_enter_chat_url.xml b/app/src/main/res/layout-sw400dp/fragment_enter_chat_url.xml index a011b2bf4b..a689ad6258 100644 --- a/app/src/main/res/layout-sw400dp/fragment_enter_chat_url.xml +++ b/app/src/main/res/layout-sw400dp/fragment_enter_chat_url.xml @@ -1,5 +1,7 @@ - - + + + + + - - + + + + + Date: Wed, 2 Jun 2021 11:00:40 +1000 Subject: [PATCH 018/240] Fix ugly color --- app/src/main/res/values-notnight-v21/colors.xml | 1 + 1 file changed, 1 insertion(+) diff --git a/app/src/main/res/values-notnight-v21/colors.xml b/app/src/main/res/values-notnight-v21/colors.xml index 53156de7c4..82d38d0b35 100644 --- a/app/src/main/res/values-notnight-v21/colors.xml +++ b/app/src/main/res/values-notnight-v21/colors.xml @@ -18,6 +18,7 @@ #FCFCFC #EDEDED #F5F5F5 + #4D077C44 #FCFCFC #0D000000 From 43fbc3de55c366d2a210d55da42942bb628c9ba4 Mon Sep 17 00:00:00 2001 From: nielsandriesse Date: Wed, 2 Jun 2021 11:34:30 +1000 Subject: [PATCH 019/240] Clean up create private chat screen --- app/src/main/AndroidManifest.xml | 63 +++++------- .../activities/CreatePrivateChatActivity.kt | 64 ++++++++----- .../fragment_enter_public_key.xml | 95 +++++++++--------- .../layout/activity_create_private_chat.xml | 1 + .../res/layout/fragment_enter_public_key.xml | 96 ++++++++++--------- 5 files changed, 167 insertions(+), 152 deletions(-) diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 988705979d..5744d15d02 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -1,5 +1,6 @@ - @@ -7,7 +8,7 @@ - - - - - - - + - + + @@ -90,22 +86,16 @@ android:name="firebase_messaging_auto_init_enabled" android:value="false" /> - + android:theme="@style/Theme.Session.DayNight.FlatActionBar" /> - @@ -113,16 +103,16 @@ android:name="org.thoughtcrime.securesms.loki.activities.LinkDeviceActivity" android:screenOrientation="portrait" android:windowSoftInputMode="adjustResize" - android:theme="@style/Theme.Session.DayNight.FlatActionBar" /> + android:theme="@style/Theme.Session.DayNight.FlatActionBar" /> + android:theme="@style/Theme.Session.DayNight.FlatActionBar" /> + android:theme="@style/Theme.Session.DayNight.FlatActionBar" /> + android:label="@string/activity_settings_title" /> + android:theme="@style/Theme.Session.DayNight.FlatActionBar" /> + android:windowSoftInputMode="adjustResize" + android:theme="@style/Theme.Session.DayNight.FlatActionBar" /> @@ -164,14 +155,14 @@ + android:screenOrientation="portrait" /> - + - - @@ -195,7 +184,6 @@ - @@ -207,11 +195,9 @@ android:targetActivity="org.thoughtcrime.securesms.loki.activities.HomeActivity"> - - @@ -235,16 +221,15 @@ - + android:theme="@style/Theme.TextSecure.DayNight.NoActionBar" /> + android:theme="@style/Theme.TextSecure.DayNight" /> + android:theme="@style/Theme.TextSecure.DayNight" /> + android:theme="@style/Theme.Session.DayNight.NoActionBar" /> + android:theme="@style/Theme.Session.ForceDark" /> - @@ -449,7 +433,6 @@ - - - diff --git a/app/src/main/java/org/thoughtcrime/securesms/loki/activities/CreatePrivateChatActivity.kt b/app/src/main/java/org/thoughtcrime/securesms/loki/activities/CreatePrivateChatActivity.kt index 54c80227a2..7f75b9cc77 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/loki/activities/CreatePrivateChatActivity.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/loki/activities/CreatePrivateChatActivity.kt @@ -7,35 +7,43 @@ import android.content.ClipboardManager import android.content.Context import android.content.Intent import android.os.Bundle -import androidx.fragment.app.Fragment -import androidx.fragment.app.FragmentPagerAdapter import android.text.InputType +import android.util.Log +import android.util.TypedValue import android.view.* import android.view.inputmethod.EditorInfo import android.view.inputmethod.InputMethodManager import android.widget.Toast -import kotlinx.android.synthetic.main.activity_create_private_chat.loader -import kotlinx.android.synthetic.main.activity_create_private_chat.tabLayout -import kotlinx.android.synthetic.main.activity_create_private_chat.viewPager +import androidx.core.view.isVisible +import androidx.fragment.app.Fragment +import androidx.fragment.app.FragmentPagerAdapter +import kotlinx.android.synthetic.main.activity_create_private_chat.* import kotlinx.android.synthetic.main.fragment_enter_public_key.* import network.loki.messenger.R import nl.komponents.kovenant.ui.failUi import nl.komponents.kovenant.ui.successUi import org.session.libsession.snode.SnodeAPI -import org.thoughtcrime.securesms.PassphraseRequiredActionBarActivity -import org.thoughtcrime.securesms.conversation.ConversationActivity import org.session.libsession.utilities.Address import org.session.libsession.utilities.DistributionTypes +import org.session.libsession.utilities.TextSecurePreferences +import org.session.libsession.utilities.recipients.Recipient +import org.session.libsignal.utilities.PublicKeyValidation +import org.thoughtcrime.securesms.PassphraseRequiredActionBarActivity +import org.thoughtcrime.securesms.conversation.ConversationActivity import org.thoughtcrime.securesms.database.DatabaseFactory import org.thoughtcrime.securesms.loki.fragments.ScanQRCodeWrapperFragment import org.thoughtcrime.securesms.loki.fragments.ScanQRCodeWrapperFragmentDelegate -import org.session.libsession.utilities.recipients.Recipient -import org.session.libsession.utilities.TextSecurePreferences -import org.session.libsignal.utilities.PublicKeyValidation - class CreatePrivateChatActivity : PassphraseRequiredActionBarActivity(), ScanQRCodeWrapperFragmentDelegate { private val adapter = CreatePrivateChatActivityAdapter(this) + private var isKeyboardShowing = false + set(value) { + val hasChanged = (field != value) + field = value + if (hasChanged) { + adapter.isKeyboardShowing = value + } + } // region Lifecycle override fun onCreate(savedInstanceState: Bundle?, isReady: Boolean) { @@ -47,11 +55,15 @@ class CreatePrivateChatActivity : PassphraseRequiredActionBarActivity(), ScanQRC // Set up view pager viewPager.adapter = adapter tabLayout.setupWithViewPager(viewPager) - } + rootLayout.viewTreeObserver.addOnGlobalLayoutListener(object : ViewTreeObserver.OnGlobalLayoutListener { - override fun onCreateOptionsMenu(menu: Menu?): Boolean { - menuInflater.inflate(R.menu.menu_done, menu) - return true + override fun onGlobalLayout() { + val diff = rootLayout.rootView.height - rootLayout.height + val displayMetrics = this@CreatePrivateChatActivity.resources.displayMetrics + val estimatedKeyboardHeight = TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, 200.0f, displayMetrics) + this@CreatePrivateChatActivity.isKeyboardShowing = (diff > estimatedKeyboardHeight) + } + }) } // endregion @@ -73,13 +85,6 @@ class CreatePrivateChatActivity : PassphraseRequiredActionBarActivity(), ScanQRC // endregion // region Interaction - override fun onOptionsItemSelected(item: MenuItem): Boolean { - when(item.itemId) { - R.id.doneButton -> adapter.enterPublicKeyFragment.createPrivateChatIfPossible() - } - return super.onOptionsItemSelected(item) - } - override fun handleQRCodeScanned(hexEncodedPublicKey: String) { createPrivateChatIfPossible(hexEncodedPublicKey) } @@ -122,6 +127,8 @@ class CreatePrivateChatActivity : PassphraseRequiredActionBarActivity(), ScanQRC // region Adapter private class CreatePrivateChatActivityAdapter(val activity: CreatePrivateChatActivity) : FragmentPagerAdapter(activity.supportFragmentManager) { val enterPublicKeyFragment = EnterPublicKeyFragment() + var isKeyboardShowing = false + set(value) { field = value; enterPublicKeyFragment.isKeyboardShowing = isKeyboardShowing } override fun getCount(): Int { return 2 @@ -152,6 +159,8 @@ private class CreatePrivateChatActivityAdapter(val activity: CreatePrivateChatAc // region Enter Public Key Fragment class EnterPublicKeyFragment : Fragment() { + var isKeyboardShowing = false + set(value) { field = value; handleIsKeyboardShowingChanged() } private val hexEncodedPublicKey: String get() { @@ -182,6 +191,10 @@ class EnterPublicKeyFragment : Fragment() { createPrivateChatButton.setOnClickListener { createPrivateChatIfPossible() } } + private fun handleIsKeyboardShowingChanged() { + optionalContentContainer.isVisible = !isKeyboardShowing + } + private fun copyPublicKey() { val clipboard = requireActivity().getSystemService(Context.CLIPBOARD_SERVICE) as ClipboardManager val clip = ClipData.newPlainText("Session ID", hexEncodedPublicKey) @@ -197,9 +210,10 @@ class EnterPublicKeyFragment : Fragment() { startActivity(intent) } - fun createPrivateChatIfPossible() { - val hexEncodedPublicKey = publicKeyEditText.text?.trim().toString() ?: "" - (requireActivity() as CreatePrivateChatActivity).createPrivateChatIfPossible(hexEncodedPublicKey) + private fun createPrivateChatIfPossible() { + val hexEncodedPublicKey = publicKeyEditText.text?.trim().toString() + val activity = requireActivity() as CreatePrivateChatActivity + activity.createPrivateChatIfPossible(hexEncodedPublicKey) } } // endregion diff --git a/app/src/main/res/layout-sw400dp/fragment_enter_public_key.xml b/app/src/main/res/layout-sw400dp/fragment_enter_public_key.xml index 9acdc7e6db..ad8de37b72 100644 --- a/app/src/main/res/layout-sw400dp/fragment_enter_public_key.xml +++ b/app/src/main/res/layout-sw400dp/fragment_enter_public_key.xml @@ -15,10 +15,10 @@ android:elevation="1dp" /> @@ -41,56 +41,65 @@ android:alpha="0.6" android:textAlignment="center" android:text="@string/fragment_enter_public_key_explanation" /> - - - - + android:orientation="vertical"> -