Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Submit feedback
Contribute to GitLab
Sign in
Toggle navigation
A
AloqaIM-Android
Project
Project
Details
Activity
Releases
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Issues
0
Issues
0
List
Boards
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Charts
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
Administrator
AloqaIM-Android
Commits
c97f822e
Unverified
Commit
c97f822e
authored
May 16, 2018
by
divyanshu bhargava
Committed by
GitHub
May 16, 2018
Browse files
Options
Browse Files
Download
Plain Diff
Merge pull request #15 from RocketChat/develop
merge
parents
ed432b83
9e70822c
Changes
37
Hide whitespace changes
Inline
Side-by-side
Showing
37 changed files
with
565 additions
and
220 deletions
+565
-220
VersionCheckView.kt
...id/authentication/server/presentation/VersionCheckView.kt
+7
-0
ServerFragment.kt
...rocket/android/authentication/server/ui/ServerFragment.kt
+31
-14
BaseViewHolder.kt
...va/chat/rocket/android/chatroom/adapter/BaseViewHolder.kt
+18
-12
ChatRoomAdapter.kt
...a/chat/rocket/android/chatroom/adapter/ChatRoomAdapter.kt
+26
-12
MessageViewHolder.kt
...chat/rocket/android/chatroom/adapter/MessageViewHolder.kt
+4
-4
ChatRoomPresenter.kt
...rocket/android/chatroom/presentation/ChatRoomPresenter.kt
+105
-12
ChatRoomView.kt
...chat/rocket/android/chatroom/presentation/ChatRoomView.kt
+12
-0
ChatRoomFragment.kt
.../java/chat/rocket/android/chatroom/ui/ChatRoomFragment.kt
+47
-3
ActionListAdapter.kt
...roid/chatroom/ui/bottomsheet/adapter/ActionListAdapter.kt
+9
-3
ViewModelMapper.kt
...chat/rocket/android/chatroom/viewmodel/ViewModelMapper.kt
+2
-0
ChatRoomsPresenter.kt
...cket/android/chatrooms/presentation/ChatRoomsPresenter.kt
+12
-6
ChatRoomsFragment.kt
...ava/chat/rocket/android/chatrooms/ui/ChatRoomsFragment.kt
+2
-5
PinnedMessagesPresenter.kt
...id/pinnedmessages/presentation/PinnedMessagesPresenter.kt
+2
-2
PushManager.kt
app/src/main/java/chat/rocket/android/push/PushManager.kt
+1
-1
PermissionsInteractor.kt
...hat/rocket/android/server/domain/PermissionsInteractor.kt
+8
-3
RefreshSettingsInteractor.kt
...rocket/android/server/domain/RefreshSettingsInteractor.kt
+1
-1
SettingsRepository.kt
...a/chat/rocket/android/server/domain/SettingsRepository.kt
+2
-0
ConnectionManager.kt
...ocket/android/server/infraestructure/ConnectionManager.kt
+1
-1
CheckServerPresenter.kt
...ocket/android/server/presentation/CheckServerPresenter.kt
+19
-16
ic_action_message_copy_24dp.xml
app/src/main/res/drawable/ic_action_message_copy_24dp.xml
+10
-0
ic_action_message_delete_24dp.xml
app/src/main/res/drawable/ic_action_message_delete_24dp.xml
+10
-0
ic_action_message_edit_24dp.xml
app/src/main/res/drawable/ic_action_message_edit_24dp.xml
+8
-7
ic_action_message_pin_24dp.xml
app/src/main/res/drawable/ic_action_message_pin_24dp.xml
+10
-0
ic_action_message_quote_24dp.xml
app/src/main/res/drawable/ic_action_message_quote_24dp.xml
+10
-0
ic_action_message_reply_24dp.xml
app/src/main/res/drawable/ic_action_message_reply_24dp.xml
+10
-0
ic_action_message_star_24dp.xml
app/src/main/res/drawable/ic_action_message_star_24dp.xml
+10
-0
ic_pin_black_24dp.xml
app/src/main/res/drawable/ic_pin_black_24dp.xml
+0
-15
fragment_chat_room.xml
app/src/main/res/layout/fragment_chat_room.xml
+43
-31
fragment_pinned_messages.xml
app/src/main/res/layout/fragment_pinned_messages.xml
+1
-1
item_message.xml
app/src/main/res/layout/item_message.xml
+38
-23
message_actions.xml
app/src/main/res/menu/message_actions.xml
+44
-48
strings.xml
app/src/main/res/values-es/strings.xml
+14
-0
strings.xml
app/src/main/res/values-fr/strings.xml
+15
-0
strings.xml
app/src/main/res/values-hi-rIN/strings.xml
+14
-0
strings.xml
app/src/main/res/values-pt-rBR/strings.xml
+8
-0
strings.xml
app/src/main/res/values-uk-rUA/strings.xml
+3
-0
strings.xml
app/src/main/res/values/strings.xml
+8
-0
No files found.
app/src/main/java/chat/rocket/android/authentication/server/presentation/VersionCheckView.kt
View file @
c97f822e
package
chat.rocket.android.authentication.server.presentation
import
okhttp3.HttpUrl
interface
VersionCheckView
{
/**
* Alerts the user about the server version not meeting the recommended server version.
...
...
@@ -26,4 +28,9 @@ interface VersionCheckView {
* Alters the user this protocol is invalid. This is optional.
*/
fun
errorInvalidProtocol
()
{}
/**
* Updates the server URL after a URL redirection
*/
fun
updateServerUrl
(
url
:
HttpUrl
)
{}
}
\ No newline at end of file
app/src/main/java/chat/rocket/android/authentication/server/ui/ServerFragment.kt
View file @
c97f822e
...
...
@@ -20,6 +20,7 @@ import chat.rocket.android.util.extensions.*
import
chat.rocket.common.util.ifNull
import
dagger.android.support.AndroidSupportInjection
import
kotlinx.android.synthetic.main.fragment_authentication_server.*
import
okhttp3.HttpUrl
import
javax.inject.Inject
class
ServerFragment
:
Fragment
(),
ServerView
{
...
...
@@ -41,6 +42,7 @@ class ServerFragment : Fragment(), ServerView {
}
private
var
protocol
=
"https://"
private
var
ignoreChange
=
false
override
fun
onCreate
(
savedInstanceState
:
Bundle
?)
{
super
.
onCreate
(
savedInstanceState
)
...
...
@@ -72,22 +74,27 @@ class ServerFragment : Fragment(), ServerView {
protocol
=
"https://"
}
1
->
{
ui
{
AlertDialog
.
Builder
(
it
)
.
setTitle
(
R
.
string
.
msg_warning
)
.
setMessage
(
R
.
string
.
msg_http_insecure
)
.
setPositiveButton
(
R
.
string
.
msg_proceed
)
{
_
,
_
->
protocol
=
"http://"
}
.
setNegativeButton
(
R
.
string
.
msg_cancel
)
{
_
,
_
->
text_server_protocol
.
setSelection
(
0
)
}
.
setCancelable
(
false
)
.
create
()
.
show
()
if
(
ignoreChange
)
{
protocol
=
"http://"
}
else
{
ui
{
AlertDialog
.
Builder
(
it
)
.
setTitle
(
R
.
string
.
msg_warning
)
.
setMessage
(
R
.
string
.
msg_http_insecure
)
.
setPositiveButton
(
R
.
string
.
msg_proceed
)
{
_
,
_
->
protocol
=
"http://"
}
.
setNegativeButton
(
R
.
string
.
msg_cancel
)
{
_
,
_
->
text_server_protocol
.
setSelection
(
0
)
}
.
setCancelable
(
false
)
.
create
()
.
show
()
}
}
}
}
ignoreChange
=
false
}
override
fun
onNothingSelected
(
parent
:
AdapterView
<
*
>?)
{
...
...
@@ -174,13 +181,23 @@ class ServerFragment : Fragment(), ServerView {
showMessage
(
R
.
string
.
msg_invalid_server_protocol
)
}
override
fun
updateServerUrl
(
url
:
HttpUrl
)
{
if
(
activity
!=
null
&&
view
!=
null
)
{
if
(
url
.
scheme
()
==
"https"
)
text_server_protocol
.
setSelection
(
0
)
else
text_server_protocol
.
setSelection
(
1
)
protocol
=
"${url.scheme()}://"
val
serverUrl
=
url
.
toString
().
removePrefix
(
"${url.scheme()}://"
)
text_server_url
.
textContent
=
serverUrl
}
}
private
fun
performConnect
()
{
ui
{
deepLinkInfo
?.
let
{
presenter
.
deepLink
(
it
)
}.
ifNull
{
val
url
=
text_server_url
.
textContent
.
ifEmpty
(
text_server_url
.
hintContent
)
presenter
.
connect
(
"$
{protocol}
${url.sanitize()}"
)
presenter
.
connect
(
"$
protocol
${url.sanitize()}"
)
}
}
}
...
...
app/src/main/java/chat/rocket/android/chatroom/adapter/BaseViewHolder.kt
View file @
c97f822e
...
...
@@ -18,13 +18,12 @@ import com.google.android.flexbox.FlexboxLayoutManager
import
ru.whalemare.sheetmenu.extension.inflate
import
ru.whalemare.sheetmenu.extension.toList
abstract
class
BaseViewHolder
<
T
:
BaseViewModel
<*>>(
itemView
:
View
,
private
val
listener
:
ActionsListener
,
var
reactionListener
:
EmojiReactionListener
?
=
null
itemView
:
View
,
private
val
listener
:
ActionsListener
,
var
reactionListener
:
EmojiReactionListener
?
=
null
)
:
RecyclerView
.
ViewHolder
(
itemView
),
MenuItem
.
OnMenuItemClickListener
{
MenuItem
.
OnMenuItemClickListener
{
var
data
:
T
?
=
null
init
{
...
...
@@ -78,14 +77,21 @@ abstract class BaseViewHolder<T : BaseViewModel<*>>(
private
val
onClickListener
=
{
view
:
View
->
if
(
data
?.
message
?.
isSystemMessage
()
==
false
)
{
val
menuItems
=
view
.
context
.
inflate
(
R
.
menu
.
message_actions
).
toList
()
menuItems
.
find
{
it
.
itemId
==
R
.
id
.
action_menu_msg_pin_unpin
}
?.
apply
{
val
isPinned
=
data
?.
message
?.
pinned
?:
false
setTitle
(
if
(
isPinned
)
R
.
string
.
action_msg_unpin
else
R
.
string
.
action_msg_pin
)
isChecked
=
isPinned
data
?.
message
?.
let
{
val
menuItems
=
view
.
context
.
inflate
(
R
.
menu
.
message_actions
).
toList
()
menuItems
.
find
{
it
.
itemId
==
R
.
id
.
action_message_unpin
}
?.
apply
{
setTitle
(
if
(
it
.
pinned
)
R
.
string
.
action_msg_unpin
else
R
.
string
.
action_msg_pin
)
isChecked
=
it
.
pinned
}
menuItems
.
find
{
it
.
itemId
==
R
.
id
.
action_message_star
}
?.
apply
{
val
isStarred
=
it
.
starred
?.
isNotEmpty
()
?:
false
setTitle
(
if
(
isStarred
)
R
.
string
.
action_msg_unstar
else
R
.
string
.
action_msg_star
)
isChecked
=
isStarred
}
val
adapter
=
ActionListAdapter
(
menuItems
,
this
@BaseViewHolder
)
BottomSheetMenu
(
adapter
).
show
(
view
.
context
)
}
val
adapter
=
ActionListAdapter
(
menuItems
,
this
@BaseViewHolder
)
BottomSheetMenu
(
adapter
).
show
(
view
.
context
)
}
}
...
...
app/src/main/java/chat/rocket/android/chatroom/adapter/ChatRoomAdapter.kt
View file @
c97f822e
...
...
@@ -181,25 +181,39 @@ class ChatRoomAdapter(
}
private
val
actionsListener
=
object
:
BaseViewHolder
.
ActionsListener
{
override
fun
isActionsEnabled
():
Boolean
=
enableActions
override
fun
onActionSelected
(
item
:
MenuItem
,
message
:
Message
)
{
message
.
apply
{
when
(
item
.
itemId
)
{
R
.
id
.
action_menu_msg_delete
->
presenter
?.
deleteMessage
(
roomId
,
id
)
R
.
id
.
action_menu_msg_quote
->
presenter
?.
citeMessage
(
roomType
,
id
,
false
)
R
.
id
.
action_menu_msg_reply
->
presenter
?.
citeMessage
(
roomType
,
id
,
true
)
R
.
id
.
action_menu_msg_copy
->
presenter
?.
copyMessage
(
id
)
R
.
id
.
action_menu_msg_edit
->
presenter
?.
editMessage
(
roomId
,
id
,
message
.
message
)
R
.
id
.
action_menu_msg_pin_unpin
->
{
with
(
item
)
{
if
(!
isChecked
)
{
presenter
?.
pinMessage
(
id
)
}
else
{
presenter
?.
unpinMessage
(
id
)
}
R
.
id
.
action_message_reply
->
{
presenter
?.
citeMessage
(
roomType
,
id
,
true
)
}
R
.
id
.
action_message_quote
->
{
presenter
?.
citeMessage
(
roomType
,
id
,
false
)
}
R
.
id
.
action_message_copy
->
{
presenter
?.
copyMessage
(
id
)
}
R
.
id
.
action_message_edit
->
{
presenter
?.
editMessage
(
roomId
,
id
,
message
.
message
)
}
R
.
id
.
action_message_star
->
{
if
(!
item
.
isChecked
)
{
presenter
?.
starMessage
(
id
)
}
else
{
presenter
?.
unstarMessage
(
id
)
}
}
R
.
id
.
action_message_unpin
->
{
if
(!
item
.
isChecked
)
{
presenter
?.
pinMessage
(
id
)
}
else
{
presenter
?.
unpinMessage
(
id
)
}
}
R
.
id
.
action_message_delete
->
presenter
?.
deleteMessage
(
roomId
,
id
)
R
.
id
.
action_menu_msg_react
->
presenter
?.
showReactions
(
id
)
else
->
TODO
(
"Not implemented"
)
}
...
...
app/src/main/java/chat/rocket/android/chatroom/adapter/MessageViewHolder.kt
View file @
c97f822e
...
...
@@ -3,6 +3,7 @@ package chat.rocket.android.chatroom.adapter
import
android.graphics.Color
import
android.text.method.LinkMovementMethod
import
android.view.View
import
androidx.core.view.isVisible
import
chat.rocket.android.chatroom.viewmodel.MessageViewModel
import
chat.rocket.android.util.extensions.setVisible
import
chat.rocket.android.widget.emoji.EmojiReactionListener
...
...
@@ -35,10 +36,9 @@ class MessageViewHolder(
text_content
.
setTextColor
(
if
(
data
.
isTemporary
)
Color
.
GRAY
else
Color
.
BLACK
)
if
(!
data
.
message
.
isSystemMessage
()
&&
data
.
message
.
editedBy
!=
null
){
text_edit_indicator
.
setVisible
(
true
)
}
else
{
text_edit_indicator
.
setVisible
(
false
)
data
.
message
.
let
{
text_edit_indicator
.
isVisible
=
it
.
isSystemMessage
()
&&
it
.
editedBy
!=
null
image_star_indicator
.
isVisible
=
it
.
starred
?.
isNotEmpty
()
?:
false
}
}
}
...
...
app/src/main/java/chat/rocket/android/chatroom/presentation/ChatRoomPresenter.kt
View file @
c97f822e
...
...
@@ -29,6 +29,8 @@ import chat.rocket.common.model.roomTypeOf
import
chat.rocket.common.util.ifNull
import
chat.rocket.core.internal.realtime.setTypingStatus
import
chat.rocket.core.internal.realtime.socket.model.State
import
chat.rocket.core.internal.realtime.subscribeTypingStatus
import
chat.rocket.core.internal.realtime.unsubscribe
import
chat.rocket.core.internal.rest.*
import
chat.rocket.core.model.Command
import
chat.rocket.core.model.Message
...
...
@@ -70,8 +72,11 @@ class ChatRoomPresenter @Inject constructor(
private
var
chatRoomId
:
String
?
=
null
private
var
chatRoomType
:
String
?
=
null
private
val
stateChannel
=
Channel
<
State
>()
private
var
typingStatusSubscriptionId
:
String
?
=
null
private
var
lastState
=
manager
.
state
private
var
typingStatusList
=
arrayListOf
<
String
>()
fun
setupChatRoom
()
{
launchUI
(
strategy
)
{
...
...
@@ -115,6 +120,7 @@ class ChatRoomPresenter @Inject constructor(
view
.
hideLoading
()
}
subscribeTypingStatus
()
if
(
offset
==
0L
)
{
subscribeState
()
}
...
...
@@ -152,6 +158,7 @@ class ChatRoomPresenter @Inject constructor(
groupable
=
false
,
parseUrls
=
false
,
pinned
=
false
,
starred
=
emptyList
(),
mentions
=
emptyList
(),
reactions
=
null
,
senderAlias
=
null
,
...
...
@@ -160,9 +167,24 @@ class ChatRoomPresenter @Inject constructor(
urls
=
null
,
isTemporary
=
true
)
messagesRepository
.
save
(
newMessage
)
view
.
showNewMessage
(
mapper
.
map
(
newMessage
))
client
.
sendMessage
(
id
,
chatRoomId
,
text
)
try
{
val
message
=
client
.
sendMessage
(
id
,
chatRoomId
,
text
)
messagesRepository
.
save
(
newMessage
)
view
.
showNewMessage
(
mapper
.
map
(
newMessage
))
message
}
catch
(
ex
:
Exception
)
{
// Ok, not very beautiful, but the backend sends us a not valid response
// When someone sends a message on a read-only channel, so we just ignore it
// and show a generic error message
// TODO - remove the generic message when we implement :userId:/message subscription
if
(
ex
is
IllegalStateException
)
{
Timber
.
d
(
ex
,
"Probably a read-only problem..."
)
view
.
showGenericErrorMessage
()
}
else
{
// some other error, just rethrow it...
throw
ex
}
}
}
else
{
client
.
updateMessage
(
chatRoomId
,
messageId
,
text
)
}
...
...
@@ -311,14 +333,6 @@ class ChatRoomPresenter @Inject constructor(
}
}
fun
unsubscribeMessages
(
chatRoomId
:
String
)
{
manager
.
removeStatusChannel
(
stateChannel
)
manager
.
unsubscribeRoomMessages
(
chatRoomId
)
// All messages during the subscribed period are assumed to be read,
// and lastSeen is updated as the time when the user leaves the room
markRoomAsRead
(
chatRoomId
)
}
/**
* Delete the message with the given id.
*
...
...
@@ -416,6 +430,34 @@ class ChatRoomPresenter @Inject constructor(
}
}
fun
starMessage
(
messageId
:
String
)
{
launchUI
(
strategy
)
{
if
(!
permissions
.
allowedMessageStarring
())
{
view
.
showMessage
(
R
.
string
.
permission_starring_not_allowed
)
return
@launchUI
}
try
{
retryIO
(
"starMessage($messageId)"
)
{
client
.
starMessage
(
messageId
)
}
}
catch
(
e
:
RocketChatException
)
{
Timber
.
e
(
e
)
}
}
}
fun
unstarMessage
(
messageId
:
String
)
{
launchUI
(
strategy
)
{
if
(!
permissions
.
allowedMessageStarring
())
{
view
.
showMessage
(
R
.
string
.
permission_starring_not_allowed
)
return
@launchUI
}
try
{
retryIO
(
"unstarMessage($messageId)"
)
{
client
.
unstarMessage
(
messageId
)
}
}
catch
(
e
:
RocketChatException
)
{
Timber
.
e
(
e
)
}
}
}
fun
pinMessage
(
messageId
:
String
)
{
launchUI
(
strategy
)
{
if
(!
permissions
.
allowedMessagePinning
())
{
...
...
@@ -636,6 +678,57 @@ class ChatRoomPresenter @Inject constructor(
}
}
fun
disconnect
()
{
unsubscribeTypingStatus
()
if
(
chatRoomId
!=
null
)
{
unsubscribeMessages
(
chatRoomId
.
toString
())
}
}
private
suspend
fun
subscribeTypingStatus
()
{
client
.
subscribeTypingStatus
(
chatRoomId
.
toString
())
{
_
,
id
->
typingStatusSubscriptionId
=
id
}
for
(
typingStatus
in
client
.
typingStatusChannel
)
{
processTypingStatus
(
typingStatus
)
}
}
private
fun
processTypingStatus
(
typingStatus
:
Pair
<
String
,
Boolean
>)
{
if
(!
typingStatusList
.
any
{
username
->
username
==
typingStatus
.
first
})
{
if
(
typingStatus
.
second
)
{
typingStatusList
.
add
(
typingStatus
.
first
)
}
}
else
{
typingStatusList
.
find
{
username
->
username
==
typingStatus
.
first
}
?.
let
{
typingStatusList
.
remove
(
it
)
if
(
typingStatus
.
second
)
{
typingStatusList
.
add
(
typingStatus
.
first
)
}
}
}
if
(
typingStatusList
.
isNotEmpty
())
{
view
.
showTypingStatus
(
typingStatusList
)
}
else
{
view
.
hideTypingStatusView
()
}
}
private
fun
unsubscribeTypingStatus
()
{
typingStatusSubscriptionId
?.
let
{
client
.
unsubscribe
(
it
)
}
}
private
fun
unsubscribeMessages
(
chatRoomId
:
String
)
{
manager
.
removeStatusChannel
(
stateChannel
)
manager
.
unsubscribeRoomMessages
(
chatRoomId
)
// All messages during the subscribed period are assumed to be read,
// and lastSeen is updated as the time when the user leaves the room
markRoomAsRead
(
chatRoomId
)
}
private
fun
updateMessage
(
streamedMessage
:
Message
)
{
launchUI
(
strategy
)
{
val
viewModelStreamedMessage
=
mapper
.
map
(
streamedMessage
)
...
...
@@ -652,4 +745,4 @@ class ChatRoomPresenter @Inject constructor(
}
}
}
}
}
\ No newline at end of file
app/src/main/java/chat/rocket/android/chatroom/presentation/ChatRoomView.kt
View file @
c97f822e
...
...
@@ -25,6 +25,18 @@ interface ChatRoomView : LoadingView, MessageView {
*/
fun
sendMessage
(
text
:
String
)
/**
* Shows the username(s) of the user(s) who is/are typing in the chat room.
*
* @param usernameList The list of username to show.
*/
fun
showTypingStatus
(
usernameList
:
ArrayList
<
String
>)
/**
* Hides the typing status view.
*/
fun
hideTypingStatusView
()
/**
* Perform file selection with the mime type [filter]
*/
...
...
app/src/main/java/chat/rocket/android/chatroom/ui/ChatRoomFragment.kt
View file @
c97f822e
...
...
@@ -13,7 +13,10 @@ import android.support.v4.app.Fragment
import
android.support.v7.widget.DefaultItemAnimator
import
android.support.v7.widget.LinearLayoutManager
import
android.support.v7.widget.RecyclerView
import
android.text.SpannableStringBuilder
import
android.view.*
import
androidx.core.text.bold
import
androidx.core.view.isVisible
import
chat.rocket.android.R
import
chat.rocket.android.chatroom.adapter.*
import
chat.rocket.android.chatroom.presentation.ChatRoomPresenter
...
...
@@ -94,8 +97,18 @@ class ChatRoomFragment : Fragment(), ChatRoomView, EmojiKeyboardListener, EmojiR
private
var
playComposeMessageButtonsAnimation
=
true
// For reveal and unreveal anim.
private
val
hypotenuse
by
lazy
{
Math
.
hypot
(
root_layout
.
width
.
toDouble
(),
root_layout
.
height
.
toDouble
()).
toFloat
()
}
private
val
max
by
lazy
{
Math
.
max
(
layout_message_attachment_options
.
width
.
toDouble
(),
layout_message_attachment_options
.
height
.
toDouble
()).
toFloat
()
}
private
val
hypotenuse
by
lazy
{
Math
.
hypot
(
root_layout
.
width
.
toDouble
(),
root_layout
.
height
.
toDouble
()
).
toFloat
()
}
private
val
max
by
lazy
{
Math
.
max
(
layout_message_attachment_options
.
width
.
toDouble
(),
layout_message_attachment_options
.
height
.
toDouble
()
).
toFloat
()
}
private
val
centerX
by
lazy
{
recycler_view
.
right
}
private
val
centerY
by
lazy
{
recycler_view
.
bottom
}
private
val
handler
=
Handler
()
...
...
@@ -155,7 +168,7 @@ class ChatRoomFragment : Fragment(), ChatRoomView, EmojiKeyboardListener, EmojiR
recycler_view
.
removeOnScrollListener
(
onScrollListener
)
recycler_view
.
removeOnLayoutChangeListener
(
layoutChangeListener
)
presenter
.
unsubscribeMessages
(
chatRoomId
)
presenter
.
disconnect
(
)
handler
.
removeCallbacksAndMessages
(
null
)
unsubscribeComposeTextMessage
()
...
...
@@ -319,6 +332,37 @@ class ChatRoomFragment : Fragment(), ChatRoomView, EmojiKeyboardListener, EmojiR
}
}
override
fun
showTypingStatus
(
usernameList
:
ArrayList
<
String
>)
{
ui
{
when
(
usernameList
.
size
)
{
1
->
{
text_typing_status
.
text
=
SpannableStringBuilder
()
.
bold
{
append
(
usernameList
[
0
])
}
.
append
(
getString
(
R
.
string
.
msg_is_typing
))
}
2
->
{
text_typing_status
.
text
=
SpannableStringBuilder
()
.
bold
{
append
(
usernameList
[
0
])
}
.
append
(
getString
(
R
.
string
.
msg_and
))
.
bold
{
append
(
usernameList
[
1
])
}
.
append
(
getString
(
R
.
string
.
msg_are_typing
))
}
else
->
{
text_typing_status
.
text
=
getString
(
R
.
string
.
msg_several_users_are_typing
)
}
}
text_typing_status
.
isVisible
=
true
}
}
override
fun
hideTypingStatusView
()
{
ui
{
text_typing_status
.
isVisible
=
false
}
}
override
fun
uploadFile
(
uri
:
Uri
)
{
// TODO Just leaving a blank message that comes with the file for now. In the future lets add the possibility to add a message with the file to be uploaded.
presenter
.
uploadFile
(
chatRoomId
,
uri
,
""
)
...
...
app/src/main/java/chat/rocket/android/chatroom/ui/bottomsheet/adapter/ActionListAdapter.kt
View file @
c97f822e
...
...
@@ -7,8 +7,10 @@ import chat.rocket.android.util.extensions.setVisible
/**
* An adapter for bottomsheet menu that lists all the actions that could be taken over a chat message.
*/
class
ActionListAdapter
(
menuItems
:
List
<
MenuItem
>
=
emptyList
(),
callback
:
MenuItem
.
OnMenuItemClickListener
)
:
ListBottomSheetAdapter
(
menuItems
=
menuItems
,
callback
=
callback
)
{
class
ActionListAdapter
(
menuItems
:
List
<
MenuItem
>
=
emptyList
(),
callback
:
MenuItem
.
OnMenuItemClickListener
)
:
ListBottomSheetAdapter
(
menuItems
=
menuItems
,
callback
=
callback
)
{
override
fun
onBindViewHolder
(
holder
:
ViewHolder
,
position
:
Int
)
{
val
item
=
menuItems
[
position
]
...
...
@@ -25,7 +27,11 @@ class ActionListAdapter(menuItems: List<MenuItem> = emptyList(), callback: MenuI
callback
?.
onMenuItemClick
(
item
)
}
val
deleteTextColor
=
holder
.
itemView
.
context
.
resources
.
getColor
(
R
.
color
.
red
)
val
color
=
if
(
item
.
itemId
==
R
.
id
.
action_menu_msg_delete
)
deleteTextColor
else
textColors
.
get
(
item
.
itemId
)
val
color
=
if
(
item
.
itemId
==
R
.
id
.
action_message_delete
)
{
deleteTextColor
}
else
{
textColors
.
get
(
item
.
itemId
)
}
holder
.
textTitle
.
setTextColor
(
color
)
}
}
\ No newline at end of file
app/src/main/java/chat/rocket/android/chatroom/viewmodel/ViewModelMapper.kt
View file @
c97f822e
...
...
@@ -325,6 +325,8 @@ class ViewModelMapper @Inject constructor(
is
MessageType
.
MessagePinned
->
context
.
getString
(
R
.
string
.
message_pinned
)
is
MessageType
.
UserMuted
->
context
.
getString
(
R
.
string
.
message_muted
,
message
.
message
,
message
.
sender
?.
username
)
is
MessageType
.
UserUnMuted
->
context
.
getString
(
R
.
string
.
message_unmuted
,
message
.
message
,
message
.
sender
?.
username
)
is
MessageType
.
SubscriptionRoleAdded
->
context
.
getString
(
R
.
string
.
message_role_add
,
message
.
message
,
message
.
role
,
message
.
sender
?.
username
)
is
MessageType
.
SubscriptionRoleRemoved
->
context
.
getString
(
R
.
string
.
message_role_removed
,
message
.
message
,
message
.
role
,
message
.
sender
?.
username
)
else
->
{
throw
InvalidParameterException
(
"Invalid message type: ${message.type}"
)
}
...
...
app/src/main/java/chat/rocket/android/chatrooms/presentation/ChatRoomsPresenter.kt
View file @
c97f822e
...
...
@@ -211,7 +211,8 @@ class ChatRoomsPresenter @Inject constructor(
userMentions
=
null
,
groupMentions
=
0L
,
lastMessage
=
null
,
client
=
client
client
=
client
,
broadcast
=
false
)
}
}
...
...
@@ -244,7 +245,8 @@ class ChatRoomsPresenter @Inject constructor(
userMentions
=
null
,
groupMentions
=
0L
,
lastMessage
=
it
.
lastMessage
,
client
=
client
client
=
client
,
broadcast
=
it
.
broadcast
)
}
}
...
...
@@ -335,7 +337,8 @@ class ChatRoomsPresenter @Inject constructor(
userMentions
=
it
.
userMentions
,
groupMentions
=
it
.
groupMentions
,
lastMessage
=
it
.
lastMessage
,
client
=
client
client
=
client
,
broadcast
=
it
.
broadcast
)
chatRoomsList
.
add
(
newRoom
)
}
...
...
@@ -478,7 +481,8 @@ class ChatRoomsPresenter @Inject constructor(
userMentions
=
userMentions
,
groupMentions
=
groupMentions
,
lastMessage
=
room
.
lastMessage
,
client
=
client
client
=
client
,
broadcast
=
broadcast
)
removeRoom
(
room
.
id
,
chatRooms
)
chatRooms
.
add
(
newRoom
)
...
...
@@ -517,7 +521,8 @@ class ChatRoomsPresenter @Inject constructor(
userMentions
=
subscription
.
userMentions
,
groupMentions
=
subscription
.
groupMentions
,
lastMessage
=
lastMessage
,
client
=
client
client
=
client
,
broadcast
=
broadcast
)
removeRoom
(
subscription
.
roomId
,
chatRooms
)
chatRooms
.
add
(
newRoom
)
...
...
@@ -591,7 +596,8 @@ class ChatRoomsPresenter @Inject constructor(
userMentions
=
it
.
userMentions
,
groupMentions
=
it
.
groupMentions
,
lastMessage
=
it
.
lastMessage
,
client
=
client
client
=
client
,
broadcast
=
it
.
broadcast
)
getChatRoomsInteractor
.
remove
(
currentServer
,
it
)
...
...
app/src/main/java/chat/rocket/android/chatrooms/ui/ChatRoomsFragment.kt
View file @
c97f822e
...
...
@@ -14,6 +14,7 @@ import android.support.v7.widget.SearchView
import
android.view.*
import
android.widget.CheckBox
import
android.widget.RadioGroup
import
androidx.core.view.isVisible
import
chat.rocket.android.R
import
chat.rocket.android.chatrooms.presentation.ChatRoomsPresenter
import
chat.rocket.android.chatrooms.presentation.ChatRoomsView
...
...
@@ -166,11 +167,7 @@ class ChatRoomsFragment : Fragment(), ChatRoomsView {
/*val diff = async(CommonPool) {
DiffUtil.calculateDiff(RoomsDiffCallback(adapter.baseAdapter.dataSet, newDataSet))
}.await()*/
if
(
newDataSet
.
isEmpty
())
{
text_no_search
.
visibility
=
View
.
VISIBLE
}
else
{
text_no_search
.
visibility
=
View
.
GONE
}
text_no_search
.
isVisible
=
newDataSet
.
isEmpty
()
if
(
isActive
)
{
adapter
.
baseAdapter
.
updateRooms
(
newDataSet
)
// TODO - fix crash to re-enable diff.dispatchUpdatesTo(adapter)
...
...
app/src/main/java/chat/rocket/android/pinnedmessages/presentation/PinnedMessagesPresenter.kt
View file @
c97f822e
...
...
@@ -8,7 +8,7 @@ import chat.rocket.android.server.infraestructure.RocketChatClientFactory
import
chat.rocket.android.util.extensions.launchUI
import
chat.rocket.common.RocketChatException
import
chat.rocket.common.util.ifNull
import
chat.rocket.core.internal.rest.get
Room
PinnedMessages
import
chat.rocket.core.internal.rest.getPinnedMessages
import
chat.rocket.core.model.isSystemMessage
import
timber.log.Timber
import
javax.inject.Inject
...
...
@@ -37,7 +37,7 @@ class PinnedMessagesPresenter @Inject constructor(
chatRoom
?.
let
{
room
->
view
.
showLoading
()
val
pinnedMessages
=
client
.
get
Room
PinnedMessages
(
roomId
,
room
.
type
,
pinnedMessagesListOffset
)
client
.
getPinnedMessages
(
roomId
,
room
.
type
,
pinnedMessagesListOffset
)
pinnedMessagesListOffset
=
pinnedMessages
.
offset
.
toInt
()
val
messageList
=
mapper
.
map
(
pinnedMessages
.
result
.
filterNot
{
it
.
isSystemMessage
()
})
view
.
showPinnedMessages
(
messageList
)
...
...
app/src/main/java/chat/rocket/android/push/PushManager.kt
View file @
c97f822e
...
...
@@ -291,7 +291,7 @@ class PushManager @Inject constructor(
.
setLabel
(
replyTextHint
)
.
build
()
val
pendingIntent
=
getReplyPendingIntent
(
pushMessage
)
val
replyAction
=
NotificationCompat
.
Action
.
Builder
(
R
.
drawable
.
ic_
reply_black_24px
,
replyTextHint
,
pendingIntent
)
val
replyAction
=
NotificationCompat
.
Action
.
Builder
(
R
.
drawable
.
ic_
action_message_reply_24dp
,
replyTextHint
,
pendingIntent
)
.
addRemoteInput
(
replyRemoteInput
)
.
setAllowGeneratedReplies
(
true
)
.
build
()
...
...
app/src/main/java/chat/rocket/android/server/domain/PermissionsInteractor.kt
View file @
c97f822e
...
...
@@ -32,20 +32,25 @@ class PermissionsInteractor @Inject constructor(
}
/**
* Check whether user is allowed to delete a message.
* Check whether
the
user is allowed to delete a message.
*/
fun
allowedMessageDeleting
()
=
publicSettings
()
?.
allowedMessageDeleting
()
?:
false
/**
* Checks whether user is allowed to edit a message.
* Checks whether
the
user is allowed to edit a message.
*/
fun
allowedMessageEditing
()
=
publicSettings
()
?.
allowedMessageEditing
()
?:
false
/**
* Checks whether user is allowed to pin a message to a channel.
* Checks whether
the
user is allowed to pin a message to a channel.
*/
fun
allowedMessagePinning
()
=
publicSettings
()
?.
allowedMessagePinning
()
?:
false
/**
* Checks whether the user is allowed to star a message.
*/
fun
allowedMessageStarring
()
=
publicSettings
()
?.
allowedMessageStarring
()
?:
false
/**
* Checks whether should show deleted message status.
*/
...
...
app/src/main/java/chat/rocket/android/server/domain/RefreshSettingsInteractor.kt
View file @
c97f822e
...
...
@@ -24,7 +24,7 @@ class RefreshSettingsInteractor @Inject constructor(
FAVORITE_ROOMS
,
UPLOAD_STORAGE_TYPE
,
UPLOAD_MAX_FILE_SIZE
,
UPLOAD_WHITELIST_MIMETYPES
,
HIDE_USER_JOIN
,
HIDE_USER_LEAVE
,
HIDE_TYPE_AU
,
HIDE_MUTE_UNMUTE
,
HIDE_TYPE_RU
,
ALLOW_MESSAGE_DELETING
,
ALLOW_MESSAGE_EDITING
,
ALLOW_MESSAGE_PINNING
,
SHOW_DELETED_STATUS
,
SHOW_EDITED_STATUS
,
ALLOW_MESSAGE_EDITING
,
ALLOW_MESSAGE_PINNING
,
ALLOW_MESSAGE_STARRING
,
SHOW_DELETED_STATUS
,
SHOW_EDITED_STATUS
,
WIDE_TILE_310
,
STORE_LAST_MESSAGE
)
suspend
fun
refresh
(
server
:
String
)
{
...
...
app/src/main/java/chat/rocket/android/server/domain/SettingsRepository.kt
View file @
c97f822e
...
...
@@ -49,6 +49,7 @@ const val ALLOW_MESSAGE_EDITING = "Message_AllowEditing"
const
val
SHOW_DELETED_STATUS
=
"Message_ShowDeletedStatus"
const
val
SHOW_EDITED_STATUS
=
"Message_ShowEditedStatus"
const
val
ALLOW_MESSAGE_PINNING
=
"Message_AllowPinning"
const
val
ALLOW_MESSAGE_STARRING
=
"Message_AllowStarring"
const
val
STORE_LAST_MESSAGE
=
"Store_Last_Message"
/*
...
...
@@ -83,6 +84,7 @@ fun PublicSettings.wideTile(): String? = this[WIDE_TILE_310]?.value as String?
fun
PublicSettings
.
showDeletedStatus
():
Boolean
=
this
[
SHOW_DELETED_STATUS
]
?.
value
==
true
fun
PublicSettings
.
showEditedStatus
():
Boolean
=
this
[
SHOW_EDITED_STATUS
]
?.
value
==
true
fun
PublicSettings
.
allowedMessagePinning
():
Boolean
=
this
[
ALLOW_MESSAGE_PINNING
]
?.
value
==
true
fun
PublicSettings
.
allowedMessageStarring
():
Boolean
=
this
[
ALLOW_MESSAGE_STARRING
]
?.
value
==
true
fun
PublicSettings
.
allowedMessageEditing
():
Boolean
=
this
[
ALLOW_MESSAGE_EDITING
]
?.
value
==
true
fun
PublicSettings
.
allowedMessageDeleting
():
Boolean
=
this
[
ALLOW_MESSAGE_DELETING
]
?.
value
==
true
...
...
app/src/main/java/chat/rocket/android/server/infraestructure/ConnectionManager.kt
View file @
c97f822e
...
...
@@ -110,7 +110,6 @@ class ConnectionManager(internal val client: RocketChatClient) {
Timber
.
d
(
"Received new Message for room ${message.roomId}"
)
val
channel
=
roomMessagesChannels
[
message
.
roomId
]
channel
?.
send
(
message
)
}
}
...
...
@@ -131,6 +130,7 @@ class ConnectionManager(internal val client: RocketChatClient) {
}
}
}
client
.
connect
()
// Broadcast initial state...
...
...
app/src/main/java/chat/rocket/android/server/presentation/CheckServerPresenter.kt
View file @
c97f822e
...
...
@@ -8,6 +8,7 @@ import chat.rocket.android.util.VersionInfo
import
chat.rocket.android.util.extensions.launchUI
import
chat.rocket.android.util.retryIO
import
chat.rocket.common.RocketChatInvalidProtocolException
import
chat.rocket.common.model.ServerInfo
import
chat.rocket.core.RocketChatClient
import
chat.rocket.core.internal.rest.serverInfo
import
kotlinx.coroutines.experimental.Deferred
...
...
@@ -26,7 +27,13 @@ abstract class CheckServerPresenter constructor(private val strategy: CancelStra
try
{
currentServer
=
serverUrl
client
=
factory
.
create
(
currentServer
)
val
version
=
checkServerVersion
(
serverUrl
).
await
()
val
serverInfo
=
retryIO
(
description
=
"serverInfo"
,
times
=
5
)
{
client
.
serverInfo
()
}
if
(
serverInfo
.
redirected
)
{
view
.
updateServerUrl
(
serverInfo
.
url
)
}
val
version
=
checkServerVersion
(
serverInfo
)
when
(
version
)
{
is
Version
.
VersionOk
->
{
Timber
.
i
(
"Your version is nice! (Requires: 0.62.0, Yours: ${version.version})"
)
...
...
@@ -55,23 +62,19 @@ abstract class CheckServerPresenter constructor(private val strategy: CancelStra
}
}
internal
fun
checkServerVersion
(
serverUrl
:
String
):
Deferred
<
Version
>
{
currentServer
=
serverUrl
return
async
{
val
serverInfo
=
retryIO
(
description
=
"serverInfo"
,
times
=
5
)
{
client
.
serverInfo
()
}
val
thisServerVersion
=
serverInfo
.
version
val
isRequiredVersion
=
isRequiredServerVersion
(
thisServerVersion
)
val
isRecommendedVersion
=
isRecommendedServerVersion
(
thisServerVersion
)
if
(
isRequiredVersion
)
{
if
(
isRecommendedVersion
)
{
Timber
.
i
(
"Your version is nice! (Requires: 0.62.0, Yours: $thisServerVersion)"
)
return
@async
Version
.
VersionOk
(
thisServerVersion
)
}
else
{
return
@async
Version
.
RecommendedVersionWarning
(
thisServerVersion
)
}
private
fun
checkServerVersion
(
serverInfo
:
ServerInfo
):
Version
{
val
thisServerVersion
=
serverInfo
.
version
val
isRequiredVersion
=
isRequiredServerVersion
(
thisServerVersion
)
val
isRecommendedVersion
=
isRecommendedServerVersion
(
thisServerVersion
)
return
if
(
isRequiredVersion
)
{
if
(
isRecommendedVersion
)
{
Timber
.
i
(
"Your version is nice! (Requires: 0.62.0, Yours: $thisServerVersion)"
)
Version
.
VersionOk
(
thisServerVersion
)
}
else
{
return
@async
Version
.
OutOfDateError
(
thisServerVersion
)
Version
.
RecommendedVersionWarning
(
thisServerVersion
)
}
}
else
{
Version
.
OutOfDateError
(
thisServerVersion
)
}
}
...
...
app/src/main/res/drawable/ic_
content_copy_black_24px
.xml
→
app/src/main/res/drawable/ic_
action_message_copy_24dp
.xml
View file @
c97f822e
<vector
xmlns:android=
"http://schemas.android.com/apk/res/android"
android:width=
"24dp"
android:height=
"24dp"
android:viewportWidth=
"24.0"
android:viewportHeight=
"24.0"
>
<path
android:pathData=
"M16,1L4,1c-1.1,0 -2,0.9 -2,2v14h2L4,3h12L16,1zM19,5L8,5c-1.1,0 -2,0.9 -2,2v14c0,1.1 0.9,2 2,2h11c1.1,0 2,-0.9 2,-2L21,7c0,-1.1 -0.9,-2 -2,-2zM19,21L8,21L8,7h11v14z"
android:fillColor=
"@color/actionMenuColor"
/>
</vector>
android:width=
"24dp"
android:height=
"24dp"
android:viewportHeight=
"24.0"
android:viewportWidth=
"24.0"
>
<path
android:fillColor=
"@color/actionMenuColor"
android:pathData=
"M16,1L4,1c-1.1,0 -2,0.9 -2,2v14h2L4,3h12L16,1zM19,5L8,5c-1.1,0 -2,0.9 -2,2v14c0,1.1 0.9,2 2,2h11c1.1,0 2,-0.9 2,-2L21,7c0,-1.1 -0.9,-2 -2,-2zM19,21L8,21L8,7h11v14z"
/>
</vector>
\ No newline at end of file
app/src/main/res/drawable/ic_
delete_black_24px
.xml
→
app/src/main/res/drawable/ic_
action_message_delete_24dp
.xml
View file @
c97f822e
<vector
xmlns:android=
"http://schemas.android.com/apk/res/android"
android:width=
"24dp"
android:height=
"24dp"
android:viewportWidth=
"24.0"
android:viewportHeight=
"24.0"
>
android:width=
"24dp"
android:height=
"24dp"
android:viewportHeight=
"24.0"
android:viewportWidth=
"24.0"
>
<path
android:
pathData=
"M6,19c0,1.1 0.9,2 2,2h8c1.1,0 2,-0.9 2,-2V7H6v12zM19,4h-3.5l-1,-1h-5l-1,1H5v2h14V4z
"
android:
fillColor=
"#FF0000"
/>
android:
fillColor=
"#FF0000
"
android:
pathData=
"M6,19c0,1.1 0.9,2 2,2h8c1.1,0 2,-0.9 2,-2V7H6v12zM19,4h-3.5l-1,-1h-5l-1,1H5v2h14V4z"
/>
</vector>
app/src/main/res/drawable/ic_
edit_black_24px
.xml
→
app/src/main/res/drawable/ic_
action_message_edit_24dp
.xml
View file @
c97f822e
<vector
xmlns:android=
"http://schemas.android.com/apk/res/android"
android:width=
"24dp"
android:height=
"24dp"
android:viewportWidth=
"24.0"
android:viewportHeight=
"24.0"
>
android:width=
"24dp"
android:height=
"24dp"
android:viewportHeight=
"24.0"
android:viewportWidth=
"24.0"
>
<path
android:
pathData=
"M3,17.25V21h3.75L17.81,9.94l-3.75,-3.75L3,17.25zM20.71,7.04c0.39,-0.39 0.39,-1.02 0,-1.41l-2.34,-2.34c-0.39,-0.39 -1.02,-0.39 -1.41,0l-1.83,1.83 3.75,3.75 1.83,-1.83z
"
android:
fillColor=
"@color/actionMenuColor"
/>
</vector>
android:
fillColor=
"@color/actionMenuColor
"
android:
pathData=
"M3,17.25V21h3.75L17.81,9.94l-3.75,-3.75L3,17.25zM20.71,7.04c0.39,-0.39 0.39,-1.02 0,-1.41l-2.34,-2.34c-0.39,-0.39 -1.02,-0.39 -1.41,0l-1.83,1.83 3.75,3.75 1.83,-1.83z"
/>
</vector>
\ No newline at end of file
app/src/main/res/drawable/ic_action_message_pin_24dp.xml
0 → 100644
View file @
c97f822e
<vector
xmlns:android=
"http://schemas.android.com/apk/res/android"
android:width=
"24dp"
android:height=
"24dp"
android:viewportHeight=
"24"
android:viewportWidth=
"24"
>
<path
android:fillColor=
"@color/actionMenuColor"
android:pathData=
"M16,12V4H17V2H7V4H8V12L6,14V16H11.2V22H12.8V16H18V14L16,12Z"
/>
</vector>
\ No newline at end of file
app/src/main/res/drawable/ic_
quote_black_24px
.xml
→
app/src/main/res/drawable/ic_
action_message_quote_24dp
.xml
View file @
c97f822e
<vector
xmlns:android=
"http://schemas.android.com/apk/res/android"
android:width=
"24dp"
android:height=
"24dp"
android:viewportWidth=
"24.0"
android:viewportHeight=
"24.0"
>
android:width=
"24dp"
android:height=
"24dp"
android:viewportHeight=
"24.0"
android:viewportWidth=
"24.0"
>
<path
android:
pathData=
"M6,17h3l2,-4L11,7L5,7v6h3zM14,17h3l2,-4L19,7h-6v6h3z
"
android:
fillColor=
"@color/actionMenuColor"
/>
</vector>
android:
fillColor=
"@color/actionMenuColor
"
android:
pathData=
"M6,17h3l2,-4L11,7L5,7v6h3zM14,17h3l2,-4L19,7h-6v6h3z"
/>
</vector>
\ No newline at end of file
app/src/main/res/drawable/ic_
reply_black_24px
.xml
→
app/src/main/res/drawable/ic_
action_message_reply_24dp
.xml
View file @
c97f822e
<vector
xmlns:android=
"http://schemas.android.com/apk/res/android"
android:width=
"24dp"
android:height=
"24dp"
android:viewportWidth=
"24.0"
android:viewportHeight=
"24.0"
>
android:width=
"24dp"
android:height=
"24dp"
android:viewportHeight=
"24.0"
android:viewportWidth=
"24.0"
>
<path
android:
pathData=
"M10,9V5l-7,7 7,7v-4.1c5,0 8.5,1.6 11,5.1 -1,-5 -4,-10 -11,-11z
"
android:
fillColor=
"@color/actionMenuColor"
/>
</vector>
android:
fillColor=
"@color/actionMenuColor
"
android:
pathData=
"M10,9V5l-7,7 7,7v-4.1c5,0 8.5,1.6 11,5.1 -1,-5 -4,-10 -11,-11z"
/>
</vector>
\ No newline at end of file
app/src/main/res/drawable/ic_
star_black_24px
.xml
→
app/src/main/res/drawable/ic_
action_message_star_24dp
.xml
View file @
c97f822e
<vector
xmlns:android=
"http://schemas.android.com/apk/res/android"
android:width=
"24dp"
android:height=
"24dp"
android:viewportWidth=
"24.0"
android:viewportHeight=
"24.0"
>
android:width=
"24dp"
android:height=
"24dp"
android:viewportHeight=
"24.0"
android:viewportWidth=
"24.0"
>
<path
android:
pathData=
"M12,17.27L18.18,21l-1.64,-7.03L22,9.24l-7.19,-0.61L12,2 9.19,8.63 2,9.24l5.46,4.73L5.82,21z
"
android:
fillColor=
"@color/actionMenuColor"
/>
</vector>
android:
fillColor=
"@color/actionMenuColor
"
android:
pathData=
"M12,17.27L18.18,21l-1.64,-7.03L22,9.24l-7.19,-0.61L12,2 9.19,8.63 2,9.24l5.46,4.73L5.82,21z"
/>
</vector>
\ No newline at end of file
app/src/main/res/drawable/ic_pin_black_24dp.xml
deleted
100644 → 0
View file @
ed432b83
<?xml version="1.0" encoding="utf-8"?>
<vector
xmlns:android=
"http://schemas.android.com/apk/res/android"
android:viewportWidth=
"197.218"
android:viewportHeight=
"197.218"
android:width=
"197.218dp"
android:height=
"197.218dp"
>
<group
android:translateX=
"-570.396"
android:translateY=
"-306.782"
>
<path
android:pathData=
"M704.445 306.782l-6.785 6.785c-6.084 6.084 -7.622 14.712 -4.309 21.871l-44.068 35.44 -3.086 -3.086c-7.889 -7.889 -19.525 -7.889 -27.414 0l-8.944 8.953 87.821 87.811 8.934 -8.933c7.899 -7.899 7.899 -19.525 0 -27.433l-3.076 -3.077 36.051 -44.68c6.824 2.466 14.367 1.036 20.037 -4.624l8.008 -5.858 -63.169 -63.169zm-66.867 116.487l-67.182 66.857 0 13.874 13.864 0 66.867 -67.182 -13.549 -13.549z"
android:fillColor=
"@color/actionMenuColor"
/>
</group>
</vector>
\ No newline at end of file
app/src/main/res/layout/fragment_chat_room.xml
View file @
c97f822e
<?xml version="1.0" encoding="utf-8"?>
<android.support.constraint.ConstraintLayout
xmlns:android=
"http://schemas.android.com/apk/res/android"
<android.support.constraint.ConstraintLayout
xmlns:android=
"http://schemas.android.com/apk/res/android"
xmlns:app=
"http://schemas.android.com/apk/res-auto"
xmlns:tools=
"http://schemas.android.com/tools"
android:id=
"@+id/root_layout"
...
...
@@ -12,23 +11,23 @@
android:id=
"@+id/view_loading"
android:layout_width=
"wrap_content"
android:layout_height=
"wrap_content"
app:layout_constraintStart_toStartOf=
"parent"
app:layout_constraintEnd_toEndOf=
"parent"
app:layout_constraintTop_toTopOf=
"parent"
app:layout_constraintBottom_toBottomOf=
"parent"
android:visibility=
"gone"
app:indicatorColor=
"@color/black"
app:indicatorName=
"BallPulseIndicator"
app:layout_constraintBottom_toBottomOf=
"parent"
app:layout_constraintEnd_toEndOf=
"parent"
app:layout_constraintStart_toStartOf=
"parent"
app:layout_constraintTop_toTopOf=
"parent"
tools:visibility=
"visible"
/>
<FrameLayout
android:id=
"@+id/message_list_container"
android:layout_width=
"0dp"
android:layout_height=
"0dp"
app:layout_constraint
Start_toStartOf=
"parent
"
app:layout_constraint
Bottom_toTopOf=
"@id/text_typing_status
"
app:layout_constraintEnd_toEndOf=
"parent"
app:layout_constraint
Top_toTop
Of=
"parent"
app:layout_constraint
Bottom_toTopOf=
"@id/layout_message_composer
"
>
app:layout_constraint
Start_toStart
Of=
"parent"
app:layout_constraint
Top_toTopOf=
"parent
"
>
<include
android:id=
"@+id/layout_message_list"
...
...
@@ -44,52 +43,65 @@
android:layout_height=
"100dp"
android:src=
"@drawable/ic_chat_black_24dp"
android:tint=
"@color/icon_grey"
app:layout_constraintStart_toStartOf=
"parent"
android:visibility=
"gone"
app:layout_constraintBottom_toTopOf=
"@id/text_chat_title"
app:layout_constraintEnd_toEndOf=
"parent"
app:layout_constraintStart_toStartOf=
"parent"
app:layout_constraintTop_toTopOf=
"parent"
app:layout_constraintBottom_toTopOf=
"@id/text_chat_title"
app:layout_constraintVertical_chainStyle=
"packed"
android:visibility=
"gone"
tools:visibility=
"visible"
/>
<TextView
android:id=
"@+id/text_chat_title"
android:layout_width=
"wrap_content"
android:layout_height=
"wrap_content"
android:layout_marginTop=
"24dp"
android:text=
"@string/msg_no_chat_title"
app:layout_constraintStart_toStartOf=
"parent"
app:layout_constraintEnd_toEndOf=
"parent"
app:layout_constraintTop_toBottomOf=
"@id/image_chat_icon"
app:layout_constraintBottom_toTopOf=
"@id/text_chat_description"
android:textColor=
"@color/colorSecondaryText"
android:textSize=
"20sp"
android:layout_marginTop=
"24dp"
android:textStyle=
"bold"
android:textColor=
"@color/colorSecondaryText"
android:visibility=
"gone"
tools:visibility=
"visible"
/>
app:layout_constraintBottom_toTopOf=
"@id/text_chat_description"
app:layout_constraintEnd_toEndOf=
"parent"
app:layout_constraintStart_toStartOf=
"parent"
app:layout_constraintTop_toBottomOf=
"@id/image_chat_icon"
tools:visibility=
"visible"
/>
<TextView
android:id=
"@+id/text_chat_description"
android:layout_width=
"wrap_content"
android:layout_height=
"wrap_content"
android:text=
"@string/msg_no_chat_description"
app:layout_constraintStart_toStartOf=
"parent"
app:layout_constraintEnd_toEndOf=
"parent"
app:layout_constraintTop_toBottomOf=
"@id/text_chat_title"
app:layout_constraintBottom_toTopOf=
"@id/layout_message_composer"
android:layout_marginTop=
"16dp"
android:text=
"@string/msg_no_chat_description"
android:textAlignment=
"center"
android:textSize=
"16sp"
android:textColor=
"@color/colorSecondaryTextLight"
android:textSize=
"16sp"
android:visibility=
"gone"
tools:visibility=
"visible"
/>
app:layout_constraintBottom_toTopOf=
"@id/layout_message_composer"
app:layout_constraintEnd_toEndOf=
"parent"
app:layout_constraintStart_toStartOf=
"parent"
app:layout_constraintTop_toBottomOf=
"@id/text_chat_title"
tools:visibility=
"visible"
/>
<chat.rocket.android.widget.autocompletion.ui.SuggestionsView
android:id=
"@+id/suggestions_view"
android:layout_width=
"match_parent"
android:layout_height=
"wrap_content"
android:background=
"@color/suggestion_background_color"
app:layout_constraintBottom_toTopOf=
"@id/layout_message_composer"
/>
<TextView
android:id=
"@+id/text_typing_status"
android:layout_width=
"match_parent"
android:layout_height=
"wrap_content"
android:layout_marginBottom=
"5dp"
android:layout_marginEnd=
"16dp"
android:layout_marginStart=
"16dp"
android:layout_marginTop=
"16dp"
android:maxLines=
"2"
android:visibility=
"gone"
app:layout_constraintBottom_toTopOf=
"@id/layout_message_composer"
a
ndroid:background=
"@color/suggestion_background_color
"
/>
a
pp:layout_constraintEnd_toStartOf=
"parent
"
/>
<include
android:id=
"@+id/layout_message_composer"
...
...
@@ -102,18 +114,18 @@
android:id=
"@+id/view_dim"
android:layout_width=
"match_parent"
android:layout_height=
"match_parent"
app:layout_constraintBottom_toTopOf=
"@id/layout_message_composer"
android:background=
"@color/colorDim"
android:visibility=
"gone"
/>
android:visibility=
"gone"
app:layout_constraintBottom_toTopOf=
"@id/layout_message_composer"
/>
<include
android:id=
"@+id/layout_message_attachment_options"
layout=
"@layout/message_attachment_options"
android:layout_width=
"match_parent"
android:layout_height=
"wrap_content"
app:layout_constraintBottom_toTopOf=
"@id/layout_message_composer"
android:layout_margin=
"5dp"
android:visibility=
"gone"
/>
android:visibility=
"gone"
app:layout_constraintBottom_toTopOf=
"@id/layout_message_composer"
/>
<TextView
android:id=
"@+id/connection_status_text"
...
...
app/src/main/res/layout/fragment_pinned_messages.xml
View file @
c97f822e
...
...
@@ -36,7 +36,7 @@
android:id=
"@+id/iv_pin_icon"
android:layout_width=
"100dp"
android:layout_height=
"100dp"
android:src=
"@drawable/ic_
pin_black
_24dp"
android:src=
"@drawable/ic_
action_message_pin
_24dp"
android:tint=
"@color/icon_grey"
app:layout_constraintStart_toStartOf=
"parent"
app:layout_constraintEnd_toEndOf=
"parent"
...
...
app/src/main/res/layout/item_message.xml
View file @
c97f822e
...
...
@@ -7,11 +7,11 @@
android:layout_height=
"wrap_content"
android:background=
"?android:attr/selectableItemBackground"
android:clickable=
"true"
android:paddingStart=
"@dimen/screen_edge_left_and_right_padding"
android:paddingEnd=
"@dimen/screen_edge_left_and_right_padding"
android:paddingTop=
"@dimen/message_item_top_and_bottom_padding"
android:focusable=
"true"
android:paddingBottom=
"@dimen/message_item_top_and_bottom_padding"
android:focusable=
"true"
>
android:paddingEnd=
"@dimen/screen_edge_left_and_right_padding"
android:paddingStart=
"@dimen/screen_edge_left_and_right_padding"
android:paddingTop=
"@dimen/message_item_top_and_bottom_padding"
>
<include
android:id=
"@+id/layout_avatar"
...
...
@@ -20,36 +20,39 @@
android:layout_height=
"40dp"
android:layout_marginTop=
"5dp"
app:layout_constraintLeft_toLeftOf=
"parent"
app:layout_constraintTop_toBottomOf=
"@id/new_messages_notif"
/>
app:layout_constraintTop_toBottomOf=
"@
+
id/new_messages_notif"
/>
<LinearLayout
android:id=
"@+id/new_messages_notif"
tools:visibility=
"visible"
android:visibility=
"gone"
android:orientation=
"horizontal"
android:layout_width=
"match_parent"
android:layout_height=
"wrap_content"
android:orientation=
"horizontal"
android:visibility=
"gone"
app:layout_constraintEnd_toEndOf=
"parent"
app:layout_constraintTop_toTopOf=
"parent"
>
app:layout_constraintTop_toTopOf=
"parent"
tools:visibility=
"visible"
>
<View
android:layout_gravity=
"center"
android:layout_height=
"1dp"
android:layout_width=
"0dp"
android:layout_weight=
"1"
android:layout_height=
"1dp"
android:layout_gravity=
"center"
android:layout_marginEnd=
"4dp"
android:background=
"@color/red"
/>
android:layout_weight=
"1"
android:background=
"@color/red"
/>
<TextView
android:layout_width=
"wrap_content"
android:text=
"@string/msg_unread_messages"
android:layout_height=
"wrap_content"
android:text=
"@string/msg_unread_messages"
android:textColor=
"@color/red"
/>
<View
android:layout_gravity=
"center"
android:layout_height=
"1dp"
android:layout_width=
"0dp"
android:layout_weight=
"1"
android:layout_height=
"1dp"
android:layout_gravity=
"center"
android:layout_marginStart=
"4dp"
android:background=
"@color/red"
/>
android:layout_weight=
"1"
android:background=
"@color/red"
/>
</LinearLayout>
<LinearLayout
...
...
@@ -58,8 +61,8 @@
android:layout_height=
"wrap_content"
android:layout_marginStart=
"16dp"
android:orientation=
"horizontal"
app:layout_constraint
Top_toBottomOf=
"@id/new_messages_notif
"
app:layout_constraint
Left_toRightOf=
"@+id/layout_avatar
"
>
app:layout_constraint
Left_toRightOf=
"@+id/layout_avatar
"
app:layout_constraint
Top_toBottomOf=
"@+id/new_messages_notif
"
>
<TextView
android:id=
"@+id/text_sender"
...
...
@@ -80,11 +83,22 @@
android:id=
"@+id/text_edit_indicator"
android:layout_width=
"wrap_content"
android:layout_height=
"wrap_content"
android:text=
"@string/msg_edited"
android:layout_marginStart=
"8dp"
android:text=
"@string/msg_edited"
android:textStyle=
"italic"
android:visibility=
"gone"
tools:visibility=
"visible"
/>
<ImageView
android:id=
"@+id/image_star_indicator"
android:layout_width=
"14dp"
android:layout_height=
"14dp"
android:layout_gravity=
"center_vertical"
android:layout_marginStart=
"8dp"
android:layout_marginTop=
"2dp"
android:src=
"@drawable/ic_action_message_star_24dp"
android:visibility=
"gone"
tools:visibility=
"visible"
/>
</LinearLayout>
<TextView
...
...
@@ -94,12 +108,13 @@
android:layout_height=
"wrap_content"
android:layout_marginBottom=
"2dp"
android:layout_marginTop=
"5dp"
app:layout_constraintLeft_toLeftOf=
"@id/top_container"
app:layout_constraintLeft_toLeftOf=
"@
+
id/top_container"
app:layout_constraintRight_toRightOf=
"parent"
app:layout_constraintTop_toBottomOf=
"@+id/top_container"
tools:text=
"This is a multiline chat message from Bertie that will take more than just one line of text. I have sure that everything is amazing!"
/>
<include
layout=
"@layout/layout_reactions"
<include
layout=
"@layout/layout_reactions"
android:layout_width=
"0dp"
android:layout_height=
"wrap_content"
app:layout_constraintEnd_toEndOf=
"@+id/text_content"
...
...
app/src/main/res/menu/message_actions.xml
View file @
c97f822e
<?xml version="1.0" encoding="utf-8"?>
<menu
xmlns:android=
"http://schemas.android.com/apk/res/android"
>
<group
android:id=
"@+id/common_actions"
>
<item
android:id=
"@+id/action_menu_msg_reply"
android:icon=
"@drawable/ic_reply_black_24px"
android:title=
"@string/action_msg_reply"
/>
<item
android:id=
"@+id/action_menu_msg_quote"
android:icon=
"@drawable/ic_quote_black_24px"
android:title=
"@string/action_msg_quote"
/>
<item
android:id=
"@+id/action_menu_msg_edit"
android:icon=
"@drawable/ic_edit_black_24px"
android:title=
"@string/action_msg_edit"
/>
<item
android:id=
"@+id/action_menu_msg_copy"
android:icon=
"@drawable/ic_content_copy_black_24px"
android:title=
"@string/action_msg_copy"
/>
<item
android:id=
"@+id/action_menu_msg_react"
android:icon=
"@drawable/ic_add_reaction"
android:title=
"@string/action_msg_add_reaction"
/>
<!--<item-->
<!--android:id="@+id/action_menu_msg_share"-->
<!--andrtextIconicon="@drawable/ic_share_black_24px"-->
<!--android:title="@string/action_msg_share" />-->
<item
android:id=
"@+id/action_menu_msg_pin_unpin"
android:icon=
"@drawable/ic_pin_black_24dp"
android:title=
"@string/action_msg_pin"
/>
<!--<item-->
<!--android:id="@+id/action_menu_msg_star"-->
<!--andrtextIconicon="@drawable/ic_star_black_24px"-->
<!--android:title="@string/action_msg_star" />-->
</group>
<group
android:id=
"@+id/dangerous_actions"
>
<item
android:id=
"@+id/action_menu_msg_delete"
android:icon=
"@drawable/ic_delete_black_24px"
android:title=
"@string/action_msg_delete"
/>
</group>
<item
android:id=
"@+id/action_message_reply"
android:icon=
"@drawable/ic_action_message_reply_24dp"
android:title=
"@string/action_msg_reply"
/>
<item
android:id=
"@+id/action_message_quote"
android:icon=
"@drawable/ic_action_message_quote_24dp"
android:title=
"@string/action_msg_quote"
/>
<item
android:id=
"@+id/action_message_copy"
android:icon=
"@drawable/ic_action_message_copy_24dp"
android:title=
"@string/action_msg_copy"
/>
<item
android:id=
"@+id/action_menu_msg_react"
android:icon=
"@drawable/ic_add_reaction"
android:title=
"@string/action_msg_add_reaction"
/>
<!--<item-->
<!--android:id="@+id/action_menu_msg_share"-->
<!--andrtextIconicon="@drawable/ic_share_black_24px"-->
<!--android:title="@string/action_msg_share" />-->
<item
android:id=
"@+id/action_message_star"
android:icon=
"@drawable/ic_action_message_star_24dp"
android:title=
"@string/action_msg_star"
/>
<item
android:id=
"@+id/action_message_unpin"
android:icon=
"@drawable/ic_action_message_pin_24dp"
android:title=
"@string/action_msg_pin"
/>
<item
android:id=
"@+id/action_message_edit"
android:icon=
"@drawable/ic_action_message_edit_24dp"
android:title=
"@string/action_msg_edit"
/>
<item
android:id=
"@+id/action_message_delete"
android:icon=
"@drawable/ic_action_message_delete_24dp"
android:title=
"@string/action_msg_delete"
/>
</menu>
\ No newline at end of file
app/src/main/res/values-es/strings.xml
View file @
c97f822e
...
...
@@ -111,6 +111,14 @@
<string
name=
"msg_no_chat_title"
>
Sin mensajes de chat
</string>
<string
name=
"msg_no_chat_description"
>
Comience a conversar para ver\nsus mensajes aquí.
</string>
<string
name=
"msg_edited"
>
(editado)
</string>
// TODO: Add proper translation.
<string
name=
"msg_and"
>
\u0020and\u0020
</string>
// TODO: Add proper translation.
<string
name=
"msg_is_typing"
>
\u0020is typing…
</string>
// TODO: Add proper translation.
<string
name=
"msg_are_typing"
>
\u0020are typing…
</string>
// TODO: Add proper translation.
<string
name=
"msg_several_users_are_typing"
>
Several users are typing…
</string>
<string
name=
"msg_no_search_found"
>
No se han encontrado resultados
</string>
<!-- System messages -->
...
...
@@ -124,6 +132,8 @@
<string
name=
"message_pinned"
>
Fijado una mensaje:
</string>
<string
name=
"message_muted"
>
Usuario %1$s silenciado por %2$s
</string>
<string
name=
"message_unmuted"
>
Usuario %1$s no silenciado por %2$s
</string>
<string
name=
"message_role_add"
>
%1$s fue establecido %2$s por %3$s
</string>
<string
name=
"message_role_removed"
>
%1$s ya no es %2$s por %3$s
</string>
<!-- Message actions -->
<string
name=
"action_msg_reply"
>
Respuesta
</string>
...
...
@@ -134,6 +144,8 @@
<string
name=
"action_msg_pin"
>
Fijar mensaje
</string>
<string
name=
"action_msg_unpin"
>
Soltar mensaje
</string>
<string
name=
"action_msg_star"
>
Star mensaje
</string>
// TODO: Add proper translation.
<string
name=
"action_msg_unstar"
>
Unstar Message
</string>
<string
name=
"action_msg_share"
>
Compartir
</string>
<string
name=
"action_title_editing"
>
Edición de mensaje
</string>
<string
name=
"action_msg_add_reaction"
>
Añadir una reacción
</string>
...
...
@@ -142,6 +154,8 @@
<string
name=
"permission_editing_not_allowed"
>
La edición no és permitida
</string>
<string
name=
"permission_deleting_not_allowed"
>
Eliminar no és permitido
</string>
<string
name=
"permission_pinning_not_allowed"
>
Fijar no és permitido
</string>
// TODO: Add proper translation.
<string
name=
"permission_starring_not_allowed"
>
Starring is not allowed
</string>
<!-- Members List -->
<string
name=
"title_members_list"
>
Lista de miembros
</string>
...
...
app/src/main/res/values-fr/strings.xml
View file @
c97f822e
...
...
@@ -111,6 +111,14 @@
<string
name=
"msg_no_chat_title"
>
Aucun message de discussion
</string>
<string
name=
"msg_no_chat_description"
>
Commencez à converser pour voir\nvos messages ici.
</string>
<string
name=
"msg_edited"
>
(édité)
</string>
// TODO: Add proper translation.
<string
name=
"msg_and"
>
\u0020and\u0020
</string>
// TODO: Add proper translation.
<string
name=
"msg_is_typing"
>
\u0020is typing…
</string>
// TODO: Add proper translation.
<string
name=
"msg_are_typing"
>
\u0020are typing…
</string>
// TODO: Add proper translation.
<string
name=
"msg_several_users_are_typing"
>
Several users are typing…
</string>
<string
name=
"msg_no_search_found"
>
Aucun résultat trouvé
</string>
<!-- System messages -->
...
...
@@ -124,6 +132,8 @@
<string
name=
"message_pinned"
>
Épinglé un message:
</string>
<string
name=
"message_muted"
>
Utilisateur %1$s mis en sourdine par %2$s
</string>
<string
name=
"message_unmuted"
>
Utilisateur %1$s non muté par %2$s
</string>
<string
name=
"message_role_add"
>
%1$s a été défini %2$s par %3$s
</string>
<string
name=
"message_role_removed"
>
%1$s is no longer %2$s par %3$s
</string>
<!-- Message actions -->
<string
name=
"action_msg_reply"
>
Répondre
</string>
...
...
@@ -133,7 +143,10 @@
<string
name=
"action_msg_delete"
>
Effacer
</string>
<string
name=
"action_msg_pin"
>
Épingle message
</string>
<string
name=
"action_msg_unpin"
>
Enlever message
</string>
// TODO: Add proper translation.
<string
name=
"action_msg_star"
>
Star message
</string>
// TODO: Add proper translation.
<string
name=
"action_msg_unstar"
>
Unstar Message
</string>
<string
name=
"action_msg_share"
>
Partager
</string>
<string
name=
"action_title_editing"
>
Modification du message
</string>
<string
name=
"action_msg_add_reaction"
>
Ajouter une réaction
</string>
...
...
@@ -142,6 +155,8 @@
<string
name=
"permission_editing_not_allowed"
>
L\'édition n\'est pas autorisée
</string>
<string
name=
"permission_deleting_not_allowed"
>
La suppression n\'est pas autorisée
</string>
<string
name=
"permission_pinning_not_allowed"
>
L\'épinglage n\'est pas autorisé
</string>
// TODO: Add proper translation.
<string
name=
"permission_starring_not_allowed"
>
Starring is not allowed
</string>
<!-- Members List -->
<string
name=
"title_members_list"
>
Liste des membres
</string>
...
...
app/src/main/res/values-hi-rIN/strings.xml
View file @
c97f822e
...
...
@@ -113,6 +113,14 @@
<string
name=
"msg_no_chat_title"
>
कोई चैट संदेश नहीं
</string>
<string
name=
"msg_no_chat_description"
>
यहां अपने संदेश देखने के लिए\nबातचीत शुरू करें।
</string>
<string
name=
"msg_edited"
>
(संपादित)
</string>
// TODO: Add proper translation.
<string
name=
"msg_and"
>
\u0020and\u0020
</string>
// TODO: Add proper translation.
<string
name=
"msg_is_typing"
>
\u0020is typing…
</string>
// TODO: Add proper translation.
<string
name=
"msg_are_typing"
>
\u0020are typing…
</string>
// TODO: Add proper translation.
<string
name=
"msg_several_users_are_typing"
>
Several users are typing…
</string>
<string
name=
"msg_no_search_found"
>
कोई परिणाम नहीं मिला
</string>
<!-- System messages -->
...
...
@@ -126,6 +134,8 @@
<string
name=
"message_pinned"
>
एक संदेश पिन किया:
</string>
<string
name=
"message_muted"
>
उपयोगकर्ता %1$s %2$s द्वारा म्यूट किया गया
</string>
<string
name=
"message_unmuted"
>
उपयोगकर्ता %1$s %2$s द्वारा अनम्यूट किया गया
</string>
<string
name=
"message_role_add"
>
%1$s %3$s द्वारा %2$s सेट किया गया था
</string>
<string
name=
"message_role_removed"
>
%1$s अब %3$s द्वारा %2$s नहीं है
</string>
<!-- Message actions -->
<string
name=
"action_msg_reply"
>
जवाब दें
</string>
...
...
@@ -136,6 +146,8 @@
<string
name=
"action_msg_pin"
>
संदेश को पिन करें
</string>
<string
name=
"action_msg_unpin"
>
संदेश को पिन से हटाएँ
</string>
<string
name=
"action_msg_star"
>
संदेश को स्टार करें
</string>
// TODO: Add proper translation.
<string
name=
"action_msg_unstar"
>
Unstar Message
</string>
<string
name=
"action_msg_share"
>
शेयर करें
</string>
<string
name=
"action_title_editing"
>
संपादन संदेश
</string>
<string
name=
"action_msg_add_reaction"
>
प्रतिक्रिया जोड़ें
</string>
...
...
@@ -144,6 +156,8 @@
<string
name=
"permission_editing_not_allowed"
>
संपादन की अनुमति नहीं है
</string>
<string
name=
"permission_deleting_not_allowed"
>
हटाने की अनुमति नहीं है
</string>
<string
name=
"permission_pinning_not_allowed"
>
पिनि करने की अनुमति नहीं है
</string>
// TODO: Add proper translation.
<string
name=
"permission_starring_not_allowed"
>
Starring is not allowed
</string>
<!-- Members List -->
<string
name=
"title_members_list"
>
सदस्यों की सूची
</string>
...
...
app/src/main/res/values-pt-rBR/strings.xml
View file @
c97f822e
...
...
@@ -107,6 +107,10 @@
<string
name=
"msg_image_saved_successfully"
>
Imagem salva na galeria
</string>
<string
name=
"msg_image_saved_failed"
>
Falha ao salvar a imagem
</string>
<string
name=
"msg_edited"
>
(editado)
</string>
<string
name=
"msg_and"
>
\u0020e\u0020
</string>
<string
name=
"msg_is_typing"
>
\u0020está digitando…
</string>
<string
name=
"msg_are_typing"
>
\u0020estão digitando…
</string>
<string
name=
"msg_several_users_are_typing"
>
Vários usuários estão digitando…
</string>
<string
name=
"msg_no_search_found"
>
nenhum resultado encontrado
</string>
<!-- System messages -->
...
...
@@ -120,6 +124,8 @@
<string
name=
"message_pinned"
>
Pinou uma mensagem:
</string>
<string
name=
"message_muted"
>
Usuário %1$s entrou no modo mudo por %2$s
</string>
<string
name=
"message_unmuted"
>
Usuário %1$s saiu do modo mudo por %2$s
</string>
<string
name=
"message_role_add"
>
%1$s foi definido %2$s por %3$s
</string>
<string
name=
"message_role_removed"
>
%1$s não é mais %2$s por %3$s
</string>
<!-- Message actions -->
<string
name=
"action_msg_reply"
>
Responder
</string>
...
...
@@ -130,6 +136,7 @@
<string
name=
"action_msg_pin"
>
Pinar mensagem
</string>
<string
name=
"action_msg_unpin"
>
Despinar mensagem
</string>
<string
name=
"action_msg_star"
>
Favoritar mensagem
</string>
<string
name=
"action_msg_unstar"
>
Desfavoritar messagem
</string>
<string
name=
"action_msg_share"
>
Compartilhar
</string>
<string
name=
"action_title_editing"
>
Editando mensagem
</string>
<string
name=
"action_msg_add_reaction"
>
Adicionar reação
</string>
...
...
@@ -138,6 +145,7 @@
<string
name=
"permission_editing_not_allowed"
>
Edição não permitida
</string>
<string
name=
"permission_deleting_not_allowed"
>
Remoção não permitida
</string>
<string
name=
"permission_pinning_not_allowed"
>
Pinagem não permitida
</string>
<string
name=
"permission_starring_not_allowed"
>
Favoritar não permitido
</string>
<!-- Members List -->
<string
name=
"title_members_list"
>
Lista de Membros
</string>
...
...
app/src/main/res/values-uk-rUA/strings.xml
View file @
c97f822e
...
...
@@ -131,6 +131,7 @@
<string
name=
"action_msg_pin"
>
Pin Message
</string>
<string
name=
"action_msg_unpin"
>
Unpin Message
</string>
<string
name=
"action_msg_star"
>
Star Message
</string>
<string
name=
"action_msg_unstar"
>
Unstar Message
</string>
<string
name=
"action_msg_share"
>
Share
</string>
<string
name=
"action_title_editing"
>
Editing Message
</string>
<string
name=
"action_msg_add_reaction"
>
Add reaction
</string>
...
...
@@ -139,6 +140,8 @@
<string
name=
"permission_editing_not_allowed"
>
Editing is not allowed
</string>
<string
name=
"permission_deleting_not_allowed"
>
Deleting is not allowed
</string>
<string
name=
"permission_pinning_not_allowed"
>
Pinning is not allowed
</string>
// TODO: Add proper translation.
<string
name=
"permission_starring_not_allowed"
>
Starring is not allowed
</string>
<!-- Members List -->
<string
name=
"title_members_list"
>
Members List
</string>
...
...
app/src/main/res/values/strings.xml
View file @
c97f822e
...
...
@@ -108,6 +108,10 @@
<string
name=
"msg_image_saved_successfully"
>
Image has been saved to gallery
</string>
<string
name=
"msg_image_saved_failed"
>
Failed to save image
</string>
<string
name=
"msg_edited"
>
(edited)
</string>
<string
name=
"msg_and"
>
\u0020and\u0020
</string>
<string
name=
"msg_is_typing"
>
\u0020is typing…
</string>
<string
name=
"msg_are_typing"
>
\u0020are typing…
</string>
<string
name=
"msg_several_users_are_typing"
>
Several users are typing…
</string>
<string
name=
"msg_no_search_found"
>
No result found
</string>
<!-- System messages -->
...
...
@@ -121,6 +125,8 @@
<string
name=
"message_pinned"
>
Pinned a message:
</string>
<string
name=
"message_muted"
>
User %1$s muted by %2$s
</string>
<string
name=
"message_unmuted"
>
User %1$s unmuted by %2$s
</string>
<string
name=
"message_role_add"
>
%1$s was set %2$s by %3$s
</string>
<string
name=
"message_role_removed"
>
%1$s is no longer %2$s by %3$s
</string>
<!-- Message actions -->
<string
name=
"action_msg_reply"
>
Reply
</string>
...
...
@@ -131,6 +137,7 @@
<string
name=
"action_msg_pin"
>
Pin Message
</string>
<string
name=
"action_msg_unpin"
>
Unpin Message
</string>
<string
name=
"action_msg_star"
>
Star Message
</string>
<string
name=
"action_msg_unstar"
>
Unstar Message
</string>
<string
name=
"action_msg_share"
>
Share
</string>
<string
name=
"action_title_editing"
>
Editing Message
</string>
<string
name=
"action_msg_add_reaction"
>
Add reaction
</string>
...
...
@@ -139,6 +146,7 @@
<string
name=
"permission_editing_not_allowed"
>
Editing is not allowed
</string>
<string
name=
"permission_deleting_not_allowed"
>
Deleting is not allowed
</string>
<string
name=
"permission_pinning_not_allowed"
>
Pinning is not allowed
</string>
<string
name=
"permission_starring_not_allowed"
>
Starring is not allowed
</string>
<!-- Members List -->
<string
name=
"title_members_list"
>
Members List
</string>
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment