Merge branch 'master' into dev

This commit is contained in:
jubb 2022-09-13 16:26:49 +10:00
commit 2c3a949bb3
9 changed files with 48 additions and 21 deletions

View File

@ -1052,7 +1052,7 @@ class ConversationActivityV2 : PassphraseRequiredActionBarActivity(), InputBarDe
Log.e("Loki", "Failed to show emoji picker", e) Log.e("Loki", "Failed to show emoji picker", e)
return return
} }
ViewUtil.hideKeyboard(this, visibleMessageView); ViewUtil.hideKeyboard(this, visibleMessageView)
binding?.reactionsShade?.isVisible = true binding?.reactionsShade?.isVisible = true
showOrHidScrollToBottomButton(false) showOrHidScrollToBottomButton(false)
binding?.conversationRecyclerView?.suppressLayout(true) binding?.conversationRecyclerView?.suppressLayout(true)
@ -1083,7 +1083,7 @@ class ConversationActivityV2 : PassphraseRequiredActionBarActivity(), InputBarDe
message.isOutgoing, message.isOutgoing,
visibleMessageView.messageContentView visibleMessageView.messageContentView
) )
reactionDelegate.show(this, message, selectedConversationModel) reactionDelegate.show(this, message, selectedConversationModel, viewModel.blindedPublicKey)
} }
override fun dispatchTouchEvent(ev: MotionEvent): Boolean { override fun dispatchTouchEvent(ev: MotionEvent): Boolean {
@ -1865,6 +1865,8 @@ class ConversationActivityV2 : PassphraseRequiredActionBarActivity(), InputBarDe
ConversationReactionOverlay.Action.VIEW_INFO -> showMessageDetail(selectedItems) ConversationReactionOverlay.Action.VIEW_INFO -> showMessageDetail(selectedItems)
ConversationReactionOverlay.Action.SELECT -> selectMessages(selectedItems) ConversationReactionOverlay.Action.SELECT -> selectMessages(selectedItems)
ConversationReactionOverlay.Action.DELETE -> deleteMessages(selectedItems) ConversationReactionOverlay.Action.DELETE -> deleteMessages(selectedItems)
ConversationReactionOverlay.Action.BAN_AND_DELETE_ALL -> banAndDeleteAll(selectedItems)
ConversationReactionOverlay.Action.BAN_USER -> banUser(selectedItems)
} }
} }
} }

View File

@ -27,13 +27,15 @@ internal class ConversationReactionDelegate(private val overlayStub: Stub<Conver
fun show( fun show(
activity: Activity, activity: Activity,
messageRecord: MessageRecord, messageRecord: MessageRecord,
selectedConversationModel: SelectedConversationModel selectedConversationModel: SelectedConversationModel,
blindedPublicKey: String?
) { ) {
resolveOverlay().show( resolveOverlay().show(
activity, activity,
messageRecord, messageRecord,
lastSeenDownPoint, lastSeenDownPoint,
selectedConversationModel selectedConversationModel,
blindedPublicKey
) )
} }

View File

@ -68,6 +68,7 @@ public final class ConversationReactionOverlay extends FrameLayout {
private Activity activity; private Activity activity;
private MessageRecord messageRecord; private MessageRecord messageRecord;
private SelectedConversationModel selectedConversationModel; private SelectedConversationModel selectedConversationModel;
private String blindedPublicKey;
private OverlayState overlayState = OverlayState.HIDDEN; private OverlayState overlayState = OverlayState.HIDDEN;
private RecentEmojiPageModel recentEmojiPageModel; private RecentEmojiPageModel recentEmojiPageModel;
@ -142,7 +143,8 @@ public final class ConversationReactionOverlay extends FrameLayout {
public void show(@NonNull Activity activity, public void show(@NonNull Activity activity,
@NonNull MessageRecord messageRecord, @NonNull MessageRecord messageRecord,
@NonNull PointF lastSeenDownPoint, @NonNull PointF lastSeenDownPoint,
@NonNull SelectedConversationModel selectedConversationModel) @NonNull SelectedConversationModel selectedConversationModel,
@Nullable String blindedPublicKey)
{ {
if (overlayState != OverlayState.HIDDEN) { if (overlayState != OverlayState.HIDDEN) {
return; return;
@ -150,6 +152,7 @@ public final class ConversationReactionOverlay extends FrameLayout {
this.messageRecord = messageRecord; this.messageRecord = messageRecord;
this.selectedConversationModel = selectedConversationModel; this.selectedConversationModel = selectedConversationModel;
this.blindedPublicKey = blindedPublicKey;
overlayState = OverlayState.UNINITAILIZED; overlayState = OverlayState.UNINITAILIZED;
selected = -1; selected = -1;
recentEmojiPageModel = new RecentEmojiPageModel(activity); recentEmojiPageModel = new RecentEmojiPageModel(activity);
@ -668,16 +671,16 @@ public final class ConversationReactionOverlay extends FrameLayout {
items.add(new ActionItem(R.attr.menu_copy_icon, getContext().getResources().getString(R.string.activity_conversation_menu_copy_session_id), () -> handleActionItemClicked(Action.COPY_SESSION_ID))); items.add(new ActionItem(R.attr.menu_copy_icon, getContext().getResources().getString(R.string.activity_conversation_menu_copy_session_id), () -> handleActionItemClicked(Action.COPY_SESSION_ID)));
} }
// Delete message // Delete message
if (ConversationMenuItemHelper.userCanDeleteSelectedItems(getContext(), message, openGroup, userPublicKey)) { if (ConversationMenuItemHelper.userCanDeleteSelectedItems(getContext(), message, openGroup, userPublicKey, blindedPublicKey)) {
items.add(new ActionItem(R.attr.menu_trash_icon, getContext().getResources().getString(R.string.delete), () -> handleActionItemClicked(Action.DELETE))); items.add(new ActionItem(R.attr.menu_trash_icon, getContext().getResources().getString(R.string.delete), () -> handleActionItemClicked(Action.DELETE)));
} }
// Ban user // Ban user
if (ConversationMenuItemHelper.userCanBanSelectedUsers(getContext(), message, openGroup, userPublicKey)) { if (ConversationMenuItemHelper.userCanBanSelectedUsers(getContext(), message, openGroup, userPublicKey, blindedPublicKey)) {
items.add(new ActionItem(0, getContext().getResources().getString(R.string.conversation_context__menu_ban_user), () -> handleActionItemClicked(Action.BAN_USER))); items.add(new ActionItem(R.attr.menu_block_icon, getContext().getResources().getString(R.string.conversation_context__menu_ban_user), () -> handleActionItemClicked(Action.BAN_USER)));
} }
// Ban and delete all // Ban and delete all
if (ConversationMenuItemHelper.userCanBanSelectedUsers(getContext(), message, openGroup, userPublicKey)) { if (ConversationMenuItemHelper.userCanBanSelectedUsers(getContext(), message, openGroup, userPublicKey, blindedPublicKey)) {
items.add(new ActionItem(0, getContext().getResources().getString(R.string.conversation_context__menu_ban_and_delete_all), () -> handleActionItemClicked(Action.BAN_AND_DELETE_ALL))); items.add(new ActionItem(R.attr.menu_trash_icon, getContext().getResources().getString(R.string.conversation_context__menu_ban_and_delete_all), () -> handleActionItemClicked(Action.BAN_AND_DELETE_ALL)));
} }
// Message detail // Message detail
if (message.isFailed()) { if (message.isFailed()) {

View File

@ -8,17 +8,17 @@ import org.thoughtcrime.securesms.groups.OpenGroupManager
object ConversationMenuItemHelper { object ConversationMenuItemHelper {
@JvmStatic @JvmStatic
fun userCanDeleteSelectedItems(context: Context, message: MessageRecord, openGroup: OpenGroup?, userPublicKey: String): Boolean { fun userCanDeleteSelectedItems(context: Context, message: MessageRecord, openGroup: OpenGroup?, userPublicKey: String, blindedPublicKey: String?): Boolean {
if (openGroup == null) return message.isOutgoing || !message.isOutgoing if (openGroup == null) return message.isOutgoing || !message.isOutgoing
if (message.isOutgoing) return true if (message.isOutgoing) return true
return OpenGroupManager.isUserModerator(context, openGroup.groupId, userPublicKey) return OpenGroupManager.isUserModerator(context, openGroup.groupId, userPublicKey, blindedPublicKey)
} }
@JvmStatic @JvmStatic
fun userCanBanSelectedUsers(context: Context, message: MessageRecord, openGroup: OpenGroup?, userPublicKey: String): Boolean { fun userCanBanSelectedUsers(context: Context, message: MessageRecord, openGroup: OpenGroup?, userPublicKey: String, blindedPublicKey: String?): Boolean {
if (openGroup == null) return false if (openGroup == null) return false
if (message.isOutgoing) return false // Users can't ban themselves if (message.isOutgoing) return false // Users can't ban themselves
return OpenGroupManager.isUserModerator(context, openGroup.groupId, userPublicKey) return OpenGroupManager.isUserModerator(context, openGroup.groupId, userPublicKey, blindedPublicKey)
} }
} }

View File

@ -3,9 +3,9 @@ package org.thoughtcrime.securesms.database
import android.content.ContentValues import android.content.ContentValues
import android.content.Context import android.content.Context
import android.database.Cursor import android.database.Cursor
import org.thoughtcrime.securesms.database.helpers.SQLCipherOpenHelper
import org.session.libsession.messaging.open_groups.GroupMember import org.session.libsession.messaging.open_groups.GroupMember
import org.session.libsession.messaging.open_groups.GroupMemberRole import org.session.libsession.messaging.open_groups.GroupMemberRole
import org.thoughtcrime.securesms.database.helpers.SQLCipherOpenHelper
class GroupMemberDatabase(context: Context, helper: SQLCipherOpenHelper) : Database(context, helper) { class GroupMemberDatabase(context: Context, helper: SQLCipherOpenHelper) : Database(context, helper) {
@ -69,4 +69,16 @@ class GroupMemberDatabase(context: Context, helper: SQLCipherOpenHelper) : Datab
} }
} }
fun clearGroupMemberRoles(groupId: String) {
writableDatabase.beginTransaction()
try {
val query = "$GROUP_ID = ?"
val args = arrayOf(groupId)
writableDatabase.delete(TABLE_NAME, query, args)
writableDatabase.setTransactionSuccessful()
} finally {
writableDatabase.endTransaction()
}
}
} }

View File

@ -319,7 +319,11 @@ class Storage(context: Context, helper: SQLCipherOpenHelper) : Database(context,
return getAllOpenGroups().values.firstOrNull { it.server == server && it.room == room } return getAllOpenGroups().values.firstOrNull { it.server == server && it.room == room }
} }
override fun addGroupMember(member: GroupMember) { override fun clearGroupMemberRoles(groupId: String) {
DatabaseComponent.get(context).groupMemberDatabase().clearGroupMemberRoles(groupId)
}
override fun addGroupMemberRole(member: GroupMember) {
DatabaseComponent.get(context).groupMemberDatabase().addGroupMember(member) DatabaseComponent.get(context).groupMemberDatabase().addGroupMember(member)
} }

View File

@ -71,7 +71,8 @@ interface StorageProtocol {
fun hasBackgroundGroupAddJob(groupJoinUrl: String): Boolean fun hasBackgroundGroupAddJob(groupJoinUrl: String): Boolean
fun setOpenGroupServerMessageID(messageID: Long, serverID: Long, threadID: Long, isSms: Boolean) fun setOpenGroupServerMessageID(messageID: Long, serverID: Long, threadID: Long, isSms: Boolean)
fun getOpenGroup(room: String, server: String): OpenGroup? fun getOpenGroup(room: String, server: String): OpenGroup?
fun addGroupMember(member: GroupMember) fun addGroupMemberRole(member: GroupMember)
fun clearGroupMemberRoles(groupId: String)
// Open Group Public Keys // Open Group Public Keys
fun getOpenGroupPublicKey(server: String): String? fun getOpenGroupPublicKey(server: String): String?

View File

@ -134,18 +134,20 @@ class OpenGroupPoller(private val server: String, private val executorService: S
storage.setUserCount(roomToken, server, pollInfo.activeUsers) storage.setUserCount(roomToken, server, pollInfo.activeUsers)
// - Moderators // - Moderators
storage.clearGroupMemberRoles(groupId)
pollInfo.details?.moderators?.forEach { pollInfo.details?.moderators?.forEach {
storage.addGroupMember(GroupMember(groupId, it, GroupMemberRole.MODERATOR)) storage.addGroupMemberRole(GroupMember(groupId, it, GroupMemberRole.MODERATOR))
} }
pollInfo.details?.hiddenModerators?.forEach { pollInfo.details?.hiddenModerators?.forEach {
storage.addGroupMember(GroupMember(groupId, it, GroupMemberRole.HIDDEN_MODERATOR)) storage.addGroupMemberRole(GroupMember(groupId, it, GroupMemberRole.HIDDEN_MODERATOR))
} }
// - Admins // - Admins
pollInfo.details?.admins?.forEach { pollInfo.details?.admins?.forEach {
storage.addGroupMember(GroupMember(groupId, it, GroupMemberRole.ADMIN)) storage.addGroupMemberRole(GroupMember(groupId, it, GroupMemberRole.ADMIN))
} }
pollInfo.details?.hiddenAdmins?.forEach { pollInfo.details?.hiddenAdmins?.forEach {
storage.addGroupMember(GroupMember(groupId, it, GroupMemberRole.HIDDEN_ADMIN)) storage.addGroupMemberRole(GroupMember(groupId, it, GroupMemberRole.HIDDEN_ADMIN))
} }
} }

View File

@ -224,6 +224,7 @@ public class Recipient implements RecipientModifiedListener {
Recipient.this.profileSharing = result.profileSharing; Recipient.this.profileSharing = result.profileSharing;
Recipient.this.unidentifiedAccessMode = result.unidentifiedAccessMode; Recipient.this.unidentifiedAccessMode = result.unidentifiedAccessMode;
Recipient.this.forceSmsSelection = result.forceSmsSelection; Recipient.this.forceSmsSelection = result.forceSmsSelection;
Recipient.this.notifyType = result.notifyType;
Recipient.this.participants.clear(); Recipient.this.participants.clear();
Recipient.this.participants.addAll(result.participants); Recipient.this.participants.addAll(result.participants);