mirror of
https://github.com/oxen-io/session-android.git
synced 2025-02-25 12:47:20 +00:00
Leave group on swiping
This commit is contained in:
parent
3a0c518eeb
commit
1ce7050f1a
@ -1662,10 +1662,13 @@
|
|||||||
<string name="session_restore_banner_dismiss_button_title">Dismiss</string>
|
<string name="session_restore_banner_dismiss_button_title">Dismiss</string>
|
||||||
<string name="session_restore_banner_restore_button_title">Restore</string>
|
<string name="session_restore_banner_restore_button_title">Restore</string>
|
||||||
|
|
||||||
<!-- Loki -->
|
|
||||||
|
|
||||||
<!-- Session -->
|
<!-- Session -->
|
||||||
<string name="activity_register_public_key_copied_message">Copied to clipboard</string>
|
<string name="activity_register_public_key_copied_message">Copied to clipboard</string>
|
||||||
<!-- Session -->
|
<!-- Session -->
|
||||||
|
|
||||||
|
<!-- Home Activity -->
|
||||||
|
<string name="activity_home_conversation_deleted">Conversation deleted</string>
|
||||||
|
<string name="activity_home_leave_group_title">Are you sure you want to leave the group?</string>
|
||||||
|
<string name="activity_home_delete_conversation_title">Are you sure you want to delete the conversation?</string>
|
||||||
|
|
||||||
</resources>
|
</resources>
|
||||||
|
@ -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.setMessage(getString(R.string.ConversationActivity_are_you_sure_you_want_to_leave_this_group));
|
||||||
builder.setPositiveButton(R.string.yes, (dialog, which) -> {
|
builder.setPositiveButton(R.string.yes, (dialog, which) -> {
|
||||||
Recipient groupRecipient = getRecipient();
|
Recipient groupRecipient = getRecipient();
|
||||||
long threadId = DatabaseFactory.getThreadDatabase(this).getThreadIdFor(groupRecipient);
|
if (GroupUtil.leaveGroup(this, groupRecipient)) {
|
||||||
Optional<OutgoingGroupMediaMessage> 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));
|
|
||||||
|
|
||||||
initializeEnabledCheck();
|
initializeEnabledCheck();
|
||||||
} else {
|
} else {
|
||||||
Toast.makeText(this, R.string.ConversationActivity_error_leaving_group, Toast.LENGTH_LONG).show();
|
Toast.makeText(this, R.string.ConversationActivity_error_leaving_group, Toast.LENGTH_LONG).show();
|
||||||
|
@ -1,6 +1,7 @@
|
|||||||
package org.thoughtcrime.securesms.loki.redesign.activities
|
package org.thoughtcrime.securesms.loki.redesign.activities
|
||||||
|
|
||||||
import android.annotation.SuppressLint
|
import android.annotation.SuppressLint
|
||||||
|
import android.app.AlertDialog
|
||||||
import android.arch.lifecycle.Observer
|
import android.arch.lifecycle.Observer
|
||||||
import android.content.Intent
|
import android.content.Intent
|
||||||
import android.database.Cursor
|
import android.database.Cursor
|
||||||
@ -20,6 +21,7 @@ import android.text.Spannable
|
|||||||
import android.text.SpannableString
|
import android.text.SpannableString
|
||||||
import android.text.style.ForegroundColorSpan
|
import android.text.style.ForegroundColorSpan
|
||||||
import android.view.View
|
import android.view.View
|
||||||
|
import android.widget.Toast
|
||||||
import kotlinx.android.synthetic.main.activity_home.*
|
import kotlinx.android.synthetic.main.activity_home.*
|
||||||
import network.loki.messenger.R
|
import network.loki.messenger.R
|
||||||
import org.thoughtcrime.securesms.ApplicationContext
|
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.GlideApp
|
||||||
import org.thoughtcrime.securesms.mms.GlideRequests
|
import org.thoughtcrime.securesms.mms.GlideRequests
|
||||||
import org.thoughtcrime.securesms.notifications.MessageNotifier
|
import org.thoughtcrime.securesms.notifications.MessageNotifier
|
||||||
|
import org.thoughtcrime.securesms.util.GroupUtil
|
||||||
import org.thoughtcrime.securesms.util.TextSecurePreferences
|
import org.thoughtcrime.securesms.util.TextSecurePreferences
|
||||||
import kotlin.math.abs
|
import kotlin.math.abs
|
||||||
|
|
||||||
@ -230,8 +233,8 @@ class HomeActivity : PassphraseRequiredActionBarActivity, ConversationClickListe
|
|||||||
@SuppressLint("StaticFieldLeak")
|
@SuppressLint("StaticFieldLeak")
|
||||||
override fun onSwiped(viewHolder: RecyclerView.ViewHolder, direction: Int) {
|
override fun onSwiped(viewHolder: RecyclerView.ViewHolder, direction: Int) {
|
||||||
val threadID = (viewHolder as HomeAdapter.ViewHolder).view.thread!!.threadId
|
val threadID = (viewHolder as HomeAdapter.ViewHolder).view.thread!!.threadId
|
||||||
|
val recipient = (viewHolder as HomeAdapter.ViewHolder).view.thread!!.recipient
|
||||||
val threadDatabase = DatabaseFactory.getThreadDatabase(activity)
|
val threadDatabase = DatabaseFactory.getThreadDatabase(activity)
|
||||||
threadDatabase.archiveConversation(threadID)
|
|
||||||
val deleteThread = object : Runnable {
|
val deleteThread = object : Runnable {
|
||||||
|
|
||||||
override fun run() {
|
override fun run() {
|
||||||
@ -243,22 +246,45 @@ class HomeActivity : PassphraseRequiredActionBarActivity, ConversationClickListe
|
|||||||
apiDatabase.removeLastDeletionServerID(publicChat.channel, publicChat.server)
|
apiDatabase.removeLastDeletionServerID(publicChat.channel, publicChat.server)
|
||||||
ApplicationContext.getInstance(activity).lokiPublicChatAPI!!.leave(publicChat.channel, publicChat.server)
|
ApplicationContext.getInstance(activity).lokiPublicChatAPI!!.leave(publicChat.channel, publicChat.server)
|
||||||
}
|
}
|
||||||
|
|
||||||
threadDatabase.deleteConversation(threadID)
|
threadDatabase.deleteConversation(threadID)
|
||||||
|
|
||||||
MessageNotifier.updateNotification(activity)
|
MessageNotifier.updateNotification(activity)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
val handler = Handler()
|
|
||||||
handler.postDelayed(deleteThread, 5000)
|
val message = if (recipient.isGroupRecipient) R.string.activity_home_leave_group_title else R.string.activity_home_delete_conversation_title
|
||||||
val snackbar = Snackbar.make(activity.contentView, "Conversation Deleted", Snackbar.LENGTH_LONG)
|
val alertDialogBuilder = AlertDialog.Builder(activity)
|
||||||
snackbar.setAction("Undo") {
|
alertDialogBuilder.setMessage(message)
|
||||||
threadDatabase.unarchiveConversation(threadID)
|
alertDialogBuilder.setPositiveButton(R.string.yes) { _, _ ->
|
||||||
handler.removeCallbacks(deleteThread)
|
val isGroup = recipient.isGroupRecipient
|
||||||
animate(viewHolder, 0.0f)
|
|
||||||
|
// 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
|
||||||
}
|
}
|
||||||
snackbar.setActionTextColor(activity.resources.getColorWithID(R.color.accent, activity.theme))
|
}
|
||||||
|
|
||||||
|
// 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.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) {
|
override fun onChildDraw(c: Canvas, recyclerView: RecyclerView, viewHolder: RecyclerView.ViewHolder, dx: Float, dy: Float, actionState: Int, isCurrentlyActive: Boolean) {
|
||||||
if (actionState == ItemTouchHelper.ACTION_STATE_SWIPE && dx < 0) {
|
if (actionState == ItemTouchHelper.ACTION_STATE_SWIPE && dx < 0) {
|
||||||
|
@ -4,6 +4,7 @@ import android.content.Context;
|
|||||||
import android.support.annotation.NonNull;
|
import android.support.annotation.NonNull;
|
||||||
import android.support.annotation.Nullable;
|
import android.support.annotation.Nullable;
|
||||||
import android.support.annotation.WorkerThread;
|
import android.support.annotation.WorkerThread;
|
||||||
|
import android.widget.Toast;
|
||||||
|
|
||||||
import com.google.protobuf.ByteString;
|
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.mms.OutgoingGroupMediaMessage;
|
||||||
import org.thoughtcrime.securesms.recipients.Recipient;
|
import org.thoughtcrime.securesms.recipients.Recipient;
|
||||||
import org.thoughtcrime.securesms.recipients.RecipientModifiedListener;
|
import org.thoughtcrime.securesms.recipients.RecipientModifiedListener;
|
||||||
|
import org.thoughtcrime.securesms.sms.MessageSender;
|
||||||
import org.whispersystems.libsignal.util.guava.Optional;
|
import org.whispersystems.libsignal.util.guava.Optional;
|
||||||
import org.whispersystems.signalservice.api.messages.SignalServiceGroup;
|
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()));
|
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<OutgoingGroupMediaMessage> 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) {
|
public static @NonNull GroupDescription getDescription(@NonNull Context context, @Nullable String encodedGroup) {
|
||||||
if (encodedGroup == null) {
|
if (encodedGroup == null) {
|
||||||
|
Loading…
x
Reference in New Issue
Block a user