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()
+ }
+ alertDialogBuilder.setNegativeButton(R.string.no) { _, _ ->
+ clearView(activity.recyclerView, viewHolder)
}
- snackbar.setActionTextColor(activity.resources.getColorWithID(R.color.accent, activity.theme))
- snackbar.show()
+ 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) {