From 3a4ab06df4dec6becaef99bdc1eabb64b47a2557 Mon Sep 17 00:00:00 2001 From: nielsandriesse Date: Fri, 4 Jun 2021 15:10:58 +1000 Subject: [PATCH] Implement basic action mode menu --- .../v2/ConversationActionModeCallback.kt | 27 +++++++++++++++++++ .../conversation/v2/ConversationActivityV2.kt | 13 ++++++++- .../conversation/v2/ConversationAdapter.kt | 12 +++++++-- .../menu/conversation_item_action_menu.xml | 21 +++++++++++++++ 4 files changed, 70 insertions(+), 3 deletions(-) create mode 100644 app/src/main/java/org/thoughtcrime/securesms/conversation/v2/ConversationActionModeCallback.kt create mode 100644 app/src/main/res/menu/conversation_item_action_menu.xml diff --git a/app/src/main/java/org/thoughtcrime/securesms/conversation/v2/ConversationActionModeCallback.kt b/app/src/main/java/org/thoughtcrime/securesms/conversation/v2/ConversationActionModeCallback.kt new file mode 100644 index 0000000000..c8b8d60911 --- /dev/null +++ b/app/src/main/java/org/thoughtcrime/securesms/conversation/v2/ConversationActionModeCallback.kt @@ -0,0 +1,27 @@ +package org.thoughtcrime.securesms.conversation.v2 + +import android.view.ActionMode +import android.view.Menu +import android.view.MenuItem +import network.loki.messenger.R + +class ConversationActionModeCallback : ActionMode.Callback { + + override fun onCreateActionMode(mode: ActionMode, menu: Menu): Boolean { + val inflater = mode.menuInflater + inflater.inflate(R.menu.conversation_item_action_menu, menu) + return true + } + + override fun onPrepareActionMode(mode: ActionMode?, menu: Menu): Boolean { + return false + } + + override fun onActionItemClicked(mode: ActionMode, item: MenuItem): Boolean { + return true + } + + override fun onDestroyActionMode(mode: ActionMode) { + + } +} \ No newline at end of file diff --git a/app/src/main/java/org/thoughtcrime/securesms/conversation/v2/ConversationActivityV2.kt b/app/src/main/java/org/thoughtcrime/securesms/conversation/v2/ConversationActivityV2.kt index a912d6a307..db52b6e185 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/conversation/v2/ConversationActivityV2.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/conversation/v2/ConversationActivityV2.kt @@ -3,6 +3,8 @@ package org.thoughtcrime.securesms.conversation.v2 import android.database.Cursor import android.os.Bundle import android.util.Log +import android.view.ActionMode +import android.view.Menu import androidx.loader.app.LoaderManager import androidx.loader.content.Loader import androidx.recyclerview.widget.ItemTouchHelper @@ -19,7 +21,7 @@ class ConversationActivityV2 : PassphraseRequiredActionBarActivity() { private val adapter by lazy { val cursor = DatabaseFactory.getMmsSmsDatabase(this).getConversation(threadID) - val adapter = ConversationAdapter(this, cursor) + val adapter = ConversationAdapter(this, cursor) { handleLongPress(it) } adapter.setHasStableIds(true) adapter } @@ -89,5 +91,14 @@ class ConversationActivityV2 : PassphraseRequiredActionBarActivity() { private fun reply(messagePosition: Int) { Log.d("Loki", "Reply to message at position: $messagePosition.") } + + private fun handleLongPress(messagePosition: Int) { + val actionModeCallback = ConversationActionModeCallback() + if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.M) { + startActionMode(actionModeCallback, ActionMode.TYPE_PRIMARY) + } else { + startActionMode(actionModeCallback) + } + } // endregion } \ No newline at end of file diff --git a/app/src/main/java/org/thoughtcrime/securesms/conversation/v2/ConversationAdapter.kt b/app/src/main/java/org/thoughtcrime/securesms/conversation/v2/ConversationAdapter.kt index adebfc5375..e0cf382fba 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/conversation/v2/ConversationAdapter.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/conversation/v2/ConversationAdapter.kt @@ -11,7 +11,8 @@ import org.thoughtcrime.securesms.database.DatabaseFactory import org.thoughtcrime.securesms.database.model.MessageRecord import java.lang.IllegalStateException -class ConversationAdapter(context: Context, cursor: Cursor) : CursorRecyclerViewAdapter(context, cursor) { +class ConversationAdapter(context: Context, cursor: Cursor, private val onItemLongPress: (Int) -> Unit) + : CursorRecyclerViewAdapter(context, cursor) { private val messageDB = DatabaseFactory.getMmsSmsDatabase(context) sealed class ViewType(val rawValue: Int) { @@ -55,7 +56,14 @@ class ConversationAdapter(context: Context, cursor: Cursor) : CursorRecyclerView override fun onBindItemViewHolder(viewHolder: ViewHolder, cursor: Cursor) { val message = getMessage(cursor)!! when (viewHolder) { - is VisibleMessageViewHolder -> viewHolder.view.bind(message) + is VisibleMessageViewHolder -> { + val view = viewHolder.view + view.bind(message) + view.setOnLongClickListener { + onItemLongPress(viewHolder.adapterPosition) + true + } + } is ControlMessageViewHolder -> viewHolder.view.bind(message) } } diff --git a/app/src/main/res/menu/conversation_item_action_menu.xml b/app/src/main/res/menu/conversation_item_action_menu.xml new file mode 100644 index 0000000000..0b38282efd --- /dev/null +++ b/app/src/main/res/menu/conversation_item_action_menu.xml @@ -0,0 +1,21 @@ + + + + + + + + + +