From 1ce7050f1ab3e7d8345866363fb92be4410efd0e Mon Sep 17 00:00:00 2001 From: Mikunj Date: Wed, 19 Feb 2020 15:34:02 +1100 Subject: [PATCH] Leave group on swiping --- res/values/strings.xml | 7 ++- .../conversation/ConversationActivity.java | 16 +------ .../loki/redesign/activities/HomeActivity.kt | 46 +++++++++++++++---- .../securesms/util/GroupUtil.java | 23 ++++++++++ 4 files changed, 65 insertions(+), 27 deletions(-) diff --git a/res/values/strings.xml b/res/values/strings.xml index 348b88b0f5..6ef258862d 100644 --- a/res/values/strings.xml +++ b/res/values/strings.xml @@ -1662,10 +1662,13 @@ Dismiss Restore - - Copied to clipboard + + Conversation deleted + Are you sure you want to leave the group? + Are you sure you want to delete the conversation? + diff --git a/src/org/thoughtcrime/securesms/conversation/ConversationActivity.java b/src/org/thoughtcrime/securesms/conversation/ConversationActivity.java index 04a96108a5..35d2193a27 100644 --- a/src/org/thoughtcrime/securesms/conversation/ConversationActivity.java +++ b/src/org/thoughtcrime/securesms/conversation/ConversationActivity.java @@ -1156,21 +1156,7 @@ public class ConversationActivity extends PassphraseRequiredActionBarActivity builder.setMessage(getString(R.string.ConversationActivity_are_you_sure_you_want_to_leave_this_group)); builder.setPositiveButton(R.string.yes, (dialog, which) -> { Recipient groupRecipient = getRecipient(); - long threadId = DatabaseFactory.getThreadDatabase(this).getThreadIdFor(groupRecipient); - Optional leaveMessage = GroupUtil.createGroupLeaveMessage(this, groupRecipient); - - if (threadId != -1 && leaveMessage.isPresent()) { - MessageSender.send(this, leaveMessage.get(), threadId, false, null); - - // We need to remove the master device from the group - String masterHexEncodedPublicKey = TextSecurePreferences.getMasterHexEncodedPublicKey(this); - String localNumber = masterHexEncodedPublicKey != null ? masterHexEncodedPublicKey : TextSecurePreferences.getLocalNumber(this); - - GroupDatabase groupDatabase = DatabaseFactory.getGroupDatabase(this); - String groupId = groupRecipient.getAddress().toGroupString(); - groupDatabase.setActive(groupId, false); - groupDatabase.remove(groupId, Address.fromSerialized(localNumber)); - + if (GroupUtil.leaveGroup(this, groupRecipient)) { initializeEnabledCheck(); } else { Toast.makeText(this, R.string.ConversationActivity_error_leaving_group, Toast.LENGTH_LONG).show(); diff --git a/src/org/thoughtcrime/securesms/loki/redesign/activities/HomeActivity.kt b/src/org/thoughtcrime/securesms/loki/redesign/activities/HomeActivity.kt index 3097290f97..e1f46df634 100644 --- a/src/org/thoughtcrime/securesms/loki/redesign/activities/HomeActivity.kt +++ b/src/org/thoughtcrime/securesms/loki/redesign/activities/HomeActivity.kt @@ -1,6 +1,7 @@ package org.thoughtcrime.securesms.loki.redesign.activities import android.annotation.SuppressLint +import android.app.AlertDialog import android.arch.lifecycle.Observer import android.content.Intent import android.database.Cursor @@ -20,6 +21,7 @@ import android.text.Spannable import android.text.SpannableString import android.text.style.ForegroundColorSpan import android.view.View +import android.widget.Toast import kotlinx.android.synthetic.main.activity_home.* import network.loki.messenger.R import org.thoughtcrime.securesms.ApplicationContext @@ -36,6 +38,7 @@ import org.thoughtcrime.securesms.loki.redesign.views.SeedReminderViewDelegate import org.thoughtcrime.securesms.mms.GlideApp import org.thoughtcrime.securesms.mms.GlideRequests import org.thoughtcrime.securesms.notifications.MessageNotifier +import org.thoughtcrime.securesms.util.GroupUtil import org.thoughtcrime.securesms.util.TextSecurePreferences import kotlin.math.abs @@ -230,8 +233,8 @@ class HomeActivity : PassphraseRequiredActionBarActivity, ConversationClickListe @SuppressLint("StaticFieldLeak") override fun onSwiped(viewHolder: RecyclerView.ViewHolder, direction: Int) { val threadID = (viewHolder as HomeAdapter.ViewHolder).view.thread!!.threadId + val recipient = (viewHolder as HomeAdapter.ViewHolder).view.thread!!.recipient val threadDatabase = DatabaseFactory.getThreadDatabase(activity) - threadDatabase.archiveConversation(threadID) val deleteThread = object : Runnable { override fun run() { @@ -243,21 +246,44 @@ class HomeActivity : PassphraseRequiredActionBarActivity, ConversationClickListe apiDatabase.removeLastDeletionServerID(publicChat.channel, publicChat.server) ApplicationContext.getInstance(activity).lokiPublicChatAPI!!.leave(publicChat.channel, publicChat.server) } + threadDatabase.deleteConversation(threadID) + MessageNotifier.updateNotification(activity) } } } - val handler = Handler() - handler.postDelayed(deleteThread, 5000) - val snackbar = Snackbar.make(activity.contentView, "Conversation Deleted", Snackbar.LENGTH_LONG) - snackbar.setAction("Undo") { - threadDatabase.unarchiveConversation(threadID) - handler.removeCallbacks(deleteThread) - animate(viewHolder, 0.0f) + + val message = if (recipient.isGroupRecipient) R.string.activity_home_leave_group_title else R.string.activity_home_delete_conversation_title + val alertDialogBuilder = AlertDialog.Builder(activity) + alertDialogBuilder.setMessage(message) + alertDialogBuilder.setPositiveButton(R.string.yes) { _, _ -> + val isGroup = recipient.isGroupRecipient + + // If we are deleting a group and it's active + // We need to send a leave message + if (isGroup && DatabaseFactory.getGroupDatabase(activity).isActive(recipient.address.toGroupString())) { + if (!GroupUtil.leaveGroup(activity, recipient)) { + Toast.makeText(activity, R.string.ConversationActivity_error_leaving_group, Toast.LENGTH_LONG).show() + clearView(activity.recyclerView, viewHolder) + return@setPositiveButton + } + } + + // Archive and forcefully delete the conversation in 10 seconds + threadDatabase.archiveConversation(threadID) + val handler = Handler() + handler.postDelayed(deleteThread, 10000) + + // Notify the user + val snackbarText = if (isGroup) R.string.MessageRecord_left_group else R.string.activity_home_conversation_deleted + val snackbar = Snackbar.make(activity.contentView, snackbarText, Snackbar.LENGTH_LONG) + snackbar.show() } - snackbar.setActionTextColor(activity.resources.getColorWithID(R.color.accent, activity.theme)) - snackbar.show() + alertDialogBuilder.setNegativeButton(R.string.no) { _, _ -> + clearView(activity.recyclerView, viewHolder) + } + alertDialogBuilder.show() } override fun onChildDraw(c: Canvas, recyclerView: RecyclerView, viewHolder: RecyclerView.ViewHolder, dx: Float, dy: Float, actionState: Int, isCurrentlyActive: Boolean) { diff --git a/src/org/thoughtcrime/securesms/util/GroupUtil.java b/src/org/thoughtcrime/securesms/util/GroupUtil.java index 9268e78264..d4bdffa291 100644 --- a/src/org/thoughtcrime/securesms/util/GroupUtil.java +++ b/src/org/thoughtcrime/securesms/util/GroupUtil.java @@ -4,6 +4,7 @@ import android.content.Context; import android.support.annotation.NonNull; import android.support.annotation.Nullable; import android.support.annotation.WorkerThread; +import android.widget.Toast; import com.google.protobuf.ByteString; @@ -16,6 +17,7 @@ import org.thoughtcrime.securesms.logging.Log; import org.thoughtcrime.securesms.mms.OutgoingGroupMediaMessage; import org.thoughtcrime.securesms.recipients.Recipient; import org.thoughtcrime.securesms.recipients.RecipientModifiedListener; +import org.thoughtcrime.securesms.sms.MessageSender; import org.whispersystems.libsignal.util.guava.Optional; import org.whispersystems.signalservice.api.messages.SignalServiceGroup; @@ -111,6 +113,27 @@ public class GroupUtil { return Optional.of(new OutgoingGroupMediaMessage(groupRecipient, groupContext, null, System.currentTimeMillis(), 0, null, Collections.emptyList(), Collections.emptyList())); } + public static boolean leaveGroup(@NonNull Context context, Recipient groupRecipient) { + long threadId = DatabaseFactory.getThreadDatabase(context).getThreadIdFor(groupRecipient); + Optional leaveMessage = GroupUtil.createGroupLeaveMessage(context, groupRecipient); + + if (threadId < 0 || !leaveMessage.isPresent()) { + return false; + } + + MessageSender.send(context, leaveMessage.get(), threadId, false, null); + + // We need to remove the master device from the group + String masterHexEncodedPublicKey = TextSecurePreferences.getMasterHexEncodedPublicKey(context); + String localNumber = masterHexEncodedPublicKey != null ? masterHexEncodedPublicKey : TextSecurePreferences.getLocalNumber(context); + + GroupDatabase groupDatabase = DatabaseFactory.getGroupDatabase(context); + String groupId = groupRecipient.getAddress().toGroupString(); + groupDatabase.setActive(groupId, false); + groupDatabase.remove(groupId, Address.fromSerialized(localNumber)); + + return true; + } public static @NonNull GroupDescription getDescription(@NonNull Context context, @Nullable String encodedGroup) { if (encodedGroup == null) {