feat: add banning users as a mod in open group

This commit is contained in:
Jubb
2021-01-22 15:10:28 +11:00
parent e6c5d3bb28
commit 380667c6cd
3 changed files with 77 additions and 0 deletions

View File

@@ -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"

View File

@@ -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>

View File

@@ -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();