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"
|
android:icon="?menu_trash_icon"
|
||||||
app:showAsAction="always" />
|
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"
|
<item android:title="@string/conversation_context__menu_copy_text"
|
||||||
android:id="@+id/menu_context_copy"
|
android:id="@+id/menu_context_copy"
|
||||||
android:icon="?menu_copy_icon"
|
android:icon="?menu_copy_icon"
|
||||||
|
@@ -5,6 +5,7 @@
|
|||||||
<string name="yes">Yes</string>
|
<string name="yes">Yes</string>
|
||||||
<string name="no">No</string>
|
<string name="no">No</string>
|
||||||
<string name="delete">Delete</string>
|
<string name="delete">Delete</string>
|
||||||
|
<string name="ban">Ban</string>
|
||||||
<string name="please_wait">Please wait...</string>
|
<string name="please_wait">Please wait...</string>
|
||||||
<string name="save">Save</string>
|
<string name="save">Save</string>
|
||||||
<string name="note_to_self">Note to Self</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="one">This will permanently delete the selected message.</item>
|
||||||
<item quantity="other">This will permanently delete all %1$d selected messages.</item>
|
<item quantity="other">This will permanently delete all %1$d selected messages.</item>
|
||||||
</plurals>
|
</plurals>
|
||||||
|
<string name="ConversationFragment_ban_selected_user">Ban this user?</string>
|
||||||
<string name="ConversationFragment_save_to_sd_card">Save to storage?</string>
|
<string name="ConversationFragment_save_to_sd_card">Save to storage?</string>
|
||||||
<plurals name="ConversationFragment_saving_n_media_to_storage_warning">
|
<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>
|
<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_sms">SMS</string>
|
||||||
<string name="ConversationFragment_deleting">Deleting</string>
|
<string name="ConversationFragment_deleting">Deleting</string>
|
||||||
<string name="ConversationFragment_deleting_messages">Deleting messages...</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_not_found">Original message not found</string>
|
||||||
<string name="ConversationFragment_quoted_message_no_longer_available">Original message no longer available</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_message_details">Message details</string>
|
||||||
<string name="conversation_context__menu_copy_text">Copy text</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_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_forward_message">Forward message</string>
|
||||||
<string name="conversation_context__menu_resend_message">Resend message</string>
|
<string name="conversation_context__menu_resend_message">Resend message</string>
|
||||||
<string name="conversation_context__menu_reply_to_message">Reply to 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.ArrayList;
|
||||||
import java.util.Collections;
|
import java.util.Collections;
|
||||||
import java.util.Comparator;
|
import java.util.Comparator;
|
||||||
|
import java.util.HashSet;
|
||||||
import java.util.LinkedList;
|
import java.util.LinkedList;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
import java.util.Locale;
|
import java.util.Locale;
|
||||||
import java.util.Set;
|
import java.util.Set;
|
||||||
|
import java.util.TreeSet;
|
||||||
|
|
||||||
|
import kotlin.Unit;
|
||||||
import network.loki.messenger.R;
|
import network.loki.messenger.R;
|
||||||
|
import nl.komponents.kovenant.Kovenant;
|
||||||
|
|
||||||
@SuppressLint("StaticFieldLeak")
|
@SuppressLint("StaticFieldLeak")
|
||||||
public class ConversationFragment extends Fragment
|
public class ConversationFragment extends Fragment
|
||||||
@@ -406,18 +410,24 @@ public class ConversationFragment extends Fragment
|
|||||||
boolean isPublicChat = (publicChat != null);
|
boolean isPublicChat = (publicChat != null);
|
||||||
int selectedMessageCount = messageRecords.size();
|
int selectedMessageCount = messageRecords.size();
|
||||||
boolean areAllSentByUser = true;
|
boolean areAllSentByUser = true;
|
||||||
|
Set<String> uniqueUserSet = new HashSet<>();
|
||||||
for (MessageRecord message : messageRecords) {
|
for (MessageRecord message : messageRecords) {
|
||||||
if (!message.isOutgoing()) { areAllSentByUser = false; }
|
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_copy_public_key).setVisible(selectedMessageCount == 1 && !areAllSentByUser);
|
||||||
menu.findItem(R.id.menu_context_reply).setVisible(selectedMessageCount == 1);
|
menu.findItem(R.id.menu_context_reply).setVisible(selectedMessageCount == 1);
|
||||||
String userHexEncodedPublicKey = TextSecurePreferences.getLocalNumber(getContext());
|
String userHexEncodedPublicKey = TextSecurePreferences.getLocalNumber(getContext());
|
||||||
boolean userCanModerate = isPublicChat && PublicChatAPI.Companion.isUserModerator(userHexEncodedPublicKey, publicChat.getChannel(), publicChat.getServer());
|
boolean userCanModerate = isPublicChat && PublicChatAPI.Companion.isUserModerator(userHexEncodedPublicKey, publicChat.getChannel(), publicChat.getServer());
|
||||||
boolean isDeleteOptionVisible = !isPublicChat || (areAllSentByUser || userCanModerate);
|
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_delete_message).setVisible(isDeleteOptionVisible);
|
||||||
|
menu.findItem(R.id.menu_context_ban_user).setVisible(isBanOptionVisible);
|
||||||
} else {
|
} else {
|
||||||
menu.findItem(R.id.menu_context_copy_public_key).setVisible(false);
|
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_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();
|
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) {
|
private void handleDisplayDetails(MessageRecord message) {
|
||||||
Intent intent = new Intent(getActivity(), MessageDetailsActivity.class);
|
Intent intent = new Intent(getActivity(), MessageDetailsActivity.class);
|
||||||
intent.putExtra(MessageDetailsActivity.MESSAGE_ID_EXTRA, message.getId());
|
intent.putExtra(MessageDetailsActivity.MESSAGE_ID_EXTRA, message.getId());
|
||||||
@@ -1133,6 +1196,9 @@ public class ConversationFragment extends Fragment
|
|||||||
handleDeleteMessages(getListAdapter().getSelectedItems());
|
handleDeleteMessages(getListAdapter().getSelectedItems());
|
||||||
actionMode.finish();
|
actionMode.finish();
|
||||||
return true;
|
return true;
|
||||||
|
case R.id.menu_context_ban_user:
|
||||||
|
handleBanUser(getListAdapter().getSelectedItems());
|
||||||
|
return true;
|
||||||
case R.id.menu_context_details:
|
case R.id.menu_context_details:
|
||||||
handleDisplayDetails(getSelectedMessageRecord());
|
handleDisplayDetails(getSelectedMessageRecord());
|
||||||
actionMode.finish();
|
actionMode.finish();
|
||||||
|
Reference in New Issue
Block a user