diff --git a/src/org/thoughtcrime/securesms/conversation/ConversationActivity.java b/src/org/thoughtcrime/securesms/conversation/ConversationActivity.java index 82829a45cd..57ddd146ee 100644 --- a/src/org/thoughtcrime/securesms/conversation/ConversationActivity.java +++ b/src/org/thoughtcrime/securesms/conversation/ConversationActivity.java @@ -77,6 +77,7 @@ import com.google.android.gms.location.places.ui.PlacePicker; import org.greenrobot.eventbus.EventBus; import org.greenrobot.eventbus.Subscribe; import org.greenrobot.eventbus.ThreadMode; +import org.jetbrains.annotations.NotNull; import org.thoughtcrime.securesms.ApplicationContext; import org.thoughtcrime.securesms.ConversationListActivity; import org.thoughtcrime.securesms.ConversationListArchiveActivity; @@ -150,6 +151,7 @@ import org.thoughtcrime.securesms.linkpreview.LinkPreview; import org.thoughtcrime.securesms.linkpreview.LinkPreviewRepository; import org.thoughtcrime.securesms.linkpreview.LinkPreviewViewModel; import org.thoughtcrime.securesms.logging.Log; +import org.thoughtcrime.securesms.loki.FriendRequestViewDelegate; import org.thoughtcrime.securesms.mediasend.Media; import org.thoughtcrime.securesms.mediasend.MediaSendActivity; import org.thoughtcrime.securesms.mms.AttachmentManager; @@ -242,7 +244,8 @@ public class ConversationActivity extends PassphraseRequiredActionBarActivity InputPanel.Listener, InputPanel.MediaListener, ComposeText.CursorPositionChangedListener, - ConversationSearchBottomBar.EventListener + ConversationSearchBottomBar.EventListener, + FriendRequestViewDelegate { private static final String TAG = ConversationActivity.class.getSimpleName(); @@ -334,6 +337,7 @@ public class ConversationActivity extends PassphraseRequiredActionBarActivity getWindow().getDecorView().setBackgroundColor(color); fragment = initFragment(R.id.fragment_content, new ConversationFragment(), dynamicLanguage.getCurrentLocale()); + fragment.friendRequestViewDelegate = this; initializeReceivers(); initializeActionBar(); @@ -2678,4 +2682,20 @@ public class ConversationActivity extends PassphraseRequiredActionBarActivity } } } + + // region Loki + + @Override + public void acceptFriendRequest(@NotNull MessageRecord friendRequest) { + DatabaseFactory.getLokiThreadFriendRequestDatabase(this).setFriendRequestStatus(this.threadId, LokiThreadFriendRequestStatus.FRIENDS); + // TODO: Send empty message + } + + @Override + public void rejectFriendRequest(@NotNull MessageRecord friendRequest) { + DatabaseFactory.getLokiThreadFriendRequestDatabase(this).setFriendRequestStatus(this.threadId, LokiThreadFriendRequestStatus.NONE); + String contactID = DatabaseFactory.getThreadDatabase(this).getRecipientForThreadId(this.threadId).getAddress().toString(); + DatabaseFactory.getLokiPreKeyBundleDatabase(this).removePreKeyBundle(contactID); + } + // endregion } diff --git a/src/org/thoughtcrime/securesms/conversation/ConversationAdapter.java b/src/org/thoughtcrime/securesms/conversation/ConversationAdapter.java index ab1887716a..d4e7c9d4c6 100644 --- a/src/org/thoughtcrime/securesms/conversation/ConversationAdapter.java +++ b/src/org/thoughtcrime/securesms/conversation/ConversationAdapter.java @@ -23,10 +23,6 @@ import android.support.annotation.NonNull; import android.support.annotation.Nullable; import android.support.annotation.VisibleForTesting; import android.support.v7.widget.RecyclerView; - -import org.thoughtcrime.securesms.BindableConversationItem; -import org.thoughtcrime.securesms.R; -import org.thoughtcrime.securesms.logging.Log; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; @@ -34,14 +30,18 @@ import android.widget.TextView; import com.annimon.stream.Stream; -import org.thoughtcrime.securesms.conversation.ConversationAdapter.HeaderViewHolder; +import org.thoughtcrime.securesms.BindableConversationItem; +import org.thoughtcrime.securesms.R; import org.thoughtcrime.securesms.attachments.DatabaseAttachment; +import org.thoughtcrime.securesms.conversation.ConversationAdapter.HeaderViewHolder; import org.thoughtcrime.securesms.database.DatabaseFactory; import org.thoughtcrime.securesms.database.FastCursorRecyclerViewAdapter; import org.thoughtcrime.securesms.database.MmsSmsColumns; import org.thoughtcrime.securesms.database.MmsSmsDatabase; import org.thoughtcrime.securesms.database.model.MessageRecord; import org.thoughtcrime.securesms.database.model.MmsMessageRecord; +import org.thoughtcrime.securesms.logging.Log; +import org.thoughtcrime.securesms.loki.FriendRequestViewDelegate; import org.thoughtcrime.securesms.mms.GlideRequests; import org.thoughtcrime.securesms.mms.SlideDeck; import org.thoughtcrime.securesms.recipients.Recipient; @@ -107,6 +107,8 @@ public class ConversationAdapter private MessageRecord recordToPulseHighlight; private String searchQuery; + public FriendRequestViewDelegate friendRequestViewDelegate; // Loki + protected static class ViewHolder extends RecyclerView.ViewHolder { public ViewHolder(final @NonNull V itemView) { super(itemView); @@ -199,15 +201,19 @@ public class ConversationAdapter MessageRecord previousRecord = adapterPosition < getItemCount() - 1 && !isFooterPosition(adapterPosition + 1) ? getRecordForPositionOrThrow(adapterPosition + 1) : null; MessageRecord nextRecord = adapterPosition > 0 && !isHeaderPosition(adapterPosition - 1) ? getRecordForPositionOrThrow(adapterPosition - 1) : null; - viewHolder.getView().bind(messageRecord, - Optional.fromNullable(previousRecord), - Optional.fromNullable(nextRecord), - glideRequests, - locale, - batchSelected, - recipient, - searchQuery, - messageRecord == recordToPulseHighlight); + BindableConversationItem conversationItem = viewHolder.getView(); + conversationItem.bind(messageRecord, + Optional.fromNullable(previousRecord), + Optional.fromNullable(nextRecord), + glideRequests, + locale, + batchSelected, + recipient, + searchQuery, + messageRecord == recordToPulseHighlight); + if (conversationItem instanceof ConversationItem) { + ((ConversationItem)conversationItem).friendRequestViewDelegate = this.friendRequestViewDelegate; + } if (messageRecord == recordToPulseHighlight) { recordToPulseHighlight = null; diff --git a/src/org/thoughtcrime/securesms/conversation/ConversationFragment.java b/src/org/thoughtcrime/securesms/conversation/ConversationFragment.java index 9f7cbb213b..1f4c153353 100644 --- a/src/org/thoughtcrime/securesms/conversation/ConversationFragment.java +++ b/src/org/thoughtcrime/securesms/conversation/ConversationFragment.java @@ -41,19 +41,6 @@ import android.support.v7.widget.RecyclerView; import android.support.v7.widget.RecyclerView.OnScrollListener; import android.text.ClipboardManager; import android.text.TextUtils; - -import org.thoughtcrime.securesms.ApplicationContext; -import org.thoughtcrime.securesms.MessageDetailsActivity; -import org.thoughtcrime.securesms.PassphraseRequiredActionBarActivity; -import org.thoughtcrime.securesms.R; -import org.thoughtcrime.securesms.ShareActivity; -import org.thoughtcrime.securesms.attachments.Attachment; -import org.thoughtcrime.securesms.components.ConversationTypingView; -import org.thoughtcrime.securesms.components.recyclerview.SmoothScrollingLinearLayoutManager; -import org.thoughtcrime.securesms.database.Address; -import org.thoughtcrime.securesms.linkpreview.LinkPreview; -import org.thoughtcrime.securesms.logging.Log; - import android.view.LayoutInflater; import android.view.Menu; import android.view.MenuInflater; @@ -69,11 +56,20 @@ import android.widget.ViewSwitcher; import com.annimon.stream.Stream; -import org.thoughtcrime.securesms.conversation.ConversationAdapter.HeaderViewHolder; -import org.thoughtcrime.securesms.conversation.ConversationAdapter.ItemClickListener; +import org.thoughtcrime.securesms.ApplicationContext; +import org.thoughtcrime.securesms.MessageDetailsActivity; +import org.thoughtcrime.securesms.PassphraseRequiredActionBarActivity; +import org.thoughtcrime.securesms.R; +import org.thoughtcrime.securesms.ShareActivity; +import org.thoughtcrime.securesms.attachments.Attachment; +import org.thoughtcrime.securesms.components.ConversationTypingView; +import org.thoughtcrime.securesms.components.recyclerview.SmoothScrollingLinearLayoutManager; +import org.thoughtcrime.securesms.contactshare.Contact; import org.thoughtcrime.securesms.contactshare.ContactUtil; import org.thoughtcrime.securesms.contactshare.SharedContactDetailsActivity; -import org.thoughtcrime.securesms.contactshare.Contact; +import org.thoughtcrime.securesms.conversation.ConversationAdapter.HeaderViewHolder; +import org.thoughtcrime.securesms.conversation.ConversationAdapter.ItemClickListener; +import org.thoughtcrime.securesms.database.Address; import org.thoughtcrime.securesms.database.DatabaseFactory; import org.thoughtcrime.securesms.database.MmsSmsDatabase; import org.thoughtcrime.securesms.database.RecipientDatabase; @@ -82,6 +78,9 @@ import org.thoughtcrime.securesms.database.model.MediaMmsMessageRecord; import org.thoughtcrime.securesms.database.model.MessageRecord; import org.thoughtcrime.securesms.database.model.MmsMessageRecord; import org.thoughtcrime.securesms.jobs.DirectoryRefreshJob; +import org.thoughtcrime.securesms.linkpreview.LinkPreview; +import org.thoughtcrime.securesms.logging.Log; +import org.thoughtcrime.securesms.loki.FriendRequestViewDelegate; import org.thoughtcrime.securesms.longmessage.LongMessageActivity; import org.thoughtcrime.securesms.mediasend.Media; import org.thoughtcrime.securesms.mms.GlideApp; @@ -147,6 +146,7 @@ public class ConversationFragment extends Fragment private View composeDivider; private View scrollToBottomButton; private TextView scrollDateHeader; + public FriendRequestViewDelegate friendRequestViewDelegate; // Loki @Override public void onCreate(Bundle icicle) { @@ -640,6 +640,7 @@ public class ConversationFragment extends Fragment if (adapter == null) { return; } + adapter.friendRequestViewDelegate = this.friendRequestViewDelegate; if (cursor.getCount() >= PARTIAL_CONVERSATION_LIMIT && loader.hasLimit()) { adapter.setFooterView(topLoadMoreView); diff --git a/src/org/thoughtcrime/securesms/conversation/ConversationItem.java b/src/org/thoughtcrime/securesms/conversation/ConversationItem.java index 1dc07c664a..641b04c0dd 100644 --- a/src/org/thoughtcrime/securesms/conversation/ConversationItem.java +++ b/src/org/thoughtcrime/securesms/conversation/ConversationItem.java @@ -88,6 +88,7 @@ import org.thoughtcrime.securesms.linkpreview.LinkPreview; import org.thoughtcrime.securesms.linkpreview.LinkPreviewUtil; import org.thoughtcrime.securesms.logging.Log; import org.thoughtcrime.securesms.loki.FriendRequestView; +import org.thoughtcrime.securesms.loki.FriendRequestViewDelegate; import org.thoughtcrime.securesms.mms.GlideRequests; import org.thoughtcrime.securesms.mms.ImageSlide; import org.thoughtcrime.securesms.mms.PartAuthority; @@ -170,6 +171,8 @@ public class ConversationItem extends LinearLayout private final Context context; + public FriendRequestViewDelegate friendRequestViewDelegate; // Loki + public ConversationItem(Context context) { this(context, null); } @@ -788,6 +791,7 @@ public class ConversationItem extends LinearLayout } private void setFriendRequestView(@NonNull MessageRecord record) { + friendRequestView.setDelegate(friendRequestViewDelegate); friendRequestView.update(record); } diff --git a/src/org/thoughtcrime/securesms/jobs/PushDecryptJob.java b/src/org/thoughtcrime/securesms/jobs/PushDecryptJob.java index 3b6b09ac65..704001145c 100644 --- a/src/org/thoughtcrime/securesms/jobs/PushDecryptJob.java +++ b/src/org/thoughtcrime/securesms/jobs/PushDecryptJob.java @@ -846,7 +846,7 @@ public class PushDecryptJob extends BaseJob implements InjectableType { // we can end up in a deadlock where both users' threads' friend request statuses are // `REQUEST_SENT`. threadFriendRequestDatabase.setFriendRequestStatus(threadID, LokiThreadFriendRequestStatus.FRIENDS); - // TODO: Update message friend request status + messageFriendRequestDatabase.setFriendRequestStatus(messageID, LokiMessageFriendRequestStatus.REQUEST_ACCEPTED); // Accept the friend request sendEmptyMessage(envelope.getSource()); } else if (threadFriendRequestStatus != LokiThreadFriendRequestStatus.FRIENDS) { @@ -862,7 +862,7 @@ public class PushDecryptJob extends BaseJob implements InjectableType { // If the thread's friend request status is not `FRIENDS`, but we're receiving a message, // it must be a friend request accepted message. Declining a friend request doesn't send a message. threadFriendRequestDatabase.setFriendRequestStatus(threadID, LokiThreadFriendRequestStatus.FRIENDS); - // TODO: Update message friend request status + messageFriendRequestDatabase.setFriendRequestStatus(messageID, LokiMessageFriendRequestStatus.REQUEST_ACCEPTED); // TODO: Send p2p details here } } diff --git a/src/org/thoughtcrime/securesms/loki/FriendRequestView.kt b/src/org/thoughtcrime/securesms/loki/FriendRequestView.kt index 10a07bdf72..02a88450e4 100644 --- a/src/org/thoughtcrime/securesms/loki/FriendRequestView.kt +++ b/src/org/thoughtcrime/securesms/loki/FriendRequestView.kt @@ -90,9 +90,10 @@ class FriendRequestView(context: Context, attrs: AttributeSet?, defStyleAttr: In val contactID = DatabaseFactory.getThreadDatabase(context).getRecipientForThreadId(message!!.threadId)!!.address.toString() if (!message!!.isOutgoing) { val friendRequestStatus = database.getFriendRequestStatus(message!!.id) + visibility = if (friendRequestStatus == LokiMessageFriendRequestStatus.NONE) View.GONE else View.VISIBLE buttonLinearLayout.visibility = if (friendRequestStatus != LokiMessageFriendRequestStatus.REQUEST_PENDING) View.GONE else View.VISIBLE val formatID = when (friendRequestStatus) { - LokiMessageFriendRequestStatus.NONE, LokiMessageFriendRequestStatus.REQUEST_SENDING_OR_FAILED -> throw IllegalStateException() + LokiMessageFriendRequestStatus.NONE, LokiMessageFriendRequestStatus.REQUEST_SENDING_OR_FAILED -> return LokiMessageFriendRequestStatus.REQUEST_PENDING -> R.string.view_friend_request_incoming_pending_message LokiMessageFriendRequestStatus.REQUEST_ACCEPTED -> R.string.view_friend_request_incoming_accepted_message LokiMessageFriendRequestStatus.REQUEST_REJECTED -> R.string.view_friend_request_incoming_declined_message @@ -101,13 +102,13 @@ class FriendRequestView(context: Context, attrs: AttributeSet?, defStyleAttr: In label.text = resources.getString(formatID, contactID) } else { val friendRequestStatus = database.getFriendRequestStatus(message!!.id) + visibility = if (friendRequestStatus == LokiMessageFriendRequestStatus.NONE) View.GONE else View.VISIBLE buttonLinearLayout.visibility = View.GONE val formatID = when (friendRequestStatus) { - LokiMessageFriendRequestStatus.NONE -> throw IllegalStateException() + LokiMessageFriendRequestStatus.NONE -> return LokiMessageFriendRequestStatus.REQUEST_SENDING_OR_FAILED -> null - LokiMessageFriendRequestStatus.REQUEST_PENDING -> R.string.view_friend_request_outgoing_pending_message + LokiMessageFriendRequestStatus.REQUEST_PENDING, LokiMessageFriendRequestStatus.REQUEST_REJECTED -> R.string.view_friend_request_outgoing_pending_message LokiMessageFriendRequestStatus.REQUEST_ACCEPTED -> R.string.view_friend_request_outgoing_accepted_message - LokiMessageFriendRequestStatus.REQUEST_REJECTED -> throw IllegalStateException() LokiMessageFriendRequestStatus.REQUEST_EXPIRED -> R.string.view_friend_request_outgoing_expired_message } if (formatID != null) {