Commit c3307c64 authored by Leonardo Aramaki's avatar Leonardo Aramaki

Add editing action to message menu; still needs proper permission checker

parent 1dd6ad10
...@@ -6,7 +6,10 @@ import android.os.Build ...@@ -6,7 +6,10 @@ import android.os.Build
import android.os.Bundle import android.os.Bundle
import android.support.v4.app.Fragment import android.support.v4.app.Fragment
import android.text.style.ClickableSpan import android.text.style.ClickableSpan
import android.view.* import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import android.view.ViewTreeObserver
import android.widget.ImageButton import android.widget.ImageButton
import android.widget.ScrollView import android.widget.ScrollView
import android.widget.Toast import android.widget.Toast
...@@ -167,8 +170,9 @@ class LoginFragment : Fragment(), LoginView { ...@@ -167,8 +170,9 @@ class LoginFragment : Fragment(), LoginView {
enableUserInput(true) enableUserInput(true)
} }
override fun showMessage(message: String) = Toast.makeText(activity, message, Toast.LENGTH_SHORT).show() override fun showMessage(resId: Int) = showMessage(getString(resId))
override fun showMessage(message: String) = Toast.makeText(activity, message, Toast.LENGTH_SHORT).show()
override fun showGenericErrorMessage() = showMessage(getString(R.string.msg_generic_error)) override fun showGenericErrorMessage() = showMessage(getString(R.string.msg_generic_error))
...@@ -216,7 +220,7 @@ class LoginFragment : Fragment(), LoginView { ...@@ -216,7 +220,7 @@ class LoginFragment : Fragment(), LoginView {
} }
// Returns true if *all* EditTexts are empty. // Returns true if *all* EditTexts are empty.
private fun isEditTextEmpty(): Boolean = text_username_or_email.textContent.isBlank() && text_password.textContent.isEmpty() private fun isEditTextEmpty(): Boolean = text_username_or_email.textContent.isBlank() && text_password.textContent.isEmpty()
private fun showRemainingSocialAccountsView() { private fun showRemainingSocialAccountsView() {
social_accounts_container.postDelayed({ social_accounts_container.postDelayed({
......
package chat.rocket.android.authentication.server.ui package chat.rocket.android.authentication.server.ui
import android.os.Bundle import android.os.Bundle
import android.support.annotation.StringRes
import android.support.v4.app.Fragment import android.support.v4.app.Fragment
import android.view.LayoutInflater import android.view.LayoutInflater
import android.view.View import android.view.View
...@@ -56,6 +57,8 @@ class ServerFragment : Fragment(), ServerView { ...@@ -56,6 +57,8 @@ class ServerFragment : Fragment(), ServerView {
enableUserInput(true) enableUserInput(true)
} }
override fun showMessage(resId: Int) = showMessage(getString(resId))
override fun showMessage(message: String) = Toast.makeText(activity, message, Toast.LENGTH_SHORT).show() override fun showMessage(message: String) = Toast.makeText(activity, message, Toast.LENGTH_SHORT).show()
override fun showGenericErrorMessage() = showMessage(getString(R.string.msg_generic_error)) override fun showGenericErrorMessage() = showMessage(getString(R.string.msg_generic_error))
......
...@@ -100,6 +100,8 @@ class SignupFragment : Fragment(), SignupView { ...@@ -100,6 +100,8 @@ class SignupFragment : Fragment(), SignupView {
enableUserInput(true) enableUserInput(true)
} }
override fun showMessage(resId: Int) = showMessage(getString(resId))
override fun showMessage(message: String) { override fun showMessage(message: String) {
Toast.makeText(activity, message, Toast.LENGTH_SHORT).show() Toast.makeText(activity, message, Toast.LENGTH_SHORT).show()
} }
......
...@@ -83,6 +83,8 @@ class TwoFAFragment : Fragment(), TwoFAView { ...@@ -83,6 +83,8 @@ class TwoFAFragment : Fragment(), TwoFAView {
enableUserInput(true) enableUserInput(true)
} }
override fun showMessage(resId: Int) = showMessage(getString(resId))
override fun showMessage(message: String) = Toast.makeText(activity, message, Toast.LENGTH_SHORT).show() override fun showMessage(message: String) = Toast.makeText(activity, message, Toast.LENGTH_SHORT).show()
override fun showGenericErrorMessage() = showMessage(getString(R.string.msg_generic_error)) override fun showGenericErrorMessage() = showMessage(getString(R.string.msg_generic_error))
......
package chat.rocket.android.chatroom.presentation package chat.rocket.android.chatroom.presentation
import chat.rocket.android.R
import chat.rocket.android.chatroom.viewmodel.MessageViewModelMapper import chat.rocket.android.chatroom.viewmodel.MessageViewModelMapper
import chat.rocket.android.core.lifecycle.CancelStrategy import chat.rocket.android.core.lifecycle.CancelStrategy
import chat.rocket.android.server.domain.* import chat.rocket.android.server.domain.*
...@@ -13,10 +14,7 @@ import chat.rocket.core.internal.realtime.State ...@@ -13,10 +14,7 @@ import chat.rocket.core.internal.realtime.State
import chat.rocket.core.internal.realtime.connect import chat.rocket.core.internal.realtime.connect
import chat.rocket.core.internal.realtime.subscribeRoomMessages import chat.rocket.core.internal.realtime.subscribeRoomMessages
import chat.rocket.core.internal.realtime.unsubscibre import chat.rocket.core.internal.realtime.unsubscibre
import chat.rocket.core.internal.rest.deleteMessage import chat.rocket.core.internal.rest.*
import chat.rocket.core.internal.rest.me
import chat.rocket.core.internal.rest.messages
import chat.rocket.core.internal.rest.sendMessage
import chat.rocket.core.model.Message import chat.rocket.core.model.Message
import chat.rocket.core.model.Value import chat.rocket.core.model.Value
import kotlinx.coroutines.experimental.CommonPool import kotlinx.coroutines.experimental.CommonPool
...@@ -67,11 +65,16 @@ class ChatRoomPresenter @Inject constructor(private val view: ChatRoomView, ...@@ -67,11 +65,16 @@ class ChatRoomPresenter @Inject constructor(private val view: ChatRoomView,
} }
} }
fun sendMessage(chatRoomId: String, text: String) { fun sendMessage(chatRoomId: String, text: String, messageId: String?) {
launchUI(strategy) { launchUI(strategy) {
view.disableMessageInput() view.disableMessageInput()
try { try {
val message = client.sendMessage(chatRoomId, text) val message: Message
if (messageId == null) {
message = client.sendMessage(chatRoomId, text)
} else {
message = client.updateMessage(chatRoomId, messageId, text)
}
// ignore message for now, will receive it on the stream // ignore message for now, will receive it on the stream
view.enableMessageInput(clear = true) view.enableMessageInput(clear = true)
} catch (ex: Exception) { } catch (ex: Exception) {
...@@ -79,8 +82,8 @@ class ChatRoomPresenter @Inject constructor(private val view: ChatRoomView, ...@@ -79,8 +82,8 @@ class ChatRoomPresenter @Inject constructor(private val view: ChatRoomView,
ex.message?.let { ex.message?.let {
view.showMessage(it) view.showMessage(it)
}.ifNull { }.ifNull {
view.showGenericErrorMessage() view.showGenericErrorMessage()
} }
view.enableMessageInput() view.enableMessageInput()
} }
...@@ -192,7 +195,7 @@ class ChatRoomPresenter @Inject constructor(private val view: ChatRoomView, ...@@ -192,7 +195,7 @@ class ChatRoomPresenter @Inject constructor(private val view: ChatRoomView,
is RoomType.Livechat -> "livechat" is RoomType.Livechat -> "livechat"
is RoomType.Custom -> "custom" //TODO: put appropriate callback string here. is RoomType.Custom -> "custom" //TODO: put appropriate callback string here.
} }
view.showReplyStatus("[ ](${serverUrl}/${room}/${roomName}?msg=${id}) ${mention} ", m.message) view.showReplyingAction(user, "[ ](${serverUrl}/${room}/${roomName}?msg=${id}) ${mention} ", m.message)
} }
} }
} }
...@@ -214,6 +217,24 @@ class ChatRoomPresenter @Inject constructor(private val view: ChatRoomView, ...@@ -214,6 +217,24 @@ class ChatRoomPresenter @Inject constructor(private val view: ChatRoomView,
} }
} }
/**
* Update message identified by given id with given text.
*
* @param roomId The id of the room of the message.
* @param messageId The id of the message to update.
* @param text The updated text.
*/
fun editMessage(roomId: String, messageId: String, text: String) {
launchUI(strategy) {
if (!getPermissionsInteractor.isMessageEditingAllowed()) {
coroutineContext.cancel()
view.showMessage(R.string.permission_editing_not_allowed)
return@launchUI
}
view.showEditingAction(roomId, messageId, text)
}
}
private suspend fun listenMessages(roomId: String) { private suspend fun listenMessages(roomId: String) {
launch(CommonPool + strategy.jobs) { launch(CommonPool + strategy.jobs) {
for (message in client.messagesChannel) { for (message in client.messagesChannel) {
......
...@@ -45,10 +45,11 @@ interface ChatRoomView : LoadingView, MessageView { ...@@ -45,10 +45,11 @@ interface ChatRoomView : LoadingView, MessageView {
/** /**
* Show reply status above the message composer. * Show reply status above the message composer.
* *
* @param username The username or name of the user to reply/quote to.
* @param replyMarkdown The markdown of the message reply. * @param replyMarkdown The markdown of the message reply.
* @param quotedMessage The message to quote. * @param quotedMessage The message to quote.
*/ */
fun showReplyStatus(replyMarkdown: String, quotedMessage: String) fun showReplyingAction(username: String, replyMarkdown: String, quotedMessage: String)
/** /**
* Copy message to clipboard. * Copy message to clipboard.
...@@ -57,6 +58,11 @@ interface ChatRoomView : LoadingView, MessageView { ...@@ -57,6 +58,11 @@ interface ChatRoomView : LoadingView, MessageView {
*/ */
fun copyToClipboard(message: String) fun copyToClipboard(message: String)
/**
* Show edit status above the message composer.
*/
fun showEditingAction(roomId: String, messageId: String, text: String)
fun disableMessageInput() fun disableMessageInput()
fun enableMessageInput(clear: Boolean = false) fun enableMessageInput(clear: Boolean = false)
} }
\ No newline at end of file
...@@ -15,38 +15,49 @@ import chat.rocket.android.helper.MessageParser ...@@ -15,38 +15,49 @@ import chat.rocket.android.helper.MessageParser
import chat.rocket.android.util.content import chat.rocket.android.util.content
import ru.noties.markwon.Markwon import ru.noties.markwon.Markwon
class CitationSnackbar : BaseTransientBottomBar<CitationSnackbar> { class ActionSnackbar : BaseTransientBottomBar<ActionSnackbar> {
companion object { companion object {
fun make(parentViewGroup: ViewGroup, content: String): CitationSnackbar { fun make(parentViewGroup: ViewGroup, content: String): ActionSnackbar {
val context = parentViewGroup.context val context = parentViewGroup.context
val view = LayoutInflater.from(context).inflate(R.layout.message_action_bar, parentViewGroup, false) val view = LayoutInflater.from(context).inflate(R.layout.message_action_bar, parentViewGroup, false)
val citationSnackbar = CitationSnackbar(parentViewGroup, view, CallbackImpl(view)) val citationSnackbar = ActionSnackbar(parentViewGroup, view, CallbackImpl(view))
citationSnackbar.textView = view.findViewById(R.id.text_view_action_text) as TextView citationSnackbar.messageTextView = view.findViewById(R.id.text_view_action_text) as TextView
citationSnackbar.titleTextView = view.findViewById(R.id.text_view_action_title) as TextView
citationSnackbar.cancelView = view.findViewById(R.id.image_view_action_cancel_quote) as ImageView citationSnackbar.cancelView = view.findViewById(R.id.image_view_action_cancel_quote) as ImageView
citationSnackbar.duration = BaseTransientBottomBar.LENGTH_INDEFINITE citationSnackbar.duration = BaseTransientBottomBar.LENGTH_INDEFINITE
val spannable = SpannableString(content) val spannable = SpannableString(content)
citationSnackbar.marginDrawable = context.getDrawable(R.drawable.quote) citationSnackbar.marginDrawable = context.getDrawable(R.drawable.quote)
spannable.setSpan(MessageParser.QuoteMarginSpan(citationSnackbar.marginDrawable, 10), 0, content.length, 0) spannable.setSpan(MessageParser.QuoteMarginSpan(citationSnackbar.marginDrawable, 10), 0, content.length, 0)
citationSnackbar.textView.content = spannable citationSnackbar.messageTextView.content = spannable
return citationSnackbar return citationSnackbar
} }
} }
lateinit var cancelView: View lateinit var cancelView: View
private lateinit var textView: TextView private lateinit var messageTextView: TextView
private lateinit var titleTextView: TextView
private lateinit var marginDrawable: Drawable private lateinit var marginDrawable: Drawable
var text: String = "" var text: String = ""
set(value) { set(value) {
val spannable = Markwon.markdown(this.context, value) as Spannable val spannable = Markwon.markdown(this.context, value) as Spannable
spannable.setSpan(MessageParser.QuoteMarginSpan(marginDrawable, 10), 0, spannable.length, 0) spannable.setSpan(MessageParser.QuoteMarginSpan(marginDrawable, 10), 0, spannable.length, 0)
textView.content = spannable messageTextView.content = spannable
}
var title: String = ""
set(value) {
val spannable = Markwon.markdown(this.context, value) as Spannable
spannable.setSpan(MessageParser.QuoteMarginSpan(marginDrawable, 10), 0, spannable.length, 0)
titleTextView.content = spannable
} }
override fun dismiss() { override fun dismiss() {
super.dismiss() super.dismiss()
text = "" text = ""
title = ""
} }
private constructor(parentViewGroup: ViewGroup, content: View, contentViewCallback: BaseTransientBottomBar.ContentViewCallback) : private constructor(parentViewGroup: ViewGroup, content: View, contentViewCallback: BaseTransientBottomBar.ContentViewCallback) :
......
...@@ -114,6 +114,7 @@ class ChatRoomAdapter(private val serverUrl: String, ...@@ -114,6 +114,7 @@ class ChatRoomAdapter(private val serverUrl: String,
R.id.action_menu_msg_quote -> presenter.citeMessage(serverUrl, roomType, roomName, id, "", false) R.id.action_menu_msg_quote -> presenter.citeMessage(serverUrl, roomType, roomName, id, "", false)
R.id.action_menu_msg_reply -> presenter.citeMessage(serverUrl, roomType, roomName, id, "", true) R.id.action_menu_msg_reply -> presenter.citeMessage(serverUrl, roomType, roomName, id, "", true)
R.id.action_menu_msg_copy -> presenter.copyMessage(id) R.id.action_menu_msg_copy -> presenter.copyMessage(id)
R.id.action_menu_msg_edit -> presenter.editMessage(roomId, id, getOriginalMessage())
else -> TODO("Not implemented") else -> TODO("Not implemented")
} }
} }
......
...@@ -49,8 +49,9 @@ class ChatRoomFragment : Fragment(), ChatRoomView { ...@@ -49,8 +49,9 @@ class ChatRoomFragment : Fragment(), ChatRoomView {
private lateinit var chatRoomType: String private lateinit var chatRoomType: String
private var isChatRoomReadOnly: Boolean = false private var isChatRoomReadOnly: Boolean = false
private lateinit var adapter: ChatRoomAdapter private lateinit var adapter: ChatRoomAdapter
private lateinit var citationSnackbar: CitationSnackbar private lateinit var actionSnackbar: ActionSnackbar
private var citation: String? = null private var citation: String? = null
private var editingMessageId: String? = null
override fun onCreate(savedInstanceState: Bundle?) { override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState) super.onCreate(savedInstanceState)
...@@ -73,7 +74,7 @@ class ChatRoomFragment : Fragment(), ChatRoomView { ...@@ -73,7 +74,7 @@ class ChatRoomFragment : Fragment(), ChatRoomView {
super.onViewCreated(view, savedInstanceState) super.onViewCreated(view, savedInstanceState)
presenter.loadMessages(chatRoomId, chatRoomType) presenter.loadMessages(chatRoomId, chatRoomType)
setupComposer() setupComposer()
setupCitationSnackbar() setupActionSnackbar()
} }
override fun onDestroyView() { override fun onDestroyView() {
...@@ -104,7 +105,7 @@ class ChatRoomFragment : Fragment(), ChatRoomView { ...@@ -104,7 +105,7 @@ class ChatRoomFragment : Fragment(), ChatRoomView {
override fun sendMessage(text: String) { override fun sendMessage(text: String) {
if (!text.isBlank()) { if (!text.isBlank()) {
presenter.sendMessage(chatRoomId, text) presenter.sendMessage(chatRoomId, text, editingMessageId)
} }
} }
...@@ -133,11 +134,12 @@ class ChatRoomFragment : Fragment(), ChatRoomView { ...@@ -133,11 +134,12 @@ class ChatRoomFragment : Fragment(), ChatRoomView {
adapter.removeItem(msgId) adapter.removeItem(msgId)
} }
override fun showReplyStatus(replyMarkdown: String, quotedMessage: String) { override fun showReplyingAction(username: String, replyMarkdown: String, quotedMessage: String) {
activity?.apply { activity?.apply {
citation = replyMarkdown citation = replyMarkdown
citationSnackbar.text = quotedMessage actionSnackbar.title = username
citationSnackbar.show() actionSnackbar.text = quotedMessage
actionSnackbar.show()
} }
} }
...@@ -147,6 +149,8 @@ class ChatRoomFragment : Fragment(), ChatRoomView { ...@@ -147,6 +149,8 @@ class ChatRoomFragment : Fragment(), ChatRoomView {
override fun showMessage(message: String) = Toast.makeText(activity, message, Toast.LENGTH_SHORT).show() override fun showMessage(message: String) = Toast.makeText(activity, message, Toast.LENGTH_SHORT).show()
override fun showMessage(resId: Int) = showMessage(getString(resId))
override fun showGenericErrorMessage() = showMessage(getString(R.string.msg_generic_error)) override fun showGenericErrorMessage() = showMessage(getString(R.string.msg_generic_error))
override fun copyToClipboard(message: String) { override fun copyToClipboard(message: String) {
...@@ -156,6 +160,17 @@ class ChatRoomFragment : Fragment(), ChatRoomView { ...@@ -156,6 +160,17 @@ class ChatRoomFragment : Fragment(), ChatRoomView {
} }
} }
override fun showEditingAction(roomId: String, messageId: String, text: String) {
activity?.apply {
actionSnackbar.title = getString(R.string.action_title_editing)
actionSnackbar.text = text
actionSnackbar.show()
text_message.textContent = text
editingMessageId = messageId
}
}
private fun setupComposer() { private fun setupComposer() {
if (isChatRoomReadOnly) { if (isChatRoomReadOnly) {
text_room_is_read_only.setVisible(true) text_room_is_read_only.setVisible(true)
...@@ -165,20 +180,22 @@ class ChatRoomFragment : Fragment(), ChatRoomView { ...@@ -165,20 +180,22 @@ class ChatRoomFragment : Fragment(), ChatRoomView {
var textMessage = citation ?: "" var textMessage = citation ?: ""
textMessage = textMessage + text_message.textContent textMessage = textMessage + text_message.textContent
sendMessage(textMessage) sendMessage(textMessage)
clearCitation() clearActionMessage()
} }
} }
} }
private fun setupCitationSnackbar() { private fun setupActionSnackbar() {
citationSnackbar = CitationSnackbar.make(message_list_container, "") actionSnackbar = ActionSnackbar.make(message_list_container, "")
citationSnackbar.cancelView.setOnClickListener({ actionSnackbar.cancelView.setOnClickListener({
clearCitation() clearActionMessage()
}) })
} }
private fun clearCitation() { private fun clearActionMessage() {
citation = null citation = null
citationSnackbar.dismiss() editingMessageId = null
text_message.text.clear()
actionSnackbar.dismiss()
} }
} }
\ No newline at end of file
...@@ -99,6 +99,8 @@ class ChatRoomsFragment : Fragment(), ChatRoomsView { ...@@ -99,6 +99,8 @@ class ChatRoomsFragment : Fragment(), ChatRoomsView {
override fun hideLoading() = view_loading.setVisible(false) override fun hideLoading() = view_loading.setVisible(false)
override fun showMessage(resId: Int) = showMessage(getString(resId))
override fun showMessage(message: String) = Toast.makeText(activity, message, Toast.LENGTH_SHORT).show() override fun showMessage(message: String) = Toast.makeText(activity, message, Toast.LENGTH_SHORT).show()
override fun showGenericErrorMessage() = showMessage(getString(R.string.msg_generic_error)) override fun showGenericErrorMessage() = showMessage(getString(R.string.msg_generic_error))
......
package chat.rocket.android.core.behaviours package chat.rocket.android.core.behaviours
import android.support.annotation.StringRes
interface MessageView { interface MessageView {
/**
* Show message given by resource id.
*
* @param resId The resource id on strings.xml of the message.
*/
fun showMessage(@StringRes resId: Int)
fun showMessage(message: String) fun showMessage(message: String)
fun showGenericErrorMessage() fun showGenericErrorMessage()
......
...@@ -79,6 +79,8 @@ class ProfileFragment : Fragment(), ProfileView, ActionMode.Callback { ...@@ -79,6 +79,8 @@ class ProfileFragment : Fragment(), ProfileView, ActionMode.Callback {
enableUserInput(true) enableUserInput(true)
} }
override fun showMessage(resId: Int) = showMessage(getString(resId))
override fun showMessage(message: String) = Toast.makeText(activity, message, Toast.LENGTH_SHORT).show() override fun showMessage(message: String) = Toast.makeText(activity, message, Toast.LENGTH_SHORT).show()
override fun showGenericErrorMessage() = showMessage(getString(R.string.msg_generic_error)) override fun showGenericErrorMessage() = showMessage(getString(R.string.msg_generic_error))
......
...@@ -3,7 +3,6 @@ ...@@ -3,7 +3,6 @@
android:shape="rectangle"> android:shape="rectangle">
<solid android:color="@color/darkGray" /> <solid android:color="@color/darkGray" />
<corners android:radius="2dp" />
<size <size
android:width="4dp" android:width="4dp"
android:height="4dp" /> android:height="4dp" />
......
...@@ -7,13 +7,12 @@ ...@@ -7,13 +7,12 @@
android:background="@color/colorPrimary"> android:background="@color/colorPrimary">
<TextView <TextView
android:id="@+id/text_view_quote" android:id="@+id/text_view_action_text"
android:layout_width="0dp" android:layout_width="0dp"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:layout_marginBottom="8dp" android:layout_marginBottom="8dp"
android:layout_marginEnd="8dp" android:layout_marginEnd="8dp"
android:layout_marginStart="8dp" android:layout_marginStart="8dp"
android:layout_marginTop="8dp"
android:ellipsize="end" android:ellipsize="end"
android:maxLines="2" android:maxLines="2"
android:textColor="@color/white" android:textColor="@color/white"
...@@ -21,12 +20,12 @@ ...@@ -21,12 +20,12 @@
android:typeface="normal" android:typeface="normal"
app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent" app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toEndOf="@+id/image_view_cancel_quote" app:layout_constraintStart_toEndOf="@+id/image_view_action_cancel_quote"
app:layout_constraintTop_toTopOf="parent" app:layout_constraintTop_toBottomOf="@+id/text_view_action_title"
tools:text="quoted message" /> tools:text="action text" />
<ImageView <ImageView
android:id="@+id/image_view_cancel_quote" android:id="@+id/image_view_action_cancel_quote"
android:layout_width="wrap_content" android:layout_width="wrap_content"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:layout_marginBottom="8dp" android:layout_marginBottom="8dp"
...@@ -36,4 +35,19 @@ ...@@ -36,4 +35,19 @@
app:layout_constraintStart_toStartOf="parent" app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent" app:layout_constraintTop_toTopOf="parent"
app:srcCompat="@drawable/ic_close_white_24dp" /> app:srcCompat="@drawable/ic_close_white_24dp" />
<TextView
android:id="@+id/text_view_action_title"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_marginEnd="8dp"
android:layout_marginStart="8dp"
android:layout_marginTop="8dp"
android:textColor="@color/colorAccent"
android:textStyle="bold"
app:layout_constraintBottom_toTopOf="@+id/text_view_action_text"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toEndOf="@+id/image_view_action_cancel_quote"
app:layout_constraintTop_toTopOf="parent"
tools:text="Edit message" />
</android.support.constraint.ConstraintLayout> </android.support.constraint.ConstraintLayout>
\ No newline at end of file
...@@ -12,9 +12,10 @@ ...@@ -12,9 +12,10 @@
android:icon="@drawable/ic_quote_black_24px" android:icon="@drawable/ic_quote_black_24px"
android:title="@string/action_msg_quote" /> android:title="@string/action_msg_quote" />
<!--<item--> <item
<!--android:id="@+id/action_menu_msg_edit"--> android:id="@+id/action_menu_msg_edit"
<!--android:title="@string/action_msg_edit" />--> android:icon="@drawable/ic_edit_black_24px"
android:title="@string/action_msg_edit" />
<item <item
android:id="@+id/action_menu_msg_copy" android:id="@+id/action_menu_msg_copy"
...@@ -22,19 +23,19 @@ ...@@ -22,19 +23,19 @@
android:title="@string/action_msg_copy" /> android:title="@string/action_msg_copy" />
<!--<item--> <!--<item-->
<!--android:id="@+id/action_menu_msg_share"--> <!--android:id="@+id/action_menu_msg_share"-->
<!--android:icon="@drawable/ic_share_black_24px"--> <!--android:icon="@drawable/ic_share_black_24px"-->
<!--android:title="@string/action_msg_share" />--> <!--android:title="@string/action_msg_share" />-->
<!--<item--> <!--<item-->
<!--android:id="@+id/action_menu_msg_pin"--> <!--android:id="@+id/action_menu_msg_pin"-->
<!--android:icon="@drawable/ic_pin_black_24dp"--> <!--android:icon="@drawable/ic_pin_black_24dp"-->
<!--android:title="@string/action_msg_pin" />--> <!--android:title="@string/action_msg_pin" />-->
<!--<item--> <!--<item-->
<!--android:id="@+id/action_menu_msg_star"--> <!--android:id="@+id/action_menu_msg_star"-->
<!--android:icon="@drawable/ic_star_black_24px"--> <!--android:icon="@drawable/ic_star_black_24px"-->
<!--android:title="@string/action_msg_star" />--> <!--android:title="@string/action_msg_star" />-->
</group> </group>
<group android:id="@+id/dangerous_actions"> <group android:id="@+id/dangerous_actions">
......
...@@ -65,5 +65,9 @@ ...@@ -65,5 +65,9 @@
<string name="action_msg_pin">Pinar Mensagem</string> <string name="action_msg_pin">Pinar Mensagem</string>
<string name="action_msg_star">Favoritar Mensagem</string> <string name="action_msg_star">Favoritar Mensagem</string>
<string name="action_msg_share">Compartilhar</string> <string name="action_msg_share">Compartilhar</string>
<string name="action_title_editing">Editando Mensagem</string>
<!-- Permission messages -->
<string name="permission_editing_not_allowed">Edição não permitida</string>
</resources> </resources>
\ No newline at end of file
...@@ -67,5 +67,9 @@ ...@@ -67,5 +67,9 @@
<string name="action_msg_pin">Pin Message</string> <string name="action_msg_pin">Pin Message</string>
<string name="action_msg_star">Star Message</string> <string name="action_msg_star">Star Message</string>
<string name="action_msg_share">Share</string> <string name="action_msg_share">Share</string>
<string name="action_title_editing">Editing Message</string>
<!-- Permission messages -->
<string name="permission_editing_not_allowed">Editing not allowed</string>
</resources> </resources>
\ No newline at end of file
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment