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
15abcd8c
Commit
15abcd8c
authored
Apr 11, 2018
by
Leonardo Aramaki
Browse files
Options
Browse Files
Download
Plain Diff
Merge branch 'develop-2.x' into new/offline-sending
parents
cea99c1d
eb838602
Changes
17
Expand all
Show whitespace changes
Inline
Side-by-side
Showing
17 changed files
with
498 additions
and
281 deletions
+498
-281
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
+111
-81
PinnedMessagesFragment.kt
...chat/rocket/android/chatroom/ui/PinnedMessagesFragment.kt
+14
-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
item_chat.xml
app/src/main/res/layout/item_chat.xml
+6
-6
No files found.
app/src/main/java/chat/rocket/android/authentication/login/ui/LoginFragment.kt
View file @
15abcd8c
This diff is collapsed.
Click to expand it.
app/src/main/java/chat/rocket/android/authentication/registerusername/ui/RegisterUsernameFragment.kt
View file @
15abcd8c
...
...
@@ -59,37 +59,47 @@ class RegisterUsernameFragment : Fragment(), RegisterUsernameView {
}
override
fun
alertBlankUsername
()
{
ui
{
vibrateSmartPhone
()
text_username
.
shake
()
}
}
override
fun
showLoading
()
{
ui
{
disableUserInput
()
view_loading
.
setVisible
(
true
)
}
}
override
fun
hideLoading
()
{
ui
{
view_loading
.
setVisible
(
false
)
enableUserInput
()
}
}
override
fun
showMessage
(
resId
:
Int
)
{
ui
{
showToast
(
resId
)
}
}
override
fun
showMessage
(
message
:
String
)
{
ui
{
showToast
(
message
)
}
}
override
fun
showGenericErrorMessage
()
{
showMessage
(
getString
(
R
.
string
.
msg_generic_error
))
}
private
fun
tintEditTextDrawableStart
()
{
activity
?.
apply
{
val
atDrawable
=
DrawableHelper
.
getDrawableFromId
(
R
.
drawable
.
ic_at_black_24dp
,
this
)
ui
{
val
atDrawable
=
DrawableHelper
.
getDrawableFromId
(
R
.
drawable
.
ic_at_black_24dp
,
it
)
DrawableHelper
.
wrapDrawable
(
atDrawable
)
DrawableHelper
.
tintDrawable
(
atDrawable
,
this
,
R
.
color
.
colorDrawableTintGrey
)
DrawableHelper
.
tintDrawable
(
atDrawable
,
it
,
R
.
color
.
colorDrawableTintGrey
)
DrawableHelper
.
compoundDrawable
(
text_username
,
atDrawable
)
}
}
...
...
app/src/main/java/chat/rocket/android/authentication/server/ui/ServerFragment.kt
View file @
15abcd8c
...
...
@@ -47,22 +47,30 @@ class ServerFragment : Fragment(), ServerView {
override
fun
showInvalidServerUrlMessage
()
=
showMessage
(
getString
(
R
.
string
.
msg_invalid_server_url
))
override
fun
showLoading
()
{
ui
{
enableUserInput
(
false
)
view_loading
.
setVisible
(
true
)
}
}
override
fun
hideLoading
()
{
ui
{
view_loading
.
setVisible
(
false
)
enableUserInput
(
true
)
}
}
override
fun
showMessage
(
resId
:
Int
){
ui
{
showToast
(
resId
)
}
}
override
fun
showMessage
(
message
:
String
)
{
ui
{
showToast
(
message
)
}
}
override
fun
showGenericErrorMessage
()
{
showMessage
(
getString
(
R
.
string
.
msg_generic_error
))
...
...
app/src/main/java/chat/rocket/android/authentication/signup/ui/SignupFragment.kt
View file @
15abcd8c
...
...
@@ -25,7 +25,7 @@ class SignupFragment : Fragment(), SignupView {
}
else
{
bottom_container
.
apply
{
postDelayed
({
setVisible
(
true
)
ui
{
setVisible
(
true
)
}
},
3
)
}
}
...
...
@@ -64,61 +64,77 @@ class SignupFragment : Fragment(), SignupView {
}
override
fun
alertBlankName
()
{
ui
{
vibrateSmartPhone
()
text_name
.
shake
()
text_name
.
requestFocus
()
}
}
override
fun
alertBlankUsername
()
{
ui
{
vibrateSmartPhone
()
text_username
.
shake
()
text_username
.
requestFocus
()
}
}
override
fun
alertEmptyPassword
()
{
ui
{
vibrateSmartPhone
()
text_password
.
shake
()
text_password
.
requestFocus
()
}
}
override
fun
alertBlankEmail
()
{
ui
{
vibrateSmartPhone
()
text_email
.
shake
()
text_email
.
requestFocus
()
}
}
override
fun
showLoading
()
{
ui
{
enableUserInput
(
false
)
view_loading
.
setVisible
(
true
)
}
}
override
fun
hideLoading
()
{
ui
{
view_loading
.
setVisible
(
false
)
enableUserInput
(
true
)
}
}
override
fun
showMessage
(
resId
:
Int
)
{
ui
{
showToast
(
resId
)
}
}
override
fun
showMessage
(
message
:
String
)
{
ui
{
showToast
(
message
)
}
}
override
fun
showGenericErrorMessage
()
{
showMessage
(
getString
(
R
.
string
.
msg_generic_error
))
}
private
fun
tintEditTextDrawableStart
()
{
activity
?.
apply
{
val
personDrawable
=
DrawableHelper
.
getDrawableFromId
(
R
.
drawable
.
ic_person_black_24dp
,
this
)
val
atDrawable
=
DrawableHelper
.
getDrawableFromId
(
R
.
drawable
.
ic_at_black_24dp
,
this
)
val
lockDrawable
=
DrawableHelper
.
getDrawableFromId
(
R
.
drawable
.
ic_lock_black_24dp
,
this
)
val
emailDrawable
=
DrawableHelper
.
getDrawableFromId
(
R
.
drawable
.
ic_email_black_24dp
,
this
)
ui
{
val
personDrawable
=
DrawableHelper
.
getDrawableFromId
(
R
.
drawable
.
ic_person_black_24dp
,
it
)
val
atDrawable
=
DrawableHelper
.
getDrawableFromId
(
R
.
drawable
.
ic_at_black_24dp
,
it
)
val
lockDrawable
=
DrawableHelper
.
getDrawableFromId
(
R
.
drawable
.
ic_lock_black_24dp
,
it
)
val
emailDrawable
=
DrawableHelper
.
getDrawableFromId
(
R
.
drawable
.
ic_email_black_24dp
,
it
)
val
drawables
=
arrayOf
(
personDrawable
,
atDrawable
,
lockDrawable
,
emailDrawable
)
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
)
}
}
...
...
app/src/main/java/chat/rocket/android/authentication/twofactor/ui/TwoFAFragment.kt
View file @
15abcd8c
...
...
@@ -63,39 +63,49 @@ class TwoFAFragment : Fragment(), TwoFAView {
}
override
fun
alertBlankTwoFactorAuthenticationCode
()
{
ui
{
vibrateSmartPhone
()
text_two_factor_auth
.
shake
()
}
}
override
fun
alertInvalidTwoFactorAuthenticationCode
()
{
showMessage
(
getString
(
R
.
string
.
msg_invalid_2fa_code
))
}
override
fun
showLoading
()
{
ui
{
enableUserInput
(
false
)
view_loading
.
setVisible
(
true
)
}
}
override
fun
hideLoading
()
{
ui
{
view_loading
.
setVisible
(
false
)
enableUserInput
(
true
)
}
}
override
fun
showMessage
(
resId
:
Int
)
{
ui
{
showToast
(
resId
)
}
}
override
fun
showMessage
(
message
:
String
)
{
ui
{
showToast
(
message
)
}
}
override
fun
showGenericErrorMessage
()
=
showMessage
(
getString
(
R
.
string
.
msg_generic_error
))
private
fun
tintEditTextDrawableStart
()
{
activity
?.
apply
{
val
lockDrawable
=
DrawableHelper
.
getDrawableFromId
(
R
.
drawable
.
ic_vpn_key_black_24dp
,
this
)
ui
{
val
lockDrawable
=
DrawableHelper
.
getDrawableFromId
(
R
.
drawable
.
ic_vpn_key_black_24dp
,
it
)
DrawableHelper
.
wrapDrawable
(
lockDrawable
)
DrawableHelper
.
tintDrawable
(
lockDrawable
,
this
,
R
.
color
.
colorDrawableTintGrey
)
DrawableHelper
.
tintDrawable
(
lockDrawable
,
it
,
R
.
color
.
colorDrawableTintGrey
)
DrawableHelper
.
compoundDrawable
(
text_two_factor_auth
,
lockDrawable
)
}
}
...
...
app/src/main/java/chat/rocket/android/chatroom/ui/ChatRoomFragment.kt
View file @
15abcd8c
...
...
@@ -4,7 +4,6 @@ import android.Manifest
import
android.app.Activity
import
android.content.ClipData
import
android.content.ClipboardManager
import
android.content.Context
import
android.content.Intent
import
android.content.pm.PackageManager
import
android.net.Uri
...
...
@@ -18,6 +17,7 @@ import android.support.v7.widget.DefaultItemAnimator
import
android.support.v7.widget.LinearLayoutManager
import
android.support.v7.widget.RecyclerView
import
android.view.*
import
androidx.core.content.systemService
import
chat.rocket.android.R
import
chat.rocket.android.chatroom.adapter.*
import
chat.rocket.android.chatroom.presentation.ChatRoomPresenter
...
...
@@ -41,7 +41,6 @@ import kotlinx.android.synthetic.main.message_composer.*
import
kotlinx.android.synthetic.main.message_list.*
import
java.util.concurrent.atomic.AtomicInteger
import
javax.inject.Inject
import
kotlin.math.absoluteValue
fun
newInstance
(
chatRoomId
:
String
,
chatRoomName
:
String
,
...
...
@@ -185,6 +184,7 @@ class ChatRoomFragment : Fragment(), ChatRoomView, EmojiKeyboardListener, EmojiR
}
override
fun
showMessages
(
dataSet
:
List
<
BaseViewModel
<*
>>)
{
ui
{
// track the message sent immediately after the current message
var
prevMessageViewModel
:
MessageViewModel
?
=
null
...
...
@@ -206,7 +206,6 @@ class ChatRoomFragment : Fragment(), ChatRoomView, EmojiKeyboardListener, EmojiR
}
}
activity
?.
apply
{
if
(
recycler_view
.
adapter
==
null
)
{
adapter
=
ChatRoomAdapter
(
chatRoomType
,
chatRoomName
,
presenter
,
reactionListener
=
this
@ChatRoomFragment
)
...
...
@@ -284,6 +283,7 @@ class ChatRoomFragment : Fragment(), ChatRoomView, EmojiKeyboardListener, EmojiR
}
override
fun
sendMessage
(
text
:
String
)
{
ui
{
if
(!
text
.
isBlank
())
{
if
(!
text
.
startsWith
(
"/"
))
{
presenter
.
sendMessage
(
chatRoomId
,
text
,
editingMessageId
)
...
...
@@ -292,6 +292,7 @@ class ChatRoomFragment : Fragment(), ChatRoomView, EmojiKeyboardListener, EmojiR
}
}
}
}
override
fun
uploadFile
(
uri
:
Uri
)
{
// TODO Just leaving a blank message that comes with the file for now. In the future lets add the possibility to add a message with the file to be uploaded.
...
...
@@ -303,41 +304,54 @@ class ChatRoomFragment : Fragment(), ChatRoomView, EmojiKeyboardListener, EmojiR
}
override
fun
showNewMessage
(
message
:
List
<
BaseViewModel
<*
>>)
{
ui
{
adapter
.
prependData
(
message
)
recycler_view
.
scrollToPosition
(
0
)
verticalScrollOffset
.
set
(
0
)
}
}
override
fun
disableSendMessageButton
()
{
ui
{
button_send
.
isEnabled
=
false
}
}
override
fun
enableSendMessageButton
()
{
ui
{
button_send
.
isEnabled
=
true
text_message
.
isEnabled
=
true
clearMessageComposition
()
}
}
override
fun
clearMessageComposition
()
{
ui
{
citation
=
null
editingMessageId
=
null
text_message
.
textContent
=
""
actionSnackbar
.
dismiss
()
}
}
override
fun
dispatchUpdateMessage
(
index
:
Int
,
message
:
List
<
BaseViewModel
<*
>>)
{
ui
{
adapter
.
updateItem
(
message
.
last
())
if
(
message
.
size
>
1
)
{
adapter
.
prependData
(
listOf
(
message
.
first
()))
}
}
}
override
fun
dispatchDeleteMessage
(
msgId
:
String
)
{
ui
{
adapter
.
removeItem
(
msgId
)
}
}
override
fun
showReplyingAction
(
username
:
String
,
replyMarkdown
:
String
,
quotedMessage
:
String
)
{
activity
?.
apply
{
ui
{
citation
=
replyMarkdown
actionSnackbar
.
title
=
username
actionSnackbar
.
text
=
quotedMessage
...
...
@@ -352,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
)
{
ui
{
showToast
(
message
)
}
}
override
fun
showMessage
(
resId
:
Int
)
{
ui
{
showToast
(
resId
)
}
}
override
fun
showGenericErrorMessage
()
=
showMessage
(
getString
(
R
.
string
.
msg_generic_error
))
override
fun
populatePeopleSuggestions
(
members
:
List
<
PeopleSuggestionViewModel
>)
{
ui
{
suggestions_view
.
addItems
(
"@"
,
members
)
}
}
override
fun
populateRoomSuggestions
(
chatRooms
:
List
<
ChatRoomSuggestionViewModel
>)
{
ui
{
suggestions_view
.
addItems
(
"#"
,
chatRooms
)
}
}
override
fun
populateCommandSuggestions
(
commands
:
List
<
CommandSuggestionViewModel
>)
{
ui
{
suggestions_view
.
addItems
(
"/"
,
commands
)
}
}
override
fun
copyToClipboard
(
message
:
String
)
{
activity
?.
apply
{
val
clipboard
=
getSystemService
(
Context
.
CLIPBOARD_SERVICE
)
as
ClipboardManager
ui
{
val
clipboard
:
ClipboardManager
=
it
.
systemService
()
clipboard
.
primaryClip
=
ClipData
.
newPlainText
(
""
,
message
)
}
}
override
fun
showEditingAction
(
roomId
:
String
,
messageId
:
String
,
text
:
String
)
{
activity
?.
apply
{
ui
{
actionSnackbar
.
title
=
getString
(
R
.
string
.
action_title_editing
)
actionSnackbar
.
text
=
text
actionSnackbar
.
show
()
...
...
@@ -422,7 +450,7 @@ class ChatRoomFragment : Fragment(), ChatRoomView, EmojiKeyboardListener, EmojiR
}
override
fun
showReactionsPopup
(
messageId
:
String
)
{
context
?.
let
{
ui
{
val
emojiPickerPopup
=
EmojiPickerPopup
(
it
)
emojiPickerPopup
.
listener
=
object
:
EmojiListenerAdapter
()
{
override
fun
onEmojiAdded
(
emoji
:
Emoji
)
{
...
...
@@ -435,11 +463,11 @@ class ChatRoomFragment : Fragment(), ChatRoomView, EmojiKeyboardListener, EmojiR
private
fun
setReactionButtonIcon
(
@DrawableRes
drawableId
:
Int
)
{
button_add_reaction
.
setImageResource
(
drawableId
)
button_add_reaction
.
setTag
(
drawableId
)
button_add_reaction
.
tag
=
drawableId
}
override
fun
showFileSelection
(
filter
:
Array
<
String
>)
{
activity
?.
let
{
ui
{
if
(
ContextCompat
.
checkSelfPermission
(
it
,
Manifest
.
permission
.
READ_EXTERNAL_STORAGE
)
!=
PackageManager
.
PERMISSION_GRANTED
)
{
ActivityCompat
.
requestPermissions
(
it
,
...
...
@@ -459,7 +487,7 @@ class ChatRoomFragment : Fragment(), ChatRoomView, EmojiKeyboardListener, EmojiR
1
->
{
if
(!(
grantResults
.
isNotEmpty
()
&&
grantResults
.
first
()
==
PackageManager
.
PERMISSION_GRANTED
))
{
handler
.
postDelayed
({
hideAttachmentOptions
()
ui
{
hideAttachmentOptions
()
}
},
400
)
}
}
...
...
@@ -471,7 +499,7 @@ class ChatRoomFragment : Fragment(), ChatRoomView, EmojiKeyboardListener, EmojiR
}
override
fun
showConnectionState
(
state
:
State
)
{
activity
?.
apply
{
ui
{
connection_status_text
.
fadeIn
()
handler
.
removeCallbacks
(
dismissStatus
)
when
(
state
)
{
...
...
@@ -489,11 +517,13 @@ class ChatRoomFragment : Fragment(), ChatRoomView, EmojiKeyboardListener, EmojiR
}
override
fun
onJoined
()
{
ui
{
input_container
.
setVisible
(
true
)
button_join_chat
.
setVisible
(
false
)
isSubscribed
=
true
setupMessageComposer
()
}
}
private
val
dismissStatus
=
{
connection_status_text
.
fadeOut
()
...
...
app/src/main/java/chat/rocket/android/chatroom/ui/PinnedMessagesFragment.kt
View file @
15abcd8c
...
...
@@ -16,6 +16,7 @@ import chat.rocket.android.chatroom.viewmodel.BaseViewModel
import
chat.rocket.android.helper.EndlessRecyclerViewScrollListener
import
chat.rocket.android.util.extensions.setVisible
import
chat.rocket.android.util.extensions.showToast
import
chat.rocket.android.util.extensions.ui
import
dagger.android.support.AndroidSupportInjection
import
kotlinx.android.synthetic.main.fragment_pinned_messages.*
import
javax.inject.Inject
...
...
@@ -62,22 +63,30 @@ class PinnedMessagesFragment : Fragment(), PinnedMessagesView {
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
)
{
ui
{
showToast
(
resId
)
}
}
override
fun
showMessage
(
message
:
String
)
{
ui
{
showToast
(
message
)
}
}
override
fun
showGenericErrorMessage
()
=
showMessage
(
getString
(
R
.
string
.
msg_generic_error
))
override
fun
showPinnedMessages
(
pinnedMessages
:
List
<
BaseViewModel
<*
>>)
{
activity
?.
apply
{
ui
{
if
(
recycler_view_pinned
.
adapter
==
null
)
{
// TODO - add a better constructor for this case...
adapter
=
ChatRoomAdapter
(
chatRoomType
,
chatRoomName
,
null
,
false
)
...
...
app/src/main/java/chat/rocket/android/chatrooms/presentation/ChatRoomsPresenter.kt
View file @
15abcd8c
...
...
@@ -270,6 +270,7 @@ class ChatRoomsPresenter @Inject constructor(private val view: ChatRoomsView,
// TODO - Temporary stuff, remove when adding DB support
private
suspend
fun
subscribeRoomUpdates
()
{
manager
.
addStatusChannel
(
stateChannel
)
view
.
showConnectionState
(
client
.
state
)
manager
.
addRoomsAndSubscriptionsChannel
(
subscriptionsChannel
)
launch
(
CommonPool
+
strategy
.
jobs
)
{
for
(
message
in
subscriptionsChannel
)
{
...
...
app/src/main/java/chat/rocket/android/chatrooms/ui/ChatRoomsAdapter.kt
View file @
15abcd8c
...
...
@@ -24,7 +24,6 @@ import chat.rocket.android.util.extensions.textContent
import
chat.rocket.common.model.RoomType
import
chat.rocket.core.model.ChatRoom
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.unread_messages_badge.view.*
...
...
app/src/main/java/chat/rocket/android/chatrooms/ui/ChatRoomsFragment.kt
View file @
15abcd8c
...
...
@@ -32,9 +32,11 @@ import dagger.android.support.AndroidSupportInjection
import
kotlinx.android.synthetic.main.fragment_chat_rooms.*
import
kotlinx.coroutines.experimental.CommonPool
import
kotlinx.coroutines.experimental.Job
import
kotlinx.coroutines.experimental.NonCancellable.isActive
import
kotlinx.coroutines.experimental.android.UI
import
kotlinx.coroutines.experimental.async
import
kotlinx.coroutines.experimental.launch
import
timber.log.Timber
import
javax.inject.Inject
...
...
@@ -101,8 +103,8 @@ class ChatRoomsFragment : Fragment(), ChatRoomsView {
}
override
fun
onOptionsItemSelected
(
item
:
MenuItem
?
):
Boolean
{
when
(
item
?
.
itemId
)
{
override
fun
onOptionsItemSelected
(
item
:
MenuItem
):
Boolean
{
when
(
item
.
itemId
)
{
R
.
id
.
action_sort
->
{
val
dialogLayout
=
layoutInflater
.
inflate
(
R
.
layout
.
chatroom_sort_dialog
,
null
)
val
sortType
=
SharedPreferenceHelper
.
getInt
(
Constants
.
CHATROOM_SORT_TYPE_KEY
,
ChatRoomsSortOrder
.
ACTIVITY
)
...
...
@@ -154,9 +156,8 @@ class ChatRoomsFragment : Fragment(), ChatRoomsView {
}
override
suspend
fun
updateChatRooms
(
newDataSet
:
List
<
ChatRoom
>)
{
activity
?.
apply
{
listJob
?.
cancel
()
listJob
=
launch
(
UI
)
{
listJob
=
ui
{
val
adapter
=
recycler_view
.
adapter
as
SimpleSectionedRecyclerViewAdapter
// FIXME https://fabric.io/rocketchat3/android/apps/chat.rocket.android/issues/5ac2916c36c7b235275ccccf
// TODO - fix this bug to re-enable DiffUtil
...
...
@@ -174,30 +175,38 @@ class ChatRoomsFragment : Fragment(), ChatRoomsView {
}
}
}
}
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
()
{
if
(
view_loading
!=
null
)
{
ui
{
view_loading
.
setVisible
(
false
)
}
}
override
fun
showMessage
(
resId
:
Int
)
{
ui
{
showToast
(
resId
)
}
}
override
fun
showMessage
(
message
:
String
)
{
ui
{
showToast
(
message
)
}
}
override
fun
showGenericErrorMessage
()
=
showMessage
(
getString
(
R
.
string
.
msg_generic_error
))
override
fun
showConnectionState
(
state
:
State
)
{
activity
?.
apply
{
Timber
.
d
(
"Got new state: $state"
)
ui
{
connection_status_text
.
fadeIn
()
handler
.
removeCallbacks
(
dismissStatus
)
when
(
state
)
{
...
...
@@ -221,22 +230,25 @@ class ChatRoomsFragment : Fragment(), ChatRoomsView {
}
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
()
{
activity
?.
apply
{
recycler_view
.
layoutManager
=
LinearLayoutManager
(
this
,
LinearLayoutManager
.
VERTICAL
,
false
)
recycler_view
.
addItemDecoration
(
DividerItemDecoration
(
this
,
ui
{
recycler_view
.
layoutManager
=
LinearLayoutManager
(
it
,
LinearLayoutManager
.
VERTICAL
,
false
)
recycler_view
.
addItemDecoration
(
DividerItemDecoration
(
it
,
resources
.
getDimensionPixelSize
(
R
.
dimen
.
divider_item_decorator_bound_start
),
resources
.
getDimensionPixelSize
(
R
.
dimen
.
divider_item_decorator_bound_end
)))
recycler_view
.
itemAnimator
=
DefaultItemAnimator
()
// TODO - use a ViewModel Mapper instead of using settings on the adapter
val
baseAdapter
=
ChatRoomsAdapter
(
this
,
settingsRepository
.
get
(
serverInteractor
.
get
()
!!
),
localRepository
)
{
chatRoom
->
presenter
.
loadChatRoom
(
chatRoom
)
}
val
baseAdapter
=
ChatRoomsAdapter
(
it
,
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
}
}
...
...
app/src/main/java/chat/rocket/android/members/presentation/MembersNavigator.kt
View file @
15abcd8c
package
chat.rocket.android.members.presentation
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
)
{
...
...
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 @
15abcd8c
package
chat.rocket.android.member.ui
package
chat.rocket.android.member
s
.ui
import
android.os.Bundle
import
android.support.design.widget.BottomSheetDialogFragment
...
...
app/src/main/java/chat/rocket/android/members/ui/MembersFragment.kt
View file @
15abcd8c
...
...
@@ -19,6 +19,7 @@ import chat.rocket.android.members.viewmodel.MemberViewModel
import
chat.rocket.android.util.extensions.inflate
import
chat.rocket.android.util.extensions.setVisible
import
chat.rocket.android.util.extensions.showToast
import
chat.rocket.android.util.extensions.ui
import
chat.rocket.android.widget.DividerItemDecoration
import
dagger.android.support.AndroidSupportInjection
import
kotlinx.android.synthetic.main.fragment_members.*
...
...
@@ -70,7 +71,7 @@ class MembersFragment : Fragment(), MembersView {
}
override
fun
showMembers
(
dataSet
:
List
<
MemberViewModel
>,
total
:
Long
)
{
activity
?.
apply
{
ui
{
setupToolbar
(
total
)
if
(
adapter
.
itemCount
==
0
)
{
adapter
.
prependData
(
dataSet
)
...
...
@@ -84,8 +85,8 @@ class MembersFragment : Fragment(), MembersView {
}
else
{
adapter
.
appendData
(
dataSet
)
}
if
(
this
is
ChatRoomActivity
)
{
this
.
showRoomTypeIcon
(
false
)
if
(
it
is
ChatRoomActivity
)
{
it
.
showRoomTypeIcon
(
false
)
}
}
}
...
...
@@ -98,29 +99,37 @@ class MembersFragment : Fragment(), MembersView {
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
)
{
ui
{
showToast
(
resId
)
}
}
override
fun
showMessage
(
message
:
String
)
{
ui
{
showToast
(
message
)
}
}
override
fun
showGenericErrorMessage
()
=
showMessage
(
getString
(
R
.
string
.
msg_generic_error
))
private
fun
setupRecyclerView
()
{
activity
?.
apply
{
ui
{
recycler_view
.
layoutManager
=
linearLayoutManager
recycler_view
.
addItemDecoration
(
DividerItemDecoration
(
this
))
recycler_view
.
addItemDecoration
(
DividerItemDecoration
(
it
))
recycler_view
.
adapter
=
adapter
}
}
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 @
15abcd8c
...
...
@@ -15,7 +15,7 @@ import java.util.concurrent.CopyOnWriteArrayList
class
ConnectionManager
(
internal
val
client
:
RocketChatClient
)
{
private
val
statusChannelList
=
CopyOnWriteArrayList
<
Channel
<
State
>>()
private
val
statusChannel
=
Channel
<
State
>()
private
val
statusChannel
=
Channel
<
State
>(
Channel
.
CONFLATED
)
private
var
connectJob
:
Job
?
=
null
private
val
roomAndSubscriptionChannels
=
ArrayList
<
Channel
<
StreamMessage
<
BaseRoom
>>>()
...
...
@@ -67,7 +67,8 @@ class ConnectionManager(internal val client: RocketChatClient) {
}
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 @
15abcd8c
...
...
@@ -11,7 +11,10 @@ import chat.rocket.android.util.extensions.asObservable
import
chat.rocket.android.util.extensions.inflate
import
chat.rocket.android.util.extensions.textContent
import
android.support.v7.view.ActionMode
import
chat.rocket.android.util.extensions.ui
import
dagger.android.support.AndroidSupportInjection
import
io.reactivex.disposables.CompositeDisposable
import
io.reactivex.disposables.Disposable
import
io.reactivex.rxkotlin.Observables
import
kotlinx.android.synthetic.main.fragment_password.*
import
javax.inject.Inject
...
...
@@ -19,6 +22,7 @@ import javax.inject.Inject
class
PasswordFragment
:
Fragment
(),
PasswordView
,
android
.
support
.
v7
.
view
.
ActionMode
.
Callback
{
@Inject
lateinit
var
presenter
:
PasswordPresenter
private
var
actionMode
:
ActionMode
?
=
null
private
val
disposables
=
CompositeDisposable
()
companion
object
{
fun
newInstance
()
=
PasswordFragment
()
...
...
@@ -34,14 +38,21 @@ class PasswordFragment: Fragment(), PasswordView, android.support.v7.view.Action
override
fun
onViewCreated
(
view
:
View
,
savedInstanceState
:
Bundle
?)
{
super
.
onViewCreated
(
view
,
savedInstanceState
)
listenToChanges
()
disposables
.
add
(
listenToChanges
())
}
override
fun
onDestroyView
()
{
disposables
.
clear
()
super
.
onDestroyView
()
}
override
fun
hideLoading
()
{
ui
{
layout_new_password
.
visibility
=
View
.
VISIBLE
layout_confirm_password
.
visibility
=
View
.
VISIBLE
view_loading
.
visibility
=
View
.
GONE
}
}
override
fun
onActionItemClicked
(
mode
:
ActionMode
,
menuItem
:
MenuItem
):
Boolean
{
return
when
(
menuItem
.
itemId
)
{
...
...
@@ -69,10 +80,12 @@ class PasswordFragment: Fragment(), PasswordView, android.support.v7.view.Action
}
override
fun
showLoading
()
{
ui
{
layout_new_password
.
visibility
=
View
.
GONE
layout_confirm_password
.
visibility
=
View
.
GONE
view_loading
.
visibility
=
View
.
VISIBLE
}
}
override
fun
showPasswordFailsUpdateMessage
(
error
:
String
?)
{
showToast
(
"Password fails to update: "
+
error
)
...
...
@@ -84,8 +97,9 @@ class PasswordFragment: Fragment(), PasswordView, android.support.v7.view.Action
private
fun
finishActionMode
()
=
actionMode
?.
finish
()
private
fun
listenToChanges
()
{
Observables
.
combineLatest
(
text_new_password
.
asObservable
(),
text_confirm_password
.
asObservable
()).
subscribe
{
private
fun
listenToChanges
():
Disposable
{
return
Observables
.
combineLatest
(
text_new_password
.
asObservable
(),
text_confirm_password
.
asObservable
()).
subscribe
{
val
textPassword
=
text_new_password
.
textContent
val
textConfirmPassword
=
text_confirm_password
.
textContent
...
...
@@ -97,7 +111,9 @@ class PasswordFragment: Fragment(), PasswordView, android.support.v7.view.Action
}
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
()
{
...
...
app/src/main/java/chat/rocket/android/util/extensions/Fragment.kt
0 → 100644
View file @
15abcd8c
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/layout/item_chat.xml
View file @
15abcd8c
...
...
@@ -10,14 +10,14 @@
android:paddingTop=
"@dimen/chat_item_top_and_bottom_padding"
android:paddingBottom=
"@dimen/chat_item_top_and_bottom_padding"
>
<include
android:id=
"@+id/layout_avatar"
layout=
"@layout/avatar"
<com.facebook.drawee.view.SimpleDraweeView
android:id=
"@+id/image_avatar"
android:layout_width=
"40dp"
android:layout_height=
"40dp"
app:roundedCornerRadius=
"3dp"
android:layout_marginTop=
"6dp"
app:layout_constraintStart_toStartOf=
"parent"
app:layout_constraintTop_toTopOf=
"parent"
/>
app:layout_constraintTop_toTopOf=
"parent"
/>
<TextView
android:id=
"@+id/text_chat_name"
...
...
@@ -25,7 +25,7 @@
android:layout_width=
"0dp"
android:layout_height=
"wrap_content"
android:layout_marginStart=
"16dp"
app:layout_constraintStart_toEndOf=
"@id/
layout
_avatar"
app:layout_constraintStart_toEndOf=
"@id/
image
_avatar"
android:textDirection=
"locale"
tools:text=
"General"
/>
...
...
@@ -51,7 +51,7 @@
app:layout_constraintTop_toBottomOf=
"@id/text_chat_name"
app:layout_constraintEnd_toStartOf=
"@id/layout_unread_messages_badge"
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
android:id=
"@+id/layout_unread_messages_badge"
...
...
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