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
91f8ec46
Commit
91f8ec46
authored
Oct 29, 2018
by
Leonardo Aramaki
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
Add message action menu item to copy permalink from tapped message
parent
2bd72661
Changes
24
Show whitespace changes
Inline
Side-by-side
Showing
24 changed files
with
233 additions
and
107 deletions
+233
-107
ChatRoomAdapter.kt
...a/chat/rocket/android/chatroom/adapter/ChatRoomAdapter.kt
+5
-1
ChatRoomPresenter.kt
...rocket/android/chatroom/presentation/ChatRoomPresenter.kt
+55
-1
ChatRoomFragment.kt
.../java/chat/rocket/android/chatroom/ui/ChatRoomFragment.kt
+4
-1
MessageActionsBottomSheet.kt
...roid/chatroom/ui/bottomsheet/MessageActionsBottomSheet.kt
+1
-1
ActionsAttachmentUiModel.kt
...cket/android/chatroom/uimodel/ActionsAttachmentUiModel.kt
+2
-1
AudioAttachmentUiModel.kt
...rocket/android/chatroom/uimodel/AudioAttachmentUiModel.kt
+15
-14
AuthorAttachmentUiModel.kt
...ocket/android/chatroom/uimodel/AuthorAttachmentUiModel.kt
+1
-1
BaseUiModel.kt
.../java/chat/rocket/android/chatroom/uimodel/BaseUiModel.kt
+1
-0
ColorAttachmentUiModel.kt
...rocket/android/chatroom/uimodel/ColorAttachmentUiModel.kt
+2
-1
GenericFileAttachmentUiModel.kt
.../android/chatroom/uimodel/GenericFileAttachmentUiModel.kt
+2
-1
ImageAttachmentUiModel.kt
...rocket/android/chatroom/uimodel/ImageAttachmentUiModel.kt
+2
-1
MessageAttachmentUiModel.kt
...cket/android/chatroom/uimodel/MessageAttachmentUiModel.kt
+2
-1
MessageReplyUiModel.kt
...at/rocket/android/chatroom/uimodel/MessageReplyUiModel.kt
+2
-1
MessageUiModel.kt
...va/chat/rocket/android/chatroom/uimodel/MessageUiModel.kt
+2
-1
UiModelMapper.kt
...ava/chat/rocket/android/chatroom/uimodel/UiModelMapper.kt
+90
-50
UrlPreviewUiModel.kt
...chat/rocket/android/chatroom/uimodel/UrlPreviewUiModel.kt
+2
-1
VideoAttachmentUiModel.kt
...rocket/android/chatroom/uimodel/VideoAttachmentUiModel.kt
+15
-14
ChatRoomSuggestionUiModel.kt
.../chatroom/uimodel/suggestion/ChatRoomSuggestionUiModel.kt
+6
-4
CommandSuggestionUiModel.kt
...d/chatroom/uimodel/suggestion/CommandSuggestionUiModel.kt
+5
-3
PeopleSuggestionUiModel.kt
...id/chatroom/uimodel/suggestion/PeopleSuggestionUiModel.kt
+9
-7
MessageHelper.kt
...src/main/java/chat/rocket/android/helper/MessageHelper.kt
+3
-2
MessageParser.kt
...src/main/java/chat/rocket/android/helper/MessageParser.kt
+1
-0
message_actions.xml
app/src/main/res/menu/message_actions.xml
+5
-0
strings.xml
app/src/main/res/values/strings.xml
+1
-0
No files found.
app/src/main/java/chat/rocket/android/chatroom/adapter/ChatRoomAdapter.kt
View file @
91f8ec46
...
...
@@ -291,6 +291,9 @@ class ChatRoomAdapter(
R
.
id
.
action_menu_msg_react
->
{
actionSelectListener
?.
showReactions
(
id
)
}
R
.
id
.
action_message_permalink
->
{
actionSelectListener
?.
copyPermalink
(
id
)
}
else
->
{
TODO
(
"Not implemented"
)
}
...
...
@@ -310,5 +313,6 @@ class ChatRoomAdapter(
fun
showReactions
(
id
:
String
)
fun
openDirectMessage
(
roomName
:
String
,
message
:
String
)
fun
sendMessage
(
chatRoomId
:
String
,
text
:
String
)
fun
copyPermalink
(
id
:
String
)
}
}
app/src/main/java/chat/rocket/android/chatroom/presentation/ChatRoomPresenter.kt
View file @
91f8ec46
...
...
@@ -620,6 +620,7 @@ class ChatRoomPresenter @Inject constructor(
try
{
messagesRepository
.
getById
(
messageId
)
?.
let
{
m
->
view
.
copyToClipboard
(
m
.
message
)
view
.
showMessage
(
R
.
string
.
msg_message_copied
)
}
}
catch
(
e
:
RocketChatException
)
{
Timber
.
e
(
e
)
...
...
@@ -857,6 +858,42 @@ class ChatRoomPresenter @Inject constructor(
}
}
// TODO: move this to new interactor or FetchChatRoomsInteractor?
private
suspend
fun
getChatRoomAsync
(
roomId
:
String
):
ChatRoom
?
=
withContext
(
CommonPool
)
{
return
@withContext
dbManager
.
chatRoomDao
().
get
(
roomId
)
?.
let
{
with
(
it
.
chatRoom
)
{
ChatRoom
(
id
=
id
,
subscriptionId
=
subscriptionId
,
type
=
roomTypeOf
(
type
),
unread
=
unread
,
broadcast
=
broadcast
?:
false
,
alert
=
alert
,
fullName
=
fullname
,
name
=
name
,
favorite
=
favorite
?:
false
,
default
=
isDefault
?:
false
,
readonly
=
readonly
,
open
=
open
,
lastMessage
=
null
,
archived
=
false
,
status
=
null
,
user
=
null
,
userMentions
=
userMentions
,
client
=
client
,
announcement
=
null
,
description
=
null
,
groupMentions
=
groupMentions
,
roles
=
null
,
topic
=
null
,
lastSeen
=
this
.
lastSeen
,
timestamp
=
timestamp
,
updatedAt
=
updatedAt
)
}
}
}
// TODO: move this to new interactor or FetchChatRoomsInteractor?
private
suspend
fun
getChatRoomsAsync
(
name
:
String
?
=
null
):
List
<
ChatRoom
>
=
withContext
(
CommonPool
)
{
return
@withContext
dbManager
.
chatRoomDao
().
getAllSync
().
filter
{
...
...
@@ -939,6 +976,23 @@ class ChatRoomPresenter @Inject constructor(
}
}
fun
copyPermalink
(
messageId
:
String
)
{
launchUI
(
strategy
)
{
try
{
messagesRepository
.
getById
(
messageId
)
?.
let
{
message
->
getChatRoomAsync
(
message
.
roomId
)
?.
let
{
chatRoom
->
val
models
=
mapper
.
map
(
message
)
models
.
firstOrNull
()
?.
permalink
?.
let
{
view
.
copyToClipboard
(
it
)
}
}
}
}
catch
(
ex
:
Exception
)
{
Timber
.
e
(
ex
)
}
}
}
/**
* Send an emoji reaction to a message.
*/
...
...
app/src/main/java/chat/rocket/android/chatroom/ui/ChatRoomFragment.kt
View file @
91f8ec46
...
...
@@ -621,7 +621,6 @@ class ChatRoomFragment : Fragment(), ChatRoomView, EmojiKeyboardListener, EmojiR
ui
{
val
clipboard
=
it
.
getSystemService
(
Context
.
CLIPBOARD_SERVICE
)
as
ClipboardManager
clipboard
.
primaryClip
=
ClipData
.
newPlainText
(
""
,
message
)
showToast
(
R
.
string
.
msg_message_copied
)
}
}
...
...
@@ -1059,6 +1058,10 @@ class ChatRoomFragment : Fragment(), ChatRoomView, EmojiKeyboardListener, EmojiR
}
}
override
fun
copyPermalink
(
id
:
String
)
{
presenter
.
copyPermalink
(
id
)
}
override
fun
showReactions
(
id
:
String
)
{
presenter
.
showReactions
(
id
)
}
...
...
app/src/main/java/chat/rocket/android/chatroom/ui/bottomsheet/MessageActionsBottomSheet.kt
View file @
91f8ec46
app/src/main/java/chat/rocket/android/chatroom/uimodel/ActionsAttachmentUiModel.kt
View file @
91f8ec46
...
...
@@ -20,7 +20,8 @@ data class ActionsAttachmentUiModel(
override
var
unread
:
Boolean
?
=
null
,
override
var
menuItemsToHide
:
MutableList
<
Int
>
=
mutableListOf
(),
override
var
currentDayMarkerText
:
String
,
override
var
showDayMarker
:
Boolean
override
var
showDayMarker
:
Boolean
,
override
var
permalink
:
String
)
:
BaseAttachmentUiModel
<
ActionsAttachment
>
{
override
val
viewType
:
Int
get
()
=
BaseUiModel
.
ViewType
.
ACTIONS_ATTACHMENT
.
viewType
...
...
app/src/main/java/chat/rocket/android/chatroom/uimodel/AudioAttachmentUiModel.kt
View file @
91f8ec46
...
...
@@ -18,7 +18,8 @@ data class AudioAttachmentUiModel(
override
var
unread
:
Boolean
?
=
null
,
override
var
menuItemsToHide
:
MutableList
<
Int
>
=
mutableListOf
(),
override
var
currentDayMarkerText
:
String
,
override
var
showDayMarker
:
Boolean
override
var
showDayMarker
:
Boolean
,
override
var
permalink
:
String
)
:
BaseFileAttachmentUiModel
<
AudioAttachment
>
{
override
val
viewType
:
Int
get
()
=
BaseUiModel
.
ViewType
.
AUDIO_ATTACHMENT
.
viewType
...
...
app/src/main/java/chat/rocket/android/chatroom/uimodel/AuthorAttachmentUiModel.kt
View file @
91f8ec46
...
...
@@ -20,7 +20,7 @@ data class AuthorAttachmentUiModel(
override
var
unread
:
Boolean
?
=
null
,
override
var
menuItemsToHide
:
MutableList
<
Int
>
=
mutableListOf
(),
override
var
currentDayMarkerText
:
String
,
override
var
showDayMarker
:
Boolean
override
var
showDayMarker
:
Boolean
,
override
var
permalink
:
String
)
:
BaseAttachmentUiModel
<
AuthorAttachment
>
{
override
val
viewType
:
Int
get
()
=
BaseUiModel
.
ViewType
.
AUTHOR_ATTACHMENT
.
viewType
...
...
app/src/main/java/chat/rocket/android/chatroom/uimodel/BaseUiModel.kt
View file @
91f8ec46
...
...
@@ -17,6 +17,7 @@ interface BaseUiModel<out T> {
var
currentDayMarkerText
:
String
var
showDayMarker
:
Boolean
var
menuItemsToHide
:
MutableList
<
Int
>
var
permalink
:
String
enum
class
ViewType
(
val
viewType
:
Int
)
{
MESSAGE
(
0
),
...
...
app/src/main/java/chat/rocket/android/chatroom/uimodel/ColorAttachmentUiModel.kt
View file @
91f8ec46
...
...
@@ -20,7 +20,8 @@ data class ColorAttachmentUiModel(
override
var
unread
:
Boolean
?,
override
var
menuItemsToHide
:
MutableList
<
Int
>
=
mutableListOf
(),
override
var
currentDayMarkerText
:
String
,
override
var
showDayMarker
:
Boolean
override
var
showDayMarker
:
Boolean
,
override
var
permalink
:
String
)
:
BaseAttachmentUiModel
<
ColorAttachment
>
{
override
val
viewType
:
Int
get
()
=
BaseUiModel
.
ViewType
.
COLOR_ATTACHMENT
.
viewType
...
...
app/src/main/java/chat/rocket/android/chatroom/uimodel/GenericFileAttachmentUiModel.kt
View file @
91f8ec46
...
...
@@ -18,7 +18,8 @@ data class GenericFileAttachmentUiModel(
override
var
unread
:
Boolean
?
=
null
,
override
var
menuItemsToHide
:
MutableList
<
Int
>
=
mutableListOf
(),
override
var
currentDayMarkerText
:
String
,
override
var
showDayMarker
:
Boolean
override
var
showDayMarker
:
Boolean
,
override
var
permalink
:
String
)
:
BaseFileAttachmentUiModel
<
GenericFileAttachment
>
{
override
val
viewType
:
Int
get
()
=
BaseUiModel
.
ViewType
.
GENERIC_FILE_ATTACHMENT
.
viewType
...
...
app/src/main/java/chat/rocket/android/chatroom/uimodel/ImageAttachmentUiModel.kt
View file @
91f8ec46
...
...
@@ -20,7 +20,8 @@ data class ImageAttachmentUiModel(
override
var
unread
:
Boolean
?
=
null
,
override
var
menuItemsToHide
:
MutableList
<
Int
>
=
mutableListOf
(),
override
var
currentDayMarkerText
:
String
,
override
var
showDayMarker
:
Boolean
override
var
showDayMarker
:
Boolean
,
override
var
permalink
:
String
)
:
BaseFileAttachmentUiModel
<
ImageAttachment
>
{
override
val
viewType
:
Int
get
()
=
BaseUiModel
.
ViewType
.
IMAGE_ATTACHMENT
.
viewType
...
...
app/src/main/java/chat/rocket/android/chatroom/uimodel/MessageAttachmentUiModel.kt
View file @
91f8ec46
...
...
@@ -19,7 +19,8 @@ data class MessageAttachmentUiModel(
override
var
unread
:
Boolean
?
=
null
,
override
var
menuItemsToHide
:
MutableList
<
Int
>
=
mutableListOf
(),
override
var
currentDayMarkerText
:
String
,
override
var
showDayMarker
:
Boolean
override
var
showDayMarker
:
Boolean
,
override
var
permalink
:
String
)
:
BaseUiModel
<
Message
>
{
override
val
viewType
:
Int
get
()
=
BaseUiModel
.
ViewType
.
MESSAGE_ATTACHMENT
.
viewType
...
...
app/src/main/java/chat/rocket/android/chatroom/uimodel/MessageReplyUiModel.kt
View file @
91f8ec46
...
...
@@ -15,7 +15,8 @@ data class MessageReplyUiModel(
override
var
unread
:
Boolean
?
=
null
,
override
var
menuItemsToHide
:
MutableList
<
Int
>
=
mutableListOf
(),
override
var
currentDayMarkerText
:
String
,
override
var
showDayMarker
:
Boolean
override
var
showDayMarker
:
Boolean
,
override
var
permalink
:
String
)
:
BaseUiModel
<
MessageReply
>
{
override
val
viewType
:
Int
get
()
=
BaseUiModel
.
ViewType
.
MESSAGE_REPLY
.
viewType
...
...
app/src/main/java/chat/rocket/android/chatroom/uimodel/MessageUiModel.kt
View file @
91f8ec46
...
...
@@ -20,7 +20,8 @@ data class MessageUiModel(
override
var
unread
:
Boolean
?
=
null
,
var
isFirstUnread
:
Boolean
,
override
var
isTemporary
:
Boolean
=
false
,
override
var
menuItemsToHide
:
MutableList
<
Int
>
=
mutableListOf
()
override
var
menuItemsToHide
:
MutableList
<
Int
>
=
mutableListOf
(),
override
var
permalink
:
String
)
:
BaseMessageUiModel
<
Message
>
{
override
val
viewType
:
Int
get
()
=
BaseUiModel
.
ViewType
.
MESSAGE
.
viewType
...
...
app/src/main/java/chat/rocket/android/chatroom/uimodel/UiModelMapper.kt
View file @
91f8ec46
...
...
@@ -131,22 +131,25 @@ class UiModelMapper @Inject constructor(
withContext
(
CommonPool
)
{
val
list
=
ArrayList
<
BaseUiModel
<*>>()
getChatRoomAsync
(
message
.
roomId
)
?.
let
{
chatRoom
->
message
.
urls
?.
forEach
{
url
->
mapUrl
(
message
,
url
)
?.
let
{
list
.
add
(
it
)
}
mapUrl
(
message
,
url
,
chatRoom
)
?.
let
{
list
.
add
(
it
)
}
}
message
.
attachments
?.
mapNotNull
{
attachment
->
mapAttachment
(
message
,
attachment
)
mapAttachment
(
message
,
attachment
,
chatRoom
)
}
?.
asReversed
()
?.
let
{
list
.
addAll
(
it
)
}
mapMessage
(
message
).
let
{
mapMessage
(
message
,
chatRoom
).
let
{
if
(
list
.
isNotEmpty
())
{
it
.
preview
=
list
.
first
().
preview
}
list
.
add
(
it
)
}
}
for
(
i
in
list
.
size
-
1
downTo
0
)
{
val
next
=
if
(
i
-
1
<
0
)
null
else
list
[
i
-
1
]
...
...
@@ -214,7 +217,8 @@ class UiModelMapper @Inject constructor(
withContext
(
CommonPool
)
{
val
list
=
ArrayList
<
BaseUiModel
<*>>()
mapMessage
(
message
).
let
{
getChatRoomAsync
(
message
.
roomId
)
?.
let
{
chatRoom
->
mapMessage
(
message
,
chatRoom
).
let
{
if
(
list
.
isNotEmpty
())
{
it
.
preview
=
list
.
first
().
preview
}
...
...
@@ -222,18 +226,19 @@ class UiModelMapper @Inject constructor(
}
message
.
attachments
?.
forEach
{
val
attachment
=
mapAttachment
(
message
,
it
)
val
attachment
=
mapAttachment
(
message
,
it
,
chatRoom
)
attachment
?.
let
{
list
.
add
(
attachment
)
}
}
message
.
urls
?.
forEach
{
val
url
=
mapUrl
(
message
,
it
)
val
url
=
mapUrl
(
message
,
it
,
chatRoom
)
url
?.
let
{
list
.
add
(
url
)
}
}
}
for
(
i
in
list
.
size
-
1
downTo
0
)
{
val
next
=
if
(
i
-
1
<
0
)
null
else
list
[
i
-
1
]
...
...
@@ -283,11 +288,12 @@ class UiModelMapper @Inject constructor(
nextDownStreamMessage
=
null
,
unread
=
message
.
unread
,
currentDayMarkerText
=
dayMarkerText
,
showDayMarker
=
false
showDayMarker
=
false
,
permalink
=
messageHelper
.
createPermalink
(
message
,
chatRoom
,
false
)
)
}
private
fun
mapUrl
(
message
:
Message
,
url
:
Url
):
BaseUiModel
<
*
>?
{
private
fun
mapUrl
(
message
:
Message
,
url
:
Url
,
chatRoom
:
ChatRoom
):
BaseUiModel
<
*
>?
{
if
(
url
.
ignoreParse
||
url
.
meta
==
null
)
return
null
val
hostname
=
url
.
parsedUrl
?.
hostname
?:
""
...
...
@@ -297,39 +303,53 @@ class UiModelMapper @Inject constructor(
val
localDateTime
=
DateTimeHelper
.
getLocalDateTime
(
message
.
timestamp
)
val
dayMarkerText
=
DateTimeHelper
.
getFormattedDateForMessages
(
localDateTime
,
context
)
val
permalink
=
messageHelper
.
createPermalink
(
message
,
chatRoom
,
false
)
return
UrlPreviewUiModel
(
message
,
url
,
message
.
id
,
title
,
hostname
,
description
,
thumb
,
getReactions
(
message
),
preview
=
message
.
copy
(
message
=
url
.
url
),
unread
=
message
.
unread
,
showDayMarker
=
false
,
currentDayMarkerText
=
dayMarkerText
)
showDayMarker
=
false
,
currentDayMarkerText
=
dayMarkerText
,
permalink
=
permalink
)
}
private
fun
mapAttachment
(
message
:
Message
,
attachment
:
Attachment
):
BaseUiModel
<
*
>?
{
private
fun
mapAttachment
(
message
:
Message
,
attachment
:
Attachment
,
chatRoom
:
ChatRoom
):
BaseUiModel
<
*
>?
{
return
when
(
attachment
)
{
is
FileAttachment
->
mapFileAttachment
(
message
,
attachment
)
is
MessageAttachment
->
mapMessageAttachment
(
message
,
attachment
)
is
AuthorAttachment
->
mapAuthorAttachment
(
message
,
attachment
)
is
ColorAttachment
->
mapColorAttachment
(
message
,
attachment
)
is
ActionsAttachment
->
mapActionsAttachment
(
message
,
attachment
)
is
FileAttachment
->
mapFileAttachment
(
message
,
attachment
,
chatRoom
)
is
MessageAttachment
->
mapMessageAttachment
(
message
,
attachment
,
chatRoom
)
is
AuthorAttachment
->
mapAuthorAttachment
(
message
,
attachment
,
chatRoom
)
is
ColorAttachment
->
mapColorAttachment
(
message
,
attachment
,
chatRoom
)
is
ActionsAttachment
->
mapActionsAttachment
(
message
,
attachment
,
chatRoom
)
else
->
null
}
}
private
fun
mapActionsAttachment
(
message
:
Message
,
attachment
:
ActionsAttachment
):
BaseUiModel
<
*
>?
{
private
fun
mapActionsAttachment
(
message
:
Message
,
attachment
:
ActionsAttachment
,
chatRoom
:
ChatRoom
):
BaseUiModel
<
*
>?
{
return
with
(
attachment
)
{
val
content
=
stripMessageQuotes
(
message
)
val
localDateTime
=
DateTimeHelper
.
getLocalDateTime
(
message
.
timestamp
)
val
dayMarkerText
=
DateTimeHelper
.
getFormattedDateForMessages
(
localDateTime
,
context
)
val
permalink
=
messageHelper
.
createPermalink
(
message
,
chatRoom
,
false
)
ActionsAttachmentUiModel
(
attachmentUrl
=
url
,
title
=
title
,
actions
=
actions
,
buttonAlignment
=
buttonAlignment
,
message
=
message
,
rawData
=
attachment
,
messageId
=
message
.
id
,
reactions
=
getReactions
(
message
),
preview
=
message
.
copy
(
message
=
content
.
message
),
unread
=
message
.
unread
,
showDayMarker
=
false
,
currentDayMarkerText
=
dayMarkerText
)
showDayMarker
=
false
,
currentDayMarkerText
=
dayMarkerText
,
permalink
=
permalink
)
}
}
private
fun
mapColorAttachment
(
message
:
Message
,
attachment
:
ColorAttachment
):
BaseUiModel
<
*
>?
{
private
fun
mapColorAttachment
(
message
:
Message
,
attachment
:
ColorAttachment
,
chatRoom
:
ChatRoom
):
BaseUiModel
<
*
>?
{
return
with
(
attachment
)
{
val
content
=
stripMessageQuotes
(
message
)
val
id
=
attachmentId
(
message
,
attachment
)
...
...
@@ -337,12 +357,13 @@ class UiModelMapper @Inject constructor(
val
localDateTime
=
DateTimeHelper
.
getLocalDateTime
(
message
.
timestamp
)
val
dayMarkerText
=
DateTimeHelper
.
getFormattedDateForMessages
(
localDateTime
,
context
)
val
fieldsText
=
mapFields
(
fields
)
val
permalink
=
messageHelper
.
createPermalink
(
message
,
chatRoom
,
false
)
ColorAttachmentUiModel
(
attachmentUrl
=
url
,
id
=
id
,
color
=
color
.
color
,
text
=
text
,
fields
=
fieldsText
,
message
=
message
,
rawData
=
attachment
,
messageId
=
message
.
id
,
reactions
=
getReactions
(
message
),
preview
=
message
.
copy
(
message
=
content
.
message
),
unread
=
message
.
unread
,
showDayMarker
=
false
,
currentDayMarkerText
=
dayMarkerText
)
showDayMarker
=
false
,
currentDayMarkerText
=
dayMarkerText
,
permalink
=
permalink
)
}
}
...
...
@@ -364,7 +385,11 @@ class UiModelMapper @Inject constructor(
}
}
private
fun
mapAuthorAttachment
(
message
:
Message
,
attachment
:
AuthorAttachment
):
AuthorAttachmentUiModel
{
private
fun
mapAuthorAttachment
(
message
:
Message
,
attachment
:
AuthorAttachment
,
chatRoom
:
ChatRoom
):
AuthorAttachmentUiModel
{
return
with
(
attachment
)
{
val
content
=
stripMessageQuotes
(
message
)
...
...
@@ -373,16 +398,21 @@ class UiModelMapper @Inject constructor(
val
localDateTime
=
DateTimeHelper
.
getLocalDateTime
(
message
.
timestamp
)
val
dayMarkerText
=
DateTimeHelper
.
getFormattedDateForMessages
(
localDateTime
,
context
)
val
permalink
=
messageHelper
.
createPermalink
(
message
,
chatRoom
,
false
)
AuthorAttachmentUiModel
(
attachmentUrl
=
url
,
id
=
id
,
name
=
authorName
,
icon
=
authorIcon
,
fields
=
fieldsText
,
message
=
message
,
rawData
=
attachment
,
messageId
=
message
.
id
,
reactions
=
getReactions
(
message
),
preview
=
message
.
copy
(
message
=
content
.
message
),
unread
=
message
.
unread
,
showDayMarker
=
false
,
currentDayMarkerText
=
dayMarkerText
)
showDayMarker
=
false
,
currentDayMarkerText
=
dayMarkerText
,
permalink
=
permalink
)
}
}
private
fun
mapMessageAttachment
(
message
:
Message
,
attachment
:
MessageAttachment
):
MessageAttachmentUiModel
{
private
fun
mapMessageAttachment
(
message
:
Message
,
attachment
:
MessageAttachment
,
chatRoom
:
ChatRoom
):
MessageAttachmentUiModel
{
val
attachmentAuthor
=
attachment
.
author
val
time
=
attachment
.
timestamp
?.
let
{
getTime
(
it
)
}
val
attachmentText
=
when
(
attachment
.
attachments
.
orEmpty
().
firstOrNull
())
{
...
...
@@ -397,15 +427,20 @@ class UiModelMapper @Inject constructor(
val
dayMarkerText
=
DateTimeHelper
.
getFormattedDateForMessages
(
localDateTime
,
context
)
val
content
=
stripMessageQuotes
(
message
)
val
permalink
=
messageHelper
.
createPermalink
(
message
,
chatRoom
,
false
)
return
MessageAttachmentUiModel
(
message
=
content
,
rawData
=
message
,
messageId
=
message
.
id
,
time
=
time
,
senderName
=
attachmentAuthor
,
content
=
attachmentText
,
isPinned
=
message
.
pinned
,
reactions
=
getReactions
(
message
),
preview
=
message
.
copy
(
message
=
content
.
message
),
unread
=
message
.
unread
,
currentDayMarkerText
=
dayMarkerText
,
showDayMarker
=
false
)
currentDayMarkerText
=
dayMarkerText
,
showDayMarker
=
false
,
permalink
=
permalink
)
}
private
fun
mapFileAttachment
(
message
:
Message
,
attachment
:
FileAttachment
):
BaseUiModel
<
*
>?
{
private
fun
mapFileAttachment
(
message
:
Message
,
attachment
:
FileAttachment
,
chatRoom
:
ChatRoom
):
BaseUiModel
<
*
>?
{
val
attachmentUrl
=
attachmentUrl
(
attachment
)
val
attachmentTitle
=
attachmentTitle
(
attachment
)
val
attachmentText
=
attachmentText
(
attachment
)
...
...
@@ -414,24 +449,25 @@ class UiModelMapper @Inject constructor(
val
localDateTime
=
DateTimeHelper
.
getLocalDateTime
(
message
.
timestamp
)
val
dayMarkerText
=
DateTimeHelper
.
getFormattedDateForMessages
(
localDateTime
,
context
)
val
permalink
=
messageHelper
.
createPermalink
(
message
,
chatRoom
,
false
)
return
when
(
attachment
)
{
is
ImageAttachment
->
ImageAttachmentUiModel
(
message
,
attachment
,
message
.
id
,
attachmentUrl
,
attachmentTitle
,
attachmentText
,
attachmentDescription
,
id
,
getReactions
(
message
),
preview
=
message
.
copy
(
message
=
context
.
getString
(
R
.
string
.
msg_preview_photo
)),
unread
=
message
.
unread
,
showDayMarker
=
false
,
currentDayMarkerText
=
dayMarkerText
)
showDayMarker
=
false
,
currentDayMarkerText
=
dayMarkerText
,
permalink
=
permalink
)
is
VideoAttachment
->
VideoAttachmentUiModel
(
message
,
attachment
,
message
.
id
,
attachmentUrl
,
attachmentTitle
,
id
,
getReactions
(
message
),
preview
=
message
.
copy
(
message
=
context
.
getString
(
R
.
string
.
msg_preview_video
)),
unread
=
message
.
unread
,
showDayMarker
=
false
,
currentDayMarkerText
=
dayMarkerText
)
showDayMarker
=
false
,
currentDayMarkerText
=
dayMarkerText
,
permalink
=
permalink
)
is
AudioAttachment
->
AudioAttachmentUiModel
(
message
,
attachment
,
message
.
id
,
attachmentUrl
,
attachmentTitle
,
id
,
getReactions
(
message
),
preview
=
message
.
copy
(
message
=
context
.
getString
(
R
.
string
.
msg_preview_audio
)),
unread
=
message
.
unread
,
showDayMarker
=
false
,
currentDayMarkerText
=
dayMarkerText
)
showDayMarker
=
false
,
currentDayMarkerText
=
dayMarkerText
,
permalink
=
permalink
)
is
GenericFileAttachment
->
GenericFileAttachmentUiModel
(
message
,
attachment
,
message
.
id
,
attachmentUrl
,
attachmentTitle
,
id
,
getReactions
(
message
),
preview
=
message
.
copy
(
message
=
context
.
getString
(
R
.
string
.
msg_preview_file
)),
unread
=
message
.
unread
,
showDayMarker
=
false
,
currentDayMarkerText
=
dayMarkerText
)
showDayMarker
=
false
,
currentDayMarkerText
=
dayMarkerText
,
permalink
=
permalink
)
else
->
null
}
}
...
...
@@ -479,7 +515,10 @@ class UiModelMapper @Inject constructor(
return
attachment
.
description
}
private
suspend
fun
mapMessage
(
message
:
Message
):
MessageUiModel
=
withContext
(
CommonPool
)
{
private
suspend
fun
mapMessage
(
message
:
Message
,
chatRoom
:
ChatRoom
):
MessageUiModel
=
withContext
(
CommonPool
)
{
val
sender
=
getSenderName
(
message
)
val
time
=
getTime
(
message
.
timestamp
)
val
avatar
=
getUserAvatar
(
message
)
...
...
@@ -493,13 +532,14 @@ class UiModelMapper @Inject constructor(
val
localDateTime
=
DateTimeHelper
.
getLocalDateTime
(
message
.
timestamp
)
val
dayMarkerText
=
DateTimeHelper
.
getFormattedDateForMessages
(
localDateTime
,
context
)
val
permalink
=
messageHelper
.
createPermalink
(
message
,
chatRoom
,
false
)
val
content
=
getContent
(
stripMessageQuotes
(
message
))
MessageUiModel
(
message
=
stripMessageQuotes
(
message
),
rawData
=
message
,
messageId
=
message
.
id
,
avatar
=
avatar
!!
,
time
=
time
,
senderName
=
sender
,
content
=
content
,
isPinned
=
message
.
pinned
,
currentDayMarkerText
=
dayMarkerText
,
showDayMarker
=
false
,
reactions
=
getReactions
(
message
),
isFirstUnread
=
false
,
preview
=
preview
,
isTemporary
=
!
synced
,
unread
=
unread
)
preview
=
preview
,
isTemporary
=
!
synced
,
unread
=
unread
,
permalink
=
permalink
)
}
private
fun
mapMessagePreview
(
message
:
Message
):
Message
{
...
...
app/src/main/java/chat/rocket/android/chatroom/uimodel/UrlPreviewUiModel.kt
View file @
91f8ec46
...
...
@@ -19,7 +19,8 @@ data class UrlPreviewUiModel(
override
var
unread
:
Boolean
?
=
null
,
override
var
menuItemsToHide
:
MutableList
<
Int
>
=
mutableListOf
(),
override
var
currentDayMarkerText
:
String
,
override
var
showDayMarker
:
Boolean
override
var
showDayMarker
:
Boolean
,
override
var
permalink
:
String
)
:
BaseUiModel
<
Url
>
{
override
val
viewType
:
Int
get
()
=
BaseUiModel
.
ViewType
.
URL_PREVIEW
.
viewType
...
...
app/src/main/java/chat/rocket/android/chatroom/uimodel/VideoAttachmentUiModel.kt
View file @
91f8ec46
...
...
@@ -18,7 +18,8 @@ data class VideoAttachmentUiModel(
override
var
unread
:
Boolean
?
=
null
,
override
var
menuItemsToHide
:
MutableList
<
Int
>
=
mutableListOf
(),
override
var
currentDayMarkerText
:
String
,
override
var
showDayMarker
:
Boolean
override
var
showDayMarker
:
Boolean
,
override
var
permalink
:
String
)
:
BaseFileAttachmentUiModel
<
VideoAttachment
>
{
override
val
viewType
:
Int
get
()
=
BaseUiModel
.
ViewType
.
VIDEO_ATTACHMENT
.
viewType
...
...
app/src/main/java/chat/rocket/android/chatroom/uimodel/suggestion/ChatRoomSuggestionUiModel.kt
View file @
91f8ec46
...
...
@@ -2,7 +2,9 @@ package chat.rocket.android.chatroom.uimodel.suggestion
import
chat.rocket.android.suggestions.model.SuggestionModel
class
ChatRoomSuggestionUiModel
(
text
:
String
,
class
ChatRoomSuggestionUiModel
(
text
:
String
,
val
fullName
:
String
,
val
name
:
String
,
searchList
:
List
<
String
>)
:
SuggestionModel
(
text
,
searchList
,
false
)
\ No newline at end of file
searchList
:
List
<
String
>
)
:
SuggestionModel
(
text
,
searchList
,
false
)
app/src/main/java/chat/rocket/android/chatroom/uimodel/suggestion/CommandSuggestionUiModel.kt
View file @
91f8ec46
...
...
@@ -2,6 +2,8 @@ package chat.rocket.android.chatroom.uimodel.suggestion
import
chat.rocket.android.suggestions.model.SuggestionModel
class
CommandSuggestionUiModel
(
text
:
String
,
class
CommandSuggestionUiModel
(
text
:
String
,
val
description
:
String
,
searchList
:
List
<
String
>)
:
SuggestionModel
(
text
,
searchList
)
\ No newline at end of file
searchList
:
List
<
String
>
)
:
SuggestionModel
(
text
,
searchList
)
\ No newline at end of file
app/src/main/java/chat/rocket/android/chatroom/uimodel/suggestion/PeopleSuggestionUiModel.kt
View file @
91f8ec46
...
...
@@ -3,13 +3,15 @@ package chat.rocket.android.chatroom.uimodel.suggestion
import
chat.rocket.android.suggestions.model.SuggestionModel
import
chat.rocket.common.model.UserStatus
class
PeopleSuggestionUiModel
(
val
imageUri
:
String
?,
class
PeopleSuggestionUiModel
(
val
imageUri
:
String
?,
text
:
String
,
val
username
:
String
,
val
name
:
String
,
val
status
:
UserStatus
?,
pinned
:
Boolean
=
false
,
searchList
:
List
<
String
>)
:
SuggestionModel
(
text
,
searchList
,
pinned
)
{
searchList
:
List
<
String
>
)
:
SuggestionModel
(
text
,
searchList
,
pinned
)
{
override
fun
toString
():
String
{
return
"PeopleSuggestionUiModel(imageUri='$imageUri', username='$username', name='$name', status=$status, pinned=$pinned)"
...
...
app/src/main/java/chat/rocket/android/helper/MessageHelper.kt
View file @
91f8ec46
...
...
@@ -17,7 +17,7 @@ class MessageHelper @Inject constructor(
private
val
currentServer
=
serverInteractor
.
get
()
!!
private
val
settings
:
PublicSettings
=
getSettingsInteractor
.
get
(
currentServer
)
fun
createPermalink
(
message
:
Message
,
chatRoom
:
ChatRoom
):
String
{
fun
createPermalink
(
message
:
Message
,
chatRoom
:
ChatRoom
,
markdownSyntax
:
Boolean
=
true
):
String
{
val
type
=
when
(
chatRoom
.
type
)
{
is
RoomType
.
PrivateGroup
->
"group"
is
RoomType
.
Channel
->
"channel"
...
...
@@ -30,7 +30,8 @@ class MessageHelper @Inject constructor(
}
else
{
chatRoom
.
name
}
return
"[ ]($currentServer/$type/$name?msg=${message.id}) "
val
permalink
=
"$currentServer/$type/$name?msg=${message.id}"
return
if
(
markdownSyntax
)
"[ ]($permalink) "
else
permalink
}
fun
messageIdFromPermalink
(
permalink
:
String
):
String
?
{
...
...
app/src/main/java/chat/rocket/android/helper/MessageParser.kt
View file @
91f8ec46
...
...
@@ -13,6 +13,7 @@ import android.text.style.ReplacementSpan
import
android.view.View
import
androidx.core.content.res.ResourcesCompat
import
androidx.core.util.PatternsCompat
import
chat.rocket.android.R
import
chat.rocket.android.chatroom.ui.StrikethroughDelimiterProcessor
import
chat.rocket.android.emoji.EmojiParser
import
chat.rocket.android.emoji.EmojiRepository
...
...
app/src/main/res/menu/message_actions.xml
View file @
91f8ec46
...
...
@@ -12,6 +12,11 @@
android:icon=
"@drawable/ic_action_message_reply_24dp"
android:title=
"@string/action_msg_reply"
/>
<item
android:id=
"@+id/action_message_permalink"
android:icon=
"@drawable/ic_action_message_reply_24dp"
android:title=
"@string/action_msg_permalink"
/>
<item
android:id=
"@+id/action_message_quote"
android:icon=
"@drawable/ic_action_message_quote_24dp"
...
...
app/src/main/res/values/strings.xml
View file @
91f8ec46
...
...
@@ -213,6 +213,7 @@ https://github.com/RocketChat/java-code-styles/blob/master/CODING_STYLE.md#strin
<string
name=
"action_msg_share"
>
Share
</string>
<string
name=
"action_title_editing"
>
Editing Message
</string>
<string
name=
"action_msg_add_reaction"
>
Add reaction
</string>
<string
name=
"action_msg_permalink"
translatable=
"false"
>
Permalink
</string>
<!-- Permission messages -->
<string
name=
"permission_editing_not_allowed"
>
Editing is not allowed
</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