From 1ce7050f1ab3e7d8345866363fb92be4410efd0e Mon Sep 17 00:00:00 2001 From: Mikunj Date: Wed, 19 Feb 2020 15:34:02 +1100 Subject: [PATCH 1/2] 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() + } + 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) { From 704c15cd24a4b8f1c224fef8907abebb5e97dcaf Mon Sep 17 00:00:00 2001 From: Niels Andriesse Date: Fri, 21 Feb 2020 11:35:53 +0700 Subject: [PATCH 2/2] Enforce style convention --- res/values/strings.xml | 11 +++--- .../loki/redesign/activities/HomeActivity.kt | 37 ++++++++----------- 2 files changed, 20 insertions(+), 28 deletions(-) diff --git a/res/values/strings.xml b/res/values/strings.xml index 6ef258862d..aca6b1c236 100644 --- a/res/values/strings.xml +++ b/res/values/strings.xml @@ -1662,13 +1662,12 @@ 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? + Are you sure you want to leave this group? + Are you sure you want to delete this conversation? + Conversation deleted diff --git a/src/org/thoughtcrime/securesms/loki/redesign/activities/HomeActivity.kt b/src/org/thoughtcrime/securesms/loki/redesign/activities/HomeActivity.kt index e1f46df634..3993a93f10 100644 --- a/src/org/thoughtcrime/securesms/loki/redesign/activities/HomeActivity.kt +++ b/src/org/thoughtcrime/securesms/loki/redesign/activities/HomeActivity.kt @@ -11,7 +11,6 @@ import android.graphics.Paint import android.os.AsyncTask import android.os.Bundle import android.os.Handler -import android.support.design.widget.Snackbar import android.support.v4.app.LoaderManager import android.support.v4.content.Loader import android.support.v7.widget.LinearLayoutManager @@ -232,8 +231,9 @@ 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 + viewHolder as HomeAdapter.ViewHolder + val threadID = viewHolder.view.thread!!.threadId + val recipient = viewHolder.view.thread!!.recipient val threadDatabase = DatabaseFactory.getThreadDatabase(activity) val deleteThread = object : Runnable { @@ -246,44 +246,37 @@ 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 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 dialogMessage = if (recipient.isGroupRecipient) R.string.activity_home_leave_group_dialog_message else R.string.activity_home_delete_conversation_dialog_message + val dialog = AlertDialog.Builder(activity) + dialog.setMessage(dialogMessage) + dialog.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 + // Send a leave group message if this is an active closed group 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() + Toast.makeText(activity, "Couldn't leave group", Toast.LENGTH_LONG).show() clearView(activity.recyclerView, viewHolder) return@setPositiveButton } } - - // Archive and forcefully delete the conversation in 10 seconds + // Archive the conversation and then delete it after 10 seconds (the case where the + // app was closed before the conversation could be deleted is handled in onCreate) 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() + val toastMessage = if (isGroup) R.string.MessageRecord_left_group else R.string.activity_home_conversation_deleted_message + Toast.makeText(activity, toastMessage, Toast.LENGTH_LONG).show() } - alertDialogBuilder.setNegativeButton(R.string.no) { _, _ -> + dialog.setNegativeButton(R.string.no) { _, _ -> clearView(activity.recyclerView, viewHolder) } - alertDialogBuilder.show() + dialog.create().show() } override fun onChildDraw(c: Canvas, recyclerView: RecyclerView, viewHolder: RecyclerView.ViewHolder, dx: Float, dy: Float, actionState: Int, isCurrentlyActive: Boolean) {