diff --git a/app/src/main/java/com/nextcloud/talk/activities/MainActivity.kt b/app/src/main/java/com/nextcloud/talk/activities/MainActivity.kt index 20d3298cb..7e803a7a7 100644 --- a/app/src/main/java/com/nextcloud/talk/activities/MainActivity.kt +++ b/app/src/main/java/com/nextcloud/talk/activities/MainActivity.kt @@ -111,7 +111,7 @@ class MainActivity : BaseActivity(), ActionBarProvider { if (intent.hasExtra(BundleKeys.KEY_FROM_NOTIFICATION_START_CALL)) { if (!router!!.hasRootController()) { router!!.setRoot( - RouterTransaction.with(ConversationsListController()) + RouterTransaction.with(ConversationsListController(Bundle())) .pushChangeHandler(HorizontalChangeHandler()) .popChangeHandler(HorizontalChangeHandler()) ) @@ -121,7 +121,7 @@ class MainActivity : BaseActivity(), ActionBarProvider { if (hasDb) { if (userUtils.anyUserExists()) { router!!.setRoot( - RouterTransaction.with(ConversationsListController()) + RouterTransaction.with(ConversationsListController(Bundle())) .pushChangeHandler(HorizontalChangeHandler()) .popChangeHandler(HorizontalChangeHandler()) ) @@ -174,7 +174,7 @@ class MainActivity : BaseActivity(), ActionBarProvider { fun resetConversationsList() { if (userUtils.anyUserExists()) { router!!.setRoot( - RouterTransaction.with(ConversationsListController()) + RouterTransaction.with(ConversationsListController(Bundle())) .pushChangeHandler(HorizontalChangeHandler()) .popChangeHandler(HorizontalChangeHandler()) ) diff --git a/app/src/main/java/com/nextcloud/talk/adapters/messages/MagicPreviewMessageViewHolder.java b/app/src/main/java/com/nextcloud/talk/adapters/messages/MagicPreviewMessageViewHolder.java index 7a4fec8b0..5cc616ad3 100644 --- a/app/src/main/java/com/nextcloud/talk/adapters/messages/MagicPreviewMessageViewHolder.java +++ b/app/src/main/java/com/nextcloud/talk/adapters/messages/MagicPreviewMessageViewHolder.java @@ -69,6 +69,7 @@ import java.util.concurrent.ExecutionException; import javax.inject.Inject; +import androidx.appcompat.view.ContextThemeWrapper; import androidx.core.content.ContextCompat; import androidx.core.content.FileProvider; import androidx.emoji.widget.EmojiTextView; @@ -407,7 +408,19 @@ public abstract class MagicPreviewMessageViewHolder extends MessageHolders.Incom return; } - PopupMenu popupMenu = new PopupMenu(this.context, itemView, Gravity.START); + Context viewContext; + + if (itemView != null && itemView.getContext() != null) { + viewContext = itemView.getContext(); + } else { + viewContext = this.context; + } + + PopupMenu popupMenu = new PopupMenu( + new ContextThemeWrapper(viewContext, R.style.appActionBarPopupMenu), + itemView, + Gravity.START + ); popupMenu.inflate(R.menu.chat_preview_message_menu); popupMenu.setOnMenuItemClickListener(item -> { diff --git a/app/src/main/java/com/nextcloud/talk/controllers/AccountVerificationController.java b/app/src/main/java/com/nextcloud/talk/controllers/AccountVerificationController.java index 4401e6796..09a882fe4 100644 --- a/app/src/main/java/com/nextcloud/talk/controllers/AccountVerificationController.java +++ b/app/src/main/java/com/nextcloud/talk/controllers/AccountVerificationController.java @@ -443,7 +443,7 @@ public class AccountVerificationController extends BaseController { getActivity().runOnUiThread(() -> { if (userUtils.getUsers().size() == 1) { getRouter().setRoot(RouterTransaction.with(new - ConversationsListController()) + ConversationsListController(new Bundle())) .pushChangeHandler(new HorizontalChangeHandler()) .popChangeHandler(new HorizontalChangeHandler())); } else { @@ -524,7 +524,7 @@ public class AccountVerificationController extends BaseController { } else { if (userUtils.anyUserExists()) { - getRouter().setRoot(RouterTransaction.with(new ConversationsListController()) + getRouter().setRoot(RouterTransaction.with(new ConversationsListController(new Bundle())) .pushChangeHandler(new HorizontalChangeHandler()) .popChangeHandler(new HorizontalChangeHandler())); } else { 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 da4a949fa..cc40cd19d 100644 --- a/app/src/main/java/com/nextcloud/talk/controllers/ChatController.kt +++ b/app/src/main/java/com/nextcloud/talk/controllers/ChatController.kt @@ -95,6 +95,7 @@ import com.facebook.imagepipeline.image.CloseableImage import com.google.android.flexbox.FlexboxLayout import com.nextcloud.talk.R import com.nextcloud.talk.activities.MagicCallActivity +import com.nextcloud.talk.activities.MainActivity import com.nextcloud.talk.adapters.messages.IncomingLocationMessageViewHolder import com.nextcloud.talk.adapters.messages.IncomingPreviewMessageViewHolder import com.nextcloud.talk.adapters.messages.IncomingVoiceMessageViewHolder @@ -2061,7 +2062,7 @@ class ChatController(args: Bundle) : override fun onOptionsItemSelected(item: MenuItem): Boolean { when (item.itemId) { android.R.id.home -> { - router.popCurrentController() + (activity as MainActivity).resetConversationsList() return true } R.id.conversation_video_call -> { @@ -2165,6 +2166,17 @@ class ChatController(args: Bundle) : clipboardManager.setPrimaryClip(clipData) true } + R.id.action_forward_message -> { + val bundle = Bundle() + bundle.putBoolean(BundleKeys.KEY_FORWARD_MSG_FLAG, true) + bundle.putString(BundleKeys.KEY_FORWARD_MSG_TEXT, message?.text) + getRouter().pushController( + RouterTransaction.with(ConversationsListController(bundle)) + .pushChangeHandler(HorizontalChangeHandler()) + .popChangeHandler(HorizontalChangeHandler()) + ) + true + } R.id.action_reply_to_message -> { val chatMessage = message as ChatMessage? replyToMessage(chatMessage, message?.jsonMessageId) @@ -2303,6 +2315,10 @@ class ChatController(args: Bundle) : (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) + menu.findItem(R.id.action_forward_message).isVisible = ChatMessage.MessageType.REGULAR_TEXT_MESSAGE.equals( + (message as ChatMessage) + .getMessageType() + ) if (menu.hasVisibleItems()) { if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.Q) { setForceShowIcon(true) diff --git a/app/src/main/java/com/nextcloud/talk/controllers/ConversationsListController.java b/app/src/main/java/com/nextcloud/talk/controllers/ConversationsListController.java index 673635ae4..fd24e0c49 100644 --- a/app/src/main/java/com/nextcloud/talk/controllers/ConversationsListController.java +++ b/app/src/main/java/com/nextcloud/talk/controllers/ConversationsListController.java @@ -139,6 +139,7 @@ public class ConversationsListController extends BaseController implements Searc public static final String TAG = "ConvListController"; public static final int ID_DELETE_CONVERSATION_DIALOG = 0; private static final String KEY_SEARCH_QUERY = "ContactsController.searchQuery"; + private final Bundle bundle; @Inject UserUtils userUtils; @@ -203,9 +204,13 @@ public class ConversationsListController extends BaseController implements Searc private String textToPaste = ""; - public ConversationsListController() { + private boolean forwardMessage = false; + + public ConversationsListController(Bundle bundle) { super(); setHasOptionsMenu(true); + forwardMessage = bundle.getBoolean(BundleKeys.INSTANCE.getKEY_FORWARD_MSG_FLAG()); + this.bundle = bundle; } @Override @@ -340,9 +345,13 @@ public class ConversationsListController extends BaseController implements Searc showShareToScreen = !shareToScreenWasShown && hasActivityActionSendIntent(); + if (showShareToScreen) { hideSearchBar(); getActionBar().setTitle(R.string.send_to_three_dots); + } else if (forwardMessage) { + hideSearchBar(); + getActionBar().setTitle(R.string.nc_forward_to_three_dots); } else { MainActivity activity = (MainActivity) getActivity(); @@ -752,6 +761,8 @@ public class ConversationsListController extends BaseController implements Searc if (showShareToScreen) { shareToScreenWasShown = true; handleSharedData(); + } else if (forwardMessage) { + openConversation(bundle.getString(BundleKeys.INSTANCE.getKEY_FORWARD_MSG_TEXT())); } else { openConversation(); } diff --git a/app/src/main/java/com/nextcloud/talk/utils/bundle/BundleKeys.kt b/app/src/main/java/com/nextcloud/talk/utils/bundle/BundleKeys.kt index a262c75e8..30518a126 100644 --- a/app/src/main/java/com/nextcloud/talk/utils/bundle/BundleKeys.kt +++ b/app/src/main/java/com/nextcloud/talk/utils/bundle/BundleKeys.kt @@ -68,4 +68,6 @@ object BundleKeys { val KEY_SHARED_TEXT = "KEY_SHARED_TEXT" val KEY_GEOCODING_QUERY = "KEY_GEOCODING_QUERY" val KEY_META_DATA = "KEY_META_DATA" + val KEY_FORWARD_MSG_FLAG = "KEY_FORWARD_MSG_FLAG" + val KEY_FORWARD_MSG_TEXT = "KEY_FORWARD_MSG_TEXT" } diff --git a/app/src/main/res/drawable/ic_share_action.xml b/app/src/main/res/drawable/ic_share_action.xml new file mode 100644 index 000000000..2705dbb71 --- /dev/null +++ b/app/src/main/res/drawable/ic_share_action.xml @@ -0,0 +1,27 @@ + + + + diff --git a/app/src/main/res/menu/chat_message_menu.xml b/app/src/main/res/menu/chat_message_menu.xml index 02036213e..17fe7420c 100644 --- a/app/src/main/res/menu/chat_message_menu.xml +++ b/app/src/main/res/menu/chat_message_menu.xml @@ -8,6 +8,12 @@ android:title="@string/nc_copy_message" app:showAsAction="always" /> + + - \ No newline at end of file + diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 5cdb6f278..807345106 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -189,6 +189,8 @@ Add to favorites Remove from favorites + Forward to … + Select participants Add participants @@ -357,6 +359,7 @@ Copy + Forward Reply Reply privately Delete