mirror of
https://github.com/oxen-io/session-android.git
synced 2025-08-26 02:58:08 +00:00
feat: add banning users as a mod in open group
This commit is contained in:
@@ -11,6 +11,12 @@
|
||||
android:icon="?menu_trash_icon"
|
||||
app:showAsAction="always" />
|
||||
|
||||
<item android:title="@string/conversation_context__menu_ban_user"
|
||||
android:id="@+id/menu_context_ban_user"
|
||||
android:icon="?menu_block_icon"
|
||||
android:visible="false"
|
||||
app:showAsAction="always"/>
|
||||
|
||||
<item android:title="@string/conversation_context__menu_copy_text"
|
||||
android:id="@+id/menu_context_copy"
|
||||
android:icon="?menu_copy_icon"
|
||||
|
@@ -5,6 +5,7 @@
|
||||
<string name="yes">Yes</string>
|
||||
<string name="no">No</string>
|
||||
<string name="delete">Delete</string>
|
||||
<string name="ban">Ban</string>
|
||||
<string name="please_wait">Please wait...</string>
|
||||
<string name="save">Save</string>
|
||||
<string name="note_to_self">Note to Self</string>
|
||||
@@ -206,6 +207,7 @@
|
||||
<item quantity="one">This will permanently delete the selected message.</item>
|
||||
<item quantity="other">This will permanently delete all %1$d selected messages.</item>
|
||||
</plurals>
|
||||
<string name="ConversationFragment_ban_selected_user">Ban this user?</string>
|
||||
<string name="ConversationFragment_save_to_sd_card">Save to storage?</string>
|
||||
<plurals name="ConversationFragment_saving_n_media_to_storage_warning">
|
||||
<item quantity="one">Saving this media to storage will allow any other apps on your device to access it.\n\nContinue?</item>
|
||||
@@ -230,6 +232,8 @@
|
||||
<string name="ConversationFragment_sms">SMS</string>
|
||||
<string name="ConversationFragment_deleting">Deleting</string>
|
||||
<string name="ConversationFragment_deleting_messages">Deleting messages...</string>
|
||||
<string name="ConversationFragment_banning">Banning</string>
|
||||
<string name="ConversationFragment_banning_user">Banning user…</string>
|
||||
<string name="ConversationFragment_quoted_message_not_found">Original message not found</string>
|
||||
<string name="ConversationFragment_quoted_message_no_longer_available">Original message no longer available</string>
|
||||
|
||||
@@ -1340,6 +1344,7 @@
|
||||
<string name="conversation_context__menu_message_details">Message details</string>
|
||||
<string name="conversation_context__menu_copy_text">Copy text</string>
|
||||
<string name="conversation_context__menu_delete_message">Delete message</string>
|
||||
<string name="conversation_context__menu_ban_user">Ban user</string>
|
||||
<string name="conversation_context__menu_forward_message">Forward message</string>
|
||||
<string name="conversation_context__menu_resend_message">Resend message</string>
|
||||
<string name="conversation_context__menu_reply_to_message">Reply to message</string>
|
||||
|
@@ -111,12 +111,16 @@ import java.io.InputStream;
|
||||
import java.util.ArrayList;
|
||||
import java.util.Collections;
|
||||
import java.util.Comparator;
|
||||
import java.util.HashSet;
|
||||
import java.util.LinkedList;
|
||||
import java.util.List;
|
||||
import java.util.Locale;
|
||||
import java.util.Set;
|
||||
import java.util.TreeSet;
|
||||
|
||||
import kotlin.Unit;
|
||||
import network.loki.messenger.R;
|
||||
import nl.komponents.kovenant.Kovenant;
|
||||
|
||||
@SuppressLint("StaticFieldLeak")
|
||||
public class ConversationFragment extends Fragment
|
||||
@@ -406,18 +410,24 @@ public class ConversationFragment extends Fragment
|
||||
boolean isPublicChat = (publicChat != null);
|
||||
int selectedMessageCount = messageRecords.size();
|
||||
boolean areAllSentByUser = true;
|
||||
Set<String> uniqueUserSet = new HashSet<>();
|
||||
for (MessageRecord message : messageRecords) {
|
||||
if (!message.isOutgoing()) { areAllSentByUser = false; }
|
||||
uniqueUserSet.add(message.getRecipient().getAddress().toPhoneString());
|
||||
}
|
||||
menu.findItem(R.id.menu_context_copy_public_key).setVisible(selectedMessageCount == 1 && !areAllSentByUser);
|
||||
menu.findItem(R.id.menu_context_reply).setVisible(selectedMessageCount == 1);
|
||||
String userHexEncodedPublicKey = TextSecurePreferences.getLocalNumber(getContext());
|
||||
boolean userCanModerate = isPublicChat && PublicChatAPI.Companion.isUserModerator(userHexEncodedPublicKey, publicChat.getChannel(), publicChat.getServer());
|
||||
boolean isDeleteOptionVisible = !isPublicChat || (areAllSentByUser || userCanModerate);
|
||||
// allow banning if moderating a public chat and only one user's messages are selected
|
||||
boolean isBanOptionVisible = isPublicChat && userCanModerate && !areAllSentByUser && uniqueUserSet.size() == 1;
|
||||
menu.findItem(R.id.menu_context_delete_message).setVisible(isDeleteOptionVisible);
|
||||
menu.findItem(R.id.menu_context_ban_user).setVisible(isBanOptionVisible);
|
||||
} else {
|
||||
menu.findItem(R.id.menu_context_copy_public_key).setVisible(false);
|
||||
menu.findItem(R.id.menu_context_delete_message).setVisible(true);
|
||||
menu.findItem(R.id.menu_context_ban_user).setVisible(false);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -576,6 +586,59 @@ public class ConversationFragment extends Fragment
|
||||
builder.show();
|
||||
}
|
||||
|
||||
private void handleBanUser(Set<MessageRecord> messageRecords) {
|
||||
AlertDialog.Builder builder = new AlertDialog.Builder(getActivity());
|
||||
|
||||
String userPublicKey = null;
|
||||
for (MessageRecord record: messageRecords) {
|
||||
String currentPublicKey = record.getRecipient().getAddress().toPhoneString();
|
||||
if (userPublicKey == null) {
|
||||
userPublicKey = currentPublicKey;
|
||||
}
|
||||
}
|
||||
final String finalPublicKey = userPublicKey;
|
||||
|
||||
builder.setIconAttribute(R.attr.dialog_alert_icon);
|
||||
builder.setTitle(R.string.ConversationFragment_ban_selected_user);
|
||||
builder.setCancelable(true);
|
||||
|
||||
PublicChat publicChat = DatabaseFactory.getLokiThreadDatabase(getContext()).getPublicChat(threadId);
|
||||
|
||||
builder.setPositiveButton(R.string.ban, (dialog, which) -> {
|
||||
ConversationAdapter chatAdapter = getListAdapter();
|
||||
chatAdapter.clearSelection();
|
||||
chatAdapter.notifyDataSetChanged();
|
||||
new ProgressDialogAsyncTask<String, Void, Void>(getActivity(),
|
||||
R.string.ConversationFragment_banning,
|
||||
R.string.ConversationFragment_banning_user) {
|
||||
@Override
|
||||
protected Void doInBackground(String... userPublicKeyParam) {
|
||||
String userPublicKey = userPublicKeyParam[0];
|
||||
if (publicChat != null) {
|
||||
PublicChatAPI publicChatAPI = ApplicationContext.getInstance(getContext()).getPublicChatAPI();
|
||||
if (publicChat != null && publicChatAPI != null) {
|
||||
publicChatAPI
|
||||
.ban(userPublicKey, publicChat.getServer())
|
||||
.success(l -> {
|
||||
Log.d("Loki", "User banned");
|
||||
return Unit.INSTANCE;
|
||||
}).fail(e -> {
|
||||
Log.d("Loki", "Couldn't ban user due to error: " + e.toString() + ".");
|
||||
return null;
|
||||
});
|
||||
}
|
||||
} else {
|
||||
Log.d("Loki", "Tried to ban user from a non-public chat");
|
||||
}
|
||||
return null;
|
||||
}
|
||||
}.executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR, finalPublicKey);
|
||||
});
|
||||
|
||||
builder.setNegativeButton(android.R.string.cancel, null);
|
||||
builder.show();
|
||||
}
|
||||
|
||||
private void handleDisplayDetails(MessageRecord message) {
|
||||
Intent intent = new Intent(getActivity(), MessageDetailsActivity.class);
|
||||
intent.putExtra(MessageDetailsActivity.MESSAGE_ID_EXTRA, message.getId());
|
||||
@@ -1133,6 +1196,9 @@ public class ConversationFragment extends Fragment
|
||||
handleDeleteMessages(getListAdapter().getSelectedItems());
|
||||
actionMode.finish();
|
||||
return true;
|
||||
case R.id.menu_context_ban_user:
|
||||
handleBanUser(getListAdapter().getSelectedItems());
|
||||
return true;
|
||||
case R.id.menu_context_details:
|
||||
handleDisplayDetails(getSelectedMessageRecord());
|
||||
actionMode.finish();
|
||||
|
Reference in New Issue
Block a user