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
a3d71108
Unverified
Commit
a3d71108
authored
Oct 31, 2018
by
Lucio Maciel
Committed by
GitHub
Oct 31, 2018
Browse files
Options
Browse Files
Download
Plain Diff
Merge branch 'beta' into improvement/image-compression
parents
f885540a
ec79b326
Changes
38
Hide whitespace changes
Inline
Side-by-side
Showing
38 changed files
with
571 additions
and
146 deletions
+571
-146
config.yml
.circleci/config.yml
+41
-28
build-sdk.sh
app/build-sdk.sh
+2
-2
ChatRoomAdapter.kt
...a/chat/rocket/android/chatroom/adapter/ChatRoomAdapter.kt
+5
-1
ChatRoomPresenter.kt
...rocket/android/chatroom/presentation/ChatRoomPresenter.kt
+56
-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
+247
-2
ic_action_message_link_24dp.xml
app/src/main/res/drawable/ic_action_message_link_24dp.xml
+10
-0
message_actions.xml
app/src/main/res/menu/message_actions.xml
+5
-0
strings.xml
app/src/main/res/values-de/strings.xml
+4
-0
strings.xml
app/src/main/res/values-es/strings.xml
+3
-0
strings.xml
app/src/main/res/values-fr/strings.xml
+4
-0
strings.xml
app/src/main/res/values-hi-rIN/strings.xml
+4
-1
strings.xml
app/src/main/res/values-ja/strings.xml
+4
-0
strings.xml
app/src/main/res/values-pt-rBR/strings.xml
+3
-0
strings.xml
app/src/main/res/values-ru-rRU/strings.xml
+4
-0
strings.xml
app/src/main/res/values-tr/strings.xml
+4
-0
strings.xml
app/src/main/res/values-uk/strings.xml
+4
-0
strings.xml
app/src/main/res/values/strings.xml
+2
-0
build.gradle
build.gradle
+2
-5
dependencies.gradle
dependencies.gradle
+1
-1
No files found.
.circleci/config.yml
View file @
a3d71108
version
:
2
version
:
2
build
:
machine
:
java
:
oraclejdk8
jobs
:
jobs
:
build-kotlin-sdk
:
build-kotlin-sdk
:
docker
:
docker
:
-
image
:
circleci/android:api-2
7
-alpha
-
image
:
circleci/android:api-2
8
-alpha
environment
:
environment
:
J
VM_OPTS
:
-Xmx3200
m
J
AVA_TOOL_OPTIONS
:
-Xmx5024
m
steps
:
steps
:
-
checkout
-
checkout
-
run
:
-
run
:
...
@@ -18,8 +21,9 @@ jobs:
...
@@ -18,8 +21,9 @@ jobs:
command
:
pushd app/ ; ./build-sdk.sh ; popd
command
:
pushd app/ ; ./build-sdk.sh ; popd
-
save_cache
:
-
save_cache
:
paths
:
paths
:
-
~/.gradle
-
~/.gradle/caches
key
:
jars-{{ checksum "build.gradle" }}-{{ checksum "app/build.gradle" }}-{{ checksum "player/build.gradle" }}
-
~/.gradle/wrapper
key
:
jars-{{ checksum "build.gradle" }}-{{ checksum "app/build.gradle" }}-{{ checksum "player/build.gradle" }}-{{ checksum "core/build.gradle" }}-{{ checksum "util/build.gradle" }}-{{ checksum "draw/build.gradle" }}-{{ checksum "emoji/build.gradle" }}-{{ checksum "suggestions/build.gradle" }}
-
save_cache
:
-
save_cache
:
paths
:
paths
:
-
app/libs/
-
app/libs/
...
@@ -30,47 +34,51 @@ jobs:
...
@@ -30,47 +34,51 @@ jobs:
destination
:
libs
destination
:
libs
code-analysis
:
code-analysis
:
docker
:
docker
:
-
image
:
circleci/android:api-2
7
-alpha
-
image
:
circleci/android:api-2
8
-alpha
environment
:
environment
:
J
VM_OPTS
:
-Xmx3200
m
J
AVA_TOOL_OPTIONS
:
-Xmx5024
m
steps
:
steps
:
-
checkout
-
checkout
-
run
:
-
run
:
name
:
ANDROID_HOME
name
:
ANDROID_HOME
command
:
echo "sdk.dir="$ANDROID_HOME > local.properties
command
:
echo "sdk.dir="$ANDROID_HOME > local.properties
-
run
:
-
run
:
name
:
checkout Rocket.Chat.Kotlin.SDK
name
:
checkout Rocket.Chat.Kotlin.SDK
command
:
git clone https://github.com/RocketChat/Rocket.Chat.Kotlin.SDK.git ../Rocket.Chat.Kotlin.SDK
command
:
git clone https://github.com/RocketChat/Rocket.Chat.Kotlin.SDK.git ../Rocket.Chat.Kotlin.SDK
-
restore_cache
:
-
restore_cache
:
key
:
kotlin-sdk-{{ .Revision }}
key
:
kotlin-sdk-{{ .Revision }}
-
restore_cache
:
-
restore_cache
:
key
:
jars-{{ checksum "build.gradle" }}-{{ checksum "app/build.gradle" }}-{{ checksum "player/build.gradle" }}
key
:
jars-{{ checksum "build.gradle" }}-{{ checksum "app/build.gradle" }}-{{ checksum "player/build.gradle" }}
-{{ checksum "core/build.gradle" }}-{{ checksum "util/build.gradle" }}-{{ checksum "draw/build.gradle" }}-{{ checksum "emoji/build.gradle" }}-{{ checksum "suggestions/build.gradle" }}
-
run
:
-
run
:
name
:
Download Dependencies
name
:
Download Dependencies
command
:
./gradlew androidDependencies --quiet --console=plain
command
:
./gradlew
--no-daemon
androidDependencies --quiet --console=plain
-
save_cache
:
-
save_cache
:
paths
:
paths
:
-
~/.gradle
-
~/.gradle/caches
key
:
jars-{{ checksum "build.gradle" }}-{{ checksum "app/build.gradle" }}-{{ checksum "player/build.gradle" }}
-
~/.gradle/wrapper
key
:
jars-{{ checksum "build.gradle" }}-{{ checksum "app/build.gradle" }}-{{ checksum "player/build.gradle" }}-{{ checksum "core/build.gradle" }}-{{ checksum "util/build.gradle" }}-{{ checksum "draw/build.gradle" }}-{{ checksum "emoji/build.gradle" }}-{{ checksum "suggestions/build.gradle" }}
-
run
:
-
run
:
name
:
Run Lint
#, Checkstyles, PMD, Findbugs...
name
:
Run Lint
#, Checkstyles, PMD, Findbugs...
command
:
./gradlew lint
command
:
./gradlew
--no-daemon
lint
-
run
:
-
run
:
name
:
Run Unit test
name
:
Run Unit test
command
:
./gradlew test
command
:
./gradlew
--no-daemon
test
-
run
:
-
run
:
name
:
Compile Instrumentation test
name
:
Compile Instrumentation test
command
:
./gradlew assembleAndroidTest
command
:
./gradlew
--no-daemon
assembleAndroidTest
-
store_artifacts
:
-
store_artifacts
:
path
:
app/build/reports/
path
:
app/build/reports/
destination
:
reports
destination
:
reports
build-play-apk
:
build-play-apk
:
docker
:
docker
:
-
image
:
circleci/android:api-2
7
-alpha
-
image
:
circleci/android:api-2
8
-alpha
environment
:
environment
:
J
VM_OPTS
:
-Xmx3200
m
J
AVA_TOOL_OPTIONS
:
-Xmx5024
m
steps
:
steps
:
-
checkout
-
checkout
-
run
:
name
:
ANDROID_HOME
command
:
echo "sdk.dir="$ANDROID_HOME > local.properties
-
run
:
-
run
:
name
:
restore files from ENV
name
:
restore files from ENV
command
:
|
command
:
|
...
@@ -82,28 +90,32 @@ jobs:
...
@@ -82,28 +90,32 @@ jobs:
-
restore_cache
:
-
restore_cache
:
key
:
kotlin-sdk-{{ .Revision }}
key
:
kotlin-sdk-{{ .Revision }}
-
restore_cache
:
-
restore_cache
:
key
:
jars-{{ checksum "build.gradle" }}-{{ checksum "app/build.gradle" }}-{{ checksum "player/build.gradle" }}
key
:
jars-{{ checksum "build.gradle" }}-{{ checksum "app/build.gradle" }}-{{ checksum "player/build.gradle" }}
-{{ checksum "core/build.gradle" }}-{{ checksum "util/build.gradle" }}-{{ checksum "draw/build.gradle" }}-{{ checksum "emoji/build.gradle" }}-{{ checksum "suggestions/build.gradle" }}
-
run
:
-
run
:
name
:
Download Dependencies
name
:
Download Dependencies
command
:
./gradlew androidDependencies --quiet --console=plain
command
:
./gradlew
--no-daemon
androidDependencies --quiet --console=plain
-
save_cache
:
-
save_cache
:
paths
:
paths
:
-
~/.gradle
-
~/.gradle/caches
key
:
jars-{{ checksum "build.gradle" }}-{{ checksum "app/build.gradle" }}-{{ checksum "player/build.gradle" }}
-
~/.gradle/wrapper
key
:
jars-{{ checksum "build.gradle" }}-{{ checksum "app/build.gradle" }}-{{ checksum "player/build.gradle" }}-{{ checksum "core/build.gradle" }}-{{ checksum "util/build.gradle" }}-{{ checksum "draw/build.gradle" }}-{{ checksum "emoji/build.gradle" }}-{{ checksum "suggestions/build.gradle" }}
-
run
:
-
run
:
name
:
Build APK
name
:
Build APK
command
:
|
command
:
|
./gradlew assemblePlayRelease --info --console=plain --stacktrace
./gradlew
--no-daemon
assemblePlayRelease --info --console=plain --stacktrace
-
store_artifacts
:
-
store_artifacts
:
path
:
app/build/outputs/apk
path
:
app/build/outputs/apk
destination
:
apks
destination
:
apks
build-foss-apk
:
build-foss-apk
:
docker
:
docker
:
-
image
:
circleci/android:api-2
7
-alpha
-
image
:
circleci/android:api-2
8
-alpha
environment
:
environment
:
J
VM_OPTS
:
-Xmx3200
m
J
AVA_TOOL_OPTIONS
:
-Xmx5024
m
steps
:
steps
:
-
checkout
-
checkout
-
run
:
name
:
ANDROID_HOME
command
:
echo "sdk.dir="$ANDROID_HOME > local.properties
-
run
:
-
run
:
name
:
restore files from ENV
name
:
restore files from ENV
command
:
|
command
:
|
...
@@ -115,18 +127,19 @@ jobs:
...
@@ -115,18 +127,19 @@ jobs:
-
restore_cache
:
-
restore_cache
:
key
:
kotlin-sdk-{{ .Revision }}
key
:
kotlin-sdk-{{ .Revision }}
-
restore_cache
:
-
restore_cache
:
key
:
jars-{{ checksum "build.gradle" }}-{{ checksum "app/build.gradle" }}-{{ checksum "player/build.gradle" }}
key
:
jars-{{ checksum "build.gradle" }}-{{ checksum "app/build.gradle" }}-{{ checksum "player/build.gradle" }}
-{{ checksum "core/build.gradle" }}-{{ checksum "util/build.gradle" }}-{{ checksum "draw/build.gradle" }}-{{ checksum "emoji/build.gradle" }}-{{ checksum "suggestions/build.gradle" }}
-
run
:
-
run
:
name
:
Download Dependencies
name
:
Download Dependencies
command
:
./gradlew androidDependencies --quiet --console=plain
command
:
./gradlew
--no-daemon
androidDependencies --quiet --console=plain
-
save_cache
:
-
save_cache
:
paths
:
paths
:
-
~/.gradle
-
~/.gradle/caches
key
:
jars-{{ checksum "build.gradle" }}-{{ checksum "app/build.gradle" }}-{{ checksum "player/build.gradle" }}
-
~/.gradle/wrapper
key
:
jars-{{ checksum "build.gradle" }}-{{ checksum "app/build.gradle" }}-{{ checksum "player/build.gradle" }}-{{ checksum "core/build.gradle" }}-{{ checksum "util/build.gradle" }}-{{ checksum "draw/build.gradle" }}-{{ checksum "emoji/build.gradle" }}-{{ checksum "suggestions/build.gradle" }}
-
run
:
-
run
:
name
:
Build APK
name
:
Build APK
command
:
|
command
:
|
./gradlew assembleFossRelease --info --console=plain --stacktrace
./gradlew
--no-daemon
assembleFossRelease --info --console=plain --stacktrace
-
store_artifacts
:
-
store_artifacts
:
path
:
app/build/outputs/apk
path
:
app/build/outputs/apk
destination
:
apks
destination
:
apks
...
...
app/build-sdk.sh
View file @
a3d71108
...
@@ -94,8 +94,8 @@ if ! check_git_dirty && ! check_last_commit && [ -f "${CURRENT_DIR}"/libs/common
...
@@ -94,8 +94,8 @@ if ! check_git_dirty && ! check_last_commit && [ -f "${CURRENT_DIR}"/libs/common
exit
0
exit
0
fi
fi
cd
"
${
SDK_DIR
}
"
&&
./gradlew common:assemble
&&
cd
"
${
CURRENT_DIR
}
"
cd
"
${
SDK_DIR
}
"
&&
./gradlew
--no-daemon
common:assemble
&&
cd
"
${
CURRENT_DIR
}
"
cd
"
${
SDK_DIR
}
"
&&
./gradlew core:assemble
&&
cd
"
${
CURRENT_DIR
}
"
cd
"
${
SDK_DIR
}
"
&&
./gradlew
--no-daemon
core:assemble
&&
cd
"
${
CURRENT_DIR
}
"
rm
"
${
CURRENT_DIR
}
"
/libs/common
*
"
${
CURRENT_DIR
}
"
/libs/core
*
rm
"
${
CURRENT_DIR
}
"
/libs/common
*
"
${
CURRENT_DIR
}
"
/libs/core
*
...
...
app/src/main/java/chat/rocket/android/chatroom/adapter/ChatRoomAdapter.kt
View file @
a3d71108
...
@@ -291,6 +291,9 @@ class ChatRoomAdapter(
...
@@ -291,6 +291,9 @@ class ChatRoomAdapter(
R
.
id
.
action_menu_msg_react
->
{
R
.
id
.
action_menu_msg_react
->
{
actionSelectListener
?.
showReactions
(
id
)
actionSelectListener
?.
showReactions
(
id
)
}
}
R
.
id
.
action_message_permalink
->
{
actionSelectListener
?.
copyPermalink
(
id
)
}
else
->
{
else
->
{
TODO
(
"Not implemented"
)
TODO
(
"Not implemented"
)
}
}
...
@@ -310,5 +313,6 @@ class ChatRoomAdapter(
...
@@ -310,5 +313,6 @@ class ChatRoomAdapter(
fun
showReactions
(
id
:
String
)
fun
showReactions
(
id
:
String
)
fun
openDirectMessage
(
roomName
:
String
,
message
:
String
)
fun
openDirectMessage
(
roomName
:
String
,
message
:
String
)
fun
sendMessage
(
chatRoomId
:
String
,
text
:
String
)
fun
sendMessage
(
chatRoomId
:
String
,
text
:
String
)
fun
copyPermalink
(
id
:
String
)
}
}
}
}
\ No newline at end of file
app/src/main/java/chat/rocket/android/chatroom/presentation/ChatRoomPresenter.kt
View file @
a3d71108
...
@@ -541,7 +541,7 @@ class ChatRoomPresenter @Inject constructor(
...
@@ -541,7 +541,7 @@ class ChatRoomPresenter @Inject constructor(
val
messages
=
val
messages
=
retryIO
(
description
=
"history($chatRoomId, $roomType, $instant)"
)
{
retryIO
(
description
=
"history($chatRoomId, $roomType, $instant)"
)
{
client
.
history
(
client
.
history
(
chatRoomId
,
roomType
,
count
=
50
,
chatRoomId
,
roomType
,
count
=
50
,
oldest
=
instant
oldest
=
instant
)
)
}
}
...
@@ -658,6 +658,7 @@ class ChatRoomPresenter @Inject constructor(
...
@@ -658,6 +658,7 @@ class ChatRoomPresenter @Inject constructor(
try
{
try
{
messagesRepository
.
getById
(
messageId
)
?.
let
{
m
->
messagesRepository
.
getById
(
messageId
)
?.
let
{
m
->
view
.
copyToClipboard
(
m
.
message
)
view
.
copyToClipboard
(
m
.
message
)
view
.
showMessage
(
R
.
string
.
msg_message_copied
)
}
}
}
catch
(
e
:
RocketChatException
)
{
}
catch
(
e
:
RocketChatException
)
{
Timber
.
e
(
e
)
Timber
.
e
(
e
)
...
@@ -895,6 +896,42 @@ class ChatRoomPresenter @Inject constructor(
...
@@ -895,6 +896,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?
// TODO: move this to new interactor or FetchChatRoomsInteractor?
private
suspend
fun
getChatRoomsAsync
(
name
:
String
?
=
null
):
List
<
ChatRoom
>
=
withContext
(
CommonPool
)
{
private
suspend
fun
getChatRoomsAsync
(
name
:
String
?
=
null
):
List
<
ChatRoom
>
=
withContext
(
CommonPool
)
{
return
@withContext
dbManager
.
chatRoomDao
().
getAllSync
().
filter
{
return
@withContext
dbManager
.
chatRoomDao
().
getAllSync
().
filter
{
...
@@ -977,6 +1014,24 @@ class ChatRoomPresenter @Inject constructor(
...
@@ -977,6 +1014,24 @@ 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
)
view
.
showMessage
(
R
.
string
.
msg_permalink_copied
)
}
}
}
}
catch
(
ex
:
Exception
)
{
Timber
.
e
(
ex
)
}
}
}
/**
/**
* Send an emoji reaction to a message.
* Send an emoji reaction to a message.
*/
*/
...
...
app/src/main/java/chat/rocket/android/chatroom/ui/ChatRoomFragment.kt
View file @
a3d71108
...
@@ -621,7 +621,6 @@ class ChatRoomFragment : Fragment(), ChatRoomView, EmojiKeyboardListener, EmojiR
...
@@ -621,7 +621,6 @@ class ChatRoomFragment : Fragment(), ChatRoomView, EmojiKeyboardListener, EmojiR
ui
{
ui
{
val
clipboard
=
it
.
getSystemService
(
Context
.
CLIPBOARD_SERVICE
)
as
ClipboardManager
val
clipboard
=
it
.
getSystemService
(
Context
.
CLIPBOARD_SERVICE
)
as
ClipboardManager
clipboard
.
primaryClip
=
ClipData
.
newPlainText
(
""
,
message
)
clipboard
.
primaryClip
=
ClipData
.
newPlainText
(
""
,
message
)
showToast
(
R
.
string
.
msg_message_copied
)
}
}
}
}
...
@@ -1059,6 +1058,10 @@ class ChatRoomFragment : Fragment(), ChatRoomView, EmojiKeyboardListener, EmojiR
...
@@ -1059,6 +1058,10 @@ class ChatRoomFragment : Fragment(), ChatRoomView, EmojiKeyboardListener, EmojiR
}
}
}
}
override
fun
copyPermalink
(
id
:
String
)
{
presenter
.
copyPermalink
(
id
)
}
override
fun
showReactions
(
id
:
String
)
{
override
fun
showReactions
(
id
:
String
)
{
presenter
.
showReactions
(
id
)
presenter
.
showReactions
(
id
)
}
}
...
...
app/src/main/java/chat/rocket/android/chatroom/ui/bottomsheet/MessageActionsBottomSheet.kt
View file @
a3d71108
...
@@ -73,4 +73,4 @@ class MessageActionsBottomSheet : BottomSheetDialogFragment() {
...
@@ -73,4 +73,4 @@ class MessageActionsBottomSheet : BottomSheetDialogFragment() {
}
}
}
}
}
}
}
}
\ No newline at end of file
app/src/main/java/chat/rocket/android/chatroom/uimodel/ActionsAttachmentUiModel.kt
View file @
a3d71108
...
@@ -20,7 +20,8 @@ data class ActionsAttachmentUiModel(
...
@@ -20,7 +20,8 @@ data class ActionsAttachmentUiModel(
override
var
unread
:
Boolean
?
=
null
,
override
var
unread
:
Boolean
?
=
null
,
override
var
menuItemsToHide
:
MutableList
<
Int
>
=
mutableListOf
(),
override
var
menuItemsToHide
:
MutableList
<
Int
>
=
mutableListOf
(),
override
var
currentDayMarkerText
:
String
,
override
var
currentDayMarkerText
:
String
,
override
var
showDayMarker
:
Boolean
override
var
showDayMarker
:
Boolean
,
override
var
permalink
:
String
)
:
BaseAttachmentUiModel
<
ActionsAttachment
>
{
)
:
BaseAttachmentUiModel
<
ActionsAttachment
>
{
override
val
viewType
:
Int
override
val
viewType
:
Int
get
()
=
BaseUiModel
.
ViewType
.
ACTIONS_ATTACHMENT
.
viewType
get
()
=
BaseUiModel
.
ViewType
.
ACTIONS_ATTACHMENT
.
viewType
...
...
app/src/main/java/chat/rocket/android/chatroom/uimodel/AudioAttachmentUiModel.kt
View file @
a3d71108
...
@@ -5,20 +5,21 @@ import chat.rocket.core.model.Message
...
@@ -5,20 +5,21 @@ import chat.rocket.core.model.Message
import
chat.rocket.core.model.attachment.AudioAttachment
import
chat.rocket.core.model.attachment.AudioAttachment
data class
AudioAttachmentUiModel
(
data class
AudioAttachmentUiModel
(
override
val
message
:
Message
,
override
val
message
:
Message
,
override
val
rawData
:
AudioAttachment
,
override
val
rawData
:
AudioAttachment
,
override
val
messageId
:
String
,
override
val
messageId
:
String
,
override
val
attachmentUrl
:
String
,
override
val
attachmentUrl
:
String
,
override
val
attachmentTitle
:
CharSequence
,
override
val
attachmentTitle
:
CharSequence
,
override
val
id
:
Long
,
override
val
id
:
Long
,
override
var
reactions
:
List
<
ReactionUiModel
>,
override
var
reactions
:
List
<
ReactionUiModel
>,
override
var
nextDownStreamMessage
:
BaseUiModel
<*>?
=
null
,
override
var
nextDownStreamMessage
:
BaseUiModel
<*>?
=
null
,
override
var
preview
:
Message
?
=
null
,
override
var
preview
:
Message
?
=
null
,
override
var
isTemporary
:
Boolean
=
false
,
override
var
isTemporary
:
Boolean
=
false
,
override
var
unread
:
Boolean
?
=
null
,
override
var
unread
:
Boolean
?
=
null
,
override
var
menuItemsToHide
:
MutableList
<
Int
>
=
mutableListOf
(),
override
var
menuItemsToHide
:
MutableList
<
Int
>
=
mutableListOf
(),
override
var
currentDayMarkerText
:
String
,
override
var
currentDayMarkerText
:
String
,
override
var
showDayMarker
:
Boolean
override
var
showDayMarker
:
Boolean
,
override
var
permalink
:
String
)
:
BaseFileAttachmentUiModel
<
AudioAttachment
>
{
)
:
BaseFileAttachmentUiModel
<
AudioAttachment
>
{
override
val
viewType
:
Int
override
val
viewType
:
Int
get
()
=
BaseUiModel
.
ViewType
.
AUDIO_ATTACHMENT
.
viewType
get
()
=
BaseUiModel
.
ViewType
.
AUDIO_ATTACHMENT
.
viewType
...
...
app/src/main/java/chat/rocket/android/chatroom/uimodel/AuthorAttachmentUiModel.kt
View file @
a3d71108
...
@@ -20,7 +20,7 @@ data class AuthorAttachmentUiModel(
...
@@ -20,7 +20,7 @@ data class AuthorAttachmentUiModel(
override
var
unread
:
Boolean
?
=
null
,
override
var
unread
:
Boolean
?
=
null
,
override
var
menuItemsToHide
:
MutableList
<
Int
>
=
mutableListOf
(),
override
var
menuItemsToHide
:
MutableList
<
Int
>
=
mutableListOf
(),
override
var
currentDayMarkerText
:
String
,
override
var
currentDayMarkerText
:
String
,
override
var
showDayMarker
:
Boolean
override
var
showDayMarker
:
Boolean
,
override
var
permalink
:
String
)
:
BaseAttachmentUiModel
<
AuthorAttachment
>
{
)
:
BaseAttachmentUiModel
<
AuthorAttachment
>
{
override
val
viewType
:
Int
override
val
viewType
:
Int
get
()
=
BaseUiModel
.
ViewType
.
AUTHOR_ATTACHMENT
.
viewType
get
()
=
BaseUiModel
.
ViewType
.
AUTHOR_ATTACHMENT
.
viewType
...
...
app/src/main/java/chat/rocket/android/chatroom/uimodel/BaseUiModel.kt
View file @
a3d71108
...
@@ -17,6 +17,7 @@ interface BaseUiModel<out T> {
...
@@ -17,6 +17,7 @@ interface BaseUiModel<out T> {
var
currentDayMarkerText
:
String
var
currentDayMarkerText
:
String
var
showDayMarker
:
Boolean
var
showDayMarker
:
Boolean
var
menuItemsToHide
:
MutableList
<
Int
>
var
menuItemsToHide
:
MutableList
<
Int
>
var
permalink
:
String
enum
class
ViewType
(
val
viewType
:
Int
)
{
enum
class
ViewType
(
val
viewType
:
Int
)
{
MESSAGE
(
0
),
MESSAGE
(
0
),
...
...
app/src/main/java/chat/rocket/android/chatroom/uimodel/ColorAttachmentUiModel.kt
View file @
a3d71108
...
@@ -20,7 +20,8 @@ data class ColorAttachmentUiModel(
...
@@ -20,7 +20,8 @@ data class ColorAttachmentUiModel(
override
var
unread
:
Boolean
?,
override
var
unread
:
Boolean
?,
override
var
menuItemsToHide
:
MutableList
<
Int
>
=
mutableListOf
(),
override
var
menuItemsToHide
:
MutableList
<
Int
>
=
mutableListOf
(),
override
var
currentDayMarkerText
:
String
,
override
var
currentDayMarkerText
:
String
,
override
var
showDayMarker
:
Boolean
override
var
showDayMarker
:
Boolean
,
override
var
permalink
:
String
)
:
BaseAttachmentUiModel
<
ColorAttachment
>
{
)
:
BaseAttachmentUiModel
<
ColorAttachment
>
{
override
val
viewType
:
Int
override
val
viewType
:
Int
get
()
=
BaseUiModel
.
ViewType
.
COLOR_ATTACHMENT
.
viewType
get
()
=
BaseUiModel
.
ViewType
.
COLOR_ATTACHMENT
.
viewType
...
...
app/src/main/java/chat/rocket/android/chatroom/uimodel/GenericFileAttachmentUiModel.kt
View file @
a3d71108
...
@@ -18,7 +18,8 @@ data class GenericFileAttachmentUiModel(
...
@@ -18,7 +18,8 @@ data class GenericFileAttachmentUiModel(
override
var
unread
:
Boolean
?
=
null
,
override
var
unread
:
Boolean
?
=
null
,
override
var
menuItemsToHide
:
MutableList
<
Int
>
=
mutableListOf
(),
override
var
menuItemsToHide
:
MutableList
<
Int
>
=
mutableListOf
(),
override
var
currentDayMarkerText
:
String
,
override
var
currentDayMarkerText
:
String
,
override
var
showDayMarker
:
Boolean
override
var
showDayMarker
:
Boolean
,
override
var
permalink
:
String
)
:
BaseFileAttachmentUiModel
<
GenericFileAttachment
>
{
)
:
BaseFileAttachmentUiModel
<
GenericFileAttachment
>
{
override
val
viewType
:
Int
override
val
viewType
:
Int
get
()
=
BaseUiModel
.
ViewType
.
GENERIC_FILE_ATTACHMENT
.
viewType
get
()
=
BaseUiModel
.
ViewType
.
GENERIC_FILE_ATTACHMENT
.
viewType
...
...
app/src/main/java/chat/rocket/android/chatroom/uimodel/ImageAttachmentUiModel.kt
View file @
a3d71108
...
@@ -20,7 +20,8 @@ data class ImageAttachmentUiModel(
...
@@ -20,7 +20,8 @@ data class ImageAttachmentUiModel(
override
var
unread
:
Boolean
?
=
null
,
override
var
unread
:
Boolean
?
=
null
,
override
var
menuItemsToHide
:
MutableList
<
Int
>
=
mutableListOf
(),
override
var
menuItemsToHide
:
MutableList
<
Int
>
=
mutableListOf
(),
override
var
currentDayMarkerText
:
String
,
override
var
currentDayMarkerText
:
String
,
override
var
showDayMarker
:
Boolean
override
var
showDayMarker
:
Boolean
,
override
var
permalink
:
String
)
:
BaseFileAttachmentUiModel
<
ImageAttachment
>
{
)
:
BaseFileAttachmentUiModel
<
ImageAttachment
>
{
override
val
viewType
:
Int
override
val
viewType
:
Int
get
()
=
BaseUiModel
.
ViewType
.
IMAGE_ATTACHMENT
.
viewType
get
()
=
BaseUiModel
.
ViewType
.
IMAGE_ATTACHMENT
.
viewType
...
...
app/src/main/java/chat/rocket/android/chatroom/uimodel/MessageAttachmentUiModel.kt
View file @
a3d71108
...
@@ -19,7 +19,8 @@ data class MessageAttachmentUiModel(
...
@@ -19,7 +19,8 @@ data class MessageAttachmentUiModel(
override
var
unread
:
Boolean
?
=
null
,
override
var
unread
:
Boolean
?
=
null
,
override
var
menuItemsToHide
:
MutableList
<
Int
>
=
mutableListOf
(),
override
var
menuItemsToHide
:
MutableList
<
Int
>
=
mutableListOf
(),
override
var
currentDayMarkerText
:
String
,
override
var
currentDayMarkerText
:
String
,
override
var
showDayMarker
:
Boolean
override
var
showDayMarker
:
Boolean
,
override
var
permalink
:
String
)
:
BaseUiModel
<
Message
>
{
)
:
BaseUiModel
<
Message
>
{
override
val
viewType
:
Int
override
val
viewType
:
Int
get
()
=
BaseUiModel
.
ViewType
.
MESSAGE_ATTACHMENT
.
viewType
get
()
=
BaseUiModel
.
ViewType
.
MESSAGE_ATTACHMENT
.
viewType
...
...
app/src/main/java/chat/rocket/android/chatroom/uimodel/MessageReplyUiModel.kt
View file @
a3d71108
...
@@ -15,7 +15,8 @@ data class MessageReplyUiModel(
...
@@ -15,7 +15,8 @@ data class MessageReplyUiModel(
override
var
unread
:
Boolean
?
=
null
,
override
var
unread
:
Boolean
?
=
null
,
override
var
menuItemsToHide
:
MutableList
<
Int
>
=
mutableListOf
(),
override
var
menuItemsToHide
:
MutableList
<
Int
>
=
mutableListOf
(),
override
var
currentDayMarkerText
:
String
,
override
var
currentDayMarkerText
:
String
,
override
var
showDayMarker
:
Boolean
override
var
showDayMarker
:
Boolean
,
override
var
permalink
:
String
)
:
BaseUiModel
<
MessageReply
>
{
)
:
BaseUiModel
<
MessageReply
>
{
override
val
viewType
:
Int
override
val
viewType
:
Int
get
()
=
BaseUiModel
.
ViewType
.
MESSAGE_REPLY
.
viewType
get
()
=
BaseUiModel
.
ViewType
.
MESSAGE_REPLY
.
viewType
...
...
app/src/main/java/chat/rocket/android/chatroom/uimodel/MessageUiModel.kt
View file @
a3d71108
...
@@ -20,7 +20,8 @@ data class MessageUiModel(
...
@@ -20,7 +20,8 @@ data class MessageUiModel(
override
var
unread
:
Boolean
?
=
null
,
override
var
unread
:
Boolean
?
=
null
,
var
isFirstUnread
:
Boolean
,
var
isFirstUnread
:
Boolean
,
override
var
isTemporary
:
Boolean
=
false
,
override
var
isTemporary
:
Boolean
=
false
,
override
var
menuItemsToHide
:
MutableList
<
Int
>
=
mutableListOf
()
override
var
menuItemsToHide
:
MutableList
<
Int
>
=
mutableListOf
(),
override
var
permalink
:
String
)
:
BaseMessageUiModel
<
Message
>
{
)
:
BaseMessageUiModel
<
Message
>
{
override
val
viewType
:
Int
override
val
viewType
:
Int
get
()
=
BaseUiModel
.
ViewType
.
MESSAGE
.
viewType
get
()
=
BaseUiModel
.
ViewType
.
MESSAGE
.
viewType
...
...
app/src/main/java/chat/rocket/android/chatroom/uimodel/UiModelMapper.kt
View file @
a3d71108
...
@@ -131,23 +131,26 @@ class UiModelMapper @Inject constructor(
...
@@ -131,23 +131,26 @@ class UiModelMapper @Inject constructor(
withContext
(
CommonPool
)
{
withContext
(
CommonPool
)
{
val
list
=
ArrayList
<
BaseUiModel
<*>>()
val
list
=
ArrayList
<
BaseUiModel
<*>>()
message
.
urls
?.
forEach
{
url
->
getChatRoomAsync
(
message
.
roomId
)
?.
let
{
chatRoom
->
mapUrl
(
message
,
url
)
?.
let
{
list
.
add
(
it
)
}
message
.
urls
?.
forEach
{
url
->
}
mapUrl
(
message
,
url
,
chatRoom
)
?.
let
{
list
.
add
(
it
)
}
}
message
.
attachments
?.
mapNotNull
{
attachment
->
message
.
attachments
?.
mapNotNull
{
attachment
->
mapAttachment
(
message
,
attachment
)
mapAttachment
(
message
,
attachment
,
chatRoom
)
}
?.
asReversed
()
?.
let
{
}
?.
asReversed
()
?.
let
{
list
.
addAll
(
it
)
list
.
addAll
(
it
)
}
}
mapMessage
(
message
).
let
{
mapMessage
(
message
,
chatRoom
).
let
{
if
(
list
.
isNotEmpty
())
{
if
(
list
.
isNotEmpty
())
{
it
.
preview
=
list
.
first
().
preview
it
.
preview
=
list
.
first
().
preview
}
list
.
add
(
it
)
}
}
list
.
add
(
it
)
}
}
for
(
i
in
list
.
size
-
1
downTo
0
)
{
for
(
i
in
list
.
size
-
1
downTo
0
)
{
val
next
=
if
(
i
-
1
<
0
)
null
else
list
[
i
-
1
]
val
next
=
if
(
i
-
1
<
0
)
null
else
list
[
i
-
1
]
list
[
i
].
nextDownStreamMessage
=
next
list
[
i
].
nextDownStreamMessage
=
next
...
@@ -214,24 +217,26 @@ class UiModelMapper @Inject constructor(
...
@@ -214,24 +217,26 @@ class UiModelMapper @Inject constructor(
withContext
(
CommonPool
)
{
withContext
(
CommonPool
)
{
val
list
=
ArrayList
<
BaseUiModel
<*>>()
val
list
=
ArrayList
<
BaseUiModel
<*>>()
mapMessage
(
message
).
let
{
getChatRoomAsync
(
message
.
roomId
)
?.
let
{
chatRoom
->
if
(
list
.
isNotEmpty
())
{
mapMessage
(
message
,
chatRoom
).
let
{
it
.
preview
=
list
.
first
().
preview
if
(
list
.
isNotEmpty
())
{
it
.
preview
=
list
.
first
().
preview
}
list
.
add
(
it
)
}
}
list
.
add
(
it
)
}
message
.
attachments
?.
forEach
{
message
.
attachments
?.
forEach
{
val
attachment
=
mapAttachment
(
message
,
it
)
val
attachment
=
mapAttachment
(
message
,
it
,
chatRoom
)
attachment
?.
let
{
attachment
?.
let
{
list
.
add
(
attachment
)
list
.
add
(
attachment
)
}
}
}
}
message
.
urls
?.
forEach
{
message
.
urls
?.
forEach
{
val
url
=
mapUrl
(
message
,
it
)
val
url
=
mapUrl
(
message
,
it
,
chatRoom
)
url
?.
let
{
url
?.
let
{
list
.
add
(
url
)
list
.
add
(
url
)
}
}
}
}
}
...
@@ -283,11 +288,12 @@ class UiModelMapper @Inject constructor(
...
@@ -283,11 +288,12 @@ class UiModelMapper @Inject constructor(
nextDownStreamMessage
=
null
,
nextDownStreamMessage
=
null
,
unread
=
message
.
unread
,
unread
=
message
.
unread
,
currentDayMarkerText
=
dayMarkerText
,
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
if
(
url
.
ignoreParse
||
url
.
meta
==
null
)
return
null
val
hostname
=
url
.
parsedUrl
?.
hostname
?:
""
val
hostname
=
url
.
parsedUrl
?.
hostname
?:
""
...
@@ -297,39 +303,53 @@ class UiModelMapper @Inject constructor(
...
@@ -297,39 +303,53 @@ class UiModelMapper @Inject constructor(
val
localDateTime
=
DateTimeHelper
.
getLocalDateTime
(
message
.
timestamp
)
val
localDateTime
=
DateTimeHelper
.
getLocalDateTime
(
message
.
timestamp
)
val
dayMarkerText
=
DateTimeHelper
.
getFormattedDateForMessages
(
localDateTime
,
context
)
val
dayMarkerText
=
DateTimeHelper
.
getFormattedDateForMessages
(
localDateTime
,
context
)
val
permalink
=
messageHelper
.
createPermalink
(
message
,
chatRoom
,
false
)
return
UrlPreviewUiModel
(
message
,
url
,
message
.
id
,
title
,
hostname
,
description
,
thumb
,
return
UrlPreviewUiModel
(
message
,
url
,
message
.
id
,
title
,
hostname
,
description
,
thumb
,
getReactions
(
message
),
preview
=
message
.
copy
(
message
=
url
.
url
),
unread
=
message
.
unread
,
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
)
{
return
when
(
attachment
)
{
is
FileAttachment
->
mapFileAttachment
(
message
,
attachment
)
is
FileAttachment
->
mapFileAttachment
(
message
,
attachment
,
chatRoom
)
is
MessageAttachment
->
mapMessageAttachment
(
message
,
attachment
)
is
MessageAttachment
->
mapMessageAttachment
(
message
,
attachment
,
chatRoom
)
is
AuthorAttachment
->
mapAuthorAttachment
(
message
,
attachment
)
is
AuthorAttachment
->
mapAuthorAttachment
(
message
,
attachment
,
chatRoom
)
is
ColorAttachment
->
mapColorAttachment
(
message
,
attachment
)
is
ColorAttachment
->
mapColorAttachment
(
message
,
attachment
,
chatRoom
)
is
ActionsAttachment
->
mapActionsAttachment
(
message
,
attachment
)
is
ActionsAttachment
->
mapActionsAttachment
(
message
,
attachment
,
chatRoom
)
else
->
null
else
->
null
}
}
}
}
private
fun
mapActionsAttachment
(
message
:
Message
,
attachment
:
ActionsAttachment
):
BaseUiModel
<
*
>?
{
private
fun
mapActionsAttachment
(
message
:
Message
,
attachment
:
ActionsAttachment
,
chatRoom
:
ChatRoom
):
BaseUiModel
<
*
>?
{
return
with
(
attachment
)
{
return
with
(
attachment
)
{
val
content
=
stripMessageQuotes
(
message
)
val
content
=
stripMessageQuotes
(
message
)
val
localDateTime
=
DateTimeHelper
.
getLocalDateTime
(
message
.
timestamp
)
val
localDateTime
=
DateTimeHelper
.
getLocalDateTime
(
message
.
timestamp
)
val
dayMarkerText
=
DateTimeHelper
.
getFormattedDateForMessages
(
localDateTime
,
context
)
val
dayMarkerText
=
DateTimeHelper
.
getFormattedDateForMessages
(
localDateTime
,
context
)
val
permalink
=
messageHelper
.
createPermalink
(
message
,
chatRoom
,
false
)
ActionsAttachmentUiModel
(
attachmentUrl
=
url
,
title
=
title
,
ActionsAttachmentUiModel
(
attachmentUrl
=
url
,
title
=
title
,
actions
=
actions
,
buttonAlignment
=
buttonAlignment
,
message
=
message
,
rawData
=
attachment
,
actions
=
actions
,
buttonAlignment
=
buttonAlignment
,
message
=
message
,
rawData
=
attachment
,
messageId
=
message
.
id
,
reactions
=
getReactions
(
message
),
messageId
=
message
.
id
,
reactions
=
getReactions
(
message
),
preview
=
message
.
copy
(
message
=
content
.
message
),
unread
=
message
.
unread
,
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
)
{
return
with
(
attachment
)
{
val
content
=
stripMessageQuotes
(
message
)
val
content
=
stripMessageQuotes
(
message
)
val
id
=
attachmentId
(
message
,
attachment
)
val
id
=
attachmentId
(
message
,
attachment
)
...
@@ -337,12 +357,13 @@ class UiModelMapper @Inject constructor(
...
@@ -337,12 +357,13 @@ class UiModelMapper @Inject constructor(
val
localDateTime
=
DateTimeHelper
.
getLocalDateTime
(
message
.
timestamp
)
val
localDateTime
=
DateTimeHelper
.
getLocalDateTime
(
message
.
timestamp
)
val
dayMarkerText
=
DateTimeHelper
.
getFormattedDateForMessages
(
localDateTime
,
context
)
val
dayMarkerText
=
DateTimeHelper
.
getFormattedDateForMessages
(
localDateTime
,
context
)
val
fieldsText
=
mapFields
(
fields
)
val
fieldsText
=
mapFields
(
fields
)
val
permalink
=
messageHelper
.
createPermalink
(
message
,
chatRoom
,
false
)
ColorAttachmentUiModel
(
attachmentUrl
=
url
,
id
=
id
,
color
=
color
.
color
,
ColorAttachmentUiModel
(
attachmentUrl
=
url
,
id
=
id
,
color
=
color
.
color
,
text
=
text
,
fields
=
fieldsText
,
message
=
message
,
rawData
=
attachment
,
text
=
text
,
fields
=
fieldsText
,
message
=
message
,
rawData
=
attachment
,
messageId
=
message
.
id
,
reactions
=
getReactions
(
message
),
messageId
=
message
.
id
,
reactions
=
getReactions
(
message
),
preview
=
message
.
copy
(
message
=
content
.
message
),
unread
=
message
.
unread
,
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(
...
@@ -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
)
{
return
with
(
attachment
)
{
val
content
=
stripMessageQuotes
(
message
)
val
content
=
stripMessageQuotes
(
message
)
...
@@ -373,16 +398,21 @@ class UiModelMapper @Inject constructor(
...
@@ -373,16 +398,21 @@ class UiModelMapper @Inject constructor(
val
localDateTime
=
DateTimeHelper
.
getLocalDateTime
(
message
.
timestamp
)
val
localDateTime
=
DateTimeHelper
.
getLocalDateTime
(
message
.
timestamp
)
val
dayMarkerText
=
DateTimeHelper
.
getFormattedDateForMessages
(
localDateTime
,
context
)
val
dayMarkerText
=
DateTimeHelper
.
getFormattedDateForMessages
(
localDateTime
,
context
)
val
permalink
=
messageHelper
.
createPermalink
(
message
,
chatRoom
,
false
)
AuthorAttachmentUiModel
(
attachmentUrl
=
url
,
id
=
id
,
name
=
authorName
,
AuthorAttachmentUiModel
(
attachmentUrl
=
url
,
id
=
id
,
name
=
authorName
,
icon
=
authorIcon
,
fields
=
fieldsText
,
message
=
message
,
rawData
=
attachment
,
icon
=
authorIcon
,
fields
=
fieldsText
,
message
=
message
,
rawData
=
attachment
,
messageId
=
message
.
id
,
reactions
=
getReactions
(
message
),
messageId
=
message
.
id
,
reactions
=
getReactions
(
message
),
preview
=
message
.
copy
(
message
=
content
.
message
),
unread
=
message
.
unread
,
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
attachmentAuthor
=
attachment
.
author
val
time
=
attachment
.
timestamp
?.
let
{
getTime
(
it
)
}
val
time
=
attachment
.
timestamp
?.
let
{
getTime
(
it
)
}
val
attachmentText
=
when
(
attachment
.
attachments
.
orEmpty
().
firstOrNull
())
{
val
attachmentText
=
when
(
attachment
.
attachments
.
orEmpty
().
firstOrNull
())
{
...
@@ -397,15 +427,20 @@ class UiModelMapper @Inject constructor(
...
@@ -397,15 +427,20 @@ class UiModelMapper @Inject constructor(
val
dayMarkerText
=
DateTimeHelper
.
getFormattedDateForMessages
(
localDateTime
,
context
)
val
dayMarkerText
=
DateTimeHelper
.
getFormattedDateForMessages
(
localDateTime
,
context
)
val
content
=
stripMessageQuotes
(
message
)
val
content
=
stripMessageQuotes
(
message
)
val
permalink
=
messageHelper
.
createPermalink
(
message
,
chatRoom
,
false
)
return
MessageAttachmentUiModel
(
message
=
content
,
rawData
=
message
,
return
MessageAttachmentUiModel
(
message
=
content
,
rawData
=
message
,
messageId
=
message
.
id
,
time
=
time
,
senderName
=
attachmentAuthor
,
messageId
=
message
.
id
,
time
=
time
,
senderName
=
attachmentAuthor
,
content
=
attachmentText
,
isPinned
=
message
.
pinned
,
reactions
=
getReactions
(
message
),
content
=
attachmentText
,
isPinned
=
message
.
pinned
,
reactions
=
getReactions
(
message
),
preview
=
message
.
copy
(
message
=
content
.
message
),
unread
=
message
.
unread
,
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
attachmentUrl
=
attachmentUrl
(
attachment
)
val
attachmentTitle
=
attachmentTitle
(
attachment
)
val
attachmentTitle
=
attachmentTitle
(
attachment
)
val
attachmentText
=
attachmentText
(
attachment
)
val
attachmentText
=
attachmentText
(
attachment
)
...
@@ -414,24 +449,25 @@ class UiModelMapper @Inject constructor(
...
@@ -414,24 +449,25 @@ class UiModelMapper @Inject constructor(
val
localDateTime
=
DateTimeHelper
.
getLocalDateTime
(
message
.
timestamp
)
val
localDateTime
=
DateTimeHelper
.
getLocalDateTime
(
message
.
timestamp
)
val
dayMarkerText
=
DateTimeHelper
.
getFormattedDateForMessages
(
localDateTime
,
context
)
val
dayMarkerText
=
DateTimeHelper
.
getFormattedDateForMessages
(
localDateTime
,
context
)
val
permalink
=
messageHelper
.
createPermalink
(
message
,
chatRoom
,
false
)
return
when
(
attachment
)
{
return
when
(
attachment
)
{
is
ImageAttachment
->
ImageAttachmentUiModel
(
message
,
attachment
,
message
.
id
,
is
ImageAttachment
->
ImageAttachmentUiModel
(
message
,
attachment
,
message
.
id
,
attachmentUrl
,
attachmentTitle
,
attachmentText
,
attachmentDescription
,
id
,
getReactions
(
message
),
attachmentUrl
,
attachmentTitle
,
attachmentText
,
attachmentDescription
,
id
,
getReactions
(
message
),
preview
=
message
.
copy
(
message
=
context
.
getString
(
R
.
string
.
msg_preview_photo
)),
unread
=
message
.
unread
,
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
,
is
VideoAttachment
->
VideoAttachmentUiModel
(
message
,
attachment
,
message
.
id
,
attachmentUrl
,
attachmentTitle
,
id
,
getReactions
(
message
),
attachmentUrl
,
attachmentTitle
,
id
,
getReactions
(
message
),
preview
=
message
.
copy
(
message
=
context
.
getString
(
R
.
string
.
msg_preview_video
)),
unread
=
message
.
unread
,
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
,
is
AudioAttachment
->
AudioAttachmentUiModel
(
message
,
attachment
,
message
.
id
,
attachmentUrl
,
attachmentTitle
,
id
,
getReactions
(
message
),
attachmentUrl
,
attachmentTitle
,
id
,
getReactions
(
message
),
preview
=
message
.
copy
(
message
=
context
.
getString
(
R
.
string
.
msg_preview_audio
)),
unread
=
message
.
unread
,
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
,
is
GenericFileAttachment
->
GenericFileAttachmentUiModel
(
message
,
attachment
,
message
.
id
,
attachmentUrl
,
attachmentTitle
,
id
,
getReactions
(
message
),
message
.
id
,
attachmentUrl
,
attachmentTitle
,
id
,
getReactions
(
message
),
preview
=
message
.
copy
(
message
=
context
.
getString
(
R
.
string
.
msg_preview_file
)),
unread
=
message
.
unread
,
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
else
->
null
}
}
}
}
...
@@ -479,7 +515,10 @@ class UiModelMapper @Inject constructor(
...
@@ -479,7 +515,10 @@ class UiModelMapper @Inject constructor(
return
attachment
.
description
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
sender
=
getSenderName
(
message
)
val
time
=
getTime
(
message
.
timestamp
)
val
time
=
getTime
(
message
.
timestamp
)
val
avatar
=
getUserAvatar
(
message
)
val
avatar
=
getUserAvatar
(
message
)
...
@@ -493,13 +532,14 @@ class UiModelMapper @Inject constructor(
...
@@ -493,13 +532,14 @@ class UiModelMapper @Inject constructor(
val
localDateTime
=
DateTimeHelper
.
getLocalDateTime
(
message
.
timestamp
)
val
localDateTime
=
DateTimeHelper
.
getLocalDateTime
(
message
.
timestamp
)
val
dayMarkerText
=
DateTimeHelper
.
getFormattedDateForMessages
(
localDateTime
,
context
)
val
dayMarkerText
=
DateTimeHelper
.
getFormattedDateForMessages
(
localDateTime
,
context
)
val
permalink
=
messageHelper
.
createPermalink
(
message
,
chatRoom
,
false
)
val
content
=
getContent
(
stripMessageQuotes
(
message
))
val
content
=
getContent
(
stripMessageQuotes
(
message
))
MessageUiModel
(
message
=
stripMessageQuotes
(
message
),
rawData
=
message
,
MessageUiModel
(
message
=
stripMessageQuotes
(
message
),
rawData
=
message
,
messageId
=
message
.
id
,
avatar
=
avatar
!!
,
time
=
time
,
senderName
=
sender
,
messageId
=
message
.
id
,
avatar
=
avatar
!!
,
time
=
time
,
senderName
=
sender
,
content
=
content
,
isPinned
=
message
.
pinned
,
currentDayMarkerText
=
dayMarkerText
,
content
=
content
,
isPinned
=
message
.
pinned
,
currentDayMarkerText
=
dayMarkerText
,
showDayMarker
=
false
,
reactions
=
getReactions
(
message
),
isFirstUnread
=
false
,
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
{
private
fun
mapMessagePreview
(
message
:
Message
):
Message
{
...
...
app/src/main/java/chat/rocket/android/chatroom/uimodel/UrlPreviewUiModel.kt
View file @
a3d71108
...
@@ -19,7 +19,8 @@ data class UrlPreviewUiModel(
...
@@ -19,7 +19,8 @@ data class UrlPreviewUiModel(
override
var
unread
:
Boolean
?
=
null
,
override
var
unread
:
Boolean
?
=
null
,
override
var
menuItemsToHide
:
MutableList
<
Int
>
=
mutableListOf
(),
override
var
menuItemsToHide
:
MutableList
<
Int
>
=
mutableListOf
(),
override
var
currentDayMarkerText
:
String
,
override
var
currentDayMarkerText
:
String
,
override
var
showDayMarker
:
Boolean
override
var
showDayMarker
:
Boolean
,
override
var
permalink
:
String
)
:
BaseUiModel
<
Url
>
{
)
:
BaseUiModel
<
Url
>
{
override
val
viewType
:
Int
override
val
viewType
:
Int
get
()
=
BaseUiModel
.
ViewType
.
URL_PREVIEW
.
viewType
get
()
=
BaseUiModel
.
ViewType
.
URL_PREVIEW
.
viewType
...
...
app/src/main/java/chat/rocket/android/chatroom/uimodel/VideoAttachmentUiModel.kt
View file @
a3d71108
...
@@ -5,20 +5,21 @@ import chat.rocket.core.model.Message
...
@@ -5,20 +5,21 @@ import chat.rocket.core.model.Message
import
chat.rocket.core.model.attachment.VideoAttachment
import
chat.rocket.core.model.attachment.VideoAttachment
data class
VideoAttachmentUiModel
(
data class
VideoAttachmentUiModel
(
override
val
message
:
Message
,
override
val
message
:
Message
,
override
val
rawData
:
VideoAttachment
,
override
val
rawData
:
VideoAttachment
,
override
val
messageId
:
String
,
override
val
messageId
:
String
,
override
val
attachmentUrl
:
String
,
override
val
attachmentUrl
:
String
,
override
val
attachmentTitle
:
CharSequence
,
override
val
attachmentTitle
:
CharSequence
,
override
val
id
:
Long
,
override
val
id
:
Long
,
override
var
reactions
:
List
<
ReactionUiModel
>,
override
var
reactions
:
List
<
ReactionUiModel
>,
override
var
nextDownStreamMessage
:
BaseUiModel
<*>?
=
null
,
override
var
nextDownStreamMessage
:
BaseUiModel
<*>?
=
null
,
override
var
preview
:
Message
?
=
null
,
override
var
preview
:
Message
?
=
null
,
override
var
isTemporary
:
Boolean
=
false
,
override
var
isTemporary
:
Boolean
=
false
,
override
var
unread
:
Boolean
?
=
null
,
override
var
unread
:
Boolean
?
=
null
,
override
var
menuItemsToHide
:
MutableList
<
Int
>
=
mutableListOf
(),
override
var
menuItemsToHide
:
MutableList
<
Int
>
=
mutableListOf
(),
override
var
currentDayMarkerText
:
String
,
override
var
currentDayMarkerText
:
String
,
override
var
showDayMarker
:
Boolean
override
var
showDayMarker
:
Boolean
,
override
var
permalink
:
String
)
:
BaseFileAttachmentUiModel
<
VideoAttachment
>
{
)
:
BaseFileAttachmentUiModel
<
VideoAttachment
>
{
override
val
viewType
:
Int
override
val
viewType
:
Int
get
()
=
BaseUiModel
.
ViewType
.
VIDEO_ATTACHMENT
.
viewType
get
()
=
BaseUiModel
.
ViewType
.
VIDEO_ATTACHMENT
.
viewType
...
...
app/src/main/java/chat/rocket/android/chatroom/uimodel/suggestion/ChatRoomSuggestionUiModel.kt
View file @
a3d71108
...
@@ -2,7 +2,9 @@ package chat.rocket.android.chatroom.uimodel.suggestion
...
@@ -2,7 +2,9 @@ package chat.rocket.android.chatroom.uimodel.suggestion
import
chat.rocket.android.suggestions.model.SuggestionModel
import
chat.rocket.android.suggestions.model.SuggestionModel
class
ChatRoomSuggestionUiModel
(
text
:
String
,
class
ChatRoomSuggestionUiModel
(
val
fullName
:
String
,
text
:
String
,
val
name
:
String
,
val
fullName
:
String
,
searchList
:
List
<
String
>)
:
SuggestionModel
(
text
,
searchList
,
false
)
val
name
:
String
,
\ 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 @
a3d71108
...
@@ -2,6 +2,8 @@ package chat.rocket.android.chatroom.uimodel.suggestion
...
@@ -2,6 +2,8 @@ package chat.rocket.android.chatroom.uimodel.suggestion
import
chat.rocket.android.suggestions.model.SuggestionModel
import
chat.rocket.android.suggestions.model.SuggestionModel
class
CommandSuggestionUiModel
(
text
:
String
,
class
CommandSuggestionUiModel
(
val
description
:
String
,
text
:
String
,
searchList
:
List
<
String
>)
:
SuggestionModel
(
text
,
searchList
)
val
description
:
String
,
\ 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 @
a3d71108
...
@@ -3,13 +3,15 @@ package chat.rocket.android.chatroom.uimodel.suggestion
...
@@ -3,13 +3,15 @@ package chat.rocket.android.chatroom.uimodel.suggestion
import
chat.rocket.android.suggestions.model.SuggestionModel
import
chat.rocket.android.suggestions.model.SuggestionModel
import
chat.rocket.common.model.UserStatus
import
chat.rocket.common.model.UserStatus
class
PeopleSuggestionUiModel
(
val
imageUri
:
String
?,
class
PeopleSuggestionUiModel
(
text
:
String
,
val
imageUri
:
String
?,
val
username
:
String
,
text
:
String
,
val
name
:
String
,
val
username
:
String
,
val
status
:
UserStatus
?,
val
name
:
String
,
pinned
:
Boolean
=
false
,
val
status
:
UserStatus
?,
searchList
:
List
<
String
>)
:
SuggestionModel
(
text
,
searchList
,
pinned
)
{
pinned
:
Boolean
=
false
,
searchList
:
List
<
String
>
)
:
SuggestionModel
(
text
,
searchList
,
pinned
)
{
override
fun
toString
():
String
{
override
fun
toString
():
String
{
return
"PeopleSuggestionUiModel(imageUri='$imageUri', username='$username', name='$name', status=$status, pinned=$pinned)"
return
"PeopleSuggestionUiModel(imageUri='$imageUri', username='$username', name='$name', status=$status, pinned=$pinned)"
...
...
app/src/main/java/chat/rocket/android/helper/MessageHelper.kt
View file @
a3d71108
...
@@ -17,7 +17,7 @@ class MessageHelper @Inject constructor(
...
@@ -17,7 +17,7 @@ class MessageHelper @Inject constructor(
private
val
currentServer
=
serverInteractor
.
get
()
!!
private
val
currentServer
=
serverInteractor
.
get
()
!!
private
val
settings
:
PublicSettings
=
getSettingsInteractor
.
get
(
currentServer
)
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
)
{
val
type
=
when
(
chatRoom
.
type
)
{
is
RoomType
.
PrivateGroup
->
"group"
is
RoomType
.
PrivateGroup
->
"group"
is
RoomType
.
Channel
->
"channel"
is
RoomType
.
Channel
->
"channel"
...
@@ -30,7 +30,8 @@ class MessageHelper @Inject constructor(
...
@@ -30,7 +30,8 @@ class MessageHelper @Inject constructor(
}
else
{
}
else
{
chatRoom
.
name
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
?
{
fun
messageIdFromPermalink
(
permalink
:
String
):
String
?
{
...
...
app/src/main/java/chat/rocket/android/helper/MessageParser.kt
View file @
a3d71108
...
@@ -40,6 +40,7 @@ import ru.noties.markwon.SpannableConfiguration
...
@@ -40,6 +40,7 @@ import ru.noties.markwon.SpannableConfiguration
import
ru.noties.markwon.renderer.SpannableMarkdownVisitor
import
ru.noties.markwon.renderer.SpannableMarkdownVisitor
import
ru.noties.markwon.tasklist.TaskListExtension
import
ru.noties.markwon.tasklist.TaskListExtension
import
java.util.*
import
java.util.*
import
java.util.regex.Pattern
import
javax.inject.Inject
import
javax.inject.Inject
class
MessageParser
@Inject
constructor
(
class
MessageParser
@Inject
constructor
(
...
@@ -47,7 +48,6 @@ class MessageParser @Inject constructor(
...
@@ -47,7 +48,6 @@ class MessageParser @Inject constructor(
private
val
configuration
:
SpannableConfiguration
,
private
val
configuration
:
SpannableConfiguration
,
private
val
settings
:
PublicSettings
private
val
settings
:
PublicSettings
)
{
)
{
/**
/**
* Render markdown and other rules on message to rich text with spans.
* Render markdown and other rules on message to rich text with spans.
*
*
...
@@ -231,7 +231,7 @@ class MessageParser @Inject constructor(
...
@@ -231,7 +231,7 @@ class MessageParser @Inject constructor(
override
fun
visit
(
document
:
Document
)
{
override
fun
visit
(
document
:
Document
)
{
// Replace all url links to markdown url syntax.
// Replace all url links to markdown url syntax.
val
matcher
=
PatternsCompat
.
AUTOLINK_
WEB_URL
.
matcher
(
builder
.
text
())
val
matcher
=
MessageParser
.
WEB_URL
.
matcher
(
builder
.
text
())
val
consumed
=
mutableListOf
<
String
>()
val
consumed
=
mutableListOf
<
String
>()
while
(
matcher
.
find
())
{
while
(
matcher
.
find
())
{
...
@@ -284,4 +284,249 @@ class MessageParser @Inject constructor(
...
@@ -284,4 +284,249 @@ class MessageParser @Inject constructor(
canvas
.
drawText
(
text
,
start
,
end
,
x
+
padding
,
y
.
toFloat
(),
paint
)
canvas
.
drawText
(
text
,
start
,
end
,
x
+
padding
,
y
.
toFloat
(),
paint
)
}
}
}
}
companion
object
{
/**
* Regular expression to match all IANA top-level domains.
*
* List accurate as of 2015/11/24. List taken from:
* http://data.iana.org/TLD/tlds-alpha-by-domain.txt
* This pattern is auto-generated by frameworks/ex/common/tools/make-iana-tld-pattern.py
*/
private
val
IANA_TOP_LEVEL_DOMAINS
=
(
"(?:"
+
"(?:aaa|aarp|abb|abbott|abogado|academy|accenture|accountant|accountants|aco|active"
+
"|actor|ads|adult|aeg|aero|afl|agency|aig|airforce|airtel|allfinanz|alsace|amica|amsterdam"
+
"|android|apartments|app|apple|aquarelle|aramco|archi|army|arpa|arte|asia|associates"
+
"|attorney|auction|audio|auto|autos|axa|azure|a[cdefgilmoqrstuwxz])"
+
"|(?:band|bank|bar|barcelona|barclaycard|barclays|bargains|bauhaus|bayern|bbc|bbva"
+
"|bcn|beats|beer|bentley|berlin|best|bet|bharti|bible|bid|bike|bing|bingo|bio|biz|black"
+
"|blackfriday|bloomberg|blue|bms|bmw|bnl|bnpparibas|boats|bom|bond|boo|boots|boutique"
+
"|bradesco|bridgestone|broadway|broker|brother|brussels|budapest|build|builders|business"
+
"|buzz|bzh|b[abdefghijmnorstvwyz])"
+
"|(?:cab|cafe|cal|camera|camp|cancerresearch|canon|capetown|capital|car|caravan|cards"
+
"|care|career|careers|cars|cartier|casa|cash|casino|cat|catering|cba|cbn|ceb|center|ceo"
+
"|cern|cfa|cfd|chanel|channel|chat|cheap|chloe|christmas|chrome|church|cipriani|cisco"
+
"|citic|city|cityeats|claims|cleaning|click|clinic|clothing|cloud|club|clubmed|coach"
+
"|codes|coffee|college|cologne|com|commbank|community|company|computer|comsec|condos"
+
"|construction|consulting|contractors|cooking|cool|coop|corsica|country|coupons|courses"
+
"|credit|creditcard|creditunion|cricket|crown|crs|cruises|csc|cuisinella|cymru|cyou|c[acdfghiklmnoruvwxyz])"
+
"|(?:dabur|dad|dance|date|dating|datsun|day|dclk|deals|degree|delivery|dell|delta"
+
"|democrat|dental|dentist|desi|design|dev|diamonds|diet|digital|direct|directory|discount"
+
"|dnp|docs|dog|doha|domains|doosan|download|drive|durban|dvag|d[ejkmoz])"
+
"|(?:earth|eat|edu|education|email|emerck|energy|engineer|engineering|enterprises"
+
"|epson|equipment|erni|esq|estate|eurovision|eus|events|everbank|exchange|expert|exposed"
+
"|express|e[cegrstu])"
+
"|(?:fage|fail|fairwinds|faith|family|fan|fans|farm|fashion|feedback|ferrero|film"
+
"|final|finance|financial|firmdale|fish|fishing|fit|fitness|flights|florist|flowers|flsmidth"
+
"|fly|foo|football|forex|forsale|forum|foundation|frl|frogans|fund|furniture|futbol|fyi"
+
"|f[ijkmor])"
+
"|(?:gal|gallery|game|garden|gbiz|gdn|gea|gent|genting|ggee|gift|gifts|gives|giving"
+
"|glass|gle|global|globo|gmail|gmo|gmx|gold|goldpoint|golf|goo|goog|google|gop|gov|grainger"
+
"|graphics|gratis|green|gripe|group|gucci|guge|guide|guitars|guru|g[abdefghilmnpqrstuwy])"
+
"|(?:hamburg|hangout|haus|healthcare|help|here|hermes|hiphop|hitachi|hiv|hockey|holdings"
+
"|holiday|homedepot|homes|honda|horse|host|hosting|hoteles|hotmail|house|how|hsbc|hyundai"
+
"|h[kmnrtu])"
+
"|(?:ibm|icbc|ice|icu|ifm|iinet|immo|immobilien|industries|infiniti|info|ing|ink|institute"
+
"|insure|int|international|investments|ipiranga|irish|ist|istanbul|itau|iwc|i[delmnoqrst])"
+
"|(?:jaguar|java|jcb|jetzt|jewelry|jlc|jll|jobs|joburg|jprs|juegos|j[emop])"
+
"|(?:kaufen|kddi|kia|kim|kinder|kitchen|kiwi|koeln|komatsu|krd|kred|kyoto|k[eghimnprwyz])"
+
"|(?:lacaixa|lancaster|land|landrover|lasalle|lat|latrobe|law|lawyer|lds|lease|leclerc"
+
"|legal|lexus|lgbt|liaison|lidl|life|lifestyle|lighting|limited|limo|linde|link|live"
+
"|lixil|loan|loans|lol|london|lotte|lotto|love|ltd|ltda|lupin|luxe|luxury|l[abcikrstuvy])"
+
"|(?:madrid|maif|maison|man|management|mango|market|marketing|markets|marriott|mba"
+
"|media|meet|melbourne|meme|memorial|men|menu|meo|miami|microsoft|mil|mini|mma|mobi|moda"
+
"|moe|moi|mom|monash|money|montblanc|mormon|mortgage|moscow|motorcycles|mov|movie|movistar"
+
"|mtn|mtpc|mtr|museum|mutuelle|m[acdeghklmnopqrstuvwxyz])"
+
"|(?:nadex|nagoya|name|navy|nec|net|netbank|network|neustar|new|news|nexus|ngo|nhk"
+
"|nico|ninja|nissan|nokia|nra|nrw|ntt|nyc|n[acefgilopruz])"
+
"|(?:obi|office|okinawa|omega|one|ong|onl|online|ooo|oracle|orange|org|organic|osaka"
+
"|otsuka|ovh|om)"
+
"|(?:page|panerai|paris|partners|parts|party|pet|pharmacy|philips|photo|photography"
+
"|photos|physio|piaget|pics|pictet|pictures|ping|pink|pizza|place|play|playstation|plumbing"
+
"|plus|pohl|poker|porn|post|praxi|press|pro|prod|productions|prof|properties|property"
+
"|protection|pub|p[aefghklmnrstwy])"
+
"|(?:qpon|quebec|qa)"
+
"|(?:racing|realtor|realty|recipes|red|redstone|rehab|reise|reisen|reit|ren|rent|rentals"
+
"|repair|report|republican|rest|restaurant|review|reviews|rich|ricoh|rio|rip|rocher|rocks"
+
"|rodeo|rsvp|ruhr|run|rwe|ryukyu|r[eosuw])"
+
"|(?:saarland|sakura|sale|samsung|sandvik|sandvikcoromant|sanofi|sap|sapo|sarl|saxo"
+
"|sbs|sca|scb|schmidt|scholarships|school|schule|schwarz|science|scor|scot|seat|security"
+
"|seek|sener|services|seven|sew|sex|sexy|shiksha|shoes|show|shriram|singles|site|ski"
+
"|sky|skype|sncf|soccer|social|software|sohu|solar|solutions|sony|soy|space|spiegel|spreadbetting"
+
"|srl|stada|starhub|statoil|stc|stcgroup|stockholm|studio|study|style|sucks|supplies"
+
"|supply|support|surf|surgery|suzuki|swatch|swiss|sydney|systems|s[abcdeghijklmnortuvxyz])"
+
"|(?:tab|taipei|tatamotors|tatar|tattoo|tax|taxi|team|tech|technology|tel|telefonica"
+
"|temasek|tennis|thd|theater|theatre|tickets|tienda|tips|tires|tirol|today|tokyo|tools"
+
"|top|toray|toshiba|tours|town|toyota|toys|trade|trading|training|travel|trust|tui|t[cdfghjklmnortvwz])"
+
"|(?:ubs|university|uno|uol|u[agksyz])"
+
"|(?:vacations|vana|vegas|ventures|versicherung|vet|viajes|video|villas|vin|virgin"
+
"|vision|vista|vistaprint|viva|vlaanderen|vodka|vote|voting|voto|voyage|v[aceginu])"
+
"|(?:wales|walter|wang|watch|webcam|website|wed|wedding|weir|whoswho|wien|wiki|williamhill"
+
"|win|windows|wine|wme|work|works|world|wtc|wtf|w[fs])"
+
"|(?:\u03b5\u03bb|\u0431\u0435\u043b|\u0434\u0435\u0442\u0438|\u043a\u043e\u043c|\u043c\u043a\u0434"
+
"|\u043c\u043e\u043d|\u043c\u043e\u0441\u043a\u0432\u0430|\u043e\u043d\u043b\u0430\u0439\u043d"
+
"|\u043e\u0440\u0433|\u0440\u0443\u0441|\u0440\u0444|\u0441\u0430\u0439\u0442|\u0441\u0440\u0431"
+
"|\u0443\u043a\u0440|\u049b\u0430\u0437|\u0570\u0561\u0575|\u05e7\u05d5\u05dd|\u0627\u0631\u0627\u0645\u0643\u0648"
+
"|\u0627\u0644\u0627\u0631\u062f\u0646|\u0627\u0644\u062c\u0632\u0627\u0626\u0631|\u0627\u0644\u0633\u0639\u0648\u062f\u064a\u0629"
+
"|\u0627\u0644\u0645\u063a\u0631\u0628|\u0627\u0645\u0627\u0631\u0627\u062a|\u0627\u06cc\u0631\u0627\u0646"
+
"|\u0628\u0627\u0632\u0627\u0631|\u0628\u06be\u0627\u0631\u062a|\u062a\u0648\u0646\u0633"
+
"|\u0633\u0648\u062f\u0627\u0646|\u0633\u0648\u0631\u064a\u0629|\u0634\u0628\u0643\u0629"
+
"|\u0639\u0631\u0627\u0642|\u0639\u0645\u0627\u0646|\u0641\u0644\u0633\u0637\u064a\u0646"
+
"|\u0642\u0637\u0631|\u0643\u0648\u0645|\u0645\u0635\u0631|\u0645\u0644\u064a\u0633\u064a\u0627"
+
"|\u0645\u0648\u0642\u0639|\u0915\u0949\u092e|\u0928\u0947\u091f|\u092d\u093e\u0930\u0924"
+
"|\u0938\u0902\u0917\u0920\u0928|\u09ad\u09be\u09b0\u09a4|\u0a2d\u0a3e\u0a30\u0a24|\u0aad\u0abe\u0ab0\u0aa4"
+
"|\u0b87\u0ba8\u0bcd\u0ba4\u0bbf\u0baf\u0bbe|\u0b87\u0bb2\u0b99\u0bcd\u0b95\u0bc8|\u0b9a\u0bbf\u0b99\u0bcd\u0b95\u0baa\u0bcd\u0baa\u0bc2\u0bb0\u0bcd"
+
"|\u0c2d\u0c3e\u0c30\u0c24\u0c4d|\u0dbd\u0d82\u0d9a\u0dcf|\u0e04\u0e2d\u0e21|\u0e44\u0e17\u0e22"
+
"|\u10d2\u10d4|\u307f\u3093\u306a|\u30b0\u30fc\u30b0\u30eb|\u30b3\u30e0|\u4e16\u754c"
+
"|\u4e2d\u4fe1|\u4e2d\u56fd|\u4e2d\u570b|\u4e2d\u6587\u7f51|\u4f01\u4e1a|\u4f5b\u5c71"
+
"|\u4fe1\u606f|\u5065\u5eb7|\u516b\u5366|\u516c\u53f8|\u516c\u76ca|\u53f0\u6e7e|\u53f0\u7063"
+
"|\u5546\u57ce|\u5546\u5e97|\u5546\u6807|\u5728\u7ebf|\u5927\u62ff|\u5a31\u4e50|\u5de5\u884c"
+
"|\u5e7f\u4e1c|\u6148\u5584|\u6211\u7231\u4f60|\u624b\u673a|\u653f\u52a1|\u653f\u5e9c"
+
"|\u65b0\u52a0\u5761|\u65b0\u95fb|\u65f6\u5c1a|\u673a\u6784|\u6de1\u9a6c\u9521|\u6e38\u620f"
+
"|\u70b9\u770b|\u79fb\u52a8|\u7ec4\u7ec7\u673a\u6784|\u7f51\u5740|\u7f51\u5e97|\u7f51\u7edc"
+
"|\u8c37\u6b4c|\u96c6\u56e2|\u98de\u5229\u6d66|\u9910\u5385|\u9999\u6e2f|\ub2f7\ub137"
+
"|\ub2f7\ucef4|\uc0bc\uc131|\ud55c\uad6d|xbox"
+
"|xerox|xin|xn\\-\\-11b4c3d|xn\\-\\-1qqw23a|xn\\-\\-30rr7y|xn\\-\\-3bst00m|xn\\-\\-3ds443g"
+
"|xn\\-\\-3e0b707e|xn\\-\\-3pxu8k|xn\\-\\-42c2d9a|xn\\-\\-45brj9c|xn\\-\\-45q11c|xn\\-\\-4gbrim"
+
"|xn\\-\\-55qw42g|xn\\-\\-55qx5d|xn\\-\\-6frz82g|xn\\-\\-6qq986b3xl|xn\\-\\-80adxhks"
+
"|xn\\-\\-80ao21a|xn\\-\\-80asehdb|xn\\-\\-80aswg|xn\\-\\-90a3ac|xn\\-\\-90ais|xn\\-\\-9dbq2a"
+
"|xn\\-\\-9et52u|xn\\-\\-b4w605ferd|xn\\-\\-c1avg|xn\\-\\-c2br7g|xn\\-\\-cg4bki|xn\\-\\-clchc0ea0b2g2a9gcd"
+
"|xn\\-\\-czr694b|xn\\-\\-czrs0t|xn\\-\\-czru2d|xn\\-\\-d1acj3b|xn\\-\\-d1alf|xn\\-\\-efvy88h"
+
"|xn\\-\\-estv75g|xn\\-\\-fhbei|xn\\-\\-fiq228c5hs|xn\\-\\-fiq64b|xn\\-\\-fiqs8s|xn\\-\\-fiqz9s"
+
"|xn\\-\\-fjq720a|xn\\-\\-flw351e|xn\\-\\-fpcrj9c3d|xn\\-\\-fzc2c9e2c|xn\\-\\-gecrj9c"
+
"|xn\\-\\-h2brj9c|xn\\-\\-hxt814e|xn\\-\\-i1b6b1a6a2e|xn\\-\\-imr513n|xn\\-\\-io0a7i"
+
"|xn\\-\\-j1aef|xn\\-\\-j1amh|xn\\-\\-j6w193g|xn\\-\\-kcrx77d1x4a|xn\\-\\-kprw13d|xn\\-\\-kpry57d"
+
"|xn\\-\\-kput3i|xn\\-\\-l1acc|xn\\-\\-lgbbat1ad8j|xn\\-\\-mgb9awbf|xn\\-\\-mgba3a3ejt"
+
"|xn\\-\\-mgba3a4f16a|xn\\-\\-mgbaam7a8h|xn\\-\\-mgbab2bd|xn\\-\\-mgbayh7gpa|xn\\-\\-mgbbh1a71e"
+
"|xn\\-\\-mgbc0a9azcg|xn\\-\\-mgberp4a5d4ar|xn\\-\\-mgbpl2fh|xn\\-\\-mgbtx2b|xn\\-\\-mgbx4cd0ab"
+
"|xn\\-\\-mk1bu44c|xn\\-\\-mxtq1m|xn\\-\\-ngbc5azd|xn\\-\\-node|xn\\-\\-nqv7f|xn\\-\\-nqv7fs00ema"
+
"|xn\\-\\-nyqy26a|xn\\-\\-o3cw4h|xn\\-\\-ogbpf8fl|xn\\-\\-p1acf|xn\\-\\-p1ai|xn\\-\\-pgbs0dh"
+
"|xn\\-\\-pssy2u|xn\\-\\-q9jyb4c|xn\\-\\-qcka1pmc|xn\\-\\-qxam|xn\\-\\-rhqv96g|xn\\-\\-s9brj9c"
+
"|xn\\-\\-ses554g|xn\\-\\-t60b56a|xn\\-\\-tckwe|xn\\-\\-unup4y|xn\\-\\-vermgensberater\\-ctb"
+
"|xn\\-\\-vermgensberatung\\-pwb|xn\\-\\-vhquv|xn\\-\\-vuq861b|xn\\-\\-wgbh1c|xn\\-\\-wgbl6a"
+
"|xn\\-\\-xhq521b|xn\\-\\-xkc2al3hye2a|xn\\-\\-xkc2dl3a5ee0h|xn\\-\\-y9a3aq|xn\\-\\-yfro4i67o"
+
"|xn\\-\\-ygbi2ammx|xn\\-\\-zfr164b|xperia|xxx|xyz)"
+
"|(?:yachts|yamaxun|yandex|yodobashi|yoga|yokohama|youtube|y[et])"
+
"|(?:zara|zip|zone|zuerich|z[amw]))"
)
/**
* RFC 3492 references RFC 1034 and limits Punycode algorithm output to 63 characters.
*/
private
val
PUNYCODE_TLD
=
"xn\\-\\-[\\w\\-]{0,58}\\w"
/**
* Valid UCS characters defined in RFC 3987. Excludes space characters.
*/
private
val
UCS_CHAR
=
"["
+
"\u00A0-\uD7FF"
+
"\uF900-\uFDCF"
+
"\uFDF0-\uFFEF"
+
"\uD800\uDC00-\uD83F\uDFFD"
+
"\uD840\uDC00-\uD87F\uDFFD"
+
"\uD880\uDC00-\uD8BF\uDFFD"
+
"\uD8C0\uDC00-\uD8FF\uDFFD"
+
"\uD900\uDC00-\uD93F\uDFFD"
+
"\uD940\uDC00-\uD97F\uDFFD"
+
"\uD980\uDC00-\uD9BF\uDFFD"
+
"\uD9C0\uDC00-\uD9FF\uDFFD"
+
"\uDA00\uDC00-\uDA3F\uDFFD"
+
"\uDA40\uDC00-\uDA7F\uDFFD"
+
"\uDA80\uDC00-\uDABF\uDFFD"
+
"\uDAC0\uDC00-\uDAFF\uDFFD"
+
"\uDB00\uDC00-\uDB3F\uDFFD"
+
"\uDB44\uDC00-\uDB7F\uDFFD"
+
"&&[^\u00A0[\u2000-\u200A]\u2028\u2029\u202F\u3000]]"
/**
* Valid characters for IRI label defined in RFC 3987.
*/
private
val
LABEL_CHAR
=
"a-zA-Z0-9$UCS_CHAR"
/**
* RFC 1035 Section 2.3.4 limits the labels to a maximum 63 octets.
*/
private
val
IRI_LABEL
=
"["
+
LABEL_CHAR
+
"](?:["
+
LABEL_CHAR
+
"_\\-]{0,61}["
+
LABEL_CHAR
+
"]){0,1}"
private
val
IP_ADDRESS
=
Pattern
.
compile
(
"((25[0-5]|2[0-4][0-9]|[0-1][0-9]{2}|[1-9][0-9]|[1-9])\\.(25[0-5]|2[0-4]"
+
"[0-9]|[0-1][0-9]{2}|[1-9][0-9]|[1-9]|0)\\.(25[0-5]|2[0-4][0-9]|[0-1]"
+
"[0-9]{2}|[1-9][0-9]|[1-9]|0)\\.(25[0-5]|2[0-4][0-9]|[0-1][0-9]{2}"
+
"|[1-9][0-9]|[0-9]))"
)
/**
* Regular expression that matches domain names without a TLD
*/
private
val
RELAXED_DOMAIN_NAME
=
"(?:(?:$IRI_LABEL(?:\\.(?=\\S))?)+|$IP_ADDRESS)"
private
val
PROTOCOL
=
"(?i:http|https|rtsp)://"
/* A word boundary or end of input. This is to stop foo.sure from matching as foo.su */
private
val
WORD_BOUNDARY
=
"(?:\\b|$|^)"
private
val
PORT_NUMBER
=
"\\:\\d{1,5}"
private
val
PATH_AND_QUERY
=
(
"[/\\?](?:(?:["
+
LABEL_CHAR
+
";/\\?:@&=#~"
// plus optional query params
+
"\\-\\.\\+!\\*'\\(\\),_\\$])|(?:%[a-fA-F0-9]{2}))*"
)
private
val
USER_INFO
=
(
"(?:[a-zA-Z0-9\\$\\-\\_\\.\\+\\!\\*\\'\\(\\)"
+
"\\,\\;\\?\\&\\=]|(?:\\%[a-fA-F0-9]{2})){1,64}(?:\\:(?:[a-zA-Z0-9\\$\\-\\_"
+
"\\.\\+\\!\\*\\'\\(\\)\\,\\;\\?\\&\\=]|(?:\\%[a-fA-F0-9]{2})){1,25})?\\@"
)
/**
* Regular expression to match strings that start with a supported protocol. Rules for domain
* names and TLDs are more relaxed. TLDs are optional.
*/
private
val
WEB_URL_WITH_PROTOCOL
=
(
"("
+
WORD_BOUNDARY
+
"(?:"
+
"(?:"
+
PROTOCOL
+
"(?:"
+
USER_INFO
+
")?"
+
")"
+
"(?:"
+
RELAXED_DOMAIN_NAME
+
")?"
+
"(?:"
+
PORT_NUMBER
+
")?"
+
")"
+
"(?:"
+
PATH_AND_QUERY
+
")?"
+
WORD_BOUNDARY
+
")"
)
/**
* Regular expression that matches known TLDs and punycode TLDs
*/
private
val
STRICT_TLD
=
"(?:"
+
IANA_TOP_LEVEL_DOMAINS
+
"|"
+
PUNYCODE_TLD
+
")"
private
val
STRICT_HOST_NAME
=
(
"(?:(?:"
+
IRI_LABEL
+
"\\.)+"
+
STRICT_TLD
+
")"
)
private
val
STRICT_DOMAIN_NAME
=
Pattern
.
compile
(
"(?:$STRICT_HOST_NAME|$IP_ADDRESS)"
)
/**
* Regular expression to match strings that do not start with a supported protocol. The TLDs
* are expected to be one of the known TLDs.
*/
private
val
WEB_URL_WITHOUT_PROTOCOL
=
(
"("
+
WORD_BOUNDARY
+
"(?<!:\\/\\/)"
+
"("
+
"(?:"
+
STRICT_DOMAIN_NAME
+
")"
+
"(?:"
+
PORT_NUMBER
+
")?"
+
")"
+
"(?:"
+
PATH_AND_QUERY
+
")?"
+
WORD_BOUNDARY
+
")"
)
/**
* Regular expression pattern to match IRIs. If a string starts with http(s):// the expression
* tries to match the URL structure with a relaxed rule for TLDs. If the string does not start
* with http(s):// the TLDs are expected to be one of the known TLDs.
*
* Borrowed from the [androidx.core.util.PatternsCompat] since this regex is restricted to
* library and thus, breaks the lint.
*/
private
val
WEB_URL
=
Pattern
.
compile
(
"($WEB_URL_WITH_PROTOCOL|$WEB_URL_WITHOUT_PROTOCOL)"
)
}
}
}
app/src/main/res/drawable/ic_action_message_link_24dp.xml
0 → 100644
View file @
a3d71108
<vector
xmlns:android=
"http://schemas.android.com/apk/res/android"
android:width=
"24dp"
android:height=
"24dp"
android:viewportWidth=
"20"
android:viewportHeight=
"20"
>
<path
android:fillColor=
"@color/actionMenuColor"
android:pathData=
"M9.548,14.23l-2.651,2.652a2.676,2.676 0,0 1,-3.78 0,2.676 2.676,0 0,1 0,-3.78L6.91,9.311a2.677,2.677 0,0 1,3.781 0,0.669 0.669,0 0,0 0.945,-0.946 4.015,4.015 0,0 0,-5.67 0l-3.792,3.792a4.014,4.014 0,0 0,0 5.67,4.014 4.014,0 0,0 5.67,0l2.65,-2.65a0.669,0.669 0,0 0,-0.945 -0.947zM17.828,2.173a4.014,4.014 0,0 0,-5.67 0L9.506,4.824a0.668,0.668 0,1 0,0.946 0.945l2.651,-2.651a2.676,2.676 0,0 1,3.78 0,2.676 2.676,0 0,1 0,3.78L13.09,10.69a2.678,2.678 0,0 1,-3.781 0,0.668 0.668,0 1,0 -0.945,0.945 4.015,4.015 0,0 0,5.67 0l3.793,-3.792a4.014,4.014 0,0 0,0 -5.67z"
/>
</vector>
app/src/main/res/menu/message_actions.xml
View file @
a3d71108
...
@@ -12,6 +12,11 @@
...
@@ -12,6 +12,11 @@
android:icon=
"@drawable/ic_action_message_reply_24dp"
android:icon=
"@drawable/ic_action_message_reply_24dp"
android:title=
"@string/action_msg_reply"
/>
android:title=
"@string/action_msg_reply"
/>
<item
android:id=
"@+id/action_message_permalink"
android:icon=
"@drawable/ic_action_message_link_24dp"
android:title=
"@string/action_msg_copy_permalink"
/>
<item
<item
android:id=
"@+id/action_message_quote"
android:id=
"@+id/action_message_quote"
android:icon=
"@drawable/ic_action_message_quote_24dp"
android:icon=
"@drawable/ic_action_message_quote_24dp"
...
...
app/src/main/res/values-de/strings.xml
View file @
a3d71108
...
@@ -162,6 +162,8 @@
...
@@ -162,6 +162,8 @@
<string
name=
"msg_view_more"
>
view more
</string>
<string
name=
"msg_view_more"
>
view more
</string>
<!-- TODO - Add proper translation -->
<!-- TODO - Add proper translation -->
<string
name=
"msg_view_less"
>
view less
</string>
<string
name=
"msg_view_less"
>
view less
</string>
<!-- TODO - Add proper translation -->
<string
name=
"msg_permalink_copied"
>
Permalink copied
</string>
<!-- Preferences messages -->
<!-- Preferences messages -->
<string
name=
"msg_analytics_tracking"
>
Analytics tracking
</string>
<!-- TODO Add translation -->
<string
name=
"msg_analytics_tracking"
>
Analytics tracking
</string>
<!-- TODO Add translation -->
...
@@ -198,6 +200,8 @@
...
@@ -198,6 +200,8 @@
<string
name=
"action_msg_share"
>
Teilen
</string>
<string
name=
"action_msg_share"
>
Teilen
</string>
<string
name=
"action_title_editing"
>
Nachricht bearbeiten
</string>
<string
name=
"action_title_editing"
>
Nachricht bearbeiten
</string>
<string
name=
"action_msg_add_reaction"
>
Reaktion hinzufügen
</string>
<string
name=
"action_msg_add_reaction"
>
Reaktion hinzufügen
</string>
<!-- TODO - Add proper translation -->
<string
name=
"action_msg_copy_permalink"
>
Copy permalink
</string>
<!-- Permission messages -->
<!-- Permission messages -->
<string
name=
"permission_editing_not_allowed"
>
Bearbeiten nicht erlaubt
</string>
<string
name=
"permission_editing_not_allowed"
>
Bearbeiten nicht erlaubt
</string>
...
...
app/src/main/res/values-es/strings.xml
View file @
a3d71108
...
@@ -159,6 +159,8 @@
...
@@ -159,6 +159,8 @@
<string
name=
"msg_view_more"
>
view more
</string>
<string
name=
"msg_view_more"
>
view more
</string>
<!-- TODO - Add proper translation -->
<!-- TODO - Add proper translation -->
<string
name=
"msg_view_less"
>
view less
</string>
<string
name=
"msg_view_less"
>
view less
</string>
<!-- TODO - Add proper translation -->
<string
name=
"msg_permalink_copied"
>
Permalink copied
</string>
<!-- Preferences messages -->
<!-- Preferences messages -->
<string
name=
"msg_analytics_tracking"
>
Analytics tracking
</string>
<!-- TODO Add translation -->
<string
name=
"msg_analytics_tracking"
>
Analytics tracking
</string>
<!-- TODO Add translation -->
...
@@ -195,6 +197,7 @@
...
@@ -195,6 +197,7 @@
<string
name=
"action_msg_share"
>
Compartir
</string>
<string
name=
"action_msg_share"
>
Compartir
</string>
<string
name=
"action_title_editing"
>
Edición de mensaje
</string>
<string
name=
"action_title_editing"
>
Edición de mensaje
</string>
<string
name=
"action_msg_add_reaction"
>
Añadir una reacción
</string>
<string
name=
"action_msg_add_reaction"
>
Añadir una reacción
</string>
<string
name=
"action_msg_copy_permalink"
>
Copiar permalink
</string>
<!-- Permission messages -->
<!-- Permission messages -->
<string
name=
"permission_editing_not_allowed"
>
La edición no és permitida
</string>
<string
name=
"permission_editing_not_allowed"
>
La edición no és permitida
</string>
...
...
app/src/main/res/values-fr/strings.xml
View file @
a3d71108
...
@@ -152,6 +152,8 @@
...
@@ -152,6 +152,8 @@
<string
name=
"msg_view_more"
>
view more
</string>
<string
name=
"msg_view_more"
>
view more
</string>
<!-- TODO - Add proper translation -->
<!-- TODO - Add proper translation -->
<string
name=
"msg_view_less"
>
view less
</string>
<string
name=
"msg_view_less"
>
view less
</string>
<!-- TODO - Add proper translation -->
<string
name=
"msg_permalink_copied"
>
Permalink copied
</string>
<!-- Create channel messages -->
<!-- Create channel messages -->
<string
name=
"msg_private_channel"
>
Privé
</string>
<string
name=
"msg_private_channel"
>
Privé
</string>
...
@@ -201,6 +203,8 @@
...
@@ -201,6 +203,8 @@
<string
name=
"action_msg_share"
>
Partager
</string>
<string
name=
"action_msg_share"
>
Partager
</string>
<string
name=
"action_title_editing"
>
Modification du message
</string>
<string
name=
"action_title_editing"
>
Modification du message
</string>
<string
name=
"action_msg_add_reaction"
>
Ajouter une réaction
</string>
<string
name=
"action_msg_add_reaction"
>
Ajouter une réaction
</string>
<!-- TODO - Add proper translation -->
<string
name=
"action_msg_copy_permalink"
>
Copy permalink
</string>
<!-- Permission messages -->
<!-- Permission messages -->
<string
name=
"permission_editing_not_allowed"
>
L\'édition n\'est pas autorisée
</string>
<string
name=
"permission_editing_not_allowed"
>
L\'édition n\'est pas autorisée
</string>
...
...
app/src/main/res/values-hi-rIN/strings.xml
View file @
a3d71108
...
@@ -163,6 +163,8 @@
...
@@ -163,6 +163,8 @@
<string
name=
"msg_channel_created_successfully"
>
चैनल सफलतापूर्वक बनाया गया
</string>
<string
name=
"msg_channel_created_successfully"
>
चैनल सफलतापूर्वक बनाया गया
</string>
<string
name=
"msg_view_more"
>
और देखें
</string>
<string
name=
"msg_view_more"
>
और देखें
</string>
<string
name=
"msg_view_less"
>
कम देखें
</string>
<string
name=
"msg_view_less"
>
कम देखें
</string>
<!-- TODO - Add proper translation -->
<string
name=
"msg_permalink_copied"
>
Permalink copied
</string>
<!-- Preferences messages -->
<!-- Preferences messages -->
<string
name=
"msg_analytics_tracking"
>
एनालिटिक्स ट्रैकिंग
</string>
<string
name=
"msg_analytics_tracking"
>
एनालिटिक्स ट्रैकिंग
</string>
...
@@ -185,7 +187,6 @@
...
@@ -185,7 +187,6 @@
<string
name=
"message_role_removed"
>
%1$s अब %3$s द्वारा %2$s नहीं है
</string>
<string
name=
"message_role_removed"
>
%1$s अब %3$s द्वारा %2$s नहीं है
</string>
<string
name=
"message_credentials_saved_successfully"
>
प्रमाण पत्र सफलतापूर्वक सहेजे गए
</string>
<string
name=
"message_credentials_saved_successfully"
>
प्रमाण पत्र सफलतापूर्वक सहेजे गए
</string>
<!-- Message actions -->
<!-- Message actions -->
<string
name=
"action_msg_reply"
>
जवाब दें
</string>
<string
name=
"action_msg_reply"
>
जवाब दें
</string>
<string
name=
"action_msg_info"
>
संदेश जानकारी
</string>
<string
name=
"action_msg_info"
>
संदेश जानकारी
</string>
...
@@ -200,6 +201,8 @@
...
@@ -200,6 +201,8 @@
<string
name=
"action_msg_share"
>
शेयर करें
</string>
<string
name=
"action_msg_share"
>
शेयर करें
</string>
<string
name=
"action_title_editing"
>
संपादन संदेश
</string>
<string
name=
"action_title_editing"
>
संपादन संदेश
</string>
<string
name=
"action_msg_add_reaction"
>
प्रतिक्रिया जोड़ें
</string>
<string
name=
"action_msg_add_reaction"
>
प्रतिक्रिया जोड़ें
</string>
<!-- TODO - Add proper translation -->
<string
name=
"action_msg_copy_permalink"
>
Copy permalink
</string>
<!-- Permission messages -->
<!-- Permission messages -->
<string
name=
"permission_editing_not_allowed"
>
संपादन की अनुमति नहीं है
</string>
<string
name=
"permission_editing_not_allowed"
>
संपादन की अनुमति नहीं है
</string>
...
...
app/src/main/res/values-ja/strings.xml
View file @
a3d71108
...
@@ -167,6 +167,8 @@
...
@@ -167,6 +167,8 @@
<string
name=
"msg_message_copied"
>
メッセージをコピー
</string>
<string
name=
"msg_message_copied"
>
メッセージをコピー
</string>
<string
name=
"msg_delete_message"
>
メッセージを削除
</string>
<string
name=
"msg_delete_message"
>
メッセージを削除
</string>
<string
name=
"msg_delete_description"
>
このメッセージを削除してもよろしいですか?
</string>
<string
name=
"msg_delete_description"
>
このメッセージを削除してもよろしいですか?
</string>
<!-- TODO - Add proper translation -->
<string
name=
"msg_permalink_copied"
>
Permalink copied
</string>
<!-- Preferences messages -->
<!-- Preferences messages -->
<string
name=
"msg_analytics_tracking"
>
Analytics tracking
</string>
<!-- TODO Add translation -->
<string
name=
"msg_analytics_tracking"
>
Analytics tracking
</string>
<!-- TODO Add translation -->
...
@@ -203,6 +205,8 @@
...
@@ -203,6 +205,8 @@
<string
name=
"action_msg_share"
>
Share
</string>
<string
name=
"action_msg_share"
>
Share
</string>
<string
name=
"action_title_editing"
>
メッセージの編集
</string>
<string
name=
"action_title_editing"
>
メッセージの編集
</string>
<string
name=
"action_msg_add_reaction"
>
リアクションする
</string>
<string
name=
"action_msg_add_reaction"
>
リアクションする
</string>
<!-- TODO - Add proper translation -->
<string
name=
"action_msg_copy_permalink"
>
Copy permalink
</string>
<!-- Permission messages -->
<!-- Permission messages -->
<string
name=
"permission_editing_not_allowed"
>
編集は許可されていません
</string>
<string
name=
"permission_editing_not_allowed"
>
編集は許可されていません
</string>
...
...
app/src/main/res/values-pt-rBR/strings.xml
View file @
a3d71108
...
@@ -150,6 +150,8 @@
...
@@ -150,6 +150,8 @@
<string
name=
"msg__your_2fa_code"
>
What’s your 2FA code?
</string>
<!-- TODO Add translation -->
<string
name=
"msg__your_2fa_code"
>
What’s your 2FA code?
</string>
<!-- TODO Add translation -->
<string
name=
"msg_view_more"
>
visualizar mais
</string>
<string
name=
"msg_view_more"
>
visualizar mais
</string>
<string
name=
"msg_view_less"
>
visualizar menos
</string>
<string
name=
"msg_view_less"
>
visualizar menos
</string>
<!-- TODO - Add proper translation -->
<string
name=
"msg_permalink_copied"
>
Permalink copiado
</string>
<!-- Create channel messages -->
<!-- Create channel messages -->
<string
name=
"msg_private_channel"
>
Privado
</string>
<string
name=
"msg_private_channel"
>
Privado
</string>
...
@@ -199,6 +201,7 @@
...
@@ -199,6 +201,7 @@
<string
name=
"action_msg_share"
>
Compartilhar
</string>
<string
name=
"action_msg_share"
>
Compartilhar
</string>
<string
name=
"action_title_editing"
>
Editando mensagem
</string>
<string
name=
"action_title_editing"
>
Editando mensagem
</string>
<string
name=
"action_msg_add_reaction"
>
Adicionar reação
</string>
<string
name=
"action_msg_add_reaction"
>
Adicionar reação
</string>
<string
name=
"action_msg_copy_permalink"
>
Copiar permalink
</string>
<!-- Permission messages -->
<!-- Permission messages -->
<string
name=
"permission_editing_not_allowed"
>
Edição não permitida
</string>
<string
name=
"permission_editing_not_allowed"
>
Edição não permitida
</string>
...
...
app/src/main/res/values-ru-rRU/strings.xml
View file @
a3d71108
...
@@ -148,6 +148,8 @@
...
@@ -148,6 +148,8 @@
<string
name=
"msg__your_2fa_code"
>
Ваш код 2FA?
</string>
<string
name=
"msg__your_2fa_code"
>
Ваш код 2FA?
</string>
<string
name=
"msg_view_more"
>
больше
</string>
<string
name=
"msg_view_more"
>
больше
</string>
<string
name=
"msg_view_less"
>
меньше
</string>
<string
name=
"msg_view_less"
>
меньше
</string>
<!-- TODO - Add proper translation -->
<string
name=
"msg_permalink_copied"
>
Permalink copied
</string>
<!-- Create channel messages -->
<!-- Create channel messages -->
<string
name=
"msg_private_channel"
>
Приватный
</string>
<string
name=
"msg_private_channel"
>
Приватный
</string>
...
@@ -196,6 +198,8 @@
...
@@ -196,6 +198,8 @@
<string
name=
"action_msg_share"
>
Поделиться
</string>
<string
name=
"action_msg_share"
>
Поделиться
</string>
<string
name=
"action_title_editing"
>
Редактирование сообщения
</string>
<string
name=
"action_title_editing"
>
Редактирование сообщения
</string>
<string
name=
"action_msg_add_reaction"
>
Отреагировать
</string>
<string
name=
"action_msg_add_reaction"
>
Отреагировать
</string>
<!-- TODO - Add proper translation -->
<string
name=
"action_msg_copy_permalink"
>
Copy permalink
</string>
<!-- Permission messages -->
<!-- Permission messages -->
<string
name=
"permission_editing_not_allowed"
>
Редактирование запрещено
</string>
<string
name=
"permission_editing_not_allowed"
>
Редактирование запрещено
</string>
...
...
app/src/main/res/values-tr/strings.xml
View file @
a3d71108
...
@@ -164,6 +164,8 @@
...
@@ -164,6 +164,8 @@
<string
name=
"msg_delete_description"
>
Bu mesajı silmek istediğinizden emin misiniz
</string>
<string
name=
"msg_delete_description"
>
Bu mesajı silmek istediğinizden emin misiniz
</string>
<string
name=
"msg_view_more"
>
Daha fazla göster
</string>
<string
name=
"msg_view_more"
>
Daha fazla göster
</string>
<string
name=
"msg_view_less"
>
Daha az göster
</string>
<string
name=
"msg_view_less"
>
Daha az göster
</string>
<!-- TODO - Add proper translation -->
<string
name=
"msg_permalink_copied"
>
Permalink copied
</string>
<!-- Preferences messages -->
<!-- Preferences messages -->
<string
name=
"msg_analytics_tracking"
>
İstatistik takibi
</string>
<string
name=
"msg_analytics_tracking"
>
İstatistik takibi
</string>
...
@@ -200,6 +202,8 @@
...
@@ -200,6 +202,8 @@
<string
name=
"action_msg_share"
>
Paylaş
</string>
<string
name=
"action_msg_share"
>
Paylaş
</string>
<string
name=
"action_title_editing"
>
Mesaj Düzenleniyor
</string>
<string
name=
"action_title_editing"
>
Mesaj Düzenleniyor
</string>
<string
name=
"action_msg_add_reaction"
>
Tepki Ekle
</string>
<string
name=
"action_msg_add_reaction"
>
Tepki Ekle
</string>
<!-- TODO - Add proper translation -->
<string
name=
"action_msg_copy_permalink"
>
Copy permalink
</string>
<!-- Permission messages -->
<!-- Permission messages -->
<string
name=
"permission_editing_not_allowed"
>
Düzenlemeye izin verilmiyor
</string>
<string
name=
"permission_editing_not_allowed"
>
Düzenlemeye izin verilmiyor
</string>
...
...
app/src/main/res/values-uk/strings.xml
View file @
a3d71108
...
@@ -149,6 +149,8 @@
...
@@ -149,6 +149,8 @@
<string
name=
"msg_view_more"
>
view more
</string>
<string
name=
"msg_view_more"
>
view more
</string>
<!-- TODO - Add proper translation -->
<!-- TODO - Add proper translation -->
<string
name=
"msg_view_less"
>
view less
</string>
<string
name=
"msg_view_less"
>
view less
</string>
<!-- TODO - Add proper translation -->
<string
name=
"msg_permalink_copied"
>
Permalink copied
</string>
<!-- Create channel messages -->
<!-- Create channel messages -->
<string
name=
"msg_private_channel"
>
Приватний
</string>
<string
name=
"msg_private_channel"
>
Приватний
</string>
...
@@ -197,6 +199,8 @@
...
@@ -197,6 +199,8 @@
<string
name=
"action_msg_share"
>
Поділитися
</string>
<string
name=
"action_msg_share"
>
Поділитися
</string>
<string
name=
"action_title_editing"
>
Редагування повідомлення
</string>
<string
name=
"action_title_editing"
>
Редагування повідомлення
</string>
<string
name=
"action_msg_add_reaction"
>
Відреагувати
</string>
<string
name=
"action_msg_add_reaction"
>
Відреагувати
</string>
<!-- TODO - Add proper translation -->
<string
name=
"action_msg_copy_permalink"
>
Copy permalink
</string>
<!-- Permission messages -->
<!-- Permission messages -->
<string
name=
"permission_editing_not_allowed"
>
Редагування заборонено
</string>
<string
name=
"permission_editing_not_allowed"
>
Редагування заборонено
</string>
...
...
app/src/main/res/values/strings.xml
View file @
a3d71108
...
@@ -160,6 +160,7 @@ https://github.com/RocketChat/java-code-styles/blob/master/CODING_STYLE.md#strin
...
@@ -160,6 +160,7 @@ https://github.com/RocketChat/java-code-styles/blob/master/CODING_STYLE.md#strin
<string
name=
"msg_continue_with_wordpress"
>
Continue with
<b>
WordPress
</b></string>
<string
name=
"msg_continue_with_wordpress"
>
Continue with
<b>
WordPress
</b></string>
<string
name=
"msg_two_factor_authentication"
>
Two-factor Authentication
</string>
<string
name=
"msg_two_factor_authentication"
>
Two-factor Authentication
</string>
<string
name=
"msg__your_2fa_code"
>
What’s your 2FA code?
</string>
<string
name=
"msg__your_2fa_code"
>
What’s your 2FA code?
</string>
<string
name=
"msg_permalink_copied"
>
Permalink copied
</string>
<!-- Create channel messages -->
<!-- Create channel messages -->
<string
name=
"msg_private_channel"
>
Private
</string>
<string
name=
"msg_private_channel"
>
Private
</string>
...
@@ -213,6 +214,7 @@ https://github.com/RocketChat/java-code-styles/blob/master/CODING_STYLE.md#strin
...
@@ -213,6 +214,7 @@ https://github.com/RocketChat/java-code-styles/blob/master/CODING_STYLE.md#strin
<string
name=
"action_msg_share"
>
Share
</string>
<string
name=
"action_msg_share"
>
Share
</string>
<string
name=
"action_title_editing"
>
Editing Message
</string>
<string
name=
"action_title_editing"
>
Editing Message
</string>
<string
name=
"action_msg_add_reaction"
>
Add reaction
</string>
<string
name=
"action_msg_add_reaction"
>
Add reaction
</string>
<string
name=
"action_msg_copy_permalink"
>
Copy permalink
</string>
<!-- Permission messages -->
<!-- Permission messages -->
<string
name=
"permission_editing_not_allowed"
>
Editing is not allowed
</string>
<string
name=
"permission_editing_not_allowed"
>
Editing is not allowed
</string>
...
...
build.gradle
View file @
a3d71108
...
@@ -10,16 +10,13 @@ buildscript {
...
@@ -10,16 +10,13 @@ buildscript {
}
}
dependencies
{
dependencies
{
classpath
'com.android.tools.build:gradle:3.
3.0-alpha12
'
classpath
'com.android.tools.build:gradle:3.
2.1
'
classpath
"org.jetbrains.kotlin:kotlin-gradle-plugin:${versions.kotlin}"
classpath
"org.jetbrains.kotlin:kotlin-gradle-plugin:${versions.kotlin}"
classpath
"org.jetbrains.dokka:dokka-gradle-plugin:${versions.dokka}"
classpath
"org.jetbrains.dokka:dokka-gradle-plugin:${versions.dokka}"
classpath
'com.google.gms:google-services:4.
0.2
'
classpath
'com.google.gms:google-services:4.
1.0
'
classpath
'io.fabric.tools:gradle:1.25.4'
classpath
'io.fabric.tools:gradle:1.25.4'
classpath
"com.github.ben-manes:gradle-versions-plugin:0.20.0"
classpath
"com.github.ben-manes:gradle-versions-plugin:0.20.0"
// NOTE: Do not place your application dependencies here; they belong
// in the individual module build.gradle files
}
}
}
}
...
...
dependencies.gradle
View file @
a3d71108
...
@@ -9,7 +9,7 @@ ext {
...
@@ -9,7 +9,7 @@ ext {
dokka
:
'0.9.16'
,
dokka
:
'0.9.16'
,
// For app
// For app
kotlin
:
'1.2.
6
1'
,
kotlin
:
'1.2.
7
1'
,
coroutine
:
'0.25.0'
,
coroutine
:
'0.25.0'
,
appCompat
:
'1.0.0'
,
appCompat
:
'1.0.0'
,
...
...
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