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
12db177e
Unverified
Commit
12db177e
authored
Dec 21, 2018
by
Rafael Kellermann Streit
Committed by
GitHub
Dec 21, 2018
Browse files
Options
Browse Files
Download
Plain Diff
Merge pull request #1932 from RocketChat/develop
[RELEASE] Merge DEVELOP into BETA
parents
59bff799
ac4ffd53
Changes
49
Show whitespace changes
Inline
Side-by-side
Showing
49 changed files
with
599 additions
and
600 deletions
+599
-600
build.gradle
app/build.gradle
+1
-1
ChatRoomPresenter.kt
...rocket/android/chatroom/presentation/ChatRoomPresenter.kt
+84
-82
ChatRoomFragment.kt
.../java/chat/rocket/android/chatroom/ui/ChatRoomFragment.kt
+138
-142
UiModelMapper.kt
...ava/chat/rocket/android/chatroom/uimodel/UiModelMapper.kt
+8
-4
ChatRoomsFragment.kt
...ava/chat/rocket/android/chatrooms/ui/ChatRoomsFragment.kt
+5
-3
AppModule.kt
.../main/java/chat/rocket/android/dagger/module/AppModule.kt
+2
-1
LocalModule.kt
...ain/java/chat/rocket/android/dagger/module/LocalModule.kt
+2
-3
LocalRepository.kt
...ava/chat/rocket/android/infrastructure/LocalRepository.kt
+1
-1
MainPresenter.kt
...va/chat/rocket/android/main/presentation/MainPresenter.kt
+1
-0
RocketChatClientFactory.kt
...android/server/infraestructure/RocketChatClientFactory.kt
+1
-0
PasswordPresenter.kt
...droid/settings/password/presentation/PasswordPresenter.kt
+12
-9
PasswordView.kt
...et/android/settings/password/presentation/PasswordView.kt
+1
-1
PasswordFragment.kt
...t/rocket/android/settings/password/ui/PasswordFragment.kt
+16
-29
UserDetailsPresenter.kt
.../android/userdetails/presentation/UserDetailsPresenter.kt
+49
-61
IO.kt
app/src/main/java/chat/rocket/android/util/IO.kt
+2
-2
String.kt
...c/main/java/chat/rocket/android/util/extensions/String.kt
+7
-1
ic_keyboard_black_24dp.xml
app/src/main/res/drawable/ic_keyboard_black_24dp.xml
+3
-9
dialog_report.xml
app/src/main/res/layout/dialog_report.xml
+1
-1
file_attachments_dialog.xml
app/src/main/res/layout/file_attachments_dialog.xml
+2
-2
fragment_authentication_log_in.xml
app/src/main/res/layout/fragment_authentication_log_in.xml
+2
-2
fragment_authentication_login_options.xml
...main/res/layout/fragment_authentication_login_options.xml
+8
-8
fragment_authentication_register_username.xml
.../res/layout/fragment_authentication_register_username.xml
+1
-1
fragment_authentication_reset_password.xml
...ain/res/layout/fragment_authentication_reset_password.xml
+1
-1
fragment_authentication_server.xml
app/src/main/res/layout/fragment_authentication_server.xml
+1
-1
fragment_authentication_sign_up.xml
app/src/main/res/layout/fragment_authentication_sign_up.xml
+1
-1
fragment_authentication_two_fa.xml
app/src/main/res/layout/fragment_authentication_two_fa.xml
+1
-1
fragment_password.xml
app/src/main/res/layout/fragment_password.xml
+15
-15
item_message_reply.xml
app/src/main/res/layout/item_message_reply.xml
+1
-1
message_attachment_options.xml
app/src/main/res/layout/message_attachment_options.xml
+3
-3
message_composer.xml
app/src/main/res/layout/message_composer.xml
+2
-3
update_avatar_options.xml
app/src/main/res/layout/update_avatar_options.xml
+3
-3
chatrooms.xml
app/src/main/res/menu/chatrooms.xml
+1
-1
strings.xml
app/src/main/res/values-de/strings.xml
+66
-70
strings.xml
app/src/main/res/values-es/strings.xml
+4
-4
strings.xml
app/src/main/res/values-fr/strings.xml
+4
-4
strings.xml
app/src/main/res/values-hi-rIN/strings.xml
+15
-16
strings.xml
app/src/main/res/values-it/strings.xml
+28
-29
strings.xml
app/src/main/res/values-ja/strings.xml
+6
-6
strings.xml
app/src/main/res/values-pt-rBR/strings.xml
+28
-28
strings.xml
app/src/main/res/values-ru-rRU/strings.xml
+13
-14
strings.xml
app/src/main/res/values-tr/strings.xml
+4
-4
strings.xml
app/src/main/res/values-uk/strings.xml
+3
-3
strings.xml
app/src/main/res/values/strings.xml
+3
-3
styles.xml
app/src/main/res/values/styles.xml
+1
-1
EmojiKeyboardPopup.kt
...main/java/chat/rocket/android/emoji/EmojiKeyboardPopup.kt
+6
-6
OverKeyboardPopupWindow.kt
...java/chat/rocket/android/emoji/OverKeyboardPopupWindow.kt
+0
-1
SuggestionsAdapter.kt
.../chat/rocket/android/suggestions/ui/SuggestionsAdapter.kt
+9
-3
SuggestionsView.kt
...ava/chat/rocket/android/suggestions/ui/SuggestionsView.kt
+27
-15
Url.kt
util/src/main/java/chat/rocket/android/util/extension/Url.kt
+6
-0
No files found.
app/build.gradle
View file @
12db177e
...
...
@@ -16,7 +16,7 @@ android {
applicationId
"chat.rocket.android"
minSdkVersion
versions
.
minSdk
targetSdkVersion
versions
.
targetSdk
versionCode
205
2
versionCode
205
5
versionName
"3.2.0"
testInstrumentationRunner
"androidx.test.runner.AndroidJUnitRunner"
multiDexEnabled
true
...
...
app/src/main/java/chat/rocket/android/chatroom/presentation/ChatRoomPresenter.kt
View file @
12db177e
...
...
@@ -123,6 +123,7 @@ class ChatRoomPresenter @Inject constructor(
private
var
lastState
=
manager
.
state
private
var
typingStatusList
=
arrayListOf
<
String
>()
private
val
roomChangesChannel
=
Channel
<
Room
>(
Channel
.
CONFLATED
)
private
lateinit
var
draftKey
:
String
fun
setupChatRoom
(
roomId
:
String
,
...
...
@@ -130,12 +131,17 @@ class ChatRoomPresenter @Inject constructor(
roomType
:
String
,
chatRoomMessage
:
String
?
=
null
)
{
draftKey
=
"${currentServer}_${LocalRepository.DRAFT_KEY}$roomId"
chatRoomId
=
roomId
chatRoomType
=
roomType
launch
(
CommonPool
+
strategy
.
jobs
)
{
try
{
chatRoles
=
if
(
roomTypeOf
(
roomType
)
!
is
RoomType
.
DirectMessage
)
{
client
.
chatRoomRoles
(
roomType
=
roomTypeOf
(
roomType
),
roomName
=
roomName
)
}
else
emptyList
()
}
catch
(
ex
:
RocketChatException
)
{
}
else
{
emptyList
()
}
}
catch
(
ex
:
Exception
)
{
Timber
.
e
(
ex
)
chatRoles
=
emptyList
()
}
finally
{
...
...
@@ -172,6 +178,7 @@ class ChatRoomPresenter @Inject constructor(
}
private
suspend
fun
subscribeRoomChanges
()
{
withContext
(
CommonPool
+
strategy
.
jobs
)
{
chatRoomId
?.
let
{
manager
.
addRoomChannel
(
it
,
roomChangesChannel
)
for
(
room
in
roomChangesChannel
)
{
...
...
@@ -181,6 +188,7 @@ class ChatRoomPresenter @Inject constructor(
}
}
}
}
private
fun
unsubscribeRoomChanges
()
{
chatRoomId
?.
let
{
manager
.
removeRoomChannel
(
it
)
}
...
...
@@ -309,8 +317,8 @@ class ChatRoomPresenter @Inject constructor(
launchUI
(
strategy
)
{
try
{
// ignore message for now, will receive it on the stream
val
id
=
UUID
.
randomUUID
().
toString
()
if
(
messageId
==
null
)
{
val
id
=
UUID
.
randomUUID
().
toString
()
val
username
=
userHelper
.
username
()
val
newMessage
=
Message
(
id
=
id
,
...
...
@@ -363,12 +371,12 @@ class ChatRoomPresenter @Inject constructor(
}
else
{
client
.
updateMessage
(
chatRoomId
,
messageId
,
text
)
}
view
.
enableSendMessageButton
()
clearDraftMessage
()
}
catch
(
ex
:
Exception
)
{
Timber
.
d
(
ex
,
"Error sending message..."
)
Timber
.
e
(
ex
,
"Error sending message..."
)
jobSchedulerInteractor
.
scheduleSendingMessages
()
}
finally
{
view
.
clearMessageComposition
(
true
)
view
.
enableSendMessageButton
()
}
}
...
...
@@ -909,7 +917,7 @@ class ChatRoomPresenter @Inject constructor(
navigator
.
toChatDetails
(
chatRoomId
,
chatRoomType
,
isSubscribed
,
isMenuDisabled
)
}
fun
loadChatRooms
()
{
fun
loadChatRooms
Suggestions
()
{
launchUI
(
strategy
)
{
try
{
val
chatRooms
=
getChatRoomsAsync
()
...
...
@@ -1259,7 +1267,6 @@ class ChatRoomPresenter @Inject constructor(
roles
=
chatRoles
,
isBroadcast
=
chatIsBroadcast
,
isRoom
=
true
)
)
val
roomMessages
=
messagesRepository
.
getByRoomId
(
streamedMessage
.
roomId
)
val
index
=
roomMessages
.
indexOfFirst
{
msg
->
msg
.
id
==
streamedMessage
.
id
}
if
(
index
>
-
1
)
{
...
...
@@ -1281,31 +1288,26 @@ class ChatRoomPresenter @Inject constructor(
}
/**
* Save unfinished message, when user left chat room without sending a message. It also clears
* saved message from local repository when unfinishedMessage is blank.
* Save unfinished message, when user left chat room without sending a message.
*
* @param chatRoomId Chat room Id.
* @param unfinishedMessage The unfinished message to save.
*/
fun
saveUnfinishedMessage
(
chatRoomId
:
String
,
unfinishedMessage
:
String
)
{
val
key
=
"${currentServer}_${LocalRepository.UNFINISHED_MSG_KEY}$chatRoomId"
fun
saveDraftMessage
(
unfinishedMessage
:
String
)
{
if
(
unfinishedMessage
.
isNotBlank
())
{
localRepository
.
save
(
key
,
unfinishedMessage
)
}
else
{
localRepository
.
clear
(
key
)
localRepository
.
save
(
draftKey
,
unfinishedMessage
)
}
}
fun
clearDraftMessage
()
{
localRepository
.
clear
(
draftKey
)
}
/**
* Get unfinished message from local repository, when user left chat room without
* sending a message and now the user is back.
*
* @param chatRoomId Chat room Id.
*
* @return Returns the unfinished message.
* @return Returns the unfinished message, null otherwise.
*/
fun
getUnfinishedMessage
(
chatRoomId
:
String
):
String
{
val
key
=
"${currentServer}_${LocalRepository.UNFINISHED_MSG_KEY}$chatRoomId"
return
localRepository
.
get
(
key
)
?:
""
fun
getDraftUnfinishedMessage
():
String
?
{
return
localRepository
.
get
(
draftKey
)
}
}
app/src/main/java/chat/rocket/android/chatroom/ui/ChatRoomFragment.kt
View file @
12db177e
...
...
@@ -6,7 +6,6 @@ import android.content.ClipData
import
android.content.ClipboardManager
import
android.content.Context
import
android.content.Intent
import
android.content.res.Configuration
import
android.graphics.drawable.Drawable
import
android.net.Uri
import
android.os.Bundle
...
...
@@ -19,7 +18,6 @@ import android.view.Menu
import
android.view.MenuItem
import
android.view.View
import
android.view.ViewGroup
import
android.widget.Button
import
android.widget.EditText
import
android.widget.FrameLayout
import
android.widget.ImageView
...
...
@@ -70,12 +68,12 @@ import chat.rocket.android.helper.MessageParser
import
chat.rocket.android.util.extension.asObservable
import
chat.rocket.android.util.extension.createImageFile
import
chat.rocket.android.util.extensions.circularRevealOrUnreveal
import
chat.rocket.android.util.extensions.content
import
chat.rocket.android.util.extensions.fadeIn
import
chat.rocket.android.util.extensions.fadeOut
import
chat.rocket.android.util.extensions.getBitmpap
import
chat.rocket.android.util.extensions.hideKeyboard
import
chat.rocket.android.util.extensions.inflate
import
chat.rocket.android.util.extensions.isNotNullNorEmpty
import
chat.rocket.android.util.extensions.rotateBy
import
chat.rocket.android.util.extensions.showToast
import
chat.rocket.android.util.extensions.textContent
...
...
@@ -177,6 +175,8 @@ class ChatRoomFragment : Fragment(), ChatRoomView, EmojiKeyboardListener, EmojiR
internal
var
isSearchTermQueried
=
false
private
val
dismissStatus
=
{
text_connection_status
.
fadeOut
()
}
// For reveal and unreveal anim.
private
val
hypotenuse
by
lazy
{
Math
.
hypot
(
...
...
@@ -198,13 +198,72 @@ class ChatRoomFragment : Fragment(), ChatRoomView, EmojiKeyboardListener, EmojiR
private
val
dialogView
by
lazy
{
View
.
inflate
(
context
,
R
.
layout
.
file_attachments_dialog
,
null
)
}
internal
val
alertDialog
by
lazy
{
AlertDialog
.
Builder
(
activity
).
setView
(
dialogView
).
create
()
}
internal
val
imagePreview
by
lazy
{
dialogView
.
findViewById
<
ImageView
>(
R
.
id
.
image_preview
)
}
internal
val
sendButton
by
lazy
{
dialogView
.
findViewById
<
Button
>(
R
.
id
.
button_send
)
}
internal
val
cancelButton
by
lazy
{
dialogView
.
findViewById
<
Button
>(
R
.
id
.
button_cancel
)
}
internal
val
sendButton
by
lazy
{
dialogView
.
findViewById
<
android
.
widget
.
Button
>(
R
.
id
.
button_send
)
}
internal
val
cancelButton
by
lazy
{
dialogView
.
findViewById
<
android
.
widget
.
Button
>(
R
.
id
.
button_cancel
)
}
internal
val
description
by
lazy
{
dialogView
.
findViewById
<
EditText
>(
R
.
id
.
text_file_description
)
}
internal
val
audioVideoAttachment
by
lazy
{
dialogView
.
findViewById
<
FrameLayout
>(
R
.
id
.
audio_video_attachment
)
}
internal
val
textFile
by
lazy
{
dialogView
.
findViewById
<
TextView
>(
R
.
id
.
text_file_name
)
}
private
var
takenPhotoUri
:
Uri
?
=
null
private
val
layoutChangeListener
=
View
.
OnLayoutChangeListener
{
_
,
_
,
_
,
_
,
bottom
,
_
,
_
,
_
,
oldBottom
->
val
y
=
oldBottom
-
bottom
if
(
Math
.
abs
(
y
)
>
0
&&
isAdded
)
{
// if y is positive the keyboard is up else it's down
recycler_view
.
post
{
if
(
y
>
0
||
Math
.
abs
(
verticalScrollOffset
.
get
())
>=
Math
.
abs
(
y
))
{
ui
{
recycler_view
.
scrollBy
(
0
,
y
)
}
}
else
{
ui
{
recycler_view
.
scrollBy
(
0
,
verticalScrollOffset
.
get
())
}
}
}
}
}
private
lateinit
var
endlessRecyclerViewScrollListener
:
EndlessRecyclerViewScrollListener
private
val
onScrollListener
=
object
:
RecyclerView
.
OnScrollListener
()
{
var
state
=
AtomicInteger
(
RecyclerView
.
SCROLL_STATE_IDLE
)
override
fun
onScrollStateChanged
(
recyclerView
:
RecyclerView
,
newState
:
Int
)
{
state
.
compareAndSet
(
RecyclerView
.
SCROLL_STATE_IDLE
,
newState
)
when
(
newState
)
{
RecyclerView
.
SCROLL_STATE_IDLE
->
{
if
(!
state
.
compareAndSet
(
RecyclerView
.
SCROLL_STATE_SETTLING
,
newState
))
{
state
.
compareAndSet
(
RecyclerView
.
SCROLL_STATE_DRAGGING
,
newState
)
}
}
RecyclerView
.
SCROLL_STATE_DRAGGING
->
{
state
.
compareAndSet
(
RecyclerView
.
SCROLL_STATE_IDLE
,
newState
)
}
RecyclerView
.
SCROLL_STATE_SETTLING
->
{
state
.
compareAndSet
(
RecyclerView
.
SCROLL_STATE_DRAGGING
,
newState
)
}
}
}
override
fun
onScrolled
(
recyclerView
:
RecyclerView
,
dx
:
Int
,
dy
:
Int
)
{
if
(
state
.
get
()
!=
RecyclerView
.
SCROLL_STATE_IDLE
)
{
verticalScrollOffset
.
getAndAdd
(
dy
)
}
}
}
private
val
fabScrollListener
=
object
:
RecyclerView
.
OnScrollListener
()
{
override
fun
onScrolled
(
recyclerView
:
RecyclerView
,
dx
:
Int
,
dy
:
Int
)
{
if
(!
recyclerView
.
canScrollVertically
(
1
))
{
text_count
.
isVisible
=
false
button_fab
.
hide
()
newMessageCount
=
0
}
else
{
if
(
dy
<
0
&&
!
button_fab
.
isVisible
)
{
button_fab
.
show
()
if
(
newMessageCount
!=
0
)
text_count
.
isVisible
=
true
}
}
}
}
override
fun
onCreate
(
savedInstanceState
:
Bundle
?)
{
super
.
onCreate
(
savedInstanceState
)
AndroidSupportInjection
.
inject
(
this
)
...
...
@@ -232,24 +291,23 @@ class ChatRoomFragment : Fragment(), ChatRoomView, EmojiKeyboardListener, EmojiR
inflater
:
LayoutInflater
,
container
:
ViewGroup
?,
savedInstanceState
:
Bundle
?
):
View
?
{
return
container
?.
inflate
(
R
.
layout
.
fragment_chat_room
)
}
):
View
?
=
container
?.
inflate
(
R
.
layout
.
fragment_chat_room
)
override
fun
onViewCreated
(
view
:
View
,
savedInstanceState
:
Bundle
?)
{
super
.
onViewCreated
(
view
,
savedInstanceState
)
setupToolbar
(
chatRoomName
)
presenter
.
setupChatRoom
(
chatRoomId
,
chatRoomName
,
chatRoomType
,
chatRoomMessage
)
presenter
.
loadChatRooms
()
presenter
.
loadChatRooms
Suggestions
()
setupRecyclerView
()
setupFab
()
setupSuggestionsView
()
setupActionSnackbar
()
(
activity
as
ChatRoomActivity
).
let
{
it
.
showToolbarTitle
(
chatRoomName
)
it
.
showToolbarChatRoomIcon
(
chatRoomType
)
with
(
activity
as
ChatRoomActivity
)
{
showToolbarTitle
(
chatRoomName
)
showToolbarChatRoomIcon
(
chatRoomType
)
}
getDraftMessage
()
analyticsManager
.
logScreenView
(
ScreenViewEvent
.
ChatRoom
)
}
...
...
@@ -264,15 +322,13 @@ class ChatRoomFragment : Fragment(), ChatRoomView, EmojiKeyboardListener, EmojiR
recycler_view
.
removeOnScrollListener
(
onScrollListener
)
recycler_view
.
removeOnLayoutChangeListener
(
layoutChangeListener
)
presenter
.
disconnect
()
presenter
.
saveUnfinishedMessage
(
chatRoomId
,
text_message
.
text
.
toString
())
presenter
.
saveDraftMessage
(
text_message
.
text
.
toString
())
handler
.
removeCallbacksAndMessages
(
null
)
unsubscribeComposeTextMessage
()
presenter
.
disconnect
()
// Hides the keyboard (if it's opened) before going to any view.
activity
?.
apply
{
hideKeyboard
()
}
activity
?.
apply
{
hideKeyboard
()
}
super
.
onDestroyView
()
}
...
...
@@ -282,15 +338,6 @@ class ChatRoomFragment : Fragment(), ChatRoomView, EmojiKeyboardListener, EmojiR
activity
?.
invalidateOptionsMenu
()
}
fun
dismissEmojiKeyboard
()
{
// Check if the keyboard was ever initialized.
// It may be the case when you are looking a not joined room
if
(
::
emojiKeyboardPopup
.
isInitialized
)
{
emojiKeyboardPopup
.
dismiss
()
setReactionButtonIcon
(
R
.
drawable
.
ic_reaction_24dp
)
}
}
override
fun
onActivityResult
(
requestCode
:
Int
,
resultCode
:
Int
,
resultData
:
Intent
?)
{
if
(
resultCode
==
Activity
.
RESULT_OK
)
{
when
(
requestCode
)
{
...
...
@@ -389,6 +436,7 @@ class ChatRoomFragment : Fragment(), ChatRoomView, EmojiKeyboardListener, EmojiR
}
presenter
.
loadActiveMembers
(
chatRoomId
,
chatRoomType
,
filterSelfOut
=
true
)
empty_chat_view
.
isVisible
=
adapter
.
itemCount
==
0
dismissEmojiKeyboard
()
}
}
...
...
@@ -397,6 +445,7 @@ class ChatRoomFragment : Fragment(), ChatRoomView, EmojiKeyboardListener, EmojiR
adapter
.
clearData
()
adapter
.
prependData
(
dataSet
)
empty_chat_view
.
isVisible
=
adapter
.
itemCount
==
0
dismissEmojiKeyboard
()
}
override
fun
onRoomUpdated
(
roomUiModel
:
RoomUiModel
)
{
...
...
@@ -413,64 +462,6 @@ class ChatRoomFragment : Fragment(), ChatRoomView, EmojiKeyboardListener, EmojiR
}
}
private
val
layoutChangeListener
=
View
.
OnLayoutChangeListener
{
_
,
_
,
_
,
_
,
bottom
,
_
,
_
,
_
,
oldBottom
->
val
y
=
oldBottom
-
bottom
if
(
Math
.
abs
(
y
)
>
0
&&
isAdded
)
{
// if y is positive the keyboard is up else it's down
recycler_view
.
post
{
if
(
y
>
0
||
Math
.
abs
(
verticalScrollOffset
.
get
())
>=
Math
.
abs
(
y
))
{
ui
{
recycler_view
.
scrollBy
(
0
,
y
)
}
}
else
{
ui
{
recycler_view
.
scrollBy
(
0
,
verticalScrollOffset
.
get
())
}
}
}
}
}
private
lateinit
var
endlessRecyclerViewScrollListener
:
EndlessRecyclerViewScrollListener
private
val
onScrollListener
=
object
:
RecyclerView
.
OnScrollListener
()
{
var
state
=
AtomicInteger
(
RecyclerView
.
SCROLL_STATE_IDLE
)
override
fun
onScrollStateChanged
(
recyclerView
:
RecyclerView
,
newState
:
Int
)
{
state
.
compareAndSet
(
RecyclerView
.
SCROLL_STATE_IDLE
,
newState
)
when
(
newState
)
{
RecyclerView
.
SCROLL_STATE_IDLE
->
{
if
(!
state
.
compareAndSet
(
RecyclerView
.
SCROLL_STATE_SETTLING
,
newState
))
{
state
.
compareAndSet
(
RecyclerView
.
SCROLL_STATE_DRAGGING
,
newState
)
}
}
RecyclerView
.
SCROLL_STATE_DRAGGING
->
{
state
.
compareAndSet
(
RecyclerView
.
SCROLL_STATE_IDLE
,
newState
)
}
RecyclerView
.
SCROLL_STATE_SETTLING
->
{
state
.
compareAndSet
(
RecyclerView
.
SCROLL_STATE_DRAGGING
,
newState
)
}
}
}
override
fun
onScrolled
(
recyclerView
:
RecyclerView
,
dx
:
Int
,
dy
:
Int
)
{
if
(
state
.
get
()
!=
RecyclerView
.
SCROLL_STATE_IDLE
)
{
verticalScrollOffset
.
getAndAdd
(
dy
)
}
}
}
private
val
fabScrollListener
=
object
:
RecyclerView
.
OnScrollListener
()
{
override
fun
onScrolled
(
recyclerView
:
RecyclerView
,
dx
:
Int
,
dy
:
Int
)
{
if
(!
recyclerView
.
canScrollVertically
(
1
))
{
text_count
.
isVisible
=
false
button_fab
.
hide
()
newMessageCount
=
0
}
else
{
if
(
dy
<
0
&&
!
button_fab
.
isVisible
)
{
button_fab
.
show
()
if
(
newMessageCount
!=
0
)
text_count
.
isVisible
=
true
}
}
}
}
override
fun
sendMessage
(
text
:
String
)
{
ui
{
...
...
@@ -505,38 +496,15 @@ class ChatRoomFragment : Fragment(), ChatRoomView, EmojiKeyboardListener, EmojiR
}
override
fun
hideTypingStatusView
()
{
ui
{
text_typing_status
.
isVisible
=
false
}
ui
{
text_typing_status
.
isVisible
=
false
}
}
override
fun
showInvalidFileMessage
()
{
showMessage
(
getString
(
R
.
string
.
msg_invalid_file
))
}
override
fun
showNewMessage
(
message
:
List
<
BaseUiModel
<*
>>,
isMessageReceived
:
Boolean
)
{
ui
{
adapter
.
prependData
(
message
)
if
(
isMessageReceived
&&
button_fab
.
isVisible
)
{
newMessageCount
++
if
(
newMessageCount
<=
99
)
text_count
.
text
=
newMessageCount
.
toString
()
else
text_count
.
text
=
"99+"
text_count
.
isVisible
=
true
}
else
if
(!
button_fab
.
isVisible
)
recycler_view
.
scrollToPosition
(
0
)
verticalScrollOffset
.
set
(
0
)
empty_chat_view
.
isVisible
=
adapter
.
itemCount
==
0
}
}
override
fun
disableSendMessageButton
()
{
ui
{
button_send
.
isEnabled
=
false
}
ui
{
button_send
.
isEnabled
=
false
}
}
override
fun
enableSendMessageButton
()
{
...
...
@@ -558,6 +526,28 @@ class ChatRoomFragment : Fragment(), ChatRoomView, EmojiKeyboardListener, EmojiR
}
}
override
fun
showNewMessage
(
message
:
List
<
BaseUiModel
<*
>>,
isMessageReceived
:
Boolean
)
{
ui
{
adapter
.
prependData
(
message
)
if
(
isMessageReceived
&&
button_fab
.
isVisible
)
{
newMessageCount
++
if
(
newMessageCount
<=
99
)
{
text_count
.
text
=
newMessageCount
.
toString
()
}
else
{
text_count
.
text
=
"99+"
}
text_count
.
isVisible
=
true
}
else
if
(!
button_fab
.
isVisible
)
{
recycler_view
.
scrollToPosition
(
0
)
}
verticalScrollOffset
.
set
(
0
)
empty_chat_view
.
isVisible
=
adapter
.
itemCount
==
0
dismissEmojiKeyboard
()
}
}
override
fun
dispatchUpdateMessage
(
index
:
Int
,
message
:
List
<
BaseUiModel
<*
>>)
{
ui
{
// TODO - investigate WHY we get a empty list here
...
...
@@ -570,6 +560,7 @@ class ChatRoomFragment : Fragment(), ChatRoomView, EmojiKeyboardListener, EmojiR
}
else
{
showNewMessage
(
message
,
true
)
}
dismissEmojiKeyboard
()
}
}
...
...
@@ -737,8 +728,8 @@ class ChatRoomFragment : Fragment(), ChatRoomView, EmojiKeyboardListener, EmojiR
}
private
fun
setReactionButtonIcon
(
@DrawableRes
drawableId
:
Int
)
{
button_add_reaction
.
setImageResource
(
drawableId
)
button_add_reaction
.
tag
=
drawableId
button_add_reaction
_or_show_keyboard
.
setImageResource
(
drawableId
)
button_add_reaction
_or_show_keyboard
.
tag
=
drawableId
}
override
fun
showFileSelection
(
filter
:
Array
<
String
>?)
{
...
...
@@ -792,10 +783,6 @@ class ChatRoomFragment : Fragment(), ChatRoomView, EmojiKeyboardListener, EmojiR
}
}
private
val
dismissStatus
=
{
text_connection_status
.
fadeOut
()
}
private
fun
setupRecyclerView
()
{
// Initialize the endlessRecyclerViewScrollListener so we don't NPE at onDestroyView
val
linearLayoutManager
=
LinearLayoutManager
(
context
,
RecyclerView
.
VERTICAL
,
true
)
...
...
@@ -859,9 +846,13 @@ class ChatRoomFragment : Fragment(), ChatRoomView, EmojiKeyboardListener, EmojiR
subscribeComposeTextMessage
()
emojiKeyboardPopup
=
EmojiKeyboardPopup
(
activity
!!
,
activity
!!
.
findViewById
(
R
.
id
.
fragment_container
))
emojiKeyboardPopup
.
listener
=
this
text_message
.
listener
=
object
:
ComposerEditText
.
ComposerEditTextListener
{
override
fun
onKeyboardOpened
()
{}
override
fun
onKeyboardOpened
()
{
KeyboardHelper
.
showSoftKeyboard
(
text_message
)
}
override
fun
onKeyboardClosed
()
{
activity
?.
let
{
...
...
@@ -878,7 +869,6 @@ class ChatRoomFragment : Fragment(), ChatRoomView, EmojiKeyboardListener, EmojiR
var
textMessage
=
citation
?:
""
textMessage
+=
text_message
.
textContent
sendMessage
(
textMessage
)
clearMessageComposition
(
true
)
}
button_show_attachment_options
.
setOnClickListener
{
...
...
@@ -893,9 +883,7 @@ class ChatRoomFragment : Fragment(), ChatRoomView, EmojiKeyboardListener, EmojiR
hideAttachmentOptions
()
}
button_add_reaction
.
setOnClickListener
{
_
->
openEmojiKeyboardPopup
()
}
button_add_reaction_or_show_keyboard
.
setOnClickListener
{
toggleKeyboard
()
}
button_take_a_photo
.
setOnClickListener
{
dispatchTakePictureIntent
()
...
...
@@ -952,16 +940,10 @@ class ChatRoomFragment : Fragment(), ChatRoomView, EmojiKeyboardListener, EmojiR
}
}
private
fun
get
Unfinished
Message
()
{
val
unfinishedMessage
=
presenter
.
get
UnfinishedMessage
(
chatRoomId
)
if
(
unfinishedMessage
.
isNot
Blank
())
{
private
fun
get
Draft
Message
()
{
val
unfinishedMessage
=
presenter
.
get
DraftUnfinishedMessage
(
)
if
(
unfinishedMessage
.
isNot
NullNorEmpty
())
{
text_message
.
setText
(
unfinishedMessage
)
val
orientation
=
resources
.
configuration
.
orientation
if
(
orientation
==
Configuration
.
ORIENTATION_PORTRAIT
)
{
KeyboardHelper
.
showSoftKeyboard
(
text_message
)
}
else
{
//TODO show keyboard in full screen mode when landscape orientation
}
}
}
...
...
@@ -979,7 +961,7 @@ class ChatRoomFragment : Fragment(), ChatRoomView, EmojiKeyboardListener, EmojiR
}
.
addSuggestionProviderAction
(
"#"
)
{
query
->
if
(
query
.
isNotEmpty
())
{
presenter
.
loadChatRooms
()
presenter
.
loadChatRooms
Suggestions
()
}
}
.
addSuggestionProviderAction
(
"/"
)
{
...
...
@@ -993,19 +975,10 @@ class ChatRoomFragment : Fragment(), ChatRoomView, EmojiKeyboardListener, EmojiR
presenter
.
loadCommands
()
}
private
fun
openEmojiKeyboardPopup
()
{
// Shows the emoji or the system keyboard.
private
fun
toggleKeyboard
()
{
if
(!
emojiKeyboardPopup
.
isShowing
)
{
// If keyboard is visible, simply show the popup
if
(
emojiKeyboardPopup
.
isKeyboardOpen
)
{
emojiKeyboardPopup
.
showAtBottom
()
}
else
{
// Open the text keyboard first and immediately after that show the emoji popup
text_message
.
isFocusableInTouchMode
=
true
text_message
.
requestFocus
()
emojiKeyboardPopup
.
showAtBottomPending
()
KeyboardHelper
.
showSoftKeyboard
(
text_message
)
}
setReactionButtonIcon
(
R
.
drawable
.
ic_keyboard_black_24dp
)
openEmojiKeyboard
()
}
else
{
// If popup is showing, simply dismiss it to show the underlying text keyboard
dismissEmojiKeyboard
()
...
...
@@ -1172,4 +1145,27 @@ class ChatRoomFragment : Fragment(), ChatRoomView, EmojiKeyboardListener, EmojiR
presenter
.
reportMessage
(
messageId
=
id
,
description
=
"This message was reported by a user from the Android app"
)
}
fun
openEmojiKeyboard
()
{
// If keyboard is visible, simply show the popup
if
(
emojiKeyboardPopup
.
isKeyboardOpen
)
{
emojiKeyboardPopup
.
showAtBottom
()
}
else
{
// Open the text keyboard first and immediately after that show the emoji popup
text_message
.
isFocusableInTouchMode
=
true
text_message
.
requestFocus
()
emojiKeyboardPopup
.
showAtBottomPending
()
KeyboardHelper
.
showSoftKeyboard
(
text_message
)
}
setReactionButtonIcon
(
R
.
drawable
.
ic_keyboard_black_24dp
)
}
fun
dismissEmojiKeyboard
()
{
// Check if the keyboard was ever initialized.
// It may be the case when you are looking a not joined room
if
(
::
emojiKeyboardPopup
.
isInitialized
)
{
emojiKeyboardPopup
.
dismiss
()
setReactionButtonIcon
(
R
.
drawable
.
ic_reaction_24dp
)
}
}
}
app/src/main/java/chat/rocket/android/chatroom/uimodel/UiModelMapper.kt
View file @
12db177e
...
...
@@ -19,7 +19,6 @@ import chat.rocket.android.dagger.scope.PerFragment
import
chat.rocket.android.db.DatabaseManager
import
chat.rocket.android.emoji.EmojiParser
import
chat.rocket.android.emoji.EmojiRepository
import
chat.rocket.android.emoji.internal.isCustom
import
chat.rocket.android.helper.MessageHelper
import
chat.rocket.android.helper.MessageParser
import
chat.rocket.android.helper.UserHelper
...
...
@@ -32,7 +31,7 @@ import chat.rocket.android.server.domain.messageReadReceiptEnabled
import
chat.rocket.android.server.domain.messageReadReceiptStoreUsers
import
chat.rocket.android.server.domain.useRealName
import
chat.rocket.android.server.infraestructure.ConnectionManagerFactory
import
chat.rocket.android.util.extension.
orFals
e
import
chat.rocket.android.util.extension.
isImag
e
import
chat.rocket.android.util.extensions.avatarUrl
import
chat.rocket.android.util.extensions.ifNotNullNorEmpty
import
chat.rocket.android.util.extensions.isNotNullNorEmpty
...
...
@@ -127,8 +126,13 @@ class UiModelMapper @Inject constructor(
getChatRoomAsync
(
message
.
roomId
)
?.
let
{
chatRoom
->
message
.
urls
?.
forEach
{
url
->
if
(
url
.
url
.
isImage
())
{
val
attachment
=
Attachment
(
imageUrl
=
url
.
url
)
mapAttachment
(
message
,
attachment
,
chatRoom
)
?.
let
{
list
.
add
(
it
)
}
}
else
{
mapUrl
(
message
,
url
,
chatRoom
)
?.
let
{
list
.
add
(
it
)
}
}
}
message
.
attachments
?.
mapNotNull
{
attachment
->
mapAttachment
(
message
,
attachment
,
chatRoom
)
...
...
@@ -164,7 +168,7 @@ class UiModelMapper @Inject constructor(
// TODO: move this to new interactor or FetchChatRoomsInteractor?
private
suspend
fun
getChatRoomAsync
(
roomId
:
String
):
ChatRoom
?
=
withContext
(
CommonPool
)
{
return
@withContext
dbManager
.
chatRoomDao
().
getSync
(
roomId
)
?.
let
{
return
@withContext
dbManager
.
getRoom
(
id
=
roomId
)
?.
let
{
with
(
it
.
chatRoom
)
{
ChatRoom
(
id
=
id
,
...
...
app/src/main/java/chat/rocket/android/chatrooms/ui/ChatRoomsFragment.kt
View file @
12db177e
...
...
@@ -36,6 +36,8 @@ import chat.rocket.android.helper.SharedPreferenceHelper
import
chat.rocket.android.util.extension.onQueryTextListener
import
chat.rocket.android.util.extensions.fadeIn
import
chat.rocket.android.util.extensions.fadeOut
import
chat.rocket.android.util.extensions.ifNotNullNorEmpty
import
chat.rocket.android.util.extensions.ifNotNullNotEmpty
import
chat.rocket.android.util.extensions.inflate
import
chat.rocket.android.util.extensions.showToast
import
chat.rocket.android.util.extensions.ui
...
...
@@ -83,8 +85,8 @@ class ChatRoomsFragment : Fragment(), ChatRoomsView {
val
bundle
=
arguments
if
(
bundle
!=
null
)
{
chatRoomId
=
bundle
.
getString
(
BUNDLE_CHAT_ROOM_ID
)
chatRoomId
?.
let
{
presenter
.
loadChatRoom
(
it
)
chatRoomId
.
ifNotNullNotEmpty
{
roomId
->
presenter
.
loadChatRoom
(
roomId
)
chatRoomId
=
null
}
}
...
...
@@ -237,7 +239,7 @@ class ChatRoomsFragment : Fragment(), ChatRoomsView {
AlertDialog
.
Builder
(
context
)
.
setTitle
(
R
.
string
.
dialog_sort_title
)
.
setView
(
dialogLayout
)
.
setPositiveButton
(
R
.
string
.
dialog_button_done
)
{
dialog
,
_
->
.
setPositiveButton
(
R
.
string
.
msg_sort
)
{
dialog
,
_
->
invalidateQueryOnSearch
()
updateSort
()
dialog
.
dismiss
()
...
...
app/src/main/java/chat/rocket/android/dagger/module/AppModule.kt
View file @
12db177e
...
...
@@ -64,6 +64,7 @@ import chat.rocket.common.internal.ISO8601Date
import
chat.rocket.common.model.TimestampAdapter
import
chat.rocket.common.util.CalendarISO8601Converter
import
chat.rocket.common.util.Logger
import
chat.rocket.common.util.NoOpLogger
import
chat.rocket.common.util.PlatformLogger
import
chat.rocket.core.internal.AttachmentAdapterFactory
import
chat.rocket.core.internal.ReactionsAdapter
...
...
@@ -231,7 +232,7 @@ class AppModule {
return
Moshi
.
Builder
()
.
add
(
FallbackSealedClassJsonAdapter
.
ADAPTER_FACTORY
)
.
add
(
AppJsonAdapterFactory
.
INSTANCE
)
.
add
(
AttachmentAdapterFactory
(
Logger
(
logger
,
url
)
))
.
add
(
AttachmentAdapterFactory
(
NoOpLogger
))
.
add
(
java
.
lang
.
Long
::
class
.
java
,
ISO8601Date
::
class
.
java
,
...
...
app/src/main/java/chat/rocket/android/dagger/module/LocalModule.kt
View file @
12db177e
...
...
@@ -14,6 +14,7 @@ import chat.rocket.common.internal.ISO8601Date
import
chat.rocket.common.model.TimestampAdapter
import
chat.rocket.common.util.CalendarISO8601Converter
import
chat.rocket.common.util.Logger
import
chat.rocket.common.util.NoOpLogger
import
chat.rocket.common.util.PlatformLogger
import
chat.rocket.core.internal.AttachmentAdapterFactory
import
chat.rocket.core.internal.ReactionsAdapter
...
...
@@ -47,7 +48,7 @@ class LocalModule {
return
Moshi
.
Builder
()
.
add
(
FallbackSealedClassJsonAdapter
.
ADAPTER_FACTORY
)
.
add
(
AppJsonAdapterFactory
.
INSTANCE
)
.
add
(
AttachmentAdapterFactory
(
Logger
(
logger
,
url
)
))
.
add
(
AttachmentAdapterFactory
(
NoOpLogger
))
.
add
(
java
.
lang
.
Long
::
class
.
java
,
ISO8601Date
::
class
.
java
,
...
...
@@ -67,8 +68,6 @@ class LocalModule {
return
context
.
getSharedPreferences
(
"rocket.chat"
,
Context
.
MODE_PRIVATE
)
}
@Provides
@Singleton
fun
provideLocalRepository
(
sharedPreferences
:
SharedPreferences
,
moshi
:
Moshi
):
LocalRepository
{
...
...
app/src/main/java/chat/rocket/android/infrastructure/LocalRepository.kt
View file @
12db177e
...
...
@@ -27,7 +27,7 @@ interface LocalRepository {
const
val
SETTINGS_KEY
=
"settings_"
const
val
PERMISSIONS_KEY
=
"permissions_"
const
val
USER_KEY
=
"user_"
const
val
UNFINISHED_MSG_KEY
=
"unfinished_msg_
"
const
val
DRAFT_KEY
=
"draft
"
const
val
CURRENT_USERNAME_KEY
=
"username_"
const
val
LAST_CHATROOMS_REFRESH
=
"_chatrooms_refresh"
}
...
...
app/src/main/java/chat/rocket/android/main/presentation/MainPresenter.kt
View file @
12db177e
...
...
@@ -110,6 +110,7 @@ class MainPresenter @Inject constructor(
}
fun
loadCurrentInfo
()
{
setupConnectionInfo
(
currentServer
)
checkServerInfo
(
currentServer
)
launchUI
(
strategy
)
{
try
{
...
...
app/src/main/java/chat/rocket/android/server/infraestructure/RocketChatClientFactory.kt
View file @
12db177e
...
...
@@ -30,6 +30,7 @@ class RocketChatClientFactory @Inject constructor(
userAgent
=
"RC Mobile; Android ${Build.VERSION.RELEASE}; v${BuildConfig.VERSION_NAME} (${BuildConfig.VERSION_CODE})"
tokenRepository
=
repository
platformLogger
=
logger
enableLogger
=
false
}
Timber
.
d
(
"Returning NEW client for: $url"
)
...
...
app/src/main/java/chat/rocket/android/settings/password/presentation/PasswordPresenter.kt
View file @
12db177e
...
...
@@ -2,13 +2,14 @@ package chat.rocket.android.settings.password.presentation
import
chat.rocket.android.analytics.AnalyticsManager
import
chat.rocket.android.core.lifecycle.CancelStrategy
import
chat.rocket.android.helper.UserHelper
import
chat.rocket.android.server.domain.GetCurrentServerInteractor
import
chat.rocket.android.server.infraestructure.RocketChatClientFactory
import
chat.rocket.android.util.extension.launchUI
import
chat.rocket.android.util.retryIO
import
chat.rocket.common.RocketChatException
import
chat.rocket.common.util.ifNull
import
chat.rocket.core.RocketChatClient
import
chat.rocket.core.internal.rest.me
import
chat.rocket.core.internal.rest.updateProfile
import
javax.inject.Inject
...
...
@@ -16,6 +17,7 @@ class PasswordPresenter @Inject constructor(
private
val
view
:
PasswordView
,
private
val
strategy
:
CancelStrategy
,
private
val
analyticsManager
:
AnalyticsManager
,
private
val
userHelp
:
UserHelper
,
serverInteractor
:
GetCurrentServerInteractor
,
factory
:
RocketChatClientFactory
)
{
...
...
@@ -26,17 +28,18 @@ class PasswordPresenter @Inject constructor(
launchUI
(
strategy
)
{
try
{
view
.
showLoading
()
val
me
=
retryIO
(
"me"
)
{
client
.
me
()
}
retryIO
(
"updateProfile(${me.id})"
)
{
client
.
updateProfile
(
me
.
id
,
null
,
null
,
password
,
null
)
userHelp
.
user
()
?.
id
?.
let
{
userId
->
retryIO
(
"updateProfile()"
)
{
client
.
updateProfile
(
userId
,
null
,
null
,
password
,
null
)
}
analyticsManager
.
logResetPassword
(
true
)
view
.
showPasswordSuccessfullyUpdatedMessage
()
}
}
catch
(
exception
:
RocketChatException
)
{
analyticsManager
.
logResetPassword
(
false
)
view
.
showPasswordFailsUpdateMessage
(
exception
.
message
)
exception
.
message
?.
let
{
errorMessage
->
view
.
showPasswordFailsUpdateMessage
(
errorMessage
)
}
}
finally
{
view
.
hideLoading
()
}
...
...
app/src/main/java/chat/rocket/android/settings/password/presentation/PasswordView.kt
View file @
12db177e
...
...
@@ -12,5 +12,5 @@ interface PasswordView: LoadingView {
* Shows a message when the user's password fails to update
* @param error is a String containing the failure message
*/
fun
showPasswordFailsUpdateMessage
(
error
:
String
?
)
fun
showPasswordFailsUpdateMessage
(
error
:
String
)
}
app/src/main/java/chat/rocket/android/settings/password/ui/PasswordFragment.kt
View file @
12db177e
...
...
@@ -6,7 +6,6 @@ import android.view.Menu
import
android.view.MenuItem
import
android.view.View
import
android.view.ViewGroup
import
android.widget.Toast
import
androidx.appcompat.view.ActionMode
import
androidx.fragment.app.Fragment
import
chat.rocket.android.R
...
...
@@ -16,6 +15,7 @@ import chat.rocket.android.settings.password.presentation.PasswordPresenter
import
chat.rocket.android.settings.password.presentation.PasswordView
import
chat.rocket.android.util.extension.asObservable
import
chat.rocket.android.util.extensions.inflate
import
chat.rocket.android.util.extensions.showToast
import
chat.rocket.android.util.extensions.textContent
import
chat.rocket.android.util.extensions.ui
import
dagger.android.support.AndroidSupportInjection
...
...
@@ -33,7 +33,7 @@ class PasswordFragment : Fragment(), PasswordView, ActionMode.Callback {
@Inject
lateinit
var
analyticsManager
:
AnalyticsManager
private
var
actionMode
:
ActionMode
?
=
null
private
val
disposables
=
CompositeDisposable
()
private
val
compositeDisposable
=
CompositeDisposable
()
override
fun
onCreate
(
savedInstanceState
:
Bundle
?)
{
AndroidSupportInjection
.
inject
(
this
)
...
...
@@ -48,14 +48,12 @@ class PasswordFragment : Fragment(), PasswordView, ActionMode.Callback {
override
fun
onViewCreated
(
view
:
View
,
savedInstanceState
:
Bundle
?)
{
super
.
onViewCreated
(
view
,
savedInstanceState
)
disposables
.
add
(
listenToChanges
())
compositeDisposable
.
add
(
listenToChanges
())
analyticsManager
.
logScreenView
(
ScreenViewEvent
.
Password
)
}
override
fun
onDestroyView
()
{
disposables
.
clear
()
compositeDisposable
.
clear
()
super
.
onDestroyView
()
}
...
...
@@ -74,21 +72,19 @@ class PasswordFragment : Fragment(), PasswordView, ActionMode.Callback {
mode
.
finish
()
return
true
}
else
->
{
false
}
else
->
false
}
}
override
fun
onCreateActionMode
(
mode
:
ActionMode
,
menu
:
Menu
?
):
Boolean
{
override
fun
onCreateActionMode
(
mode
:
ActionMode
,
menu
:
Menu
):
Boolean
{
mode
.
menuInflater
.
inflate
(
R
.
menu
.
password
,
menu
)
mode
.
title
=
resources
.
getString
(
R
.
string
.
action_confirm_password
)
return
true
}
override
fun
onPrepareActionMode
(
mode
:
ActionMode
?
,
menu
:
Menu
?):
Boolean
=
false
override
fun
onPrepareActionMode
(
mode
:
ActionMode
,
menu
:
Menu
?):
Boolean
=
false
override
fun
onDestroyActionMode
(
mode
:
ActionMode
?
)
{
override
fun
onDestroyActionMode
(
mode
:
ActionMode
)
{
actionMode
=
null
}
...
...
@@ -100,12 +96,12 @@ class PasswordFragment : Fragment(), PasswordView, ActionMode.Callback {
}
}
override
fun
showPasswordFailsUpdateMessage
(
error
:
String
?
)
{
showToast
(
"Password fails to update: "
+
error
)
override
fun
showPasswordFailsUpdateMessage
(
error
:
String
)
{
showToast
(
getString
(
R
.
string
.
msg_unable_to_update_password
,
error
)
)
}
override
fun
showPasswordSuccessfullyUpdatedMessage
()
{
showToast
(
"Password was successfully updated!"
)
showToast
(
R
.
string
.
msg_password_updated_successfully
)
}
private
fun
finishActionMode
()
=
actionMode
?.
finish
()
...
...
@@ -115,23 +111,14 @@ class PasswordFragment : Fragment(), PasswordView, ActionMode.Callback {
text_new_password
.
asObservable
(),
text_confirm_password
.
asObservable
()
).
subscribe
{
val
textPassword
=
text_new_password
.
textContent
val
textConfirmPassword
=
text_confirm_password
.
textContent
if
(
textPassword
.
length
>
5
&&
textConfirmPassword
.
length
>
5
&&
textPassword
.
equals
(
textConfirmPassword
)
)
val
newPassword
=
it
.
first
.
toString
()
val
newPasswordConfirmation
=
it
.
second
.
toString
()
if
(
newPassword
.
length
>
5
&&
newPassword
==
newPasswordConfirmation
)
{
startActionMode
()
else
}
else
{
finishActionMode
()
}
}
private
fun
showToast
(
msg
:
String
?)
{
ui
{
Toast
.
makeText
(
it
,
msg
,
Toast
.
LENGTH_LONG
).
show
()
}
}
private
fun
startActionMode
()
{
...
...
app/src/main/java/chat/rocket/android/userdetails/presentation/UserDetailsPresenter.kt
View file @
12db177e
package
chat.rocket.android.userdetails.presentation
import
chat.rocket.android.chatrooms.domain.FetchChatRoomsInteractor
import
chat.rocket.android.core.lifecycle.CancelStrategy
import
chat.rocket.android.db.DatabaseManager
import
chat.rocket.android.db.model.ChatRoomEntity
import
chat.rocket.android.server.domain.GetConnectingServerInteractor
import
chat.rocket.android.server.infraestructure.ConnectionManagerFactory
import
chat.rocket.android.util.extension.launchUI
...
...
@@ -27,6 +29,7 @@ class UserDetailsPresenter @Inject constructor(
private
var
currentServer
=
serverInteractor
.
get
()
!!
private
val
manager
=
factory
.
create
(
currentServer
)
private
val
client
=
manager
.
client
private
val
interactor
=
FetchChatRoomsInteractor
(
client
,
dbManager
)
fun
loadUserDetails
(
userId
:
String
)
{
launchUI
(
strategy
)
{
...
...
@@ -39,37 +42,7 @@ class UserDetailsPresenter @Inject constructor(
val
openedChatRooms
=
chatRoomByName
(
name
=
u
.
name
)
val
avatarUrl
=
u
.
username
?.
let
{
currentServer
.
avatarUrl
(
avatar
=
it
)
}
val
chatRoom
:
ChatRoom
?
=
if
(
openedChatRooms
.
isEmpty
())
{
ChatRoom
(
id
=
""
,
type
=
roomTypeOf
(
RoomType
.
DIRECT_MESSAGE
),
name
=
u
.
username
?:
u
.
name
.
orEmpty
(),
fullName
=
u
.
name
,
favorite
=
false
,
open
=
false
,
alert
=
false
,
status
=
userStatusOf
(
u
.
status
),
client
=
client
,
broadcast
=
false
,
archived
=
false
,
default
=
false
,
description
=
null
,
groupMentions
=
null
,
userMentions
=
null
,
lastMessage
=
null
,
lastSeen
=
null
,
topic
=
null
,
announcement
=
null
,
roles
=
null
,
unread
=
0
,
readonly
=
false
,
muted
=
null
,
subscriptionId
=
""
,
timestamp
=
null
,
updatedAt
=
null
,
user
=
null
)
}
else
openedChatRooms
.
firstOrNull
()
val
chatRoom
:
ChatRoom
?
=
openedChatRooms
.
firstOrNull
()
view
.
showUserDetails
(
avatarUrl
=
avatarUrl
,
...
...
@@ -92,13 +65,14 @@ class UserDetailsPresenter @Inject constructor(
client
.
createDirectMessage
(
username
=
id
)
}
interactor
.
refreshChatRooms
()
val
userEntity
=
withContext
(
CommonPool
)
{
dbManager
.
userDao
().
getUser
(
id
=
id
)
}
if
(
userEntity
!=
null
)
{
view
.
toDirectMessage
(
chatRoom
=
ChatRoom
(
val
chatRoom
=
ChatRoom
(
id
=
result
.
id
,
type
=
roomTypeOf
(
RoomType
.
DIRECT_MESSAGE
),
name
=
userEntity
.
username
?:
userEntity
.
name
.
orEmpty
(),
...
...
@@ -127,13 +101,27 @@ class UserDetailsPresenter @Inject constructor(
updatedAt
=
result
.
updatedAt
,
user
=
null
)
)
withContext
(
CommonPool
+
strategy
.
jobs
)
{
dbManager
.
chatRoomDao
().
insertOrReplace
(
chatRoom
=
ChatRoomEntity
(
id
=
chatRoom
.
id
,
name
=
chatRoom
.
name
,
description
=
chatRoom
.
description
,
type
=
chatRoom
.
type
.
toString
(),
fullname
=
chatRoom
.
fullName
,
subscriptionId
=
chatRoom
.
subscriptionId
,
updatedAt
=
chatRoom
.
updatedAt
))
}
view
.
toDirectMessage
(
chatRoom
=
chatRoom
)
}
}
catch
(
ex
:
Exception
)
{
Timber
.
e
(
ex
)
view
.
onOpenDirectMessageError
()
}
}
private
suspend
fun
chatRoomByName
(
name
:
String
?
=
null
):
List
<
ChatRoom
>
=
withContext
(
CommonPool
)
{
return
@withContext
dbManager
.
chatRoomDao
().
getAllSync
().
filter
{
if
(
name
==
null
)
{
...
...
app/src/main/java/chat/rocket/android/util/IO.kt
View file @
12db177e
...
...
@@ -9,7 +9,7 @@ import timber.log.Timber
import
kotlin.coroutines.experimental.coroutineContext
const
val
DEFAULT_RETRY
=
3
private
const
val
DEFAULT_DB_RETRY
=
5
private
const
val
DEFAULT_DB_RETRY
=
1
5
suspend
fun
<
T
>
retryIO
(
description
:
String
=
"<missing description>"
,
...
...
@@ -42,7 +42,7 @@ suspend fun <T> retryDB(
description
:
String
=
"<missing description>"
,
times
:
Int
=
DEFAULT_DB_RETRY
,
initialDelay
:
Long
=
100
,
// 0.1 second
maxDelay
:
Long
=
500
,
// 0
.5 second
maxDelay
:
Long
=
1500
,
// 1
.5 second
factor
:
Double
=
1.2
,
block
:
suspend
()
->
T
):
T
{
...
...
app/src/main/java/chat/rocket/android/util/extensions/String.kt
View file @
12db177e
...
...
@@ -77,3 +77,9 @@ fun String.lowercaseUrl(): String? {
}
fun
String
?.
isNotNullNorEmpty
():
Boolean
=
this
!=
null
&&
this
.
isNotEmpty
()
inline
fun
String
?.
ifNotNullNotEmpty
(
block
:
(
String
)
->
Unit
)
{
if
(
this
!=
null
&&
this
.
isNotEmpty
())
{
block
(
this
)
}
}
\ No newline at end of file
app/src/main/res/drawable/ic_keyboard_black_24dp.xml
View file @
12db177e
...
...
@@ -7,13 +7,7 @@
<path
android:fillColor=
"#000000"
android:pathData=
"M20,5 L4,5 C2.9,5,2.01,5.9,2.01,7 L2,17 C2,18.1,2.9,19,4,19 L20,19
C21.1,19,22,18.1,22,17 L22,7 C22,5.9,21.1,5,20,5 Z M11,8 L13,8 L13,10 L11,10
L11,8 Z M11,11 L13,11 L13,13 L11,13 L11,11 Z M8,8 L10,8 L10,10 L8,10 L8,8 Z
M8,11 L10,11 L10,13 L8,13 L8,11 Z M7,13 L5,13 L5,11 L7,11 L7,13 Z M7,10 L5,10
L5,8 L7,8 L7,10 Z M16,17 L8,17 L8,15 L16,15 L16,17 Z M16,13 L14,13 L14,11 L16,11
L16,13 Z M16,10 L14,10 L14,8 L16,8 L16,10 Z M19,13 L17,13 L17,11 L19,11 L19,13 Z
M19,10 L17,10 L17,8 L19,8 L19,10 Z"
/>
<path
android:pathData=
"M0,0 L24,0 L24,24 L0,24 Z M-24,0 L0,0 L0,24 L0,24 Z"
/>
android:pathData=
"M20,5 L4,5 C2.9,5,2.01,5.9,2.01,7 L2,17 C2,18.1,2.9,19,4,19 L20,19 C21.1,19,22,18.1,22,17 L22,7 C22,5.9,21.1,5,20,5 Z M11,8 L13,8 L13,10 L11,10 L11,8 Z M11,11 L13,11 L13,13 L11,13 L11,11 Z M8,8 L10,8 L10,10 L8,10 L8,8 Z M8,11 L10,11 L10,13 L8,13 L8,11 Z M7,13 L5,13 L5,11 L7,11 L7,13 Z M7,10 L5,10 L5,8 L7,8 L7,10 Z M16,17 L8,17 L8,15 L16,15 L16,17 Z M16,13 L14,13 L14,11 L16,11 L16,13 Z M16,10 L14,10 L14,8 L16,8 L16,10 Z M19,13 L17,13 L17,11 L19,11 L19,13 Z M19,10 L17,10 L17,8 L19,8 L19,10 Z"
/>
<path
android:pathData=
"M0,0 L24,0 L24,24 L0,24 Z M-24,0 L0,0 L0,24 L0,24 Z"
/>
</vector>
\ No newline at end of file
app/src/main/res/layout/dialog_report.xml
View file @
12db177e
...
...
@@ -113,7 +113,7 @@
app:layout_constraintTop_toBottomOf=
"@+id/edit_text_description"
tools:visibility=
"visible"
/>
<Button
<
android.widget.
Button
android:id=
"@+id/button_send_report"
android:layout_width=
"0dp"
android:layout_height=
"wrap_content"
...
...
app/src/main/res/layout/file_attachments_dialog.xml
View file @
12db177e
...
...
@@ -79,7 +79,7 @@
android:layout_margin=
"16dp"
android:hint=
"@string/msg_file_description"
/>
<Button
<
android.widget.
Button
android:id=
"@+id/button_send"
android:layout_width=
"wrap_content"
android:layout_height=
"wrap_content"
...
...
@@ -90,7 +90,7 @@
android:text=
"@string/msg_send"
android:textColor=
"@color/colorWhite"
/>
<Button
<
android.widget.
Button
android:id=
"@+id/button_cancel"
android:layout_width=
"wrap_content"
android:layout_height=
"wrap_content"
...
...
app/src/main/res/layout/fragment_authentication_log_in.xml
View file @
12db177e
...
...
@@ -39,7 +39,7 @@
app:layout_constraintStart_toStartOf=
"parent"
app:layout_constraintTop_toBottomOf=
"@+id/text_username_or_email"
/>
<Button
<
android.widget.
Button
android:id=
"@+id/button_log_in"
style=
"@style/Authentication.Button"
android:layout_marginTop=
"20dp"
...
...
@@ -50,7 +50,7 @@
app:layout_constraintStart_toStartOf=
"parent"
app:layout_constraintTop_toBottomOf=
"@id/text_password"
/>
<Button
<
android.widget.
Button
android:id=
"@+id/button_forgot_your_password"
style=
"@style/Authentication.Button.Borderless"
android:layout_marginTop=
"10dp"
...
...
app/src/main/res/layout/fragment_authentication_login_options.xml
View file @
12db177e
...
...
@@ -21,7 +21,7 @@
app:layout_constraintTop_toTopOf=
"parent"
tools:visibility=
"visible"
>
<Button
<
android.widget.
Button
android:id=
"@+id/button_facebook"
style=
"?borderlessButtonStyle"
android:layout_width=
"match_parent"
...
...
@@ -39,7 +39,7 @@
android:visibility=
"gone"
tools:visibility=
"visible"
/>
<Button
<
android.widget.
Button
android:id=
"@+id/button_github"
style=
"?borderlessButtonStyle"
android:layout_width=
"match_parent"
...
...
@@ -58,7 +58,7 @@
android:visibility=
"gone"
tools:visibility=
"visible"
/>
<Button
<
android.widget.
Button
android:id=
"@+id/button_google"
style=
"?borderlessButtonStyle"
android:layout_width=
"match_parent"
...
...
@@ -77,7 +77,7 @@
android:visibility=
"gone"
tools:visibility=
"visible"
/>
<Button
<
android.widget.
Button
android:id=
"@+id/button_linkedin"
style=
"?borderlessButtonStyle"
android:layout_width=
"match_parent"
...
...
@@ -96,7 +96,7 @@
android:visibility=
"gone"
tools:visibility=
"visible"
/>
<Button
<
android.widget.
Button
android:id=
"@+id/button_gitlab"
style=
"?borderlessButtonStyle"
android:layout_width=
"match_parent"
...
...
@@ -115,7 +115,7 @@
android:visibility=
"gone"
tools:visibility=
"visible"
/>
<Button
<
android.widget.
Button
android:id=
"@+id/button_wordpress"
style=
"?borderlessButtonStyle"
android:layout_width=
"match_parent"
...
...
@@ -179,7 +179,7 @@
app:layout_constraintTop_toTopOf=
"@+id/button_expand_collapse_accounts"
/>
</androidx.constraintlayout.widget.ConstraintLayout>
<Button
<
android.widget.
Button
android:id=
"@+id/button_login_with_email"
style=
"@style/Authentication.Button"
android:layout_marginTop=
"32dp"
...
...
@@ -190,7 +190,7 @@
app:layout_constraintTop_toBottomOf=
"@+id/expand_more_accounts_container"
tools:visibility=
"visible"
/>
<Button
<
android.widget.
Button
android:id=
"@+id/button_create_an_account"
style=
"@style/Authentication.Button.Borderless"
android:layout_marginTop=
"10dp"
...
...
app/src/main/res/layout/fragment_authentication_register_username.xml
View file @
12db177e
...
...
@@ -26,7 +26,7 @@
app:layout_constraintStart_toStartOf=
"parent"
app:layout_constraintTop_toBottomOf=
"@id/text_sign_in_to_your_server"
/>
<Button
<
android.widget.
Button
android:id=
"@+id/button_use_this_username"
style=
"@style/Authentication.Button"
android:layout_marginTop=
"20dp"
...
...
app/src/main/res/layout/fragment_authentication_reset_password.xml
View file @
12db177e
...
...
@@ -26,7 +26,7 @@
app:layout_constraintStart_toStartOf=
"parent"
app:layout_constraintTop_toBottomOf=
"@id/text_reset_password"
/>
<Button
<
android.widget.
Button
android:id=
"@+id/button_reset_password"
style=
"@style/Authentication.Button"
android:layout_marginTop=
"20dp"
...
...
app/src/main/res/layout/fragment_authentication_server.xml
View file @
12db177e
...
...
@@ -63,7 +63,7 @@
android:inputType=
"text|textUri"
/>
</RelativeLayout>
<Button
<
android.widget.
Button
android:id=
"@+id/button_connect"
style=
"@style/Authentication.Button"
android:layout_marginTop=
"20dp"
...
...
app/src/main/res/layout/fragment_authentication_sign_up.xml
View file @
12db177e
...
...
@@ -66,7 +66,7 @@
app:layout_constraintStart_toStartOf=
"parent"
app:layout_constraintTop_toBottomOf=
"@+id/text_password"
/>
<Button
<
android.widget.
Button
android:id=
"@+id/button_register"
style=
"@style/Authentication.Button"
android:layout_marginTop=
"20dp"
...
...
app/src/main/res/layout/fragment_authentication_two_fa.xml
View file @
12db177e
...
...
@@ -24,7 +24,7 @@
app:layout_constraintStart_toStartOf=
"parent"
app:layout_constraintTop_toBottomOf=
"@+id/text_two_factor_authentication"
/>
<Button
<
android.widget.
Button
android:id=
"@+id/button_confirm"
style=
"@style/Authentication.Button"
android:layout_marginTop=
"20dp"
...
...
app/src/main/res/layout/fragment_password.xml
View file @
12db177e
<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout
xmlns:android=
"http://schemas.android.com/apk/res/android"
android:layout_width=
"match_parent"
android:layout_height=
"match_parent"
xmlns:app=
"http://schemas.android.com/apk/res-auto"
xmlns:tools=
"http://schemas.android.com/tools"
android:layout_width=
"match_parent"
android:layout_height=
"match_parent"
tools:context=
".settings.password.ui.PasswordFragment"
>
<com.google.android.material.textfield.TextInputLayout
android:id=
"@+id/layout_new_password"
android:layout_width=
"0dp"
android:layout_height=
"wrap_content"
android:layout_margin=
"16dp"
android:theme=
"@style/EditText.Password"
app:layout_constraintStart_toStartOf=
"parent"
app:layout_constraintEnd_toEndOf=
"parent"
app:layout_constraint
Top_toTop
Of=
"parent"
a
ndroid:layout_margin=
"16dp"
>
app:layout_constraint
Start_toStart
Of=
"parent"
a
pp:layout_constraintTop_toTopOf=
"parent"
>
<EditText
android:id=
"@+id/text_new_password"
android:layout_width=
"match_parent"
android:layout_height=
"wrap_content"
android:hint=
"@string/msg_new_password"
android:inputType=
"textPassword"
/>
android:inputType=
"textPassword"
/>
</com.google.android.material.textfield.TextInputLayout>
<com.google.android.material.textfield.TextInputLayout
android:id=
"@+id/layout_confirm_password"
android:layout_width=
"0dp"
android:layout_height=
"wrap_content"
android:layout_margin=
"16dp"
android:theme=
"@style/EditText.Password"
app:layout_constraintTop_toBottomOf=
"@+id/layout_new_password"
app:layout_constraintStart_toStartOf=
"parent"
app:layout_constraintEnd_toEndOf=
"parent"
android:layout_margin=
"16dp"
>
app:layout_constraintStart_toStartOf=
"parent"
app:layout_constraintTop_toBottomOf=
"@+id/layout_new_password"
>
<EditText
android:id=
"@+id/text_confirm_password"
android:layout_width=
"match_parent"
...
...
@@ -47,12 +46,13 @@
android:id=
"@+id/view_loading"
android:layout_width=
"wrap_content"
android:layout_height=
"wrap_content"
tools:visibility=
"visible"
android:visibility=
"gone"
app:indicatorColor=
"@color/colorBlack"
app:indicatorName=
"BallPulseIndicator"
app:layout_constraint
Start_toStart
Of=
"parent"
app:layout_constraint
Bottom_toBottom
Of=
"parent"
app:layout_constraintEnd_toEndOf=
"parent"
app:layout_constraintStart_toStartOf=
"parent"
app:layout_constraintTop_toTopOf=
"parent"
app:layout_constraintBottom_toBottomOf=
"parent"
/>
tools:visibility=
"visible"
/>
</androidx.constraintlayout.widget.ConstraintLayout>
\ No newline at end of file
app/src/main/res/layout/item_message_reply.xml
View file @
12db177e
...
...
@@ -12,7 +12,7 @@
android:paddingEnd=
"@dimen/screen_edge_left_and_right_padding"
android:paddingBottom=
"@dimen/message_item_top_and_bottom_padding"
>
<Button
<
android.widget.
Button
android:id=
"@+id/button_message_reply"
android:layout_width=
"wrap_content"
android:layout_height=
"wrap_content"
...
...
app/src/main/res/layout/message_attachment_options.xml
View file @
12db177e
...
...
@@ -5,7 +5,7 @@
android:background=
"@drawable/style_attachment_options"
android:orientation=
"vertical"
>
<Button
<
android.widget.
Button
android:id=
"@+id/button_take_a_photo"
style=
"?android:attr/borderlessButtonStyle"
android:layout_width=
"match_parent"
...
...
@@ -15,7 +15,7 @@
android:gravity=
"start|center"
android:text=
"@string/action_take_a_photo"
/>
<Button
<
android.widget.
Button
android:id=
"@+id/button_attach_a_file"
style=
"?android:attr/borderlessButtonStyle"
android:layout_width=
"match_parent"
...
...
@@ -25,7 +25,7 @@
android:gravity=
"start|center"
android:text=
"@string/action_attach_a_files"
/>
<Button
<
android.widget.
Button
android:id=
"@+id/button_drawing"
style=
"?android:attr/borderlessButtonStyle"
android:layout_width=
"match_parent"
...
...
app/src/main/res/layout/message_composer.xml
View file @
12db177e
...
...
@@ -33,7 +33,7 @@
app:layout_constraintStart_toStartOf=
"parent"
app:layout_constraintTop_toBottomOf=
"@+id/divider"
/>
<Button
<
android.widget.
Button
android:id=
"@+id/button_join_chat"
android:layout_width=
"match_parent"
android:layout_height=
"45dp"
...
...
@@ -59,13 +59,12 @@
app:layout_constraintTop_toBottomOf=
"@+id/divider"
>
<ImageButton
android:id=
"@+id/button_add_reaction"
android:id=
"@+id/button_add_reaction
_or_show_keyboard
"
android:layout_width=
"32dp"
android:layout_height=
"32dp"
android:layout_gravity=
"bottom"
android:layout_marginEnd=
"16dp"
android:background=
"?attr/selectableItemBackgroundBorderless"
android:contentDescription=
"@string/msg_content_description_show_attachment_options"
android:src=
"@drawable/ic_reaction_24dp"
/>
<chat.rocket.android.emoji.ComposerEditText
...
...
app/src/main/res/layout/update_avatar_options.xml
View file @
12db177e
...
...
@@ -5,7 +5,7 @@
android:background=
"@drawable/style_attachment_options"
android:orientation=
"vertical"
>
<Button
<
android.widget.
Button
android:id=
"@+id/button_open_gallery"
style=
"?android:attr/borderlessButtonStyle"
android:layout_width=
"match_parent"
...
...
@@ -15,7 +15,7 @@
android:gravity=
"start|center"
android:text=
"@string/action_select_photo_from_gallery"
/>
<Button
<
android.widget.
Button
android:id=
"@+id/button_take_a_photo"
style=
"?android:attr/borderlessButtonStyle"
android:layout_width=
"match_parent"
...
...
@@ -25,7 +25,7 @@
android:gravity=
"start|center"
android:text=
"@string/action_take_a_photo"
/>
<Button
<
android.widget.
Button
android:id=
"@+id/button_reset_avatar"
style=
"?android:attr/borderlessButtonStyle"
android:layout_width=
"match_parent"
...
...
app/src/main/res/menu/chatrooms.xml
View file @
12db177e
...
...
@@ -14,7 +14,7 @@
<item
android:id=
"@+id/action_sort"
android:icon=
"@drawable/ic_sort"
android:title=
"@string/m
enu_chatroom
_sort"
android:title=
"@string/m
sg
_sort"
app:showAsAction=
"ifRoom"
/>
</menu>
app/src/main/res/values-de/strings.xml
View file @
12db177e
...
...
@@ -14,20 +14,20 @@
<string
name=
"title_members"
>
Benutzer
</string>
<string
name=
"title_counted_members"
>
Benutzer (%d)
</string>
<string
name=
"title_settings"
>
Einstellungen
</string>
<string
name=
"title_preferences"
>
Preferences
</string>
<!-- TODO Add translation --
>
<string
name=
"title_preferences"
>
Einstellungen
</string
>
<string
name=
"title_change_password"
>
Ändere Passwort
</string>
<string
name=
"title_rate_us"
>
Bewerten Sie uns
</string>
<string
name=
"title_admin_panel"
>
Admin
panel
</string>
<!-- TODO Add translation --
>
<string
name=
"title_admin_panel"
>
Admin
istrationsmenü
</string
>
<string
name=
"title_password"
>
Ändere Passwort
</string>
<string
name=
"title_update_profile"
>
Update Profil
</string>
<string
name=
"title_about"
>
Über
</string>
<string
name=
"title_create_channel"
>
Erstelle Raum
</string>
<string
name=
"title_are_you_sure"
>
Are you sure?
</string>
<!-- TODO Add translation --
>
<string
name=
"title_channel_details"
>
Channel
Details
</string>
<!-- TODO add translation --
>
<string
name=
"title_are_you_sure"
>
Bist du sicher?
</string
>
<string
name=
"title_channel_details"
>
Channel
-Details
</string
>
<string
name=
"title_topic"
>
Thema
</string>
<string
name=
"title_announcement"
>
Ankündigung
</string>
<string
name=
"title_description"
>
Beschreibung
</string>
<string
name=
"title_licence"
>
Li
cence
</string>
<!-- TODO Add translation --
>
<string
name=
"title_licence"
>
Li
zenz
</string
>
<!-- Actions -->
<string
name=
"action_connect"
>
Verbinde
</string>
...
...
@@ -40,7 +40,7 @@
<string
name=
"action_create_channel"
>
Erstelle Raum
</string>
<string
name=
"action_create"
>
Erstelle
</string>
<string
name=
"action_logout"
>
Abmelden
</string>
<string
name=
"action_attach_a_files"
>
Attach a file
</string>
<!-- TODO Add translation --
>
<string
name=
"action_attach_a_files"
>
Eine Datei anhängen
</string
>
<string
name=
"action_confirm_password"
>
Bestätige Passwort Änderung
</string>
<string
name=
"action_join_chat"
>
Trete Chat bei
</string>
<string
name=
"action_add_account"
>
Erstelle Account
</string>
...
...
@@ -50,25 +50,25 @@
<string
name=
"action_invisible"
>
Unsichtbar
</string>
<string
name=
"action_drawing"
>
Zeichnung
</string>
<string
name=
"action_save_to_gallery"
>
Sichern in Gallerie
</string>
<string
name=
"action_select_photo_from_gallery"
>
Select photo from gallery
</string>
<!-- TODO Add translation --
>
<string
name=
"action_take_a_photo"
>
Take a photo from galery
</string>
<!-- TODO Add translation --
>
<string
name=
"action_reset_avatar"
>
Reset avatar
</string>
<!-- TODO Add translation --
>
<string
name=
"action_connect_server"
>
Connect with a server
</string>
<!-- TODO Add translation --
>
<string
name=
"action_join_community"
>
Join in the community
</string>
<!-- TODO Add translation --
>
<string
name=
"action_create_server"
>
Create a new server
</string>
<!-- TODO Add translation --
>
<string
name=
"action_register"
>
Regist
er
</string>
<!-- TODO Add translation --
>
<string
name=
"action_confirm"
>
Confirm
</string>
<!-- TODO Add translation --
>
<string
name=
"action_delete_account"
>
Delete account
</string>
<!-- TODO Add translation --
>
<string
name=
"action_select_photo_from_gallery"
>
Foto aus der Galerie auswählen
</string
>
<string
name=
"action_take_a_photo"
>
Mach ein Foto
</string
>
<string
name=
"action_reset_avatar"
>
Avatar zurücksetzen
</string
>
<string
name=
"action_connect_server"
>
Verbinden Sie sich mit einem Server
</string
>
<string
name=
"action_join_community"
>
Trete der Community bei
</string
>
<string
name=
"action_create_server"
>
Erstellen Sie einen neuen Server
</string
>
<string
name=
"action_register"
>
Regist
rieren
</string
>
<string
name=
"action_confirm"
>
Bestätigen
</string
>
<string
name=
"action_delete_account"
>
Konto löschen
</string
>
<!-- Settings List -->
<string-array
name=
"settings_actions"
>
<item
name=
"item_preferences"
>
Preferences
</item>
<!-- TODO Add translation --
>
<item
name=
"item_password"
>
Change password
</item>
<!-- TODO Add translation --
>
<item
name=
"item_share_app"
>
Share app
</item>
<!-- TODO Add translation --
>
<item
name=
"item_rate_us"
>
Rate us
</item>
<!-- TODO Add translation --
>
<item
name=
"item_contact_us"
>
Contact us
</item>
<!-- TODO Add translation --
>
<item
name=
"item_licence"
>
Li
cence
</item>
<!-- TODO Add translation --
>
<item
name=
"item_about"
>
About
</item>
<!-- TODO Add translation --
>
<item
name=
"item_preferences"
>
Einstellungen
</item
>
<item
name=
"item_password"
>
Ändere das Passwort
</item
>
<item
name=
"item_share_app"
>
App teilen
</item
>
<item
name=
"item_rate_us"
>
Bewerten Sie uns
</item
>
<item
name=
"item_contact_us"
>
Kontaktiere uns
</item
>
<item
name=
"item_licence"
>
Li
zenz
</item
>
<item
name=
"item_about"
>
Über
</item
>
</string-array>
<!-- Regular information messages -->
...
...
@@ -80,8 +80,8 @@
<string
name=
"msg_username"
>
Benutzername
</string>
<string
name=
"msg_username_or_email"
>
Benutzername oder E-Mail
</string>
<string
name=
"msg_password"
>
Passwort
</string>
<string
name=
"msg_name"
>
Name
</string>
<!-- TODO Add translation -->
<string
name=
"msg_email"
>
EMail
</string>
<!-- TODO Add translation -->
<string
name=
"msg_name"
>
Name
</string>
<string
name=
"msg_email"
>
EMail
</string>
<string
name=
"msg_avatar_url"
>
Avatar URL
</string>
<string
name=
"msg_or_continue_using_social_accounts"
>
Oder weiter mit einem Social Account
</string>
<string
name=
"msg_new_user"
>
Neuer Benutzer? %1$s
</string>
...
...
@@ -106,11 +106,11 @@
<string
name=
"msg_content_description_log_in_using_gitlab"
>
Login mit Gitlab
</string>
<string
name=
"msg_content_description_log_in_using_wordpress"
>
Login mit WordPress
</string>
<string
name=
"msg_content_description_send_message"
>
Sende Nachricht
</string>
<string
name=
"msg_content_description_show_more_login_options"
>
Show more login options
</string>
<!-- TODO Translate-->
<string
name=
"msg_content_description_show_more_login_options"
>
Show more login options
</string>
<string
name=
"msg_content_description_show_attachment_options"
>
Zeige Anhang Optionen
</string>
<string
name=
"msg_you"
>
Du
</string>
<string
name=
"msg_unknown"
>
Unbekannt
</string>
<string
name=
"msg_email_address"
>
E-Mail Address
e
</string>
<string
name=
"msg_email_address"
>
E-Mail Address
</string>
<string
name=
"msg_utc_offset"
>
UTC Offset
</string>
<string
name=
"msg_new_password"
>
Neues Passwort eingeben
</string>
<string
name=
"msg_confirm_password"
>
Bestätige neues Passwort
</string>
...
...
@@ -145,27 +145,27 @@
<string
name=
"msg_file_description"
>
Datei Beschreibung
</string>
<string
name=
"msg_send"
>
Sende
</string>
<string
name=
"msg_sent_attachment"
>
Sende Anhang
</string>
<string
name=
"msg_welcome_to_rocket_chat"
>
W
elcome to Rocket.Chat
</string>
<!-- TODO Add translation --
>
<string
name=
"msg_team_communication"
>
Open Source Communication
</string>
<!-- TODO Add translation
-->
<string
name=
"msg_login_with_email"
>
Login with
<b>
e-mail
</b></string>
<!-- TODO Add translation --
>
<string
name=
"msg_create_account"
>
Create an account
</string>
<!-- TODO Add translation --
>
<string
name=
"msg_continue_with_facebook"
>
Continue with
<b>
Facebook
</b></string>
<!-- TODO Add translation --
>
<string
name=
"msg_continue_with_github"
>
Continue with
<b>
Github
</b></string>
<!-- TODO Add translation --
>
<string
name=
"msg_continue_with_google"
>
Continue with
<b>
Google
</b></string>
<!-- TODO Add translation --
>
<string
name=
"msg_continue_with_linkedin"
>
Continue with
<b>
Linkedin
</b></string>
<!-- TODO Add translation --
>
<string
name=
"msg_continue_with_gitlab"
>
Continue with
<b>
GitLab
</b></string>
<!-- TODO Add translation --
>
<string
name=
"msg_continue_with_wordpress"
>
Continue with
<b>
WordPress
</b></string>
<!-- TODO Add translation --
>
<string
name=
"msg_two_factor_authentication"
>
Two-factor Authentication
</string>
<!-- TODO Add translation --
>
<string
name=
"msg__your_2fa_code"
>
W
hat’s your 2FA code?
</string>
<!-- TODO Add translation --
>
<
!-- TODO - Add proper translation --
>
<string
name=
"msg_
muted_on_this_channel"
>
You are muted on this channel
</string>
<string
name=
"msg_no_
topic"
>
No topic added
</string>
<!-- TODO Add translation --
>
<string
name=
"msg_no_
announcement"
>
No announcement added
</string>
<!-- TODO Add translation --
>
<string
name=
"msg_
no_description"
>
No description added
</string>
<!-- TODO Add
translation -->
<!-- TODO - Add proper translation -->
<string
name=
"msg_welcome_to_rocket_chat"
>
W
illkommen bei Rocket.Chat
</string
>
<string
name=
"msg_team_communication"
>
Team Communication
</string>
<!-- TODO Translate
-->
<string
name=
"msg_login_with_email"
>
Einloggen mit
<b>
e-mail
</b></string
>
<string
name=
"msg_create_account"
>
Ein Konto erstellen
</string
>
<string
name=
"msg_continue_with_facebook"
>
Weitermachen mit
<b>
Facebook
</b></string
>
<string
name=
"msg_continue_with_github"
>
Weitermachen mit
<b>
Github
</b></string
>
<string
name=
"msg_continue_with_google"
>
Weitermachen mit
<b>
Google
</b></string
>
<string
name=
"msg_continue_with_linkedin"
>
Weitermachen mit
<b>
Linkedin
</b></string
>
<string
name=
"msg_continue_with_gitlab"
>
Weitermachen mit
<b>
GitLab
</b></string
>
<string
name=
"msg_continue_with_wordpress"
>
Weitermachen mit
<b>
WordPress
</b></string
>
<string
name=
"msg_two_factor_authentication"
>
Zwei-Faktor-Authentifizierung
</string
>
<string
name=
"msg__your_2fa_code"
>
W
ie lautet Ihr 2FA-Code?
</string
>
<
string
name=
"msg_muted_on_this_channel"
>
Sie sind auf diesem Kanal stummgeschaltet
</string
>
<string
name=
"msg_
no_topic"
>
Kein Thema hinzugefügt
</string>
<string
name=
"msg_no_
announcement"
>
Keine Ankündigung hinzugefügt
</string
>
<string
name=
"msg_no_
description"
>
Keine Beschreibung hinzugefügt
</string
>
<string
name=
"msg_
unable_to_update_password"
>
Unable to update password. Error message: %1$s
</string>
<!-- TODO - Add proper
translation -->
<
string
name=
"msg_password_updated_successfully"
>
Password updated successfully
</string>
<
!-- TODO - Add proper translation -->
<plurals
name=
"msg_reacted_with_"
>
<item
quantity=
"one"
>
%1$
s reacted with
%2$s
</item>
<item
quantity=
"other"
>
%1$s rea
cted with
%2$s
</item>
<item
quantity=
"one"
>
%1$
s reagierte mit
%2$s
</item>
<item
quantity=
"other"
>
%1$s rea
gierte mit
%2$s
</item>
</plurals>
<!-- Create channel messages -->
...
...
@@ -182,17 +182,17 @@
<string
name=
"msg_message_copied"
>
Nachricht kopiert
</string>
<string
name=
"msg_delete_message"
>
Lösche Nachricht
</string>
<string
name=
"msg_delete_description"
>
Sind Sie sicher, dass Sie diese Nachricht löschen wollen?
</string>
<string
name=
"msg_view_more"
>
view more
</string>
<!-- TODO - Add proper translation --
>
<string
name=
"msg_view_less"
>
view less
</string>
<!-- TODO - Add proper translation --
>
<string
name=
"msg_permalink_copied"
>
Permalink
copied
</string>
<!-- TODO - Add proper translation --
>
<string
name=
"msg_send_email"
>
Send email
</string>
<!-- TODO - Add proper translation --
>
<string
name=
"msg_android_app_support"
>
Android
app support
</string>
<!-- TODO - Add proper translation --
>
<string
name=
"msg_view_more"
>
mehr sehen
</string
>
<string
name=
"msg_view_less"
>
weniger anzeigen
</string
>
<string
name=
"msg_permalink_copied"
>
Permalink
kopiert
</string
>
<string
name=
"msg_send_email"
>
E-Mail senden
</string
>
<string
name=
"msg_android_app_support"
>
Android
App-Unterstützung
</string
>
<!-- Preferences messages -->
<string
name=
"msg_analytics_tracking"
>
Analytics tracking
</string>
<!-- TODO Add translation -->
<string
name=
"msg_send_analytics_tracking"
>
Send anonymous statics to help improving this app
</string>
<!-- TODO Add translation -->
<string
name=
"msg_do_not_send_analytics_tracking"
>
Do not send anonymous statics to help improving this app
</string>
<!-- TODO Add translation -->
<string
name=
"msg_not_applicable_since_it_is_a_foss_version"
>
Not applicable since it is a FOSS version
</string>
<!-- TODO Add translation -->
<string
name=
"msg_analytics_tracking"
>
Analytics tracking
</string>
<string
name=
"msg_send_analytics_tracking"
>
Send anonymous statics to help improving this app
</string>
<string
name=
"msg_do_not_send_analytics_tracking"
>
Do not send anonymous statics to help improving this app
</string>
<string
name=
"msg_not_applicable_since_it_is_a_foss_version"
>
Not applicable since it is a FOSS version
</string>
<!-- System messages -->
<string
name=
"message_room_name_changed"
>
Raum Namen geändert zu: %1$s von %2$s
</string>
...
...
@@ -223,10 +223,8 @@
<string
name=
"action_msg_share"
>
Teilen
</string>
<string
name=
"action_title_editing"
>
Nachricht bearbeiten
</string>
<string
name=
"action_msg_add_reaction"
>
Reaktion hinzufügen
</string>
<!-- TODO - Add proper translation -->
<string
name=
"action_msg_copy_permalink"
>
Copy permalink
</string>
<!-- TODO - Add proper translation -->
<string
name=
"action_msg_report"
>
Report
</string>
<string
name=
"action_msg_copy_permalink"
>
Permalink kopieren
</string>
<string
name=
"action_msg_report"
>
Bericht
</string>
<!-- Permission messages -->
<string
name=
"permission_editing_not_allowed"
>
Bearbeiten nicht erlaubt
</string>
...
...
@@ -308,13 +306,12 @@
<string
name=
"alert_title_default_skin_tone"
>
Standart Hautton
</string>
<!-- Sorting and grouping-->
<string
name=
"m
enu_chatroom
_sort"
>
Sortiere
</string>
<string
name=
"m
sg
_sort"
>
Sortiere
</string>
<string
name=
"dialog_sort_title"
>
Sortieren nach
</string>
<string
name=
"dialog_sort_by_alphabet"
>
Alphabetisch
</string>
<string
name=
"dialog_sort_by_activity"
>
Aktivität
</string>
<string
name=
"dialog_group_by_type"
>
Räume nach Typ
</string>
<string
name=
"dialog_group_favourites"
>
Räume nach Favoriten
</string>
<string
name=
"dialog_button_done"
>
Done
</string>
<!-- TODO Add translation -->
<string
name=
"chatroom_header"
>
Kopf
</string>
<!--ChatRooms Headers-->
...
...
@@ -331,16 +328,15 @@
<string
name=
"notif_success_sending"
>
Nachricht gesendet nach %1$s!
</string>
<string
name=
"read_by"
>
Gelesen von
</string>
<string
name=
"message_information_title"
>
Nachricht Information
</string>
<string
name=
"message_room_changed_privacy"
>
Room type changed to: %1$s by %2$s
</string>
<!--TODO - Add proper translation-->
<string
name=
"message_room_changed_privacy"
>
Room type changed to: %1$s by %2$s
</string>
<!-- User Details -->
<string
name=
"message"
>
Message
</string>
<!--TODO - Add proper translation--
>
<string
name=
"timezone"
>
Timezone
</string>
<!--TODO - Add proper translation--
>
<string
name=
"error_opening_dm"
>
Something went wrong while we were creating this conversation…
</string>
<!-- TODO - Add proper translation --
>
<string
name=
"retry"
>
Retry
</string>
<!-- TODO - Add proper translation --
>
<string
name=
"message"
>
Botschaft
</string
>
<string
name=
"timezone"
>
Zeitzone
</string
>
<string
name=
"error_opening_dm"
>
Etwas ist schiefgegangen, als wir dieses Gespräch erstellt haben…
</string
>
<string
name=
"retry"
>
Wiederholen
</string
>
<!-- Report -->
<string
name=
"submit"
>
Submit
</string>
<!--TODO - Add proper translation--
>
<string
name=
"required"
>
*
required
</string>
<!--TODO - Add proper translation--
>
<string
name=
"report_sent"
>
Your report has been sent!
</string>
<!--TODO - Add proper translation--
>
<string
name=
"submit"
>
einreichen
</string
>
<string
name=
"required"
>
*
erforderlich
</string
>
<string
name=
"report_sent"
>
Ihr Bericht wurde gesendet!
</string
>
</resources>
app/src/main/res/values-es/strings.xml
View file @
12db177e
...
...
@@ -146,7 +146,7 @@
<string
name=
"msg_delete_description"
>
Seguro que quieres borrar este mensaje
</string>
<string
name=
"msg_no_search_found"
>
No se han encontrado resultados
</string>
<string
name=
"msg_welcome_to_rocket_chat"
>
Welcome to Rocket.Chat
</string>
<!-- TODO Add translation -->
<string
name=
"msg_team_communication"
>
Open Source Communication
</string>
<!-- TODO Add translation
-->
<string
name=
"msg_team_communication"
>
Team Communication
</string>
<!-- TODO Translate
-->
<string
name=
"msg_login_with_email"
>
Login with
<b>
e-mail
</b></string>
<!-- TODO Add translation -->
<string
name=
"msg_create_account"
>
Create an account
</string>
<!-- TODO Add translation -->
<string
name=
"msg_continue_with_facebook"
>
Continue with
<b>
Facebook
</b></string>
<!-- TODO Add translation -->
...
...
@@ -178,7 +178,8 @@
<string
name=
"msg_no_topic"
>
No topic added
</string>
<!-- TODO Add translation -->
<string
name=
"msg_no_announcement"
>
No announcement added
</string>
<!-- TODO Add translation -->
<string
name=
"msg_no_description"
>
No description added
</string>
<!-- TODO Add translation -->
<string
name=
"msg_unable_to_update_password"
>
Unable to update password. Error message: %1$s
</string>
<!-- TODO - Add proper translation -->
<string
name=
"msg_password_updated_successfully"
>
Password updated successfully
</string>
<!-- TODO - Add proper translation -->
<plurals
name=
"msg_reacted_with_"
>
<item
quantity=
"one"
>
%1$s reacted with %2$s
</item>
<!-- TODO - Add proper translation -->
<item
quantity=
"other"
>
%1$s reacted with %2$s
</item>
<!-- TODO - Add proper translation -->
...
...
@@ -304,13 +305,12 @@
<string
name=
"alert_title_default_skin_tone"
>
Tono de piel predeterminado
</string>
<!-- Sorting and grouping-->
<string
name=
"m
enu_chatroom
_sort"
>
Ordenar
</string>
<string
name=
"m
sg
_sort"
>
Ordenar
</string>
<string
name=
"dialog_sort_title"
>
Ordenar por
</string>
<string
name=
"dialog_sort_by_alphabet"
>
Alfabético
</string>
<string
name=
"dialog_sort_by_activity"
>
Actividad
</string>
<string
name=
"dialog_group_by_type"
>
Agrupar por tipo
</string>
<string
name=
"dialog_group_favourites"
>
Agrupar favoritos
</string>
<string
name=
"dialog_button_done"
>
Done
</string>
<!-- TODO Add translation -->
<string
name=
"chatroom_header"
>
Cabezazo
</string>
<!--ChatRooms Headers-->
...
...
app/src/main/res/values-fr/strings.xml
View file @
12db177e
...
...
@@ -150,7 +150,7 @@
<string
name=
"msg_delete_message"
>
Supprimer Message
</string>
<string
name=
"msg_delete_description"
>
Êtes-vous sûr de vouloir supprimer ce message
</string>
<string
name=
"msg_welcome_to_rocket_chat"
>
Welcome to Rocket.Chat
</string>
<!-- TODO Add translation -->
<string
name=
"msg_team_communication"
>
Open Source Communication
</string>
<!-- TODO Add translation
-->
<string
name=
"msg_team_communication"
>
Team Communication
</string>
<!-- TODO Translate
-->
<string
name=
"msg_login_with_email"
>
Login with
<b>
e-mail
</b></string>
<!-- TODO Add translation -->
<string
name=
"msg_create_account"
>
Create an account
</string>
<!-- TODO Add translation -->
<string
name=
"msg_continue_with_facebook"
>
Continue with
<b>
Facebook
</b></string>
<!-- TODO Add translation -->
...
...
@@ -170,7 +170,8 @@
<string
name=
"msg_no_topic"
>
No topic added
</string>
<!-- TODO Add translation -->
<string
name=
"msg_no_announcement"
>
No announcement added
</string>
<!-- TODO Add translation -->
<string
name=
"msg_no_description"
>
No description added
</string>
<!-- TODO Add translation -->
<string
name=
"msg_unable_to_update_password"
>
Unable to update password. Error message: %1$s
</string>
<!-- TODO - Add proper translation -->
<string
name=
"msg_password_updated_successfully"
>
Password updated successfully
</string>
<!-- TODO - Add proper translation -->
<plurals
name=
"msg_reacted_with_"
>
<item
quantity=
"one"
>
%1$s reacted with %2$s
</item>
<!-- TODO - Add proper translation -->
<item
quantity=
"other"
>
%1$s reacted with %2$s
</item>
<!-- TODO - Add proper translation -->
...
...
@@ -309,13 +310,12 @@
<string
name=
"alert_title_default_skin_tone"
>
Tonalité de peau par défaut
</string>
<!-- Sorting and grouping-->
<string
name=
"m
enu_chatroom
_sort"
>
Trier
</string>
<string
name=
"m
sg
_sort"
>
Trier
</string>
<string
name=
"dialog_sort_title"
>
Trier par
</string>
<string
name=
"dialog_sort_by_alphabet"
>
Alphabétique
</string>
<string
name=
"dialog_sort_by_activity"
>
Activité
</string>
<string
name=
"dialog_group_by_type"
>
Grouper par type
</string>
<string
name=
"dialog_group_favourites"
>
Grouper favoris
</string>
<string
name=
"dialog_button_done"
>
Ok
</string>
<string
name=
"chatroom_header"
>
Entête
</string>
<!--ChatRooms Headers-->
...
...
app/src/main/res/values-hi-rIN/strings.xml
View file @
12db177e
...
...
@@ -152,7 +152,7 @@
<string
name=
"msg_delete_message"
>
संदेश को हटाएं
</string>
<string
name=
"msg_delete_description"
>
क्या आप निश्चित रूप से यह संदेश हटाना चाहते हैं
</string>
<string
name=
"msg_welcome_to_rocket_chat"
>
Rocket.Chat में आपका स्वागत है
</string>
<string
name=
"msg_team_communication"
>
ओपन सोर्स कम्युनिकेशन
</string
>
<string
name=
"msg_team_communication"
>
Team Communication
</string>
<!-- TODO Translate --
>
<string
name=
"msg_login_with_email"
>
ई-मेल के साथ लॉगिन करें
</string>
<string
name=
"msg_create_account"
>
खाता बनाएं
</string>
<string
name=
"msg_continue_with_facebook"
><b>
Facebook
</b>
के साथ जारी रखें
</string>
...
...
@@ -184,11 +184,12 @@
<string
name=
"msg_no_topic"
>
कोई विषय नहीं जोड़ा गया
</string>
<string
name=
"msg_no_announcement"
>
कोई घोषणा नहीं जोड़ा गया
</string>
<string
name=
"msg_no_description"
>
कोई विवरण नहीं जोड़ा गया
</string>
<string
name=
"msg_unable_to_update_password"
>
पासवर्ड अपडेट करने में असमर्थ। त्रुटि संदेश: %1$s
</string>
<string
name=
"msg_password_updated_successfully"
>
पासवर्ड सफलतापूर्वक अपडेट किया गया
</string>
<plurals
name=
"msg_reacted_with_"
>
<item
quantity=
"one"
>
%
1 $ s ने% 2 $ %d
s के साथ प्रतिक्रिया व्यक्त की
</item>
<item
quantity=
"few"
>
%
1 $ s ने% 2 $
s के साथ प्रतिक्रिया व्यक्त की
</item>
<item
quantity=
"many"
>
%
1 $ s ने% 2 $
s के साथ प्रतिक्रिया व्यक्त की
</item>
<item
quantity=
"one"
>
%
1$s ने %2$
s के साथ प्रतिक्रिया व्यक्त की
</item>
<item
quantity=
"few"
>
%
1$s ने %2$
s के साथ प्रतिक्रिया व्यक्त की
</item>
<item
quantity=
"many"
>
%
1$s ने %2$
s के साथ प्रतिक्रिया व्यक्त की
</item>
</plurals>
<!-- Preferences messages -->
...
...
@@ -227,8 +228,7 @@
<string
name=
"action_title_editing"
>
संपादन संदेश
</string>
<string
name=
"action_msg_add_reaction"
>
प्रतिक्रिया जोड़ें
</string>
<string
name=
"action_msg_copy_permalink"
>
परमालिंक कॉपी करें
</string>
<!-- TODO - Add proper translation -->
<string
name=
"action_msg_report"
>
Report
</string>
<string
name=
"action_msg_report"
>
रिपोर्ट
</string>
<!-- Permission messages -->
<string
name=
"permission_editing_not_allowed"
>
संपादन की अनुमति नहीं है
</string>
...
...
@@ -310,13 +310,12 @@
<string
name=
"alert_title_default_skin_tone"
>
डिफ़ॉल्ट त्वचा टोन
</string>
<!-- Sorting and grouping-->
<string
name=
"m
enu_chatroom
_sort"
>
क्रम
</string>
<string
name=
"m
sg
_sort"
>
क्रम
</string>
<string
name=
"dialog_sort_title"
>
द्वारा सॉर्ट करें
</string>
<string
name=
"dialog_sort_by_alphabet"
>
वर्णानुक्रम
</string>
<string
name=
"dialog_sort_by_activity"
>
गतिविधि
</string>
<string
name=
"dialog_group_by_type"
>
प्रकार के आधार पर समूह
</string>
<string
name=
"dialog_group_favourites"
>
पसंदीदा समूह
</string>
<string
name=
"dialog_button_done"
>
पूर्ण
</string>
<string
name=
"chatroom_header"
>
हैडर
</string>
<!--ChatRooms Headers-->
...
...
@@ -337,13 +336,13 @@
<string
name=
"message_room_changed_privacy"
>
%2$s ने रूम का प्रकार बदलकर %1$s किया
</string>
<!-- User Details -->
<string
name=
"message"
>
Message
</string>
<!-- TODO - Add proper translation --
>
<string
name=
"timezone"
>
Timezone
</string>
<!-- TODO - Add proper translation --
>
<string
name=
"error_opening_dm"
>
Something went wrong while we were creating this conversation…
</string>
<!-- TODO - Add proper translation --
>
<string
name=
"retry"
>
Retry
</string>
<!-- TODO - Add proper translation --
>
<string
name=
"message"
>
संदेश
</string
>
<string
name=
"timezone"
>
समय क्षेत्र
</string
>
<string
name=
"error_opening_dm"
>
जब हम इस बातचीत को बना रहे थे तो कुछ गड़बड़ हुई …
</string
>
<string
name=
"retry"
>
पुन: प्रयास करें
</string
>
<!-- Report -->
<string
name=
"submit"
>
Submit
</string>
<!-- TODO - Add proper translation --
>
<string
name=
"required"
>
*
required
</string>
<!-- TODO - Add proper translation --
>
<string
name=
"report_sent"
>
Your report has been sent
!
</string>
<string
name=
"submit"
>
जमा करें
</string
>
<string
name=
"required"
>
*
आवश्यक
</string
>
<string
name=
"report_sent"
>
आपकी रिपोर्ट भेज दी गई है
!
</string>
</resources>
app/src/main/res/values-it/strings.xml
View file @
12db177e
...
...
@@ -22,9 +22,9 @@
<string
name=
"title_update_profile"
>
Aggiorna Profilo
</string>
<string
name=
"title_about"
>
Informazioni
</string>
<string
name=
"title_create_channel"
>
Crea Canale
</string>
<string
name=
"title_licence"
>
Licence
</string>
<!-- TODO ADD translation --
>
<string
name=
"title_licence"
>
licenza
</string
>
<string
name=
"title_are_you_sure"
>
Sei sicuro che vuoi uscire ?
</string>
<string
name=
"title_channel_details"
>
Channel Details
</string>
<!-- TODO add translation --
>
<string
name=
"title_channel_details"
>
Allegare un file
</string
>
<string
name=
"title_topic"
>
Argomento
</string>
<string
name=
"title_announcement"
>
Annuncio
</string>
<string
name=
"title_description"
>
Descrizione
</string>
...
...
@@ -40,7 +40,7 @@
<string
name=
"action_create_channel"
>
Crea canale
</string>
<string
name=
"action_create"
>
Crea
</string>
<string
name=
"action_logout"
>
Disconnettersi
</string>
<string
name=
"action_attach_a_files"
>
Attach a file
</string>
<!-- TODO ADD translation --
>
<string
name=
"action_attach_a_files"
>
Ceangail comhad
</string
>
<string
name=
"action_confirm_password"
>
Conferma Cambio Password
</string>
<string
name=
"action_join_chat"
>
Iscriviti alla stanza
</string>
<string
name=
"action_add_account"
>
Aggiungi utente
</string>
...
...
@@ -51,7 +51,7 @@
<string
name=
"action_drawing"
>
Disegno
</string>
<string
name=
"action_save_to_gallery"
>
Salva in galleria
</string>
<string
name=
"action_select_photo_from_gallery"
>
Seleziona foto dalla galleria
</string>
<string
name=
"action_take_a_photo"
>
Take a photo
</string>
<!-- TODO ADD translation --
>
<string
name=
"action_take_a_photo"
>
Scatta una foto
</string
>
<string
name=
"action_reset_avatar"
>
Reimposta avatar
</string>
<string
name=
"action_connect_server"
>
Collegati a un server
</string>
<string
name=
"action_join_community"
>
Entra nella community
</string>
...
...
@@ -62,13 +62,13 @@
<!-- Settings List -->
<string-array
name=
"settings_actions"
>
<item
name=
"item_preferences"
>
Preferen
ces
</item>
<!-- TODO Add translation --
>
<item
name=
"item_password"
>
C
hange password
</item>
<!-- TODO Add translation --
>
<item
name=
"item_share_app"
>
Share app
</item>
<!-- TODO Add translation --
>
<item
name=
"item_rate_us"
>
Rate us
</item>
<!-- TODO Add translation --
>
<item
name=
"item_contact_us"
>
Conta
ct us
</item>
<!-- TODO Add translation --
>
<item
name=
"item_licence"
>
Licen
ce
</item>
<!-- TODO Add translation --
>
<item
name=
"item_about"
>
About
</item>
<!-- TODO Add translation --
>
<item
name=
"item_preferences"
>
Preferen
ze
</item
>
<item
name=
"item_password"
>
C
ambia password
</item
>
<item
name=
"item_share_app"
>
Condividi app
</item
>
<item
name=
"item_rate_us"
>
Votaci
</item
>
<item
name=
"item_contact_us"
>
Conta
ttaci
</item
>
<item
name=
"item_licence"
>
Licen
za
</item
>
<item
name=
"item_about"
>
Di
</item
>
</string-array>
<!-- Regular information messages -->
...
...
@@ -146,7 +146,7 @@
<string
name=
"msg_send"
>
Inviare
</string>
<string
name=
"msg_sent_attachment"
>
Inviato allegato
</string>
<string
name=
"msg_welcome_to_rocket_chat"
>
Benvenuto in Rocket.Chat
</string>
<string
name=
"msg_team_communication"
>
Team Communication
</string>
<string
name=
"msg_team_communication"
>
Team Communication
</string>
<!-- TODO Translate -->
<string
name=
"msg_login_with_email"
>
Accedi con
<b>
e-mail
</b></string>
<string
name=
"msg_create_account"
>
Crea un utente
</string>
<string
name=
"msg_continue_with_facebook"
>
Continua con
<b>
Facebook
</b></string>
...
...
@@ -158,12 +158,13 @@
<string
name=
"msg_two_factor_authentication"
>
Autenticazione a 2 fattori (2FA)
</string>
<string
name=
"msg__your_2fa_code"
>
Qual è il tuo codice 2FA ?
</string>
<string
name=
"msg_permalink_copied"
>
Permalink copiato
</string>
<string
name=
"msg_no_topic"
>
No topic added
</string>
<!-- TODO Add translation -->
<string
name=
"msg_no_announcement"
>
No announcement added
</string>
<!-- TODO Add translation -->
<string
name=
"msg_no_description"
>
No description added
</string>
<!-- TODO Add translation -->
<string
name=
"msg_send_email"
>
Send email
</string>
<string
name=
"msg_android_app_support"
>
Android app support
</string>
<string
name=
"msg_no_topic"
>
Nessun argomento aggiunto
</string>
<string
name=
"msg_no_announcement"
>
Nessun annuncio aggiunto
</string>
<string
name=
"msg_no_description"
>
Nessuna descrizione aggiunta
</string>
<string
name=
"msg_send_email"
>
Invia una email
</string>
<string
name=
"msg_android_app_support"
>
Supporto per le app Android
</string>
<string
name=
"msg_unable_to_update_password"
>
Unable to update password. Error message: %1$s
</string>
<!-- TODO - Add proper translation -->
<string
name=
"msg_password_updated_successfully"
>
Password updated successfully
</string>
<!-- TODO - Add proper translation -->
<plurals
name=
"msg_reacted_with_"
>
<item
quantity=
"one"
>
%1$s ha reagito con %2$s
</item>
<item
quantity=
"other"
>
%1$s ha reagito con %2$s
</item>
...
...
@@ -223,8 +224,7 @@
<string
name=
"action_title_editing"
>
Modifica messaggio
</string>
<string
name=
"action_msg_add_reaction"
>
Aggiungi reazione
</string>
<string
name=
"action_msg_copy_permalink"
>
Copia permalink
</string>
<!-- TODO - Add proper translation -->
<string
name=
"action_msg_report"
>
Report
</string>
<string
name=
"action_msg_report"
>
Resoconto
</string>
<!-- Permission messages -->
<string
name=
"permission_editing_not_allowed"
>
La modifica non è consentita
</string>
...
...
@@ -306,13 +306,12 @@
<string
name=
"alert_title_default_skin_tone"
>
Default skin tone
</string>
<!-- Sorting and grouping-->
<string
name=
"m
enu_chatroom
_sort"
>
Ordinare
</string>
<string
name=
"m
sg
_sort"
>
Ordinare
</string>
<string
name=
"dialog_sort_title"
>
Ordinare per
</string>
<string
name=
"dialog_sort_by_alphabet"
>
Alfabeto
</string>
<string
name=
"dialog_sort_by_activity"
>
Attività
</string>
<string
name=
"dialog_group_by_type"
>
Raggruppa per tipo
</string>
<string
name=
"dialog_group_favourites"
>
Raggruppa preferiti
</string>
<string
name=
"dialog_button_done"
>
Fatto
</string>
<string
name=
"chatroom_header"
>
Intestazione
</string>
<!--ChatRooms Headers-->
...
...
@@ -332,13 +331,13 @@
<string
name=
"message_room_changed_privacy"
>
Il tipo di stanza è cambiato in: %1$s da %2$s
</string>
<!-- User Details -->
<string
name=
"message"
>
Messag
e
</string>
<!-- TODO - Add proper translation --
>
<string
name=
"timezone"
>
Timezone
</string>
<!-- TODO - Add proper translation --
>
<string
name=
"error_opening_dm"
>
Something went wrong while we were creating this conversation…
</string>
<!-- TODO - Add proper translation --
>
<string
name=
"retry"
>
R
etry
</string>
<!-- TODO - Add proper translation --
>
<string
name=
"message"
>
Messag
gio
</string
>
<string
name=
"timezone"
>
Fuso Orario
</string
>
<string
name=
"error_opening_dm"
>
È successo qualcosa di sbagliato durante la creazione di questa conversazione...
</string
>
<string
name=
"retry"
>
R
iprova
</string
>
<!-- Report -->
<string
name=
"submit"
>
Submit
</string>
<!-- TODO - Add proper translation --
>
<string
name=
"required"
>
*
required
</string>
<!-- TODO - Add proper translation --
>
<string
name=
"report_sent"
>
Your report has been sent!
</string>
<!-- TODO - Add proper translation --
>
<string
name=
"submit"
>
Invia
</string
>
<string
name=
"required"
>
*
necessario
</string
>
<string
name=
"report_sent"
>
Il tuo resoconto è stato inviato!
</string
>
</resources>
app/src/main/res/values-ja/strings.xml
View file @
12db177e
...
...
@@ -151,7 +151,7 @@
<string
name=
"msg_send"
>
送信
</string>
<string
name=
"msg_sent_attachment"
>
添付ファイルを送信しました
</string>
<string
name=
"msg_welcome_to_rocket_chat"
>
Rocket.Chatへようこそ
</string>
<string
name=
"msg_team_communication"
>
チームコミュニケーション
</string
>
<string
name=
"msg_team_communication"
>
Team Communication
</string>
<!-- TODO Translate --
>
<string
name=
"msg_login_with_email"
><b>
e-mail
</b>
でログイン
</string>
<string
name=
"msg_create_account"
>
アカウントを作成
</string>
<string
name=
"msg_continue_with_facebook"
><b>
Facebook
</b>
でログイン
</string>
...
...
@@ -168,10 +168,11 @@
<string
name=
"msg_no_topic"
>
No topic added
</string>
<!-- TODO Add translation -->
<string
name=
"msg_no_announcement"
>
No announcement added
</string>
<!-- TODO Add translation -->
<string
name=
"msg_no_description"
>
No description added
</string>
<!-- TODO Add translation -->
<!-- TODO - Add proper translation -->
<string
name=
"msg_unable_to_update_password"
>
Unable to update password. Error message: %1$s
</string>
<!-- TODO - Add proper translation -->
<string
name=
"msg_password_updated_successfully"
>
Password updated successfully
</string>
<!-- TODO - Add proper translation -->
<plurals
name=
"msg_reacted_with_"
>
<item
quantity=
"one"
>
%1$s reacted with %2$s
</item>
<item
quantity=
"other"
>
%1$s reacted with %2$s
</item>
<item
quantity=
"one"
>
%1$s reacted with %2$s
</item>
<!-- TODO - Add proper translation -->
<item
quantity=
"other"
>
%1$s reacted with %2$s
</item>
<!-- TODO - Add proper translation -->
</plurals>
<!-- Create channel messages -->
...
...
@@ -311,14 +312,13 @@
<string
name=
"alert_title_default_skin_tone"
>
デフォルトスキントークン
</string>
<!-- Sorting and grouping-->
<string
name=
"m
enu_chatroom
_sort"
>
ソート
</string>
<string
name=
"m
sg
_sort"
>
ソート
</string>
<string
name=
"dialog_sort_title"
>
ソート
</string>
<string
name=
"dialog_sort_by_alphabet"
>
アルファベット順
</string>
<string
name=
"dialog_sort_by_activity"
>
アクティビティ順
</string>
<string
name=
"dialog_group_by_type"
>
グループ別
</string>
<string
name=
"dialog_group_favourites"
>
お気に入りのグループ
</string>
<string
name=
"chatroom_header"
>
ヘッダ
</string>
<string
name=
"dialog_button_done"
>
完了
</string>
<!--ChatRooms Headers-->
...
...
app/src/main/res/values-pt-rBR/strings.xml
View file @
12db177e
...
...
@@ -22,9 +22,9 @@
<string
name=
"title_update_profile"
>
Editar perfil
</string>
<string
name=
"title_about"
>
Sobre
</string>
<string
name=
"title_create_channel"
>
Criar chat
</string>
<string
name=
"title_licence"
>
Licença
</string>
<!-- TODO Add translation -->
<string
name=
"title_licence"
>
Licença
</string>
<string
name=
"title_are_you_sure"
>
Você tem certeza?
</string>
<string
name=
"title_channel_details"
>
Channel Details
</string>
<!-- TODO add translation --
>
<string
name=
"title_channel_details"
>
Detalhes do canal
</string
>
<string
name=
"title_topic"
>
Tópico
</string>
<string
name=
"title_announcement"
>
Anúncio
</string>
<string
name=
"title_description"
>
Descrição
</string>
...
...
@@ -150,27 +150,30 @@
<string
name=
"msg_send"
>
Enviar
</string>
<string
name=
"msg_delete_message"
>
Remove mensagem
</string>
<string
name=
"msg_delete_description"
>
Tem certeza que quer apagar esta mensagem?
</string>
<string
name=
"msg_welcome_to_rocket_chat"
>
Welcome to Rocket.Chat
</string>
<!-- TODO Add translation --
>
<string
name=
"msg_team_communication"
>
Open Source Communication
</string>
<!-- TODO Add translation --
>
<string
name=
"msg_login_with_email"
>
Login with
<b>
e-mail
</b></string>
<!-- TODO Add translation --
>
<string
name=
"msg_create_account"
>
Cr
eate an account
</string>
<!-- TODO Add translation --
>
<string
name=
"msg_continue_with_facebook"
>
Continu
e with
<b>
Facebook
</b></string>
<!-- TODO Add translation --
>
<string
name=
"msg_continue_with_github"
>
Continu
e with
<b>
Github
</b></string>
<!-- TODO Add translation --
>
<string
name=
"msg_continue_with_google"
>
Continu
e with
<b>
Google
</b></string>
<!-- TODO Add translation --
>
<string
name=
"msg_continue_with_linkedin"
>
Continu
e with
<b>
Linkedin
</b></string>
<!-- TODO Add translation --
>
<string
name=
"msg_continue_with_gitlab"
>
Continu
e with
<b>
GitLab
</b></string>
<!-- TODO Add translation --
>
<string
name=
"msg_continue_with_wordpress"
>
Continu
e with
<b>
WordPress
</b></string>
<!-- TODO Add translation --
>
<string
name=
"msg_two_factor_authentication"
>
Two-factor Authentication
</string>
<!-- TODO Add translation --
>
<string
name=
"msg__your_2fa_code"
>
What’s your 2FA code?
</string>
<!-- TODO Add translation --
>
<string
name=
"msg_welcome_to_rocket_chat"
>
Bem-vindo ao Rocket.Chat
</string
>
<string
name=
"msg_team_communication"
>
Comunicação para equipes
</string
>
<string
name=
"msg_login_with_email"
>
Fazer login com
<b>
e-mail
</b></string
>
<string
name=
"msg_create_account"
>
Cr
iar conta
</string
>
<string
name=
"msg_continue_with_facebook"
>
Continu
ar com
<b>
Facebook
</b></string
>
<string
name=
"msg_continue_with_github"
>
Continu
ar com
<b>
Github
</b></string
>
<string
name=
"msg_continue_with_google"
>
Continu
ar com
<b>
Google
</b></string
>
<string
name=
"msg_continue_with_linkedin"
>
Continu
ar com
<b>
Linkedin
</b></string
>
<string
name=
"msg_continue_with_gitlab"
>
Continu
ar com
<b>
GitLab
</b></string
>
<string
name=
"msg_continue_with_wordpress"
>
Continu
ar com
<b>
WordPress
</b></string
>
<string
name=
"msg_two_factor_authentication"
>
Autenticação de dois fatores
</string
>
<string
name=
"msg__your_2fa_code"
>
Qual é o seu código da autenticação de dois fatores?
</string
>
<string
name=
"msg_view_more"
>
visualizar mais
</string>
<string
name=
"msg_view_less"
>
visualizar menos
</string>
<string
name=
"msg_permalink_copied"
>
Permalink copiado
</string>
<string
name=
"msg_send_email"
>
Enviar e-mail
</string>
<string
name=
"msg_android_app_support"
>
Suporte ao aplicativo Android
</string>
<string
name=
"msg_muted_on_this_channel"
>
Você está silenciado neste canal
</string>
<string
name=
"msg_no_topic"
>
No topic added
</string>
<!-- TODO Add translation -->
<string
name=
"msg_no_announcement"
>
No announcement added
</string>
<!-- TODO Add translation -->
<string
name=
"msg_no_description"
>
No description added
</string>
<!-- TODO Add translation -->
<string
name=
"msg_no_topic"
>
Nenhum tópico adicionado
</string>
<string
name=
"msg_no_announcement"
>
Nenhum anúncio adicionado
</string>
<string
name=
"msg_no_description"
>
Nenhuma descrição adicionada
</string>
<string
name=
"msg_unable_to_update_password"
>
Não foi possível atualizar a senha. Mensagem de erro: %1$s
</string>
<string
name=
"msg_password_updated_successfully"
>
Senha alterada com sucesso
</string>
<string
name=
"msg_sort"
>
Ordenar
</string>
<plurals
name=
"msg_reacted_with_"
>
<item
quantity=
"one"
>
%1$s reagiu com %2$s
</item>
<item
quantity=
"other"
>
%1$s reagiram com %2$s
</item>
...
...
@@ -192,7 +195,7 @@
<string
name=
"msg_analytics_tracking"
>
Rastreamento de análises
</string>
<string
name=
"msg_send_analytics_tracking"
>
Envie estatísticas anônimas para ajudar a melhorar este app
</string>
<string
name=
"msg_do_not_send_analytics_tracking"
>
Não envie estatísticas anônimas para ajudar a melhorar este app
</string>
<string
name=
"msg_not_applicable_since_it_is_a_foss_version"
>
N
ot aplicável devido a versão do aplicativo ser FOSS
</string>
<!-- TODO Add translation --
>
<string
name=
"msg_not_applicable_since_it_is_a_foss_version"
>
N
ão aplicável devido a versão do aplicativo ser FOSS
</string
>
<!-- System messages -->
<string
name=
"message_room_name_changed"
>
Nome da sala alterado para: %1$s por %2$s
</string>
...
...
@@ -217,29 +220,28 @@
<string
name=
"action_msg_copy"
>
Copiar
</string>
<string
name=
"action_msg_quote"
>
Citar
</string>
<string
name=
"action_msg_delete"
>
Remover
</string>
<string
name=
"action_msg_pin"
>
Pin
ar mensagem
</string>
<string
name=
"action_msg_unpin"
>
Des
pin
ar mensagem
</string>
<string
name=
"action_msg_star"
>
Favoritar mensagem
</string>
<string
name=
"action_msg_unstar"
>
Des
favoritar messagem
</string>
<string
name=
"action_msg_pin"
>
Fix
ar mensagem
</string>
<string
name=
"action_msg_unpin"
>
Des
fix
ar mensagem
</string>
<string
name=
"action_msg_star"
>
Marcar como favorita
</string>
<string
name=
"action_msg_unstar"
>
Des
marcar como favorita
</string>
<string
name=
"action_msg_share"
>
Compartilhar
</string>
<string
name=
"action_title_editing"
>
Editando mensagem
</string>
<string
name=
"action_msg_add_reaction"
>
Adicionar reação
</string>
<string
name=
"action_msg_copy_permalink"
>
Copiar permalink
</string>
<!-- TODO - Add proper translation -->
<string
name=
"action_msg_report"
>
Reportar
</string>
<!-- Permission messages -->
<string
name=
"permission_editing_not_allowed"
>
Edição não permitida
</string>
<string
name=
"permission_deleting_not_allowed"
>
Remoção não permitida
</string>
<string
name=
"permission_pinning_not_allowed"
>
Pinagem não permitida
</string>
<string
name=
"permission_starring_not_allowed"
>
Favoritar
não permitido
</string>
<string
name=
"permission_starring_not_allowed"
>
Marcar como favorita
não permitido
</string>
<!-- Search message -->
<string
name=
"title_search_message"
>
Procurar mensagem
</string>
<!-- Favorite/Unfavorite chat room -->
<string
name=
"title_favorite_chat"
>
Favoritar canal
</string>
<string
name=
"title_unfavorite_chat"
>
Des
favoritar canal
</string>
<string
name=
"title_favorite_chat"
>
Marcar canal como favorito
</string>
<string
name=
"title_unfavorite_chat"
>
Des
marcar canal como favorito
</string>
<!-- Members List -->
<string
name=
"title_members_list"
>
Membros
</string>
...
...
@@ -308,13 +310,11 @@
<string
name=
"alert_title_default_skin_tone"
>
Tom de pele padrão
</string>
<!-- Sorting and grouping-->
<string
name=
"menu_chatroom_sort"
>
Ordenar
</string>
<string
name=
"dialog_sort_title"
>
Ordenar por
</string>
<string
name=
"dialog_sort_by_alphabet"
>
Alfabeticamente
</string>
<string
name=
"dialog_sort_by_activity"
>
Atividade
</string>
<string
name=
"dialog_group_by_type"
>
Agrupar por tipo
</string>
<string
name=
"dialog_group_favourites"
>
Grupos favoritos
</string>
<string
name=
"dialog_button_done"
>
Done
</string>
<!-- TODO Add translation -->
<string
name=
"chatroom_header"
>
Cabeçalho
</string>
<!--ChatRooms Headers-->
...
...
app/src/main/res/values-ru-rRU/strings.xml
View file @
12db177e
...
...
@@ -149,7 +149,7 @@
<string
name=
"msg_channel_name"
>
Название канала
</string>
<string
name=
"msg_search"
>
Поиск
</string>
<string
name=
"msg_welcome_to_rocket_chat"
>
Rocket.Chat
</string>
<string
name=
"msg_team_communication"
>
Чат с открытым исходным кодом
</string
>
<string
name=
"msg_team_communication"
>
Team Communication
</string>
<!-- TODO Translate --
>
<string
name=
"msg_login_with_email"
>
Войти с помощью
<b>
e-mail
</b></string>
<string
name=
"msg_create_account"
>
Создать аккаунт
</string>
<string
name=
"msg_continue_with_facebook"
>
Войти с помощью
<b>
Facebook
</b></string>
...
...
@@ -169,7 +169,8 @@
<string
name=
"msg_send_email"
>
Отправить e-mail
</string>
<string
name=
"msg_android_app_support"
>
Поддержка Android-приложения
</string>
<string
name=
"msg_muted_on_this_channel"
>
Вы лишены дара речи на этом канале
</string>
<string
name=
"msg_unable_to_update_password"
>
Невозможно обновить пароль. Ошибка: %1$s
</string>
<string
name=
"msg_password_updated_successfully"
>
Пароль успешно обновлен
</string>
<plurals
name=
"msg_reacted_with_"
>
<item
quantity=
"one"
>
%1$s реагирует с %2$s
</item>
<item
quantity=
"few"
>
%1$s реагируют с %2$s
</item>
...
...
@@ -189,7 +190,7 @@
<string
name=
"msg_channel_created_successfully"
>
Канал создан успешно
</string>
<!-- Preferences messages -->
<string
name=
"msg_analytics_tracking"
>
Отслеживание
Analytics
</string>
<string
name=
"msg_analytics_tracking"
>
Отслеживание
аналитики
</string>
<string
name=
"msg_send_analytics_tracking"
>
Отправлять анонимную статистику для улучшения приложения.
</string>
<string
name=
"msg_do_not_send_analytics_tracking"
>
Не отправлять анонимную статистику для улучшения приложения
</string>
<string
name=
"msg_not_applicable_since_it_is_a_foss_version"
>
Не применимо, так как это FOSS версия
</string>
...
...
@@ -224,8 +225,7 @@
<string
name=
"action_title_editing"
>
Редактирование сообщения
</string>
<string
name=
"action_msg_add_reaction"
>
Отреагировать
</string>
<string
name=
"action_msg_copy_permalink"
>
Копировать ссылку
</string>
<!-- TODO - Add proper translation -->
<string
name=
"action_msg_report"
>
Report
</string>
<string
name=
"action_msg_report"
>
Пожаловаться
</string>
<!-- Permission messages -->
<string
name=
"permission_editing_not_allowed"
>
Редактирование запрещено
</string>
...
...
@@ -307,13 +307,12 @@
<string
name=
"alert_title_default_skin_tone"
>
Тон кожи по умолчанию
</string>
<!-- Sorting and grouping-->
<string
name=
"m
enu_chatroom
_sort"
>
Сортировать
</string>
<string
name=
"m
sg
_sort"
>
Сортировать
</string>
<string
name=
"dialog_sort_title"
>
Сортировать по
</string>
<string
name=
"dialog_sort_by_alphabet"
>
По алфавиту
</string>
<string
name=
"dialog_sort_by_activity"
>
По активности
</string>
<string
name=
"dialog_group_by_type"
>
Группировать по типу
</string>
<string
name=
"dialog_group_favourites"
>
Группировать избранное
</string>
<string
name=
"dialog_button_done"
>
Ок
</string>
<string
name=
"chatroom_header"
>
Заголовок
</string>
<!--ChatRooms Headers-->
...
...
@@ -334,13 +333,13 @@
<string
name=
"message_room_changed_privacy"
>
Тип канала изменен на: %1$s пользователем %2$s
</string>
<!-- User Details -->
<string
name=
"message"
>
Message
</string>
<!--TODO - Add proper translation--
>
<string
name=
"timezone"
>
Timezone
</string>
<!--TODO - Add proper translation--
>
<string
name=
"error_opening_dm"
>
Something went wrong while we were creating this conversation…
</string>
<!-- TODO - Add proper translation --
>
<string
name=
"retry"
>
Retry
</string>
<!-- TODO - Add proper translation --
>
<string
name=
"message"
>
Сообщение
</string
>
<string
name=
"timezone"
>
Часовой поясe
</string
>
<string
name=
"error_opening_dm"
>
При создании этого диалога что-то пошло не так...
</string
>
<string
name=
"retry"
>
Повторить
</string
>
<!-- Report -->
<string
name=
"submit"
>
Submit
</string>
<!--TODO - Add proper translation--
>
<string
name=
"required"
>
*
required
</string>
<!--TODO - Add proper translation--
>
<string
name=
"report_sent"
>
Your report has been sent!
</string>
<!--TODO - Add proper translation--
>
<string
name=
"submit"
>
Отправить
</string
>
<string
name=
"required"
>
*
требуется
</string
>
<string
name=
"report_sent"
>
Ваша жалоба была отправлена!
</string
>
</resources>
app/src/main/res/values-tr/strings.xml
View file @
12db177e
...
...
@@ -150,7 +150,7 @@
<string
name=
"msg_send"
>
Gönder
</string>
<string
name=
"msg_sent_attachment"
>
Bir dosya eki gönderildi
</string>
<string
name=
"msg_welcome_to_rocket_chat"
>
Welcome to Rocket.Chat
</string>
<!-- TODO Add translation -->
<string
name=
"msg_team_communication"
>
Team Communication
</string>
<!-- TODO
Add translation
-->
<string
name=
"msg_team_communication"
>
Team Communication
</string>
<!-- TODO
Translate
-->
<string
name=
"msg_login_with_email"
>
Login with
<b>
e-mail
</b></string>
<!-- TODO Add translation -->
<string
name=
"msg_create_account"
>
Create an account
</string>
<!-- TODO Add translation -->
<string
name=
"msg_continue_with_facebook"
>
Continue with
<b>
Facebook
</b></string>
<!-- TODO Add translation -->
...
...
@@ -185,7 +185,8 @@
<string
name=
"msg_no_topic"
>
No topic added
</string>
<!-- TODO Add translation -->
<string
name=
"msg_no_announcement"
>
No announcement added
</string>
<!-- TODO Add translation -->
<string
name=
"msg_no_description"
>
No description added
</string>
<!-- TODO Add translation -->
<string
name=
"msg_unable_to_update_password"
>
Unable to update password. Error message: %1$s
</string>
<!-- TODO - Add proper translation -->
<string
name=
"msg_password_updated_successfully"
>
Password updated successfully
</string>
<!-- TODO - Add proper translation -->
<plurals
name=
"msg_reacted_with_"
>
<item
quantity=
"one"
>
%1$s reacted with %2$s
</item>
<!-- TODO - Add proper translation -->
<item
quantity=
"other"
>
%1$s reacted with %2$s
</item>
<!-- TODO - Add proper translation -->
...
...
@@ -311,13 +312,12 @@
<string
name=
"alert_title_default_skin_tone"
>
Varsayılan tasarım tonu
</string>
<!-- Sorting and grouping-->
<string
name=
"m
enu_chatroom
_sort"
>
Sırala
</string>
<string
name=
"m
sg
_sort"
>
Sırala
</string>
<string
name=
"dialog_sort_title"
>
Sırala
</string>
<string
name=
"dialog_sort_by_alphabet"
>
Alfabetik
</string>
<string
name=
"dialog_sort_by_activity"
>
Aktiviteye Göre
</string>
<string
name=
"dialog_group_by_type"
>
Türüne göre grupla
</string>
<string
name=
"dialog_group_favourites"
>
Favorileri grupla
</string>
<string
name=
"dialog_button_done"
>
Tamam
</string>
<string
name=
"chatroom_header"
>
Başlık
</string>
<!--ChatRooms Headers-->
...
...
app/src/main/res/values-uk/strings.xml
View file @
12db177e
...
...
@@ -168,7 +168,8 @@
<string
name=
"msg_no_topic"
>
No topic added
</string>
<!-- TODO Add translation -->
<string
name=
"msg_no_announcement"
>
No announcement added
</string>
<!-- TODO Add translation -->
<string
name=
"msg_no_description"
>
No description added
</string>
<!-- TODO Add translation -->
<string
name=
"msg_unable_to_update_password"
>
Unable to update password. Error message: %1$s
</string>
<!-- TODO - Add proper translation -->
<string
name=
"msg_password_updated_successfully"
>
Password updated successfully
</string>
<!-- TODO - Add proper translation -->
<plurals
name=
"msg_reacted_with_"
>
<item
quantity=
"one"
>
%1$s reacted with %2$s
</item>
<!-- TODO - Add proper translation -->
<item
quantity=
"few"
>
%1$s reacted with %2$s
</item>
<!-- TODO - Add proper translation -->
...
...
@@ -307,13 +308,12 @@
<string
name=
"alert_title_default_skin_tone"
>
Тон шкіри за замовчуванням
</string>
<!-- Sorting and grouping-->
<string
name=
"m
enu_chatroom
_sort"
>
Сортувати
</string>
<string
name=
"m
sg
_sort"
>
Сортувати
</string>
<string
name=
"dialog_sort_title"
>
Сортувати за
</string>
<string
name=
"dialog_sort_by_alphabet"
>
За алфавітом
</string>
<string
name=
"dialog_sort_by_activity"
>
За активністю
</string>
<string
name=
"dialog_group_by_type"
>
Групувати за типом
</string>
<string
name=
"dialog_group_favourites"
>
Групувати обране
</string>
<string
name=
"dialog_button_done"
>
Ок
</string>
<string
name=
"chatroom_header"
>
Заголовок
</string>
<!--ChatRooms Headers-->
...
...
app/src/main/res/values/strings.xml
View file @
12db177e
...
...
@@ -180,7 +180,8 @@ https://github.com/RocketChat/java-code-styles/blob/master/CODING_STYLE.md#strin
<string
name=
"msg_no_description"
>
No description added
</string>
<string
name=
"msg_send_email"
>
Send email
</string>
<string
name=
"msg_android_app_support"
>
Android app support
</string>
<string
name=
"msg_unable_to_update_password"
>
Unable to update password. Error message: %1$s
</string>
<string
name=
"msg_password_updated_successfully"
>
Password updated successfully
</string>
<plurals
name=
"msg_reacted_with_"
>
<item
quantity=
"one"
>
%1$s reacted with %2$s
</item>
<item
quantity=
"other"
>
%1$s reacted with %2$s
</item>
...
...
@@ -322,13 +323,12 @@ https://github.com/RocketChat/java-code-styles/blob/master/CODING_STYLE.md#strin
<string
name=
"alert_title_default_skin_tone"
>
Default skin tone
</string>
<!-- Sorting and grouping-->
<string
name=
"m
enu_chatroom
_sort"
>
Sort
</string>
<string
name=
"m
sg
_sort"
>
Sort
</string>
<string
name=
"dialog_sort_title"
>
Sort by
</string>
<string
name=
"dialog_sort_by_alphabet"
>
Alphabetical
</string>
<string
name=
"dialog_sort_by_activity"
>
Activity
</string>
<string
name=
"dialog_group_by_type"
>
Group by type
</string>
<string
name=
"dialog_group_favourites"
>
Group favourites
</string>
<string
name=
"dialog_button_done"
>
Done
</string>
<string
name=
"chatroom_header"
>
Header
</string>
<!--ChatRooms Headers-->
...
...
app/src/main/res/values/styles.xml
View file @
12db177e
<resources>
<!-- Base application theme. -->
<style
name=
"AppTheme"
parent=
"Theme.
AppCompat
.Light.NoActionBar"
>
<style
name=
"AppTheme"
parent=
"Theme.
MaterialComponents
.Light.NoActionBar"
>
<!-- Customize your theme here. -->
<item
name=
"colorPrimary"
>
@color/colorPrimary
</item>
<item
name=
"colorPrimaryDark"
>
@color/colorPrimaryDark
</item>
...
...
emoji/src/main/java/chat/rocket/android/emoji/EmojiKeyboardPopup.kt
View file @
12db177e
...
...
@@ -25,9 +25,7 @@ import kotlinx.android.synthetic.main.dialog_skin_tone_chooser.view.*
import
kotlinx.coroutines.experimental.android.UI
import
kotlinx.coroutines.experimental.launch
class
EmojiKeyboardPopup
(
context
:
Context
,
view
:
View
)
:
OverKeyboardPopupWindow
(
context
,
view
)
{
private
lateinit
var
viewPager
:
ViewPager
private
lateinit
var
tabLayout
:
TabLayout
private
lateinit
var
searchView
:
View
...
...
@@ -84,7 +82,7 @@ class EmojiKeyboardPopup(context: Context, view: View) : OverKeyboardPopupWindow
.
setCancelable
(
true
)
.
create
()
with
(
view
)
{
with
(
view
)
{
image_view_default_tone
.
setOnClickListener
{
dialog
.
dismiss
()
changeSkinTone
(
Fitzpatrick
.
Default
)
...
...
@@ -138,7 +136,10 @@ class EmojiKeyboardPopup(context: Context, view: View) : OverKeyboardPopupWindow
return
when
(
tone
)
{
Fitzpatrick
.
Default
->
ContextCompat
.
getColor
(
context
,
R
.
color
.
tone_default
)
Fitzpatrick
.
LightTone
->
ContextCompat
.
getColor
(
context
,
R
.
color
.
tone_light
)
Fitzpatrick
.
MediumLightTone
->
ContextCompat
.
getColor
(
context
,
R
.
color
.
tone_medium_light
)
Fitzpatrick
.
MediumLightTone
->
ContextCompat
.
getColor
(
context
,
R
.
color
.
tone_medium_light
)
Fitzpatrick
.
MediumTone
->
ContextCompat
.
getColor
(
context
,
R
.
color
.
tone_medium
)
Fitzpatrick
.
MediumDarkTone
->
ContextCompat
.
getColor
(
context
,
R
.
color
.
tone_medium_dark
)
Fitzpatrick
.
DarkTone
->
ContextCompat
.
getColor
(
context
,
R
.
color
.
tone_dark
)
...
...
@@ -151,7 +152,7 @@ class EmojiKeyboardPopup(context: Context, view: View) : OverKeyboardPopupWindow
is
EmojiKeyboardListener
->
it
else
->
{
val
fragments
=
(
it
as
AppCompatActivity
).
supportFragmentManager
.
fragments
if
(
fragments
.
size
==
0
||
!(
fragments
[
0
]
is
EmojiKeyboardListener
)
)
{
if
(
fragments
.
size
==
0
||
fragments
[
0
]
!
is
EmojiKeyboardListener
)
{
// Since the app can arrive in an inconsistent state at this point, do not throw
// throw IllegalStateException("activity/fragment should implement Listener interface")
null
...
...
@@ -190,7 +191,6 @@ class EmojiKeyboardPopup(context: Context, view: View) : OverKeyboardPopupWindow
}
class
EmojiTextWatcher
(
private
val
editor
:
EditText
)
:
TextWatcher
{
@Volatile
private
var
emojiToRemove
=
mutableListOf
<
EmojiTypefaceSpan
>()
...
...
emoji/src/main/java/chat/rocket/android/emoji/OverKeyboardPopupWindow.kt
View file @
12db177e
...
...
@@ -21,7 +21,6 @@ package chat.rocket.android.emoji
import
android.content.Context
import
android.graphics.Point
import
android.graphics.Rect
import
android.os.Build
import
android.view.Gravity
import
android.view.LayoutInflater
import
android.view.View
...
...
suggestions/src/main/java/chat/rocket/android/suggestions/ui/SuggestionsAdapter.kt
View file @
12db177e
...
...
@@ -29,6 +29,9 @@ abstract class SuggestionsAdapter<VH : BaseSuggestionViewHolder>(
notifyDataSetChanged
()
}
private
var
currentCount
=
0
;
private
var
currentItems
=
listOf
<
SuggestionModel
>()
init
{
setHasStableIds
(
true
)
}
...
...
@@ -41,10 +44,10 @@ abstract class SuggestionsAdapter<VH : BaseSuggestionViewHolder>(
holder
.
bind
(
getItem
(
position
),
itemClickListener
)
}
override
fun
getItemCount
()
=
strategy
.
autocompleteItems
(
currentTerm
).
size
override
fun
getItemCount
()
=
currentCount
private
fun
getItem
(
position
:
Int
):
SuggestionModel
{
return
strategy
.
autocompleteItems
(
currentTerm
)
[
position
]
return
currentItems
[
position
]
}
/**
...
...
@@ -58,12 +61,15 @@ abstract class SuggestionsAdapter<VH : BaseSuggestionViewHolder>(
fun
autocomplete
(
newTerm
:
String
)
{
this
.
currentTerm
=
newTerm
.
toLowerCase
().
trim
()
currentItems
=
strategy
.
autocompleteItems
(
currentTerm
)
currentCount
=
currentItems
.
size
}
fun
addItems
(
list
:
List
<
SuggestionModel
>)
{
strategy
.
addAll
(
list
)
// Since we've just added new items we should check for possible new completion suggestions.
strategy
.
autocompleteItems
(
currentTerm
)
//strategy.autocompleteItems(currentTerm)
autocomplete
(
currentTerm
)
notifyDataSetChanged
()
}
...
...
suggestions/src/main/java/chat/rocket/android/suggestions/ui/SuggestionsView.kt
View file @
12db177e
...
...
@@ -10,6 +10,7 @@ import android.text.TextWatcher
import
android.transition.Slide
import
android.transition.TransitionManager
import
android.util.AttributeSet
import
android.util.Log
import
android.view.Gravity
import
android.view.View
import
android.widget.EditText
...
...
@@ -24,6 +25,7 @@ import chat.rocket.android.suggestions.model.SuggestionModel
import
chat.rocket.android.suggestions.ui.SuggestionsAdapter.Companion.CONSTRAINT_BOUND_TO_START
import
java.lang.ref.WeakReference
import
java.util.concurrent.atomic.AtomicInteger
import
kotlin.system.measureTimeMillis
// This is a special index that means we're not at an autocompleting state.
private
const
val
NO_STATE_INDEX
=
0
...
...
@@ -101,22 +103,32 @@ class SuggestionsView : FrameLayout, TextWatcher {
return
}
if
(
completionOffset
.
get
()
==
NO_STATE_INDEX
)
{
return
}
measureTimeMillis
{
val
prefixEndIndex
=
this
.
editor
?.
get
()
?.
selectionStart
?:
NO_STATE_INDEX
if
(
prefixEndIndex
==
NO_STATE_INDEX
||
prefixEndIndex
<
completionOffset
.
get
())
return
val
prefix
=
s
.
subSequence
(
completionOffset
.
get
(),
this
.
editor
?.
get
()
?.
selectionStart
?:
completionOffset
.
get
()).
toString
()
recyclerView
.
adapter
?.
let
{
recyclerView
.
adapter
?.
also
{
it
as
SuggestionsAdapter
// we need to look up only after the '@'
it
.
autocomplete
(
prefix
)
measureTimeMillis
{
it
.
autocomplete
(
prefix
)
}.
let
{
time
->
Log
.
d
(
"SuggestionsView"
,
"autocomplete($prefix) in $time ms"
)
}
val
cacheMap
=
localProvidersByToken
[
it
.
token
]
if
(
cacheMap
!=
null
&&
cacheMap
[
prefix
]
!=
null
)
{
if
(
it
.
itemCount
==
0
)
{
it
.
addItems
(
cacheMap
[
prefix
]
!!
)
}
}
else
{
// fetch more suggestions from an external source if any
externalProvidersByToken
[
it
.
token
]
?.
invoke
(
prefix
)
}
}
}.
let
{
Log
.
d
(
"SuggestionsView"
,
"whole prefix in $it ms"
)
}
}
override
fun
onMeasure
(
widthMeasureSpec
:
Int
,
heightMeasureSpec
:
Int
)
{
...
...
util/src/main/java/chat/rocket/android/util/extension/Url.kt
0 → 100644
View file @
12db177e
package
chat.rocket.android.util.extension
/**
* This purely checks if an url link ends with a image format.
*/
fun
String
.
isImage
()
=
endsWith
(
".gif"
)
||
endsWith
(
".png"
)
||
endsWith
(
".jpg"
)
||
endsWith
(
"jpeg"
)
\ No newline at end of file
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