From 7bbe954d47e52a666b4c1f5be8cf0fa1a0b32150 Mon Sep 17 00:00:00 2001 From: Joas Schilling Date: Wed, 12 May 2021 18:55:42 +0200 Subject: [PATCH 1/3] Reply privately Signed-off-by: Joas Schilling --- .../talk/controllers/ChatController.kt | 80 +++++++++++++++++-- app/src/main/res/menu/chat_message_menu.xml | 6 ++ app/src/main/res/values/strings.xml | 1 + 3 files changed, 82 insertions(+), 5 deletions(-) diff --git a/app/src/main/java/com/nextcloud/talk/controllers/ChatController.kt b/app/src/main/java/com/nextcloud/talk/controllers/ChatController.kt index e8c1e0c31..3bd652340 100644 --- a/app/src/main/java/com/nextcloud/talk/controllers/ChatController.kt +++ b/app/src/main/java/com/nextcloud/talk/controllers/ChatController.kt @@ -112,6 +112,7 @@ import com.nextcloud.talk.presenters.MentionAutocompletePresenter import com.nextcloud.talk.ui.dialog.AttachmentDialog import com.nextcloud.talk.utils.ApiUtils import com.nextcloud.talk.utils.ConductorRemapping +import com.nextcloud.talk.utils.ConductorRemapping.remapChatController import com.nextcloud.talk.utils.DateUtils import com.nextcloud.talk.utils.DisplayUtils import com.nextcloud.talk.utils.KeyboardUtils @@ -119,6 +120,10 @@ import com.nextcloud.talk.utils.MagicCharPolicy import com.nextcloud.talk.utils.NotificationUtils import com.nextcloud.talk.utils.UriUtils import com.nextcloud.talk.utils.bundle.BundleKeys +import com.nextcloud.talk.utils.bundle.BundleKeys.KEY_ACTIVE_CONVERSATION +import com.nextcloud.talk.utils.bundle.BundleKeys.KEY_ROOM_ID +import com.nextcloud.talk.utils.bundle.BundleKeys.KEY_ROOM_TOKEN +import com.nextcloud.talk.utils.bundle.BundleKeys.KEY_USER_ENTITY import com.nextcloud.talk.utils.database.user.UserUtils import com.nextcloud.talk.utils.preferences.AppPreferences import com.nextcloud.talk.utils.singletons.ApplicationWideCurrentRoomHolder @@ -543,7 +548,7 @@ class ChatController(args: Bundle) : if (s.length >= lengthFilter) { messageInput?.error = String.format( Objects.requireNonNull - (resources).getString(R.string.nc_limit_hit), + (resources).getString(R.string.nc_limit_hit), Integer.toString(lengthFilter) ) } else { @@ -620,7 +625,7 @@ class ChatController(args: Bundle) : } if (currentConversation != null && currentConversation!!.shouldShowLobby - (conversationUser) + (conversationUser) ) { messageInputView?.visibility = View.GONE } else { @@ -1304,9 +1309,9 @@ class ChatController(args: Bundle) : TextUtils.isEmpty(chatMessageList[i + 1].systemMessage) && chatMessageList[i + 1].actorId == chatMessageList[i].actorId && countGroupedMessages < 4 && DateFormatter.isSameDay( - chatMessageList[i].createdAt, - chatMessageList[i + 1].createdAt - ) + chatMessageList[i].createdAt, + chatMessageList[i + 1].createdAt + ) ) { chatMessageList[i].isGrouped = true countGroupedMessages++ @@ -1616,6 +1621,66 @@ class ChatController(args: Bundle) : } true } + R.id.action_reply_privately -> { + val apiVersion = ApiUtils.getConversationApiVersion(conversationUser, intArrayOf(ApiUtils.APIv4, 1)) + val retrofitBucket = ApiUtils.getRetrofitBucketForCreateRoom( + apiVersion, + conversationUser?.baseUrl, + "1", + message?.user?.id?.substring(6), + null + ) + ncApi!!.createRoom( + credentials, + retrofitBucket.getUrl(), retrofitBucket.getQueryMap() + ) + .subscribeOn(Schedulers.io()) + .observeOn(AndroidSchedulers.mainThread()) + .subscribe(object : Observer { + override fun onSubscribe(d: Disposable) {} + override fun onNext(roomOverall: RoomOverall) { + val bundle = Bundle() + bundle.putParcelable(KEY_USER_ENTITY, conversationUser) + bundle.putString(KEY_ROOM_TOKEN, roomOverall.getOcs().getData().getToken()) + bundle.putString(KEY_ROOM_ID, roomOverall.getOcs().getData().getRoomId()) + + // FIXME once APIv2 or later is used only, the createRoom already returns all the data + ncApi!!.getRoom( + credentials, + ApiUtils.getUrlForRoom( + apiVersion, conversationUser?.baseUrl, + roomOverall.getOcs().getData().getToken() + ) + ) + .subscribeOn(Schedulers.io()) + .observeOn(AndroidSchedulers.mainThread()) + .subscribe(object : Observer { + override fun onSubscribe(d: Disposable) {} + override fun onNext(roomOverall: RoomOverall) { + bundle.putParcelable( + KEY_ACTIVE_CONVERSATION, + Parcels.wrap(roomOverall.getOcs().getData()) + ) + remapChatController( + router, conversationUser!!.id, + roomOverall.getOcs().getData().getToken(), bundle, true + ) + } + + override fun onError(e: Throwable) { + Log.e(TAG, e.message, e) + } + override fun onComplete() {} + }) + } + + override fun onError(e: Throwable) { + Log.e(TAG, e.message, e) + } + override fun onComplete() {} + }) + true + } R.id.action_delete_message -> { var apiVersion = 1 // FIXME Fix API checking with guests? @@ -1667,6 +1732,11 @@ class ChatController(args: Bundle) : inflate(R.menu.chat_message_menu) menu.findItem(R.id.action_copy_message).isVisible = !(message as ChatMessage).isDeleted menu.findItem(R.id.action_reply_to_message).isVisible = (message as ChatMessage).replyable + menu.findItem(R.id.action_reply_privately).isVisible = (message as ChatMessage).replyable && + conversationUser?.userId?.isNotEmpty() == true && conversationUser.userId != "?" && + (message as ChatMessage).user.id.startsWith("users/") && + (message as ChatMessage).user.id.substring(6) != currentConversation?.actorId && + currentConversation?.type != Conversation.ConversationType.ROOM_TYPE_ONE_TO_ONE_CALL menu.findItem(R.id.action_delete_message).isVisible = isShowMessageDeletionButton(message) if (menu.hasVisibleItems()) { show() diff --git a/app/src/main/res/menu/chat_message_menu.xml b/app/src/main/res/menu/chat_message_menu.xml index b5652a002..cef4d452b 100644 --- a/app/src/main/res/menu/chat_message_menu.xml +++ b/app/src/main/res/menu/chat_message_menu.xml @@ -14,6 +14,12 @@ android:title="@string/nc_reply" app:showAsAction="always" /> + + 99+ Copy Reply + Reply privately Delete Message deleted successfully, but it might have been leaked to other services From a44e714f137734f42bab63264cb0531fd6334782 Mon Sep 17 00:00:00 2001 From: Joas Schilling Date: Fri, 14 May 2021 13:54:35 +0200 Subject: [PATCH 2/3] Fix position and icon of the PopupMenu Signed-off-by: Joas Schilling --- .../talk/controllers/ChatController.kt | 5 +++- app/src/main/res/drawable/ic_content_copy.xml | 5 ++++ app/src/main/res/drawable/ic_delete.xml | 25 +++++++++++++++++++ app/src/main/res/drawable/ic_reply.xml | 5 ++++ app/src/main/res/menu/chat_message_menu.xml | 8 +++--- 5 files changed, 43 insertions(+), 5 deletions(-) create mode 100644 app/src/main/res/drawable/ic_content_copy.xml create mode 100644 app/src/main/res/drawable/ic_delete.xml create mode 100644 app/src/main/res/drawable/ic_reply.xml diff --git a/app/src/main/java/com/nextcloud/talk/controllers/ChatController.kt b/app/src/main/java/com/nextcloud/talk/controllers/ChatController.kt index 3bd652340..7717cd0ab 100644 --- a/app/src/main/java/com/nextcloud/talk/controllers/ChatController.kt +++ b/app/src/main/java/com/nextcloud/talk/controllers/ChatController.kt @@ -1562,7 +1562,7 @@ class ChatController(args: Bundle) : PopupMenu( ContextThemeWrapper(view?.context, R.style.appActionBarPopupMenu), view, - if (message?.user?.id == conversationUser?.userId) Gravity.END else Gravity.START + if (message?.user?.id == currentConversation?.actorType + "/" + currentConversation?.actorId) Gravity.END else Gravity.START ).apply { setOnMenuItemClickListener { item -> when (item?.itemId) { @@ -1739,6 +1739,9 @@ class ChatController(args: Bundle) : currentConversation?.type != Conversation.ConversationType.ROOM_TYPE_ONE_TO_ONE_CALL menu.findItem(R.id.action_delete_message).isVisible = isShowMessageDeletionButton(message) if (menu.hasVisibleItems()) { + if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.Q) { + setForceShowIcon(true) + } show() } } diff --git a/app/src/main/res/drawable/ic_content_copy.xml b/app/src/main/res/drawable/ic_content_copy.xml new file mode 100644 index 000000000..0ce661cd4 --- /dev/null +++ b/app/src/main/res/drawable/ic_content_copy.xml @@ -0,0 +1,5 @@ + + + diff --git a/app/src/main/res/drawable/ic_delete.xml b/app/src/main/res/drawable/ic_delete.xml new file mode 100644 index 000000000..f862bed6b --- /dev/null +++ b/app/src/main/res/drawable/ic_delete.xml @@ -0,0 +1,25 @@ + + + + + diff --git a/app/src/main/res/drawable/ic_reply.xml b/app/src/main/res/drawable/ic_reply.xml new file mode 100644 index 000000000..c1078cd8b --- /dev/null +++ b/app/src/main/res/drawable/ic_reply.xml @@ -0,0 +1,5 @@ + + + diff --git a/app/src/main/res/menu/chat_message_menu.xml b/app/src/main/res/menu/chat_message_menu.xml index cef4d452b..02036213e 100644 --- a/app/src/main/res/menu/chat_message_menu.xml +++ b/app/src/main/res/menu/chat_message_menu.xml @@ -4,25 +4,25 @@ \ No newline at end of file From d06935fd78e56f6fc0cc1e2e6c870c043230f8e9 Mon Sep 17 00:00:00 2001 From: Joas Schilling Date: Fri, 14 May 2021 14:06:35 +0200 Subject: [PATCH 3/3] Fix ktlint Signed-off-by: Joas Schilling --- .../talk/controllers/ChatController.kt | 12 ++++----- .../drawable/ic_content_copy_white_24dp.xml | 5 ---- .../res/drawable/ic_delete_white_24dp.xml | 25 ------------------- .../main/res/drawable/ic_reply_white_24dp.xml | 5 ---- 4 files changed, 5 insertions(+), 42 deletions(-) delete mode 100644 app/src/main/res/drawable/ic_content_copy_white_24dp.xml delete mode 100644 app/src/main/res/drawable/ic_delete_white_24dp.xml delete mode 100644 app/src/main/res/drawable/ic_reply_white_24dp.xml diff --git a/app/src/main/java/com/nextcloud/talk/controllers/ChatController.kt b/app/src/main/java/com/nextcloud/talk/controllers/ChatController.kt index 7717cd0ab..a5ec23a8b 100644 --- a/app/src/main/java/com/nextcloud/talk/controllers/ChatController.kt +++ b/app/src/main/java/com/nextcloud/talk/controllers/ChatController.kt @@ -547,8 +547,7 @@ class ChatController(args: Bundle) : override fun onTextChanged(s: CharSequence, start: Int, before: Int, count: Int) { if (s.length >= lengthFilter) { messageInput?.error = String.format( - Objects.requireNonNull - (resources).getString(R.string.nc_limit_hit), + Objects.requireNonNull (resources).getString(R.string.nc_limit_hit), Integer.toString(lengthFilter) ) } else { @@ -624,8 +623,7 @@ class ChatController(args: Bundle) : conversationVideoMenuItem?.icon?.alpha = 255 } - if (currentConversation != null && currentConversation!!.shouldShowLobby - (conversationUser) + if (currentConversation != null && currentConversation!!.shouldShowLobby(conversationUser) ) { messageInputView?.visibility = View.GONE } else { @@ -1309,9 +1307,9 @@ class ChatController(args: Bundle) : TextUtils.isEmpty(chatMessageList[i + 1].systemMessage) && chatMessageList[i + 1].actorId == chatMessageList[i].actorId && countGroupedMessages < 4 && DateFormatter.isSameDay( - chatMessageList[i].createdAt, - chatMessageList[i + 1].createdAt - ) + chatMessageList[i].createdAt, + chatMessageList[i + 1].createdAt + ) ) { chatMessageList[i].isGrouped = true countGroupedMessages++ diff --git a/app/src/main/res/drawable/ic_content_copy_white_24dp.xml b/app/src/main/res/drawable/ic_content_copy_white_24dp.xml deleted file mode 100644 index c211821b4..000000000 --- a/app/src/main/res/drawable/ic_content_copy_white_24dp.xml +++ /dev/null @@ -1,5 +0,0 @@ - - - diff --git a/app/src/main/res/drawable/ic_delete_white_24dp.xml b/app/src/main/res/drawable/ic_delete_white_24dp.xml deleted file mode 100644 index 4c3a52e84..000000000 --- a/app/src/main/res/drawable/ic_delete_white_24dp.xml +++ /dev/null @@ -1,25 +0,0 @@ - - - - - diff --git a/app/src/main/res/drawable/ic_reply_white_24dp.xml b/app/src/main/res/drawable/ic_reply_white_24dp.xml deleted file mode 100644 index bfe58aa51..000000000 --- a/app/src/main/res/drawable/ic_reply_white_24dp.xml +++ /dev/null @@ -1,5 +0,0 @@ - - -