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
6d73aff8
Unverified
Commit
6d73aff8
authored
Apr 12, 2018
by
Filipe de Lima Brito
Committed by
GitHub
Apr 12, 2018
Browse files
Options
Browse Files
Download
Plain Diff
Merge branch 'develop-2.x' into project/sdk-changes
parents
d293407e
2e5639c0
Changes
24
Expand all
Hide whitespace changes
Inline
Side-by-side
Showing
24 changed files
with
569 additions
and
264 deletions
+569
-264
AndroidManifest.xml
app/src/main/AndroidManifest.xml
+3
-1
LoginFragment.kt
...t/rocket/android/authentication/login/ui/LoginFragment.kt
+146
-78
RegisterUsernameFragment.kt
...ntication/registerusername/ui/RegisterUsernameFragment.kt
+21
-11
ServerFragment.kt
...rocket/android/authentication/server/ui/ServerFragment.kt
+14
-6
SignupFragment.kt
...rocket/android/authentication/signup/ui/SignupFragment.kt
+41
-25
TwoFAFragment.kt
...cket/android/authentication/twofactor/ui/TwoFAFragment.kt
+21
-11
ChatRoomFragment.kt
.../java/chat/rocket/android/chatroom/ui/ChatRoomFragment.kt
+90
-59
PinnedMessagesFragment.kt
...chat/rocket/android/chatroom/ui/PinnedMessagesFragment.kt
+27
-5
ChatRoomsPresenter.kt
...cket/android/chatrooms/presentation/ChatRoomsPresenter.kt
+1
-0
ChatRoomsAdapter.kt
...java/chat/rocket/android/chatrooms/ui/ChatRoomsAdapter.kt
+0
-1
ChatRoomsFragment.kt
...ava/chat/rocket/android/chatrooms/ui/ChatRoomsFragment.kt
+45
-33
MembersNavigator.kt
...t/rocket/android/members/presentation/MembersNavigator.kt
+1
-1
MemberBottomSheetFragment.kt
...at/rocket/android/members/ui/MemberBottomSheetFragment.kt
+1
-1
MembersFragment.kt
...in/java/chat/rocket/android/members/ui/MembersFragment.kt
+19
-10
ConnectionManager.kt
...ocket/android/server/infraestructure/ConnectionManager.kt
+3
-2
PasswordFragment.kt
...t/rocket/android/settings/password/ui/PasswordFragment.kt
+26
-10
Fragment.kt
...main/java/chat/rocket/android/util/extensions/Fragment.kt
+28
-0
ic_pin_black_24dp.xml
app/src/main/res/drawable/ic_pin_black_24dp.xml
+15
-4
fragment_pinned_messages.xml
app/src/main/res/layout/fragment_pinned_messages.xml
+46
-0
item_chat.xml
app/src/main/res/layout/item_chat.xml
+6
-6
strings.xml
app/src/main/res/values-hi-rIN/strings.xml
+2
-0
strings.xml
app/src/main/res/values-pt-rBR/strings.xml
+2
-0
strings.xml
app/src/main/res/values/strings.xml
+2
-0
network_security_config.xml
app/src/main/res/xml/network_security_config.xml
+9
-0
No files found.
app/src/main/AndroidManifest.xml
View file @
6d73aff8
...
@@ -20,7 +20,9 @@
...
@@ -20,7 +20,9 @@
android:icon=
"@mipmap/ic_launcher"
android:icon=
"@mipmap/ic_launcher"
android:label=
"@string/app_name"
android:label=
"@string/app_name"
android:roundIcon=
"@mipmap/ic_launcher_round"
android:roundIcon=
"@mipmap/ic_launcher_round"
android:networkSecurityConfig=
"@xml/network_security_config"
>
android:supportsRtl="true">
android:supportsRtl="true">
<activity
<activity
android:name=
".authentication.ui.AuthenticationActivity"
android:name=
".authentication.ui.AuthenticationActivity"
android:configChanges=
"orientation"
android:configChanges=
"orientation"
...
@@ -109,4 +111,4 @@
...
@@ -109,4 +111,4 @@
android:theme=
"@style/AppTheme"
/>
android:theme=
"@style/AppTheme"
/>
</application>
</application>
</manifest>
</manifest>
\ No newline at end of file
app/src/main/java/chat/rocket/android/authentication/login/ui/LoginFragment.kt
View file @
6d73aff8
This diff is collapsed.
Click to expand it.
app/src/main/java/chat/rocket/android/authentication/registerusername/ui/RegisterUsernameFragment.kt
View file @
6d73aff8
...
@@ -59,26 +59,36 @@ class RegisterUsernameFragment : Fragment(), RegisterUsernameView {
...
@@ -59,26 +59,36 @@ class RegisterUsernameFragment : Fragment(), RegisterUsernameView {
}
}
override
fun
alertBlankUsername
()
{
override
fun
alertBlankUsername
()
{
vibrateSmartPhone
()
ui
{
text_username
.
shake
()
vibrateSmartPhone
()
text_username
.
shake
()
}
}
}
override
fun
showLoading
()
{
override
fun
showLoading
()
{
disableUserInput
()
ui
{
view_loading
.
setVisible
(
true
)
disableUserInput
()
view_loading
.
setVisible
(
true
)
}
}
}
override
fun
hideLoading
()
{
override
fun
hideLoading
()
{
view_loading
.
setVisible
(
false
)
ui
{
enableUserInput
()
view_loading
.
setVisible
(
false
)
enableUserInput
()
}
}
}
override
fun
showMessage
(
resId
:
Int
)
{
override
fun
showMessage
(
resId
:
Int
)
{
showToast
(
resId
)
ui
{
showToast
(
resId
)
}
}
}
override
fun
showMessage
(
message
:
String
)
{
override
fun
showMessage
(
message
:
String
)
{
showToast
(
message
)
ui
{
showToast
(
message
)
}
}
}
override
fun
showGenericErrorMessage
()
{
override
fun
showGenericErrorMessage
()
{
...
@@ -86,10 +96,10 @@ class RegisterUsernameFragment : Fragment(), RegisterUsernameView {
...
@@ -86,10 +96,10 @@ class RegisterUsernameFragment : Fragment(), RegisterUsernameView {
}
}
private
fun
tintEditTextDrawableStart
()
{
private
fun
tintEditTextDrawableStart
()
{
activity
?.
apply
{
ui
{
val
atDrawable
=
DrawableHelper
.
getDrawableFromId
(
R
.
drawable
.
ic_at_black_24dp
,
this
)
val
atDrawable
=
DrawableHelper
.
getDrawableFromId
(
R
.
drawable
.
ic_at_black_24dp
,
it
)
DrawableHelper
.
wrapDrawable
(
atDrawable
)
DrawableHelper
.
wrapDrawable
(
atDrawable
)
DrawableHelper
.
tintDrawable
(
atDrawable
,
this
,
R
.
color
.
colorDrawableTintGrey
)
DrawableHelper
.
tintDrawable
(
atDrawable
,
it
,
R
.
color
.
colorDrawableTintGrey
)
DrawableHelper
.
compoundDrawable
(
text_username
,
atDrawable
)
DrawableHelper
.
compoundDrawable
(
text_username
,
atDrawable
)
}
}
}
}
...
...
app/src/main/java/chat/rocket/android/authentication/server/ui/ServerFragment.kt
View file @
6d73aff8
...
@@ -47,21 +47,29 @@ class ServerFragment : Fragment(), ServerView {
...
@@ -47,21 +47,29 @@ class ServerFragment : Fragment(), ServerView {
override
fun
showInvalidServerUrlMessage
()
=
showMessage
(
getString
(
R
.
string
.
msg_invalid_server_url
))
override
fun
showInvalidServerUrlMessage
()
=
showMessage
(
getString
(
R
.
string
.
msg_invalid_server_url
))
override
fun
showLoading
()
{
override
fun
showLoading
()
{
enableUserInput
(
false
)
ui
{
view_loading
.
setVisible
(
true
)
enableUserInput
(
false
)
view_loading
.
setVisible
(
true
)
}
}
}
override
fun
hideLoading
()
{
override
fun
hideLoading
()
{
view_loading
.
setVisible
(
false
)
ui
{
enableUserInput
(
true
)
view_loading
.
setVisible
(
false
)
enableUserInput
(
true
)
}
}
}
override
fun
showMessage
(
resId
:
Int
){
override
fun
showMessage
(
resId
:
Int
){
showToast
(
resId
)
ui
{
showToast
(
resId
)
}
}
}
override
fun
showMessage
(
message
:
String
)
{
override
fun
showMessage
(
message
:
String
)
{
showToast
(
message
)
ui
{
showToast
(
message
)
}
}
}
override
fun
showGenericErrorMessage
()
{
override
fun
showGenericErrorMessage
()
{
...
...
app/src/main/java/chat/rocket/android/authentication/signup/ui/SignupFragment.kt
View file @
6d73aff8
...
@@ -25,7 +25,7 @@ class SignupFragment : Fragment(), SignupView {
...
@@ -25,7 +25,7 @@ class SignupFragment : Fragment(), SignupView {
}
else
{
}
else
{
bottom_container
.
apply
{
bottom_container
.
apply
{
postDelayed
({
postDelayed
({
setVisible
(
true
)
ui
{
setVisible
(
true
)
}
},
3
)
},
3
)
}
}
}
}
...
@@ -64,45 +64,61 @@ class SignupFragment : Fragment(), SignupView {
...
@@ -64,45 +64,61 @@ class SignupFragment : Fragment(), SignupView {
}
}
override
fun
alertBlankName
()
{
override
fun
alertBlankName
()
{
vibrateSmartPhone
()
ui
{
text_name
.
shake
()
vibrateSmartPhone
()
text_name
.
requestFocus
()
text_name
.
shake
()
text_name
.
requestFocus
()
}
}
}
override
fun
alertBlankUsername
()
{
override
fun
alertBlankUsername
()
{
vibrateSmartPhone
()
ui
{
text_username
.
shake
()
vibrateSmartPhone
()
text_username
.
requestFocus
()
text_username
.
shake
()
text_username
.
requestFocus
()
}
}
}
override
fun
alertEmptyPassword
()
{
override
fun
alertEmptyPassword
()
{
vibrateSmartPhone
()
ui
{
text_password
.
shake
()
vibrateSmartPhone
()
text_password
.
requestFocus
()
text_password
.
shake
()
text_password
.
requestFocus
()
}
}
}
override
fun
alertBlankEmail
()
{
override
fun
alertBlankEmail
()
{
vibrateSmartPhone
()
ui
{
text_email
.
shake
()
vibrateSmartPhone
()
text_email
.
requestFocus
()
text_email
.
shake
()
text_email
.
requestFocus
()
}
}
}
override
fun
showLoading
()
{
override
fun
showLoading
()
{
enableUserInput
(
false
)
ui
{
view_loading
.
setVisible
(
true
)
enableUserInput
(
false
)
view_loading
.
setVisible
(
true
)
}
}
}
override
fun
hideLoading
()
{
override
fun
hideLoading
()
{
view_loading
.
setVisible
(
false
)
ui
{
enableUserInput
(
true
)
view_loading
.
setVisible
(
false
)
enableUserInput
(
true
)
}
}
}
override
fun
showMessage
(
resId
:
Int
)
{
override
fun
showMessage
(
resId
:
Int
)
{
showToast
(
resId
)
ui
{
showToast
(
resId
)
}
}
}
override
fun
showMessage
(
message
:
String
)
{
override
fun
showMessage
(
message
:
String
)
{
showToast
(
message
)
ui
{
showToast
(
message
)
}
}
}
override
fun
showGenericErrorMessage
()
{
override
fun
showGenericErrorMessage
()
{
...
@@ -110,15 +126,15 @@ class SignupFragment : Fragment(), SignupView {
...
@@ -110,15 +126,15 @@ class SignupFragment : Fragment(), SignupView {
}
}
private
fun
tintEditTextDrawableStart
()
{
private
fun
tintEditTextDrawableStart
()
{
activity
?.
apply
{
ui
{
val
personDrawable
=
DrawableHelper
.
getDrawableFromId
(
R
.
drawable
.
ic_person_black_24dp
,
this
)
val
personDrawable
=
DrawableHelper
.
getDrawableFromId
(
R
.
drawable
.
ic_person_black_24dp
,
it
)
val
atDrawable
=
DrawableHelper
.
getDrawableFromId
(
R
.
drawable
.
ic_at_black_24dp
,
this
)
val
atDrawable
=
DrawableHelper
.
getDrawableFromId
(
R
.
drawable
.
ic_at_black_24dp
,
it
)
val
lockDrawable
=
DrawableHelper
.
getDrawableFromId
(
R
.
drawable
.
ic_lock_black_24dp
,
this
)
val
lockDrawable
=
DrawableHelper
.
getDrawableFromId
(
R
.
drawable
.
ic_lock_black_24dp
,
it
)
val
emailDrawable
=
DrawableHelper
.
getDrawableFromId
(
R
.
drawable
.
ic_email_black_24dp
,
this
)
val
emailDrawable
=
DrawableHelper
.
getDrawableFromId
(
R
.
drawable
.
ic_email_black_24dp
,
it
)
val
drawables
=
arrayOf
(
personDrawable
,
atDrawable
,
lockDrawable
,
emailDrawable
)
val
drawables
=
arrayOf
(
personDrawable
,
atDrawable
,
lockDrawable
,
emailDrawable
)
DrawableHelper
.
wrapDrawables
(
drawables
)
DrawableHelper
.
wrapDrawables
(
drawables
)
DrawableHelper
.
tintDrawables
(
drawables
,
this
,
R
.
color
.
colorDrawableTintGrey
)
DrawableHelper
.
tintDrawables
(
drawables
,
it
,
R
.
color
.
colorDrawableTintGrey
)
DrawableHelper
.
compoundDrawables
(
arrayOf
(
text_name
,
text_username
,
text_password
,
text_email
),
drawables
)
DrawableHelper
.
compoundDrawables
(
arrayOf
(
text_name
,
text_username
,
text_password
,
text_email
),
drawables
)
}
}
}
}
...
...
app/src/main/java/chat/rocket/android/authentication/twofactor/ui/TwoFAFragment.kt
View file @
6d73aff8
...
@@ -63,8 +63,10 @@ class TwoFAFragment : Fragment(), TwoFAView {
...
@@ -63,8 +63,10 @@ class TwoFAFragment : Fragment(), TwoFAView {
}
}
override
fun
alertBlankTwoFactorAuthenticationCode
()
{
override
fun
alertBlankTwoFactorAuthenticationCode
()
{
vibrateSmartPhone
()
ui
{
text_two_factor_auth
.
shake
()
vibrateSmartPhone
()
text_two_factor_auth
.
shake
()
}
}
}
override
fun
alertInvalidTwoFactorAuthenticationCode
()
{
override
fun
alertInvalidTwoFactorAuthenticationCode
()
{
...
@@ -72,30 +74,38 @@ class TwoFAFragment : Fragment(), TwoFAView {
...
@@ -72,30 +74,38 @@ class TwoFAFragment : Fragment(), TwoFAView {
}
}
override
fun
showLoading
()
{
override
fun
showLoading
()
{
enableUserInput
(
false
)
ui
{
view_loading
.
setVisible
(
true
)
enableUserInput
(
false
)
view_loading
.
setVisible
(
true
)
}
}
}
override
fun
hideLoading
()
{
override
fun
hideLoading
()
{
view_loading
.
setVisible
(
false
)
ui
{
enableUserInput
(
true
)
view_loading
.
setVisible
(
false
)
enableUserInput
(
true
)
}
}
}
override
fun
showMessage
(
resId
:
Int
)
{
override
fun
showMessage
(
resId
:
Int
)
{
showToast
(
resId
)
ui
{
showToast
(
resId
)
}
}
}
override
fun
showMessage
(
message
:
String
)
{
override
fun
showMessage
(
message
:
String
)
{
showToast
(
message
)
ui
{
showToast
(
message
)
}
}
}
override
fun
showGenericErrorMessage
()
=
showMessage
(
getString
(
R
.
string
.
msg_generic_error
))
override
fun
showGenericErrorMessage
()
=
showMessage
(
getString
(
R
.
string
.
msg_generic_error
))
private
fun
tintEditTextDrawableStart
()
{
private
fun
tintEditTextDrawableStart
()
{
activity
?.
apply
{
ui
{
val
lockDrawable
=
DrawableHelper
.
getDrawableFromId
(
R
.
drawable
.
ic_vpn_key_black_24dp
,
this
)
val
lockDrawable
=
DrawableHelper
.
getDrawableFromId
(
R
.
drawable
.
ic_vpn_key_black_24dp
,
it
)
DrawableHelper
.
wrapDrawable
(
lockDrawable
)
DrawableHelper
.
wrapDrawable
(
lockDrawable
)
DrawableHelper
.
tintDrawable
(
lockDrawable
,
this
,
R
.
color
.
colorDrawableTintGrey
)
DrawableHelper
.
tintDrawable
(
lockDrawable
,
it
,
R
.
color
.
colorDrawableTintGrey
)
DrawableHelper
.
compoundDrawable
(
text_two_factor_auth
,
lockDrawable
)
DrawableHelper
.
compoundDrawable
(
text_two_factor_auth
,
lockDrawable
)
}
}
}
}
...
...
app/src/main/java/chat/rocket/android/chatroom/ui/ChatRoomFragment.kt
View file @
6d73aff8
...
@@ -18,6 +18,7 @@ import android.support.v7.widget.DefaultItemAnimator
...
@@ -18,6 +18,7 @@ import android.support.v7.widget.DefaultItemAnimator
import
android.support.v7.widget.LinearLayoutManager
import
android.support.v7.widget.LinearLayoutManager
import
android.support.v7.widget.RecyclerView
import
android.support.v7.widget.RecyclerView
import
android.view.*
import
android.view.*
import
androidx.core.content.systemService
import
chat.rocket.android.R
import
chat.rocket.android.R
import
chat.rocket.android.chatroom.adapter.*
import
chat.rocket.android.chatroom.adapter.*
import
chat.rocket.android.chatroom.presentation.ChatRoomPresenter
import
chat.rocket.android.chatroom.presentation.ChatRoomPresenter
...
@@ -182,28 +183,28 @@ class ChatRoomFragment : Fragment(), ChatRoomView, EmojiKeyboardListener, EmojiR
...
@@ -182,28 +183,28 @@ class ChatRoomFragment : Fragment(), ChatRoomView, EmojiKeyboardListener, EmojiR
}
}
override
fun
showMessages
(
dataSet
:
List
<
BaseViewModel
<*
>>)
{
override
fun
showMessages
(
dataSet
:
List
<
BaseViewModel
<*
>>)
{
// track the message sent immediately after the current message
ui
{
var
prevMessageViewModel
:
MessageViewModel
?
=
null
// track the message sent immediately after the current message
var
prevMessageViewModel
:
MessageViewModel
?
=
null
// Loop over received messages to determine first unread
for
(
i
in
dataSet
.
indices
)
{
// Loop over received messages to determine first unread
val
msgModel
=
dataSet
[
i
]
for
(
i
in
dataSet
.
indices
)
{
val
msgModel
=
dataSet
[
i
]
if
(
msgModel
is
MessageViewModel
)
{
val
msg
=
msgModel
.
rawData
if
(
msgModel
is
MessageViewModel
)
{
if
(
msg
.
timestamp
<
chatRoomLastSeen
)
{
val
msg
=
msgModel
.
rawData
// This message was sent before the last seen of the room. Hence, it was seen.
if
(
msg
.
timestamp
<
chatRoomLastSeen
)
{
// if there is a message after (below) this, mark it firstUnread.
// This message was sent before the last seen of the room. Hence, it was seen.
if
(
prevMessageViewModel
!=
null
)
{
// if there is a message after (below) this, mark it firstUnread.
prevMessageViewModel
.
isFirstUnread
=
true
if
(
prevMessageViewModel
!=
null
)
{
prevMessageViewModel
.
isFirstUnread
=
true
}
break
}
}
break
prevMessageViewModel
=
msgModel
}
}
prevMessageViewModel
=
msgModel
}
}
}
activity
?.
apply
{
if
(
recycler_view
.
adapter
==
null
)
{
if
(
recycler_view
.
adapter
==
null
)
{
adapter
=
ChatRoomAdapter
(
chatRoomType
,
chatRoomName
,
presenter
,
adapter
=
ChatRoomAdapter
(
chatRoomType
,
chatRoomName
,
presenter
,
reactionListener
=
this
@ChatRoomFragment
)
reactionListener
=
this
@ChatRoomFragment
)
...
@@ -281,11 +282,13 @@ class ChatRoomFragment : Fragment(), ChatRoomView, EmojiKeyboardListener, EmojiR
...
@@ -281,11 +282,13 @@ class ChatRoomFragment : Fragment(), ChatRoomView, EmojiKeyboardListener, EmojiR
}
}
override
fun
sendMessage
(
text
:
String
)
{
override
fun
sendMessage
(
text
:
String
)
{
if
(!
text
.
isBlank
())
{
ui
{
if
(!
text
.
startsWith
(
"/"
))
{
if
(!
text
.
isBlank
())
{
presenter
.
sendMessage
(
chatRoomId
,
text
,
editingMessageId
)
if
(!
text
.
startsWith
(
"/"
))
{
}
else
{
presenter
.
sendMessage
(
chatRoomId
,
text
,
editingMessageId
)
presenter
.
runCommand
(
text
,
chatRoomId
)
}
else
{
presenter
.
runCommand
(
text
,
chatRoomId
)
}
}
}
}
}
}
}
...
@@ -300,43 +303,55 @@ class ChatRoomFragment : Fragment(), ChatRoomView, EmojiKeyboardListener, EmojiR
...
@@ -300,43 +303,55 @@ class ChatRoomFragment : Fragment(), ChatRoomView, EmojiKeyboardListener, EmojiR
}
}
override
fun
showNewMessage
(
message
:
List
<
BaseViewModel
<*
>>)
{
override
fun
showNewMessage
(
message
:
List
<
BaseViewModel
<*
>>)
{
adapter
.
prependData
(
message
)
ui
{
recycler_view
.
scrollToPosition
(
0
)
adapter
.
prependData
(
message
)
verticalScrollOffset
.
set
(
0
)
recycler_view
.
scrollToPosition
(
0
)
verticalScrollOffset
.
set
(
0
)
}
}
}
override
fun
disableSendMessageButton
()
{
override
fun
disableSendMessageButton
()
{
button_send
.
isEnabled
=
false
ui
{
button_send
.
isEnabled
=
false
}
}
}
override
fun
enableSendMessageButton
(
sendFailed
:
Boolean
)
{
override
fun
enableSendMessageButton
(
sendFailed
:
Boolean
)
{
button_send
.
isEnabled
=
true
ui
{
text_message
.
isEnabled
=
true
button_send
.
isEnabled
=
true
if
(!
sendFailed
)
{
text_message
.
isEnabled
=
true
clearMessageComposition
()
if
(!
sendFailed
)
{
clearMessageComposition
()
}
}
}
}
}
override
fun
clearMessageComposition
()
{
override
fun
clearMessageComposition
()
{
citation
=
null
ui
{
editingMessageId
=
null
citation
=
null
text_message
.
textContent
=
""
editingMessageId
=
null
actionSnackbar
.
dismiss
()
text_message
.
textContent
=
""
actionSnackbar
.
dismiss
()
}
}
}
override
fun
dispatchUpdateMessage
(
index
:
Int
,
message
:
List
<
BaseViewModel
<*
>>)
{
override
fun
dispatchUpdateMessage
(
index
:
Int
,
message
:
List
<
BaseViewModel
<*
>>)
{
adapter
.
updateItem
(
message
.
last
())
ui
{
if
(
message
.
size
>
1
)
{
adapter
.
updateItem
(
message
.
last
())
adapter
.
prependData
(
listOf
(
message
.
first
()))
if
(
message
.
size
>
1
)
{
adapter
.
prependData
(
listOf
(
message
.
first
()))
}
}
}
}
}
override
fun
dispatchDeleteMessage
(
msgId
:
String
)
{
override
fun
dispatchDeleteMessage
(
msgId
:
String
)
{
adapter
.
removeItem
(
msgId
)
ui
{
adapter
.
removeItem
(
msgId
)
}
}
}
override
fun
showReplyingAction
(
username
:
String
,
replyMarkdown
:
String
,
quotedMessage
:
String
)
{
override
fun
showReplyingAction
(
username
:
String
,
replyMarkdown
:
String
,
quotedMessage
:
String
)
{
activity
?.
apply
{
ui
{
citation
=
replyMarkdown
citation
=
replyMarkdown
actionSnackbar
.
title
=
username
actionSnackbar
.
title
=
username
actionSnackbar
.
text
=
quotedMessage
actionSnackbar
.
text
=
quotedMessage
...
@@ -351,41 +366,55 @@ class ChatRoomFragment : Fragment(), ChatRoomView, EmojiKeyboardListener, EmojiR
...
@@ -351,41 +366,55 @@ class ChatRoomFragment : Fragment(), ChatRoomView, EmojiKeyboardListener, EmojiR
}
}
}
}
override
fun
showLoading
()
=
view_loading
.
setVisible
(
true
)
override
fun
showLoading
()
{
ui
{
view_loading
.
setVisible
(
true
)
}
}
override
fun
hideLoading
()
=
view_loading
.
setVisible
(
false
)
override
fun
hideLoading
()
{
ui
{
view_loading
.
setVisible
(
false
)
}
}
override
fun
showMessage
(
message
:
String
)
{
override
fun
showMessage
(
message
:
String
)
{
showToast
(
message
)
ui
{
showToast
(
message
)
}
}
}
override
fun
showMessage
(
resId
:
Int
)
{
override
fun
showMessage
(
resId
:
Int
)
{
showToast
(
resId
)
ui
{
showToast
(
resId
)
}
}
}
override
fun
showGenericErrorMessage
()
=
showMessage
(
getString
(
R
.
string
.
msg_generic_error
))
override
fun
showGenericErrorMessage
()
=
showMessage
(
getString
(
R
.
string
.
msg_generic_error
))
override
fun
populatePeopleSuggestions
(
members
:
List
<
PeopleSuggestionViewModel
>)
{
override
fun
populatePeopleSuggestions
(
members
:
List
<
PeopleSuggestionViewModel
>)
{
suggestions_view
.
addItems
(
"@"
,
members
)
ui
{
suggestions_view
.
addItems
(
"@"
,
members
)
}
}
}
override
fun
populateRoomSuggestions
(
chatRooms
:
List
<
ChatRoomSuggestionViewModel
>)
{
override
fun
populateRoomSuggestions
(
chatRooms
:
List
<
ChatRoomSuggestionViewModel
>)
{
suggestions_view
.
addItems
(
"#"
,
chatRooms
)
ui
{
suggestions_view
.
addItems
(
"#"
,
chatRooms
)
}
}
}
override
fun
populateCommandSuggestions
(
commands
:
List
<
CommandSuggestionViewModel
>)
{
override
fun
populateCommandSuggestions
(
commands
:
List
<
CommandSuggestionViewModel
>)
{
suggestions_view
.
addItems
(
"/"
,
commands
)
ui
{
suggestions_view
.
addItems
(
"/"
,
commands
)
}
}
}
override
fun
copyToClipboard
(
message
:
String
)
{
override
fun
copyToClipboard
(
message
:
String
)
{
activity
?.
apply
{
ui
{
val
clipboard
=
getSystemService
(
Context
.
CLIPBOARD_SERVICE
)
as
ClipboardManager
val
clipboard
:
ClipboardManager
=
it
.
systemService
()
clipboard
.
primaryClip
=
ClipData
.
newPlainText
(
""
,
message
)
clipboard
.
primaryClip
=
ClipData
.
newPlainText
(
""
,
message
)
}
}
}
}
override
fun
showEditingAction
(
roomId
:
String
,
messageId
:
String
,
text
:
String
)
{
override
fun
showEditingAction
(
roomId
:
String
,
messageId
:
String
,
text
:
String
)
{
activity
?.
apply
{
ui
{
actionSnackbar
.
title
=
getString
(
R
.
string
.
action_title_editing
)
actionSnackbar
.
title
=
getString
(
R
.
string
.
action_title_editing
)
actionSnackbar
.
text
=
text
actionSnackbar
.
text
=
text
actionSnackbar
.
show
()
actionSnackbar
.
show
()
...
@@ -421,7 +450,7 @@ class ChatRoomFragment : Fragment(), ChatRoomView, EmojiKeyboardListener, EmojiR
...
@@ -421,7 +450,7 @@ class ChatRoomFragment : Fragment(), ChatRoomView, EmojiKeyboardListener, EmojiR
}
}
override
fun
showReactionsPopup
(
messageId
:
String
)
{
override
fun
showReactionsPopup
(
messageId
:
String
)
{
context
?.
let
{
ui
{
val
emojiPickerPopup
=
EmojiPickerPopup
(
it
)
val
emojiPickerPopup
=
EmojiPickerPopup
(
it
)
emojiPickerPopup
.
listener
=
object
:
EmojiListenerAdapter
()
{
emojiPickerPopup
.
listener
=
object
:
EmojiListenerAdapter
()
{
override
fun
onEmojiAdded
(
emoji
:
Emoji
)
{
override
fun
onEmojiAdded
(
emoji
:
Emoji
)
{
...
@@ -434,11 +463,11 @@ class ChatRoomFragment : Fragment(), ChatRoomView, EmojiKeyboardListener, EmojiR
...
@@ -434,11 +463,11 @@ class ChatRoomFragment : Fragment(), ChatRoomView, EmojiKeyboardListener, EmojiR
private
fun
setReactionButtonIcon
(
@DrawableRes
drawableId
:
Int
)
{
private
fun
setReactionButtonIcon
(
@DrawableRes
drawableId
:
Int
)
{
button_add_reaction
.
setImageResource
(
drawableId
)
button_add_reaction
.
setImageResource
(
drawableId
)
button_add_reaction
.
setTag
(
drawableId
)
button_add_reaction
.
tag
=
drawableId
}
}
override
fun
showFileSelection
(
filter
:
Array
<
String
>)
{
override
fun
showFileSelection
(
filter
:
Array
<
String
>)
{
activity
?.
let
{
ui
{
if
(
ContextCompat
.
checkSelfPermission
(
it
,
Manifest
.
permission
.
READ_EXTERNAL_STORAGE
)
if
(
ContextCompat
.
checkSelfPermission
(
it
,
Manifest
.
permission
.
READ_EXTERNAL_STORAGE
)
!=
PackageManager
.
PERMISSION_GRANTED
)
{
!=
PackageManager
.
PERMISSION_GRANTED
)
{
ActivityCompat
.
requestPermissions
(
it
,
ActivityCompat
.
requestPermissions
(
it
,
...
@@ -458,7 +487,7 @@ class ChatRoomFragment : Fragment(), ChatRoomView, EmojiKeyboardListener, EmojiR
...
@@ -458,7 +487,7 @@ class ChatRoomFragment : Fragment(), ChatRoomView, EmojiKeyboardListener, EmojiR
1
->
{
1
->
{
if
(!(
grantResults
.
isNotEmpty
()
&&
grantResults
.
first
()
==
PackageManager
.
PERMISSION_GRANTED
))
{
if
(!(
grantResults
.
isNotEmpty
()
&&
grantResults
.
first
()
==
PackageManager
.
PERMISSION_GRANTED
))
{
handler
.
postDelayed
({
handler
.
postDelayed
({
hideAttachmentOptions
()
ui
{
hideAttachmentOptions
()
}
},
400
)
},
400
)
}
}
}
}
...
@@ -470,7 +499,7 @@ class ChatRoomFragment : Fragment(), ChatRoomView, EmojiKeyboardListener, EmojiR
...
@@ -470,7 +499,7 @@ class ChatRoomFragment : Fragment(), ChatRoomView, EmojiKeyboardListener, EmojiR
}
}
override
fun
showConnectionState
(
state
:
State
)
{
override
fun
showConnectionState
(
state
:
State
)
{
activity
?.
apply
{
ui
{
connection_status_text
.
fadeIn
()
connection_status_text
.
fadeIn
()
handler
.
removeCallbacks
(
dismissStatus
)
handler
.
removeCallbacks
(
dismissStatus
)
when
(
state
)
{
when
(
state
)
{
...
@@ -488,10 +517,12 @@ class ChatRoomFragment : Fragment(), ChatRoomView, EmojiKeyboardListener, EmojiR
...
@@ -488,10 +517,12 @@ class ChatRoomFragment : Fragment(), ChatRoomView, EmojiKeyboardListener, EmojiR
}
}
override
fun
onJoined
()
{
override
fun
onJoined
()
{
input_container
.
setVisible
(
true
)
ui
{
button_join_chat
.
setVisible
(
false
)
input_container
.
setVisible
(
true
)
isSubscribed
=
true
button_join_chat
.
setVisible
(
false
)
setupMessageComposer
()
isSubscribed
=
true
setupMessageComposer
()
}
}
}
private
val
dismissStatus
=
{
private
val
dismissStatus
=
{
...
...
app/src/main/java/chat/rocket/android/chatroom/ui/PinnedMessagesFragment.kt
View file @
6d73aff8
...
@@ -16,6 +16,7 @@ import chat.rocket.android.chatroom.viewmodel.BaseViewModel
...
@@ -16,6 +16,7 @@ import chat.rocket.android.chatroom.viewmodel.BaseViewModel
import
chat.rocket.android.helper.EndlessRecyclerViewScrollListener
import
chat.rocket.android.helper.EndlessRecyclerViewScrollListener
import
chat.rocket.android.util.extensions.setVisible
import
chat.rocket.android.util.extensions.setVisible
import
chat.rocket.android.util.extensions.showToast
import
chat.rocket.android.util.extensions.showToast
import
chat.rocket.android.util.extensions.ui
import
dagger.android.support.AndroidSupportInjection
import
dagger.android.support.AndroidSupportInjection
import
kotlinx.android.synthetic.main.fragment_pinned_messages.*
import
kotlinx.android.synthetic.main.fragment_pinned_messages.*
import
javax.inject.Inject
import
javax.inject.Inject
...
@@ -62,22 +63,30 @@ class PinnedMessagesFragment : Fragment(), PinnedMessagesView {
...
@@ -62,22 +63,30 @@ class PinnedMessagesFragment : Fragment(), PinnedMessagesView {
presenter
.
loadPinnedMessages
(
chatRoomId
)
presenter
.
loadPinnedMessages
(
chatRoomId
)
}
}
override
fun
showLoading
()
=
view_loading
.
setVisible
(
true
)
override
fun
showLoading
()
{
ui
{
view_loading
.
setVisible
(
true
)
}
}
override
fun
hideLoading
()
=
view_loading
.
setVisible
(
false
)
override
fun
hideLoading
()
{
ui
{
view_loading
.
setVisible
(
false
)
}
}
override
fun
showMessage
(
resId
:
Int
)
{
override
fun
showMessage
(
resId
:
Int
)
{
showToast
(
resId
)
ui
{
showToast
(
resId
)
}
}
}
override
fun
showMessage
(
message
:
String
)
{
override
fun
showMessage
(
message
:
String
)
{
showToast
(
message
)
ui
{
showToast
(
message
)
}
}
}
override
fun
showGenericErrorMessage
()
=
showMessage
(
getString
(
R
.
string
.
msg_generic_error
))
override
fun
showGenericErrorMessage
()
=
showMessage
(
getString
(
R
.
string
.
msg_generic_error
))
override
fun
showPinnedMessages
(
pinnedMessages
:
List
<
BaseViewModel
<*
>>)
{
override
fun
showPinnedMessages
(
pinnedMessages
:
List
<
BaseViewModel
<*
>>)
{
activity
?.
apply
{
ui
{
if
(
recycler_view_pinned
.
adapter
==
null
)
{
if
(
recycler_view_pinned
.
adapter
==
null
)
{
// TODO - add a better constructor for this case...
// TODO - add a better constructor for this case...
adapter
=
ChatRoomAdapter
(
chatRoomType
,
chatRoomName
,
null
,
false
)
adapter
=
ChatRoomAdapter
(
chatRoomType
,
chatRoomName
,
null
,
false
)
...
@@ -92,9 +101,22 @@ class PinnedMessagesFragment : Fragment(), PinnedMessagesView {
...
@@ -92,9 +101,22 @@ class PinnedMessagesFragment : Fragment(), PinnedMessagesView {
}
}
})
})
}
}
togglePinView
(
pinnedMessages
.
size
)
}
}
adapter
.
appendData
(
pinnedMessages
)
adapter
.
appendData
(
pinnedMessages
)
}
}
}
}
private
fun
togglePinView
(
size
:
Int
)
{
if
(
size
==
0
){
iv_pin_icon
.
setVisible
(
true
)
tv_pin_title
.
setVisible
(
true
)
tv_pin_description
.
setVisible
(
true
)
}
else
{
iv_pin_icon
.
setVisible
(
false
)
tv_pin_title
.
setVisible
(
false
)
tv_pin_description
.
setVisible
(
false
)
}
}
}
}
\ No newline at end of file
app/src/main/java/chat/rocket/android/chatrooms/presentation/ChatRoomsPresenter.kt
View file @
6d73aff8
...
@@ -270,6 +270,7 @@ class ChatRoomsPresenter @Inject constructor(private val view: ChatRoomsView,
...
@@ -270,6 +270,7 @@ class ChatRoomsPresenter @Inject constructor(private val view: ChatRoomsView,
// TODO - Temporary stuff, remove when adding DB support
// TODO - Temporary stuff, remove when adding DB support
private
suspend
fun
subscribeRoomUpdates
()
{
private
suspend
fun
subscribeRoomUpdates
()
{
manager
.
addStatusChannel
(
stateChannel
)
manager
.
addStatusChannel
(
stateChannel
)
view
.
showConnectionState
(
client
.
state
)
manager
.
addRoomsAndSubscriptionsChannel
(
subscriptionsChannel
)
manager
.
addRoomsAndSubscriptionsChannel
(
subscriptionsChannel
)
launch
(
CommonPool
+
strategy
.
jobs
)
{
launch
(
CommonPool
+
strategy
.
jobs
)
{
for
(
message
in
subscriptionsChannel
)
{
for
(
message
in
subscriptionsChannel
)
{
...
...
app/src/main/java/chat/rocket/android/chatrooms/ui/ChatRoomsAdapter.kt
View file @
6d73aff8
...
@@ -24,7 +24,6 @@ import chat.rocket.android.util.extensions.textContent
...
@@ -24,7 +24,6 @@ import chat.rocket.android.util.extensions.textContent
import
chat.rocket.common.model.RoomType
import
chat.rocket.common.model.RoomType
import
chat.rocket.core.model.ChatRoom
import
chat.rocket.core.model.ChatRoom
import
com.facebook.drawee.view.SimpleDraweeView
import
com.facebook.drawee.view.SimpleDraweeView
import
kotlinx.android.synthetic.main.avatar.view.*
import
kotlinx.android.synthetic.main.item_chat.view.*
import
kotlinx.android.synthetic.main.item_chat.view.*
import
kotlinx.android.synthetic.main.unread_messages_badge.view.*
import
kotlinx.android.synthetic.main.unread_messages_badge.view.*
...
...
app/src/main/java/chat/rocket/android/chatrooms/ui/ChatRoomsFragment.kt
View file @
6d73aff8
...
@@ -31,8 +31,10 @@ import chat.rocket.core.model.ChatRoom
...
@@ -31,8 +31,10 @@ import chat.rocket.core.model.ChatRoom
import
dagger.android.support.AndroidSupportInjection
import
dagger.android.support.AndroidSupportInjection
import
kotlinx.android.synthetic.main.fragment_chat_rooms.*
import
kotlinx.android.synthetic.main.fragment_chat_rooms.*
import
kotlinx.coroutines.experimental.Job
import
kotlinx.coroutines.experimental.Job
import
kotlinx.coroutines.experimental.NonCancellable.isActive
import
kotlinx.coroutines.experimental.android.UI
import
kotlinx.coroutines.experimental.android.UI
import
kotlinx.coroutines.experimental.launch
import
kotlinx.coroutines.experimental.launch
import
timber.log.Timber
import
javax.inject.Inject
import
javax.inject.Inject
...
@@ -99,8 +101,8 @@ class ChatRoomsFragment : Fragment(), ChatRoomsView {
...
@@ -99,8 +101,8 @@ class ChatRoomsFragment : Fragment(), ChatRoomsView {
}
}
override
fun
onOptionsItemSelected
(
item
:
MenuItem
?
):
Boolean
{
override
fun
onOptionsItemSelected
(
item
:
MenuItem
):
Boolean
{
when
(
item
?
.
itemId
)
{
when
(
item
.
itemId
)
{
R
.
id
.
action_sort
->
{
R
.
id
.
action_sort
->
{
val
dialogLayout
=
layoutInflater
.
inflate
(
R
.
layout
.
chatroom_sort_dialog
,
null
)
val
dialogLayout
=
layoutInflater
.
inflate
(
R
.
layout
.
chatroom_sort_dialog
,
null
)
val
sortType
=
SharedPreferenceHelper
.
getInt
(
Constants
.
CHATROOM_SORT_TYPE_KEY
,
ChatRoomsSortOrder
.
ACTIVITY
)
val
sortType
=
SharedPreferenceHelper
.
getInt
(
Constants
.
CHATROOM_SORT_TYPE_KEY
,
ChatRoomsSortOrder
.
ACTIVITY
)
...
@@ -152,50 +154,57 @@ class ChatRoomsFragment : Fragment(), ChatRoomsView {
...
@@ -152,50 +154,57 @@ class ChatRoomsFragment : Fragment(), ChatRoomsView {
}
}
override
suspend
fun
updateChatRooms
(
newDataSet
:
List
<
ChatRoom
>)
{
override
suspend
fun
updateChatRooms
(
newDataSet
:
List
<
ChatRoom
>)
{
activity
?.
apply
{
listJob
?.
cancel
()
listJob
?.
cancel
()
listJob
=
ui
{
listJob
=
launch
(
UI
)
{
val
adapter
=
recycler_view
.
adapter
as
SimpleSectionedRecyclerViewAdapter
val
adapter
=
recycler_view
.
adapter
as
SimpleSectionedRecyclerViewAdapter
// FIXME https://fabric.io/rocketchat3/android/apps/chat.rocket.android/issues/5ac2916c36c7b235275ccccf
// FIXME https://fabric.io/rocketchat3/android/apps/chat.rocket.android/issues/5ac2916c36c7b235275ccccf
// TODO - fix this bug to re-enable DiffUtil
// TODO - fix this bug to re-enable DiffUtil
/*val diff = async(CommonPool) {
/*val diff = async(CommonPool) {
DiffUtil.calculateDiff(RoomsDiffCallback(adapter.baseAdapter.dataSet, newDataSet))
DiffUtil.calculateDiff(RoomsDiffCallback(adapter.baseAdapter.dataSet, newDataSet))
}.await()*/
}.await()*/
if
(
isActive
)
{
if
(
isActive
)
{
adapter
.
baseAdapter
.
updateRooms
(
newDataSet
)
adapter
.
baseAdapter
.
updateRooms
(
newDataSet
)
// TODO - fix crash to re-enable diff.dispatchUpdatesTo(adapter)
// TODO - fix crash to re-enable diff.dispatchUpdatesTo(adapter)
adapter
.
notifyDataSetChanged
()
adapter
.
notifyDataSetChanged
()
//Set sections always after data set is updated
//Set sections always after data set is updated
setSections
()
setSections
()
}
}
}
}
}
}
}
override
fun
showNoChatRoomsToDisplay
()
=
text_no_data_to_display
.
setVisible
(
true
)
override
fun
showNoChatRoomsToDisplay
()
{
ui
{
text_no_data_to_display
.
setVisible
(
true
)
}
}
override
fun
showLoading
()
=
view_loading
.
setVisible
(
true
)
override
fun
showLoading
(){
ui
{
view_loading
.
setVisible
(
true
)
}
}
override
fun
hideLoading
()
{
override
fun
hideLoading
()
{
if
(
view_loading
!=
null
)
{
ui
{
view_loading
.
setVisible
(
false
)
view_loading
.
setVisible
(
false
)
}
}
}
}
override
fun
showMessage
(
resId
:
Int
)
{
override
fun
showMessage
(
resId
:
Int
)
{
showToast
(
resId
)
ui
{
showToast
(
resId
)
}
}
}
override
fun
showMessage
(
message
:
String
)
{
override
fun
showMessage
(
message
:
String
)
{
showToast
(
message
)
ui
{
showToast
(
message
)
}
}
}
override
fun
showGenericErrorMessage
()
=
showMessage
(
getString
(
R
.
string
.
msg_generic_error
))
override
fun
showGenericErrorMessage
()
=
showMessage
(
getString
(
R
.
string
.
msg_generic_error
))
override
fun
showConnectionState
(
state
:
State
)
{
override
fun
showConnectionState
(
state
:
State
)
{
activity
?.
apply
{
Timber
.
d
(
"Got new state: $state"
)
ui
{
connection_status_text
.
fadeIn
()
connection_status_text
.
fadeIn
()
handler
.
removeCallbacks
(
dismissStatus
)
handler
.
removeCallbacks
(
dismissStatus
)
when
(
state
)
{
when
(
state
)
{
...
@@ -219,22 +228,25 @@ class ChatRoomsFragment : Fragment(), ChatRoomsView {
...
@@ -219,22 +228,25 @@ class ChatRoomsFragment : Fragment(), ChatRoomsView {
}
}
private
fun
setupToolbar
()
{
private
fun
setupToolbar
()
{
(
activity
as
AppCompatActivity
)
.
supportActionBar
?.
title
=
getString
(
R
.
string
.
title_chats
)
(
activity
as
AppCompatActivity
?)
?
.
supportActionBar
?.
title
=
getString
(
R
.
string
.
title_chats
)
}
}
private
fun
setupRecyclerView
()
{
private
fun
setupRecyclerView
()
{
activity
?.
apply
{
ui
{
recycler_view
.
layoutManager
=
LinearLayoutManager
(
this
,
LinearLayoutManager
.
VERTICAL
,
false
)
recycler_view
.
layoutManager
=
LinearLayoutManager
(
it
,
LinearLayoutManager
.
VERTICAL
,
false
)
recycler_view
.
addItemDecoration
(
DividerItemDecoration
(
this
,
recycler_view
.
addItemDecoration
(
DividerItemDecoration
(
it
,
resources
.
getDimensionPixelSize
(
R
.
dimen
.
divider_item_decorator_bound_start
),
resources
.
getDimensionPixelSize
(
R
.
dimen
.
divider_item_decorator_bound_start
),
resources
.
getDimensionPixelSize
(
R
.
dimen
.
divider_item_decorator_bound_end
)))
resources
.
getDimensionPixelSize
(
R
.
dimen
.
divider_item_decorator_bound_end
)))
recycler_view
.
itemAnimator
=
DefaultItemAnimator
()
recycler_view
.
itemAnimator
=
DefaultItemAnimator
()
// TODO - use a ViewModel Mapper instead of using settings on the adapter
// TODO - use a ViewModel Mapper instead of using settings on the adapter
val
baseAdapter
=
ChatRoomsAdapter
(
this
,
val
baseAdapter
=
ChatRoomsAdapter
(
it
,
settingsRepository
.
get
(
serverInteractor
.
get
()
!!
),
localRepository
)
{
chatRoom
->
presenter
.
loadChatRoom
(
chatRoom
)
}
settingsRepository
.
get
(
serverInteractor
.
get
()
!!
),
localRepository
)
{
chatRoom
->
presenter
.
loadChatRoom
(
chatRoom
)
}
sectionedAdapter
=
SimpleSectionedRecyclerViewAdapter
(
this
,
R
.
layout
.
item_chatroom_header
,
R
.
id
.
text_chatroom_header
,
baseAdapter
!!
)
sectionedAdapter
=
SimpleSectionedRecyclerViewAdapter
(
it
,
R
.
layout
.
item_chatroom_header
,
R
.
id
.
text_chatroom_header
,
baseAdapter
)
recycler_view
.
adapter
=
sectionedAdapter
recycler_view
.
adapter
=
sectionedAdapter
}
}
}
}
...
...
app/src/main/java/chat/rocket/android/members/presentation/MembersNavigator.kt
View file @
6d73aff8
package
chat.rocket.android.members.presentation
package
chat.rocket.android.members.presentation
import
chat.rocket.android.chatroom.ui.ChatRoomActivity
import
chat.rocket.android.chatroom.ui.ChatRoomActivity
import
chat.rocket.android.member.ui.newInstance
import
chat.rocket.android.member
s
.ui.newInstance
class
MembersNavigator
(
internal
val
activity
:
ChatRoomActivity
)
{
class
MembersNavigator
(
internal
val
activity
:
ChatRoomActivity
)
{
...
...
app/src/main/java/chat/rocket/android/member/ui/MemberBottomSheetFragment.kt
→
app/src/main/java/chat/rocket/android/member
s
/ui/MemberBottomSheetFragment.kt
View file @
6d73aff8
package
chat.rocket.android.member.ui
package
chat.rocket.android.member
s
.ui
import
android.os.Bundle
import
android.os.Bundle
import
android.support.design.widget.BottomSheetDialogFragment
import
android.support.design.widget.BottomSheetDialogFragment
...
...
app/src/main/java/chat/rocket/android/members/ui/MembersFragment.kt
View file @
6d73aff8
...
@@ -19,6 +19,7 @@ import chat.rocket.android.members.viewmodel.MemberViewModel
...
@@ -19,6 +19,7 @@ import chat.rocket.android.members.viewmodel.MemberViewModel
import
chat.rocket.android.util.extensions.inflate
import
chat.rocket.android.util.extensions.inflate
import
chat.rocket.android.util.extensions.setVisible
import
chat.rocket.android.util.extensions.setVisible
import
chat.rocket.android.util.extensions.showToast
import
chat.rocket.android.util.extensions.showToast
import
chat.rocket.android.util.extensions.ui
import
chat.rocket.android.widget.DividerItemDecoration
import
chat.rocket.android.widget.DividerItemDecoration
import
dagger.android.support.AndroidSupportInjection
import
dagger.android.support.AndroidSupportInjection
import
kotlinx.android.synthetic.main.fragment_members.*
import
kotlinx.android.synthetic.main.fragment_members.*
...
@@ -70,7 +71,7 @@ class MembersFragment : Fragment(), MembersView {
...
@@ -70,7 +71,7 @@ class MembersFragment : Fragment(), MembersView {
}
}
override
fun
showMembers
(
dataSet
:
List
<
MemberViewModel
>,
total
:
Long
)
{
override
fun
showMembers
(
dataSet
:
List
<
MemberViewModel
>,
total
:
Long
)
{
activity
?.
apply
{
ui
{
setupToolbar
(
total
)
setupToolbar
(
total
)
if
(
adapter
.
itemCount
==
0
)
{
if
(
adapter
.
itemCount
==
0
)
{
adapter
.
prependData
(
dataSet
)
adapter
.
prependData
(
dataSet
)
...
@@ -84,8 +85,8 @@ class MembersFragment : Fragment(), MembersView {
...
@@ -84,8 +85,8 @@ class MembersFragment : Fragment(), MembersView {
}
else
{
}
else
{
adapter
.
appendData
(
dataSet
)
adapter
.
appendData
(
dataSet
)
}
}
if
(
this
is
ChatRoomActivity
)
{
if
(
it
is
ChatRoomActivity
)
{
this
.
showRoomTypeIcon
(
false
)
it
.
showRoomTypeIcon
(
false
)
}
}
}
}
}
}
...
@@ -98,29 +99,37 @@ class MembersFragment : Fragment(), MembersView {
...
@@ -98,29 +99,37 @@ class MembersFragment : Fragment(), MembersView {
return
super
.
onOptionsItemSelected
(
item
)
return
super
.
onOptionsItemSelected
(
item
)
}
}
override
fun
showLoading
()
=
view_loading
.
setVisible
(
true
)
override
fun
showLoading
()
{
ui
{
view_loading
.
setVisible
(
true
)
}
}
override
fun
hideLoading
()
=
view_loading
.
setVisible
(
false
)
override
fun
hideLoading
()
{
ui
{
view_loading
.
setVisible
(
false
)
}
}
override
fun
showMessage
(
resId
:
Int
)
{
override
fun
showMessage
(
resId
:
Int
)
{
showToast
(
resId
)
ui
{
showToast
(
resId
)
}
}
}
override
fun
showMessage
(
message
:
String
)
{
override
fun
showMessage
(
message
:
String
)
{
showToast
(
message
)
ui
{
showToast
(
message
)
}
}
}
override
fun
showGenericErrorMessage
()
=
showMessage
(
getString
(
R
.
string
.
msg_generic_error
))
override
fun
showGenericErrorMessage
()
=
showMessage
(
getString
(
R
.
string
.
msg_generic_error
))
private
fun
setupRecyclerView
()
{
private
fun
setupRecyclerView
()
{
activity
?.
apply
{
ui
{
recycler_view
.
layoutManager
=
linearLayoutManager
recycler_view
.
layoutManager
=
linearLayoutManager
recycler_view
.
addItemDecoration
(
DividerItemDecoration
(
this
))
recycler_view
.
addItemDecoration
(
DividerItemDecoration
(
it
))
recycler_view
.
adapter
=
adapter
recycler_view
.
adapter
=
adapter
}
}
}
}
private
fun
setupToolbar
(
totalMembers
:
Long
)
{
private
fun
setupToolbar
(
totalMembers
:
Long
)
{
(
activity
as
ChatRoomActivity
)
.
setupToolbarTitle
(
getString
(
R
.
string
.
title_members
,
totalMembers
))
(
activity
as
ChatRoomActivity
?)
?
.
setupToolbarTitle
(
getString
(
R
.
string
.
title_members
,
totalMembers
))
}
}
}
}
\ No newline at end of file
app/src/main/java/chat/rocket/android/server/infraestructure/ConnectionManager.kt
View file @
6d73aff8
...
@@ -22,7 +22,7 @@ import java.util.concurrent.CopyOnWriteArrayList
...
@@ -22,7 +22,7 @@ import java.util.concurrent.CopyOnWriteArrayList
class
ConnectionManager
(
internal
val
client
:
RocketChatClient
)
{
class
ConnectionManager
(
internal
val
client
:
RocketChatClient
)
{
private
val
statusChannelList
=
CopyOnWriteArrayList
<
Channel
<
State
>>()
private
val
statusChannelList
=
CopyOnWriteArrayList
<
Channel
<
State
>>()
private
val
statusChannel
=
Channel
<
State
>()
private
val
statusChannel
=
Channel
<
State
>(
Channel
.
CONFLATED
)
private
var
connectJob
:
Job
?
=
null
private
var
connectJob
:
Job
?
=
null
private
val
roomAndSubscriptionChannels
=
ArrayList
<
Channel
<
StreamMessage
<
BaseRoom
>>>()
private
val
roomAndSubscriptionChannels
=
ArrayList
<
Channel
<
StreamMessage
<
BaseRoom
>>>()
...
@@ -73,7 +73,8 @@ class ConnectionManager(internal val client: RocketChatClient) {
...
@@ -73,7 +73,8 @@ class ConnectionManager(internal val client: RocketChatClient) {
}
}
for
(
channel
in
statusChannelList
)
{
for
(
channel
in
statusChannelList
)
{
channel
.
send
(
status
)
Timber
.
d
(
"Sending status: $status to $channel"
)
channel
.
offer
(
status
)
}
}
}
}
}
}
...
...
app/src/main/java/chat/rocket/android/settings/password/ui/PasswordFragment.kt
View file @
6d73aff8
...
@@ -11,7 +11,10 @@ import chat.rocket.android.util.extensions.asObservable
...
@@ -11,7 +11,10 @@ import chat.rocket.android.util.extensions.asObservable
import
chat.rocket.android.util.extensions.inflate
import
chat.rocket.android.util.extensions.inflate
import
chat.rocket.android.util.extensions.textContent
import
chat.rocket.android.util.extensions.textContent
import
android.support.v7.view.ActionMode
import
android.support.v7.view.ActionMode
import
chat.rocket.android.util.extensions.ui
import
dagger.android.support.AndroidSupportInjection
import
dagger.android.support.AndroidSupportInjection
import
io.reactivex.disposables.CompositeDisposable
import
io.reactivex.disposables.Disposable
import
io.reactivex.rxkotlin.Observables
import
io.reactivex.rxkotlin.Observables
import
kotlinx.android.synthetic.main.fragment_password.*
import
kotlinx.android.synthetic.main.fragment_password.*
import
javax.inject.Inject
import
javax.inject.Inject
...
@@ -19,6 +22,7 @@ import javax.inject.Inject
...
@@ -19,6 +22,7 @@ import javax.inject.Inject
class
PasswordFragment
:
Fragment
(),
PasswordView
,
android
.
support
.
v7
.
view
.
ActionMode
.
Callback
{
class
PasswordFragment
:
Fragment
(),
PasswordView
,
android
.
support
.
v7
.
view
.
ActionMode
.
Callback
{
@Inject
lateinit
var
presenter
:
PasswordPresenter
@Inject
lateinit
var
presenter
:
PasswordPresenter
private
var
actionMode
:
ActionMode
?
=
null
private
var
actionMode
:
ActionMode
?
=
null
private
val
disposables
=
CompositeDisposable
()
companion
object
{
companion
object
{
fun
newInstance
()
=
PasswordFragment
()
fun
newInstance
()
=
PasswordFragment
()
...
@@ -34,13 +38,20 @@ class PasswordFragment: Fragment(), PasswordView, android.support.v7.view.Action
...
@@ -34,13 +38,20 @@ class PasswordFragment: Fragment(), PasswordView, android.support.v7.view.Action
override
fun
onViewCreated
(
view
:
View
,
savedInstanceState
:
Bundle
?)
{
override
fun
onViewCreated
(
view
:
View
,
savedInstanceState
:
Bundle
?)
{
super
.
onViewCreated
(
view
,
savedInstanceState
)
super
.
onViewCreated
(
view
,
savedInstanceState
)
listenToChanges
()
disposables
.
add
(
listenToChanges
())
}
override
fun
onDestroyView
()
{
disposables
.
clear
()
super
.
onDestroyView
()
}
}
override
fun
hideLoading
()
{
override
fun
hideLoading
()
{
layout_new_password
.
visibility
=
View
.
VISIBLE
ui
{
layout_confirm_password
.
visibility
=
View
.
VISIBLE
layout_new_password
.
visibility
=
View
.
VISIBLE
view_loading
.
visibility
=
View
.
GONE
layout_confirm_password
.
visibility
=
View
.
VISIBLE
view_loading
.
visibility
=
View
.
GONE
}
}
}
override
fun
onActionItemClicked
(
mode
:
ActionMode
,
menuItem
:
MenuItem
):
Boolean
{
override
fun
onActionItemClicked
(
mode
:
ActionMode
,
menuItem
:
MenuItem
):
Boolean
{
...
@@ -69,9 +80,11 @@ class PasswordFragment: Fragment(), PasswordView, android.support.v7.view.Action
...
@@ -69,9 +80,11 @@ class PasswordFragment: Fragment(), PasswordView, android.support.v7.view.Action
}
}
override
fun
showLoading
()
{
override
fun
showLoading
()
{
layout_new_password
.
visibility
=
View
.
GONE
ui
{
layout_confirm_password
.
visibility
=
View
.
GONE
layout_new_password
.
visibility
=
View
.
GONE
view_loading
.
visibility
=
View
.
VISIBLE
layout_confirm_password
.
visibility
=
View
.
GONE
view_loading
.
visibility
=
View
.
VISIBLE
}
}
}
override
fun
showPasswordFailsUpdateMessage
(
error
:
String
?)
{
override
fun
showPasswordFailsUpdateMessage
(
error
:
String
?)
{
...
@@ -84,8 +97,9 @@ class PasswordFragment: Fragment(), PasswordView, android.support.v7.view.Action
...
@@ -84,8 +97,9 @@ class PasswordFragment: Fragment(), PasswordView, android.support.v7.view.Action
private
fun
finishActionMode
()
=
actionMode
?.
finish
()
private
fun
finishActionMode
()
=
actionMode
?.
finish
()
private
fun
listenToChanges
()
{
private
fun
listenToChanges
():
Disposable
{
Observables
.
combineLatest
(
text_new_password
.
asObservable
(),
text_confirm_password
.
asObservable
()).
subscribe
{
return
Observables
.
combineLatest
(
text_new_password
.
asObservable
(),
text_confirm_password
.
asObservable
()).
subscribe
{
val
textPassword
=
text_new_password
.
textContent
val
textPassword
=
text_new_password
.
textContent
val
textConfirmPassword
=
text_confirm_password
.
textContent
val
textConfirmPassword
=
text_confirm_password
.
textContent
...
@@ -97,7 +111,9 @@ class PasswordFragment: Fragment(), PasswordView, android.support.v7.view.Action
...
@@ -97,7 +111,9 @@ class PasswordFragment: Fragment(), PasswordView, android.support.v7.view.Action
}
}
private
fun
showToast
(
msg
:
String
?)
{
private
fun
showToast
(
msg
:
String
?)
{
Toast
.
makeText
(
context
,
msg
,
Toast
.
LENGTH_LONG
).
show
()
ui
{
Toast
.
makeText
(
it
,
msg
,
Toast
.
LENGTH_LONG
).
show
()
}
}
}
private
fun
startActionMode
()
{
private
fun
startActionMode
()
{
...
...
app/src/main/java/chat/rocket/android/util/extensions/Fragment.kt
0 → 100644
View file @
6d73aff8
package
chat.rocket.android.util.extensions
import
android.os.Looper
import
android.support.v4.app.Fragment
import
android.support.v4.app.FragmentActivity
import
kotlinx.coroutines.experimental.Job
import
kotlinx.coroutines.experimental.android.UI
import
kotlinx.coroutines.experimental.launch
inline
fun
Fragment
.
ui
(
crossinline
block
:
(
activity
:
FragmentActivity
)
->
Unit
):
Job
?
{
// Checking first for activity and view saves us from some synchronyzed and thread local checks
if
(
activity
!=
null
&&
view
!=
null
)
{
// If we already are running on the Main Thread (UI Thread), just go ahead and execute the block
return
if
(
Looper
.
getMainLooper
()
==
Looper
.
myLooper
())
{
block
(
activity
!!
)
null
}
else
{
// Launch a Job on the UI context and check again if the activity and view are still valid
launch
(
UI
)
{
if
(
activity
!=
null
&&
view
!=
null
)
{
block
(
activity
!!
)
}
}
}
}
return
null
}
\ No newline at end of file
app/src/main/res/drawable/ic_pin_black_24dp.xml
View file @
6d73aff8
<vector
android:height=
"24dp"
android:viewportHeight=
"800.0"
<?xml version="1.0" encoding="utf-8"?>
android:viewportWidth=
"800.0"
android:width=
"24dp"
xmlns:android=
"http://schemas.android.com/apk/res/android"
>
<vector
xmlns:android=
"http://schemas.android.com/apk/res/android"
<path
android:fillColor=
"@color/actionMenuColor"
android:pathData=
"M511.8,390H520V84C567,67.8 596.3,42 596.3,16H203.7c0,26 29.3,51.8 76.3,68V390h8.2c-92.9,16 -157.5,61 -157.5,108H377v288h48V498h244.3C669.3,451 604.7,406 511.8,390z"
/>
android:viewportWidth=
"197.218"
</vector>
android:viewportHeight=
"197.218"
android:width=
"197.218dp"
android:height=
"197.218dp"
>
<group
android:translateX=
"-570.396"
android:translateY=
"-306.782"
>
<path
android:pathData=
"M704.445 306.782l-6.785 6.785c-6.084 6.084 -7.622 14.712 -4.309 21.871l-44.068 35.44 -3.086 -3.086c-7.889 -7.889 -19.525 -7.889 -27.414 0l-8.944 8.953 87.821 87.811 8.934 -8.933c7.899 -7.899 7.899 -19.525 0 -27.433l-3.076 -3.077 36.051 -44.68c6.824 2.466 14.367 1.036 20.037 -4.624l8.008 -5.858 -63.169 -63.169zm-66.867 116.487l-67.182 66.857 0 13.874 13.864 0 66.867 -67.182 -13.549 -13.549z"
android:fillColor=
"@color/actionMenuColor"
/>
</group>
</vector>
\ No newline at end of file
app/src/main/res/layout/fragment_pinned_messages.xml
View file @
6d73aff8
...
@@ -32,4 +32,50 @@
...
@@ -32,4 +32,50 @@
app:layout_constraintTop_toTopOf=
"parent"
app:layout_constraintTop_toTopOf=
"parent"
tools:visibility=
"visible"
/>
tools:visibility=
"visible"
/>
<ImageView
android:id=
"@+id/iv_pin_icon"
android:layout_width=
"100dp"
android:layout_height=
"100dp"
android:src=
"@drawable/ic_pin_black_24dp"
android:tint=
"#AFADAF"
app:layout_constraintStart_toStartOf=
"parent"
app:layout_constraintEnd_toEndOf=
"parent"
app:layout_constraintTop_toTopOf=
"parent"
app:layout_constraintBottom_toTopOf=
"@id/tv_pin_title"
app:layout_constraintVertical_chainStyle=
"packed"
android:visibility=
"gone"
tools:visibility=
"visible"
/>
<TextView
android:id=
"@+id/tv_pin_title"
android:layout_width=
"wrap_content"
android:layout_height=
"wrap_content"
android:text=
"@string/no_pinned_messages"
app:layout_constraintStart_toStartOf=
"parent"
app:layout_constraintEnd_toEndOf=
"parent"
app:layout_constraintTop_toBottomOf=
"@id/iv_pin_icon"
app:layout_constraintBottom_toTopOf=
"@id/tv_pin_description"
android:textSize=
"20sp"
android:layout_marginTop=
"24dp"
android:textStyle=
"bold"
android:textColor=
"#8B8B8B"
android:visibility=
"gone"
tools:visibility=
"visible"
/>
<TextView
android:id=
"@+id/tv_pin_description"
android:layout_width=
"wrap_content"
android:layout_height=
"wrap_content"
android:text=
"@string/no_pinned_description"
app:layout_constraintStart_toStartOf=
"parent"
app:layout_constraintEnd_toEndOf=
"parent"
app:layout_constraintTop_toBottomOf=
"@id/tv_pin_title"
app:layout_constraintBottom_toBottomOf=
"parent"
android:layout_marginTop=
"16dp"
android:textAlignment=
"center"
android:textSize=
"16sp"
android:textColor=
"#c1c1c1"
android:visibility=
"gone"
tools:visibility=
"visible"
/>
</android.support.constraint.ConstraintLayout>
</android.support.constraint.ConstraintLayout>
\ No newline at end of file
app/src/main/res/layout/item_chat.xml
View file @
6d73aff8
...
@@ -10,14 +10,14 @@
...
@@ -10,14 +10,14 @@
android:paddingTop=
"@dimen/chat_item_top_and_bottom_padding"
android:paddingTop=
"@dimen/chat_item_top_and_bottom_padding"
android:paddingBottom=
"@dimen/chat_item_top_and_bottom_padding"
>
android:paddingBottom=
"@dimen/chat_item_top_and_bottom_padding"
>
<include
<com.facebook.drawee.view.SimpleDraweeView
android:id=
"@+id/layout_avatar"
android:id=
"@+id/image_avatar"
layout=
"@layout/avatar"
android:layout_width=
"40dp"
android:layout_width=
"40dp"
android:layout_height=
"40dp"
android:layout_height=
"40dp"
app:roundedCornerRadius=
"3dp"
android:layout_marginTop=
"6dp"
android:layout_marginTop=
"6dp"
app:layout_constraintStart_toStartOf=
"parent"
app:layout_constraintStart_toStartOf=
"parent"
app:layout_constraintTop_toTopOf=
"parent"
/>
app:layout_constraintTop_toTopOf=
"parent"
/>
<TextView
<TextView
android:id=
"@+id/text_chat_name"
android:id=
"@+id/text_chat_name"
...
@@ -25,7 +25,7 @@
...
@@ -25,7 +25,7 @@
android:layout_width=
"0dp"
android:layout_width=
"0dp"
android:layout_height=
"wrap_content"
android:layout_height=
"wrap_content"
android:layout_marginStart=
"16dp"
android:layout_marginStart=
"16dp"
app:layout_constraintStart_toEndOf=
"@id/
layout
_avatar"
app:layout_constraintStart_toEndOf=
"@id/
image
_avatar"
android:textDirection=
"locale"
android:textDirection=
"locale"
tools:text=
"General"
/>
tools:text=
"General"
/>
...
@@ -51,7 +51,7 @@
...
@@ -51,7 +51,7 @@
app:layout_constraintTop_toBottomOf=
"@id/text_chat_name"
app:layout_constraintTop_toBottomOf=
"@id/text_chat_name"
app:layout_constraintEnd_toStartOf=
"@id/layout_unread_messages_badge"
app:layout_constraintEnd_toStartOf=
"@id/layout_unread_messages_badge"
android:textDirection=
"locale"
android:textDirection=
"locale"
tools:text=
"You: Type something"
/>
tools:text=
"You: Type something
that is very big and need at least to lines, or maybe even more
"
/>
<include
<include
android:id=
"@+id/layout_unread_messages_badge"
android:id=
"@+id/layout_unread_messages_badge"
...
...
app/src/main/res/values-hi-rIN/strings.xml
View file @
6d73aff8
...
@@ -123,6 +123,8 @@
...
@@ -123,6 +123,8 @@
<!-- Pinned Messages -->
<!-- Pinned Messages -->
<string
name=
"title_pinned_messages"
>
पिन किए गए संदेश
</string>
<string
name=
"title_pinned_messages"
>
पिन किए गए संदेश
</string>
<string
name=
"no_pinned_messages"
>
कोई पिन संदेश नहीं
</string>
<string
name=
"no_pinned_description"
>
सभी पिन किए गए संदेश यहां\nदिखाई देते हैं।
</string>
<!-- Upload Messages -->
<!-- Upload Messages -->
<string
name=
"max_file_size_exceeded"
>
फ़ाइल का आकार %1$d बाइट्स ने %2$d बाइट्स के अधिकतम अपलोड आकार को पार कर लिया है
</string>
<string
name=
"max_file_size_exceeded"
>
फ़ाइल का आकार %1$d बाइट्स ने %2$d बाइट्स के अधिकतम अपलोड आकार को पार कर लिया है
</string>
...
...
app/src/main/res/values-pt-rBR/strings.xml
View file @
6d73aff8
...
@@ -123,6 +123,8 @@
...
@@ -123,6 +123,8 @@
<!-- Pinned Messages -->
<!-- Pinned Messages -->
<string
name=
"title_pinned_messages"
>
Mensagens Pinadas
</string>
<string
name=
"title_pinned_messages"
>
Mensagens Pinadas
</string>
<string
name=
"no_pinned_messages"
>
Nenhuma mensagem pinada
</string>
<string
name=
"no_pinned_description"
>
Todas as mensagens pinadas\naparecerão aqui
</string>
<!-- Upload Messages -->
<!-- Upload Messages -->
<string
name=
"max_file_size_exceeded"
>
Tamanho de arquivo (%1$d bytes) excedeu tamanho máximo de upload (%2$d bytes)
</string>
<string
name=
"max_file_size_exceeded"
>
Tamanho de arquivo (%1$d bytes) excedeu tamanho máximo de upload (%2$d bytes)
</string>
...
...
app/src/main/res/values/strings.xml
View file @
6d73aff8
...
@@ -124,6 +124,8 @@
...
@@ -124,6 +124,8 @@
<!-- Pinned Messages -->
<!-- Pinned Messages -->
<string
name=
"title_pinned_messages"
>
Pinned Messages
</string>
<string
name=
"title_pinned_messages"
>
Pinned Messages
</string>
<string
name=
"no_pinned_messages"
>
No pinned messages
</string>
<string
name=
"no_pinned_description"
>
All the pinned messages\nappear here.
</string>
<!-- Upload Messages -->
<!-- Upload Messages -->
<string
name=
"max_file_size_exceeded"
>
File size %1$d bytes exceeded max upload size of %2$d bytes
</string>
<string
name=
"max_file_size_exceeded"
>
File size %1$d bytes exceeded max upload size of %2$d bytes
</string>
...
...
app/src/main/res/xml/network_security_config.xml
0 → 100644
View file @
6d73aff8
<?xml version="1.0" encoding="utf-8"?>
<network-security-config>
<base-config
cleartextTrafficPermitted=
"true"
>
<trust-anchors>
<certificates
src=
"system"
/>
<certificates
src=
"user"
/>
</trust-anchors>
</base-config>
</network-security-config>
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