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
857abccc
Unverified
Commit
857abccc
authored
Dec 01, 2017
by
Leonardo Aramaki
Committed by
GitHub
Dec 01, 2017
Browse files
Options
Browse Files
Download
Plain Diff
Merge pull request #596 from RocketChat/fix/logout-and-login-same-user
[FIX] Logout and login with the same user
parents
9bcef2c4
b1a1e4a3
Changes
12
Hide whitespace changes
Inline
Side-by-side
Showing
12 changed files
with
423 additions
and
418 deletions
+423
-418
build.gradle
app/build.gradle
+3
-2
MainActivity.java
.../main/java/chat/rocket/android/activity/MainActivity.java
+2
-5
MainContract.java
.../main/java/chat/rocket/android/activity/MainContract.java
+1
-1
MainPresenter.java
...main/java/chat/rocket/android/activity/MainPresenter.java
+3
-1
RoomPresenter.java
.../chat/rocket/android/fragment/chatroom/RoomPresenter.java
+2
-3
LoginPresenter.java
...rocket/android/fragment/server_config/LoginPresenter.java
+73
-73
SidebarMainContract.java
.../rocket/android/fragment/sidebar/SidebarMainContract.java
+2
-2
SidebarMainFragment.java
.../rocket/android/fragment/sidebar/SidebarMainFragment.java
+298
-307
SidebarMainPresenter.java
...rocket/android/fragment/sidebar/SidebarMainPresenter.java
+24
-18
RealmBasedConnectivityManager.java
...rocket/android/service/RealmBasedConnectivityManager.java
+5
-2
RocketChatWebSocketThread.java
...hat/rocket/android/service/RocketChatWebSocketThread.java
+9
-3
MessageInteractor.kt
...in/java/chat/rocket/core/interactors/MessageInteractor.kt
+1
-1
No files found.
app/build.gradle
View file @
857abccc
...
...
@@ -3,7 +3,8 @@ apply plugin: 'io.fabric'
repositories
{
maven
{
url
'https://maven.fabric.io/public'
}
maven
{
url
'https://github.com/uPhyca/stetho-realm/raw/master/maven-repo'
}
// maven { url 'https://github.com/uPhyca/stetho-realm/raw/master/maven-repo' }
maven
{
url
'https://github.com/WickeDev/stetho-realm/raw/master/maven-repo'
}
}
apply
plugin:
'kotlin-android'
...
...
@@ -100,7 +101,7 @@ ext {
playLibVersion
=
'11.6.0'
stethoVersion
=
'1.5.0'
stethoOkhttp3Version
=
'1.5.0'
stethoRealmVersion
=
'2.
1.0
'
stethoRealmVersion
=
'2.
2.2
'
rxbindingVersion
=
'2.0.0'
rxlifecycleVersion
=
'2.1.0'
icepickVersion
=
'3.2.0'
...
...
app/src/main/java/chat/rocket/android/activity/MainActivity.java
View file @
857abccc
...
...
@@ -347,15 +347,12 @@ public class MainActivity extends AbstractAuthedActivity implements MainContract
@DebugLog
public
void
onLogout
()
{
presenter
.
prepareToLogout
();
if
(
new
RocketChatCache
(
getApplicationContext
()).
getSelectedServerHostname
()
==
null
)
{
finish
();
LaunchUtil
.
showMainActivity
(
this
);
}
else
{
onHostnameUpdated
();
}
}
@DebugLog
public
void
beforeLogoutCleanUp
()
{
presenter
.
beforeLogoutCleanUp
();
}
}
app/src/main/java/chat/rocket/android/activity/MainContract.java
View file @
857abccc
...
...
@@ -40,6 +40,6 @@ public interface MainContract {
void
loadSignedInServers
(
String
hostname
);
void
beforeLogoutCleanUp
();
void
prepareToLogout
();
}
}
app/src/main/java/chat/rocket/android/activity/MainPresenter.java
View file @
857abccc
...
...
@@ -28,6 +28,7 @@ import chat.rocket.core.models.Session;
import
chat.rocket.core.models.User
;
import
chat.rocket.core.repositories.PublicSettingRepository
;
import
chat.rocket.core.utils.Pair
;
import
hugo.weaving.DebugLog
;
import
io.reactivex.Flowable
;
import
io.reactivex.android.schedulers.AndroidSchedulers
;
import
io.reactivex.disposables.Disposable
;
...
...
@@ -133,8 +134,9 @@ public class MainPresenter extends BasePresenter<MainContract.View>
addSubscription
(
subscription
);
}
@DebugLog
@Override
public
void
beforeLogoutCleanUp
()
{
public
void
prepareToLogout
()
{
clearSubscriptions
();
}
...
...
app/src/main/java/chat/rocket/android/fragment/chatroom/RoomPresenter.java
View file @
857abccc
...
...
@@ -77,7 +77,7 @@ public class RoomPresenter extends BasePresenter<RoomContract.View>
.
observeOn
(
AndroidSchedulers
.
mainThread
())
.
subscribe
(
success
->
{
if
(
success
)
{
if
(
!
success
)
{
connectivityManagerApi
.
keepAliveServer
();
}
},
...
...
@@ -89,14 +89,13 @@ public class RoomPresenter extends BasePresenter<RoomContract.View>
@Override
public
void
loadMoreMessages
()
{
final
Disposable
subscription
=
getSingleRoom
()
.
flatMap
(
messageInteractor:
:
loadMoreMessages
)
.
subscribeOn
(
AndroidSchedulers
.
from
(
BackgroundLooper
.
get
()))
.
observeOn
(
AndroidSchedulers
.
mainThread
())
.
subscribe
(
success
->
{
if
(
success
)
{
if
(
!
success
)
{
connectivityManagerApi
.
keepAliveServer
();
}
},
...
...
app/src/main/java/chat/rocket/android/fragment/server_config/LoginPresenter.java
View file @
857abccc
...
...
@@ -18,81 +18,81 @@ import chat.rocket.core.repositories.PublicSettingRepository;
import
io.reactivex.android.schedulers.AndroidSchedulers
;
public
class
LoginPresenter
extends
BasePresenter
<
LoginContract
.
View
>
implements
LoginContract
.
Presenter
{
private
final
LoginServiceConfigurationRepository
loginServiceConfigurationRepository
;
private
final
PublicSettingRepository
publicSettingRepository
;
private
final
MethodCallHelper
methodCallHelper
;
public
LoginPresenter
(
LoginServiceConfigurationRepository
loginServiceConfigurationRepository
,
PublicSettingRepository
publicSettingRepository
,
MethodCallHelper
methodCallHelper
)
{
this
.
loginServiceConfigurationRepository
=
loginServiceConfigurationRepository
;
this
.
publicSettingRepository
=
publicSettingRepository
;
this
.
methodCallHelper
=
methodCallHelper
;
}
@Override
public
void
bindView
(
@NonNull
LoginContract
.
View
view
)
{
super
.
bindView
(
view
);
getLoginServices
();
}
@Override
public
void
login
(
String
username
,
String
password
)
{
if
(
TextUtils
.
isEmpty
(
username
)
||
TextUtils
.
isEmpty
(
password
))
{
return
;
implements
LoginContract
.
Presenter
{
private
final
LoginServiceConfigurationRepository
loginServiceConfigurationRepository
;
private
final
PublicSettingRepository
publicSettingRepository
;
private
final
MethodCallHelper
methodCallHelper
;
public
LoginPresenter
(
LoginServiceConfigurationRepository
loginServiceConfigurationRepository
,
PublicSettingRepository
publicSettingRepository
,
MethodCallHelper
methodCallHelper
)
{
this
.
loginServiceConfigurationRepository
=
loginServiceConfigurationRepository
;
this
.
publicSettingRepository
=
publicSettingRepository
;
this
.
methodCallHelper
=
methodCallHelper
;
}
view
.
showLoader
();
addSubscription
(
publicSettingRepository
.
getById
(
PublicSettingsConstants
.
LDAP
.
ENABLE
)
.
subscribeOn
(
AndroidSchedulers
.
from
(
BackgroundLooper
.
get
()))
.
observeOn
(
AndroidSchedulers
.
mainThread
())
.
subscribe
(
publicSettingOptional
->
doLogin
(
username
,
password
,
publicSettingOptional
),
Logger:
:
report
)
);
}
private
void
getLoginServices
()
{
addSubscription
(
loginServiceConfigurationRepository
.
getAll
()
.
subscribeOn
(
AndroidSchedulers
.
from
(
BackgroundLooper
.
get
()))
.
observeOn
(
AndroidSchedulers
.
mainThread
())
.
subscribe
(
loginServiceConfigurations
->
view
.
showLoginServices
(
loginServiceConfigurations
),
Logger:
:
report
)
);
}
private
void
doLogin
(
String
username
,
String
password
,
Optional
<
PublicSetting
>
optional
)
{
call
(
username
,
password
,
optional
)
.
continueWith
(
task
->
{
if
(
task
.
isFaulted
())
{
view
.
hideLoader
();
final
Exception
error
=
task
.
getError
();
if
(
error
instanceof
TwoStepAuthException
)
{
view
.
showTwoStepAuth
();
}
else
{
view
.
showError
(
error
.
getMessage
());
}
}
return
null
;
},
Task
.
UI_THREAD_EXECUTOR
);
}
private
Task
<
Void
>
call
(
String
username
,
String
password
,
Optional
<
PublicSetting
>
optional
)
{
if
(
optional
.
isPresent
()
&&
optional
.
get
().
getValueAsBoolean
())
{
return
methodCallHelper
.
loginWithLdap
(
username
,
password
);
@Override
public
void
bindView
(
@NonNull
LoginContract
.
View
view
)
{
super
.
bindView
(
view
);
getLoginServices
();
}
@Override
public
void
login
(
String
username
,
String
password
)
{
if
(
TextUtils
.
isEmpty
(
username
)
||
TextUtils
.
isEmpty
(
password
))
{
return
;
}
view
.
showLoader
();
addSubscription
(
publicSettingRepository
.
getById
(
PublicSettingsConstants
.
LDAP
.
ENABLE
)
.
subscribeOn
(
AndroidSchedulers
.
from
(
BackgroundLooper
.
get
()))
.
observeOn
(
AndroidSchedulers
.
mainThread
())
.
subscribe
(
publicSettingOptional
->
doLogin
(
username
,
password
,
publicSettingOptional
),
Logger:
:
report
)
);
}
private
void
getLoginServices
()
{
addSubscription
(
loginServiceConfigurationRepository
.
getAll
()
.
subscribeOn
(
AndroidSchedulers
.
from
(
BackgroundLooper
.
get
()))
.
observeOn
(
AndroidSchedulers
.
mainThread
())
.
subscribe
(
loginServiceConfigurations
->
view
.
showLoginServices
(
loginServiceConfigurations
),
Logger:
:
report
)
);
}
return
methodCallHelper
.
loginWithEmail
(
username
,
password
);
}
private
void
doLogin
(
String
username
,
String
password
,
Optional
<
PublicSetting
>
optional
)
{
call
(
username
,
password
,
optional
)
.
continueWith
(
task
->
{
if
(
task
.
isFaulted
())
{
view
.
hideLoader
();
final
Exception
error
=
task
.
getError
();
if
(
error
instanceof
TwoStepAuthException
)
{
view
.
showTwoStepAuth
();
}
else
{
view
.
showError
(
error
.
getMessage
());
}
}
return
null
;
},
Task
.
UI_THREAD_EXECUTOR
);
}
private
Task
<
Void
>
call
(
String
username
,
String
password
,
Optional
<
PublicSetting
>
optional
)
{
if
(
optional
.
isPresent
()
&&
optional
.
get
().
getValueAsBoolean
())
{
return
methodCallHelper
.
loginWithLdap
(
username
,
password
);
}
return
methodCallHelper
.
loginWithEmail
(
username
,
password
);
}
}
app/src/main/java/chat/rocket/android/fragment/sidebar/SidebarMainContract.java
View file @
857abccc
...
...
@@ -25,7 +25,7 @@ public interface SidebarMainContract {
void
show
(
User
user
);
void
on
LogoutCleanUp
();
void
on
PreparedToLogOut
();
}
interface
Presenter
extends
BaseContract
.
Presenter
<
View
>
{
...
...
@@ -48,6 +48,6 @@ public interface SidebarMainContract {
void
onLogout
(
Continuation
<
Void
,
Object
>
continuation
);
void
beforeLogoutCleanUp
();
void
prepareToLogOut
();
}
}
\ No newline at end of file
app/src/main/java/chat/rocket/android/fragment/sidebar/SidebarMainFragment.java
View file @
857abccc
...
...
@@ -22,7 +22,6 @@ import java.util.ArrayList;
import
java.util.Collections
;
import
java.util.List
;
import
bolts.Task
;
import
chat.rocket.android.BuildConfig
;
import
chat.rocket.android.R
;
import
chat.rocket.android.RocketChatCache
;
...
...
@@ -51,323 +50,315 @@ import chat.rocket.persistence.realm.repositories.RealmServerInfoRepository;
import
chat.rocket.persistence.realm.repositories.RealmSessionRepository
;
import
chat.rocket.persistence.realm.repositories.RealmSpotlightRepository
;
import
chat.rocket.persistence.realm.repositories.RealmUserRepository
;
import
hugo.weaving.DebugLog
;
import
io.reactivex.android.schedulers.AndroidSchedulers
;
import
io.reactivex.disposables.Disposable
;
public
class
SidebarMainFragment
extends
AbstractFragment
implements
SidebarMainContract
.
View
{
private
SidebarMainContract
.
Presenter
presenter
;
private
RoomListAdapter
adapter
;
private
SearchView
searchView
;
private
TextView
loadMoreResultsText
;
private
List
<
RoomSidebar
>
roomSidebarList
=
Collections
.
emptyList
();
private
Disposable
spotlightDisposable
;
private
String
hostname
;
private
static
final
String
HOSTNAME
=
"hostname"
;
public
SidebarMainFragment
()
{}
/**
* build SidebarMainFragment with hostname.
*/
public
static
SidebarMainFragment
create
(
String
hostname
)
{
Bundle
args
=
new
Bundle
();
args
.
putString
(
HOSTNAME
,
hostname
);
SidebarMainFragment
fragment
=
new
SidebarMainFragment
();
fragment
.
setArguments
(
args
);
return
fragment
;
}
@Override
public
void
onCreate
(
@Nullable
Bundle
savedInstanceState
)
{
super
.
onCreate
(
savedInstanceState
);
hostname
=
getArguments
().
getString
(
HOSTNAME
);
RealmUserRepository
userRepository
=
new
RealmUserRepository
(
hostname
);
AbsoluteUrlHelper
absoluteUrlHelper
=
new
AbsoluteUrlHelper
(
hostname
,
new
RealmServerInfoRepository
(),
userRepository
,
new
SessionInteractor
(
new
RealmSessionRepository
(
hostname
))
);
RocketChatCache
rocketChatCache
=
new
RocketChatCache
(
getContext
().
getApplicationContext
());
presenter
=
new
SidebarMainPresenter
(
hostname
,
new
RoomInteractor
(
new
RealmRoomRepository
(
hostname
)),
userRepository
,
rocketChatCache
,
absoluteUrlHelper
,
new
MethodCallHelper
(
getContext
(),
hostname
),
new
RealmSpotlightRepository
(
hostname
)
);
}
@Nullable
@Override
public
View
onCreateView
(
LayoutInflater
inflater
,
@Nullable
ViewGroup
container
,
@Nullable
Bundle
savedInstanceState
)
{
View
view
=
super
.
onCreateView
(
inflater
,
container
,
savedInstanceState
);
presenter
.
bindView
(
this
);
return
view
;
}
@Override
public
void
onDestroyView
()
{
presenter
.
release
();
super
.
onDestroyView
();
}
@Override
public
void
onResume
()
{
super
.
onResume
();
}
@Override
public
void
onPause
()
{
super
.
onPause
();
}
@Override
protected
int
getLayout
()
{
return
R
.
layout
.
fragment_sidebar_main
;
}
@SuppressLint
(
"RxLeakedSubscription"
)
@Override
protected
void
onSetupView
()
{
setupUserActionToggle
();
setupUserStatusButtons
();
setupLogoutButton
();
setupVersionInfo
();
searchView
=
rootView
.
findViewById
(
R
.
id
.
search
);
adapter
=
new
RoomListAdapter
();
adapter
.
setOnItemClickListener
(
new
RoomListAdapter
.
OnItemClickListener
()
{
@Override
public
void
onItemClick
(
RoomSidebar
roomSidebar
)
{
searchView
.
setQuery
(
null
,
false
);
searchView
.
clearFocus
();
presenter
.
onRoomSelected
(
roomSidebar
);
}
private
SidebarMainContract
.
Presenter
presenter
;
private
RoomListAdapter
adapter
;
private
SearchView
searchView
;
private
TextView
loadMoreResultsText
;
private
List
<
RoomSidebar
>
roomSidebarList
=
Collections
.
emptyList
();
private
Disposable
spotlightDisposable
;
private
String
hostname
;
private
static
final
String
HOSTNAME
=
"hostname"
;
public
SidebarMainFragment
()
{
}
@Override
public
void
onItemClick
(
Spotlight
spotlight
)
{
searchView
.
setQuery
(
null
,
false
);
searchView
.
clearFocus
();
presenter
.
onSpotlightSelected
(
spotlight
);
}
});
RecyclerView
recyclerView
=
rootView
.
findViewById
(
R
.
id
.
room_list_container
);
recyclerView
.
setLayoutManager
(
new
LinearLayoutManager
(
getContext
(),
LinearLayoutManager
.
VERTICAL
,
false
));
recyclerView
.
setAdapter
(
adapter
);
loadMoreResultsText
=
rootView
.
findViewById
(
R
.
id
.
text_load_more_results
);
RxSearchView
.
queryTextChanges
(
searchView
)
.
observeOn
(
AndroidSchedulers
.
mainThread
())
.
subscribe
(
charSequence
->
{
if
(
spotlightDisposable
!=
null
&&
!
spotlightDisposable
.
isDisposed
())
{
spotlightDisposable
.
dispose
();
}
presenter
.
disposeSubscriptions
();
if
(
charSequence
.
length
()
==
0
)
{
loadMoreResultsText
.
setVisibility
(
View
.
GONE
);
adapter
.
setMode
(
RoomListAdapter
.
MODE_ROOM
);
presenter
.
bindView
(
this
);
}
else
{
filterRoomSidebarList
(
charSequence
);
}
});
loadMoreResultsText
.
setOnClickListener
(
view
->
loadMoreResults
());
}
@Override
public
void
showRoomSidebarList
(
@NonNull
List
<
RoomSidebar
>
roomSidebarList
)
{
this
.
roomSidebarList
=
roomSidebarList
;
adapter
.
setRoomSidebarList
(
roomSidebarList
);
}
@Override
public
void
filterRoomSidebarList
(
CharSequence
term
)
{
List
<
RoomSidebar
>
filteredRoomSidebarList
=
new
ArrayList
<>();
for
(
RoomSidebar
roomSidebar:
roomSidebarList
)
{
if
(
roomSidebar
.
getRoomName
().
contains
(
term
))
{
filteredRoomSidebarList
.
add
(
roomSidebar
);
}
}
if
(
filteredRoomSidebarList
.
isEmpty
())
{
loadMoreResults
();
}
else
{
loadMoreResultsText
.
setVisibility
(
View
.
VISIBLE
);
adapter
.
setMode
(
RoomListAdapter
.
MODE_ROOM
);
adapter
.
setRoomSidebarList
(
filteredRoomSidebarList
);
}
}
private
void
loadMoreResults
()
{
spotlightDisposable
=
presenter
.
searchSpotlight
(
searchView
.
getQuery
().
toString
())
.
toObservable
()
.
observeOn
(
AndroidSchedulers
.
mainThread
())
.
subscribe
(
this
::
showSearchSuggestions
);
}
private
void
showSearchSuggestions
(
List
<
Spotlight
>
spotlightList
)
{
loadMoreResultsText
.
setVisibility
(
View
.
GONE
);
adapter
.
setMode
(
RoomListAdapter
.
MODE_SPOTLIGHT
);
adapter
.
setSpotlightList
(
spotlightList
);
}
@SuppressLint
(
"RxLeakedSubscription"
)
private
void
setupUserActionToggle
()
{
final
CompoundButton
toggleUserAction
=
rootView
.
findViewById
(
R
.
id
.
toggle_user_action
);
toggleUserAction
.
setFocusableInTouchMode
(
false
);
rootView
.
findViewById
(
R
.
id
.
user_info_container
).
setOnClickListener
(
view
->
toggleUserAction
.
toggle
());
RxCompoundButton
.
checkedChanges
(
toggleUserAction
)
.
compose
(
bindToLifecycle
())
.
subscribe
(
this
::
showUserActionContainer
,
Logger:
:
report
/**
* build SidebarMainFragment with hostname.
*/
public
static
SidebarMainFragment
create
(
String
hostname
)
{
Bundle
args
=
new
Bundle
();
args
.
putString
(
HOSTNAME
,
hostname
);
SidebarMainFragment
fragment
=
new
SidebarMainFragment
();
fragment
.
setArguments
(
args
);
return
fragment
;
}
@Override
public
void
onCreate
(
@Nullable
Bundle
savedInstanceState
)
{
super
.
onCreate
(
savedInstanceState
);
hostname
=
getArguments
().
getString
(
HOSTNAME
);
RealmUserRepository
userRepository
=
new
RealmUserRepository
(
hostname
);
AbsoluteUrlHelper
absoluteUrlHelper
=
new
AbsoluteUrlHelper
(
hostname
,
new
RealmServerInfoRepository
(),
userRepository
,
new
SessionInteractor
(
new
RealmSessionRepository
(
hostname
))
);
}
public
void
showUserActionContainer
(
boolean
show
)
{
rootView
.
findViewById
(
R
.
id
.
user_action_outer_container
)
.
setVisibility
(
show
?
View
.
VISIBLE
:
View
.
GONE
);
}
public
void
toggleUserActionContainer
(
boolean
checked
)
{
CompoundButton
toggleUserAction
=
rootView
.
findViewById
(
R
.
id
.
toggle_user_action
);
toggleUserAction
.
setChecked
(
checked
);
}
@Override
public
void
showScreen
()
{
rootView
.
setVisibility
(
View
.
VISIBLE
);
}
@Override
public
void
showEmptyScreen
()
{
rootView
.
setVisibility
(
View
.
INVISIBLE
);
}
@Override
public
void
show
(
User
user
)
{
onRenderCurrentUser
(
user
);
updateRoomListMode
();
}
private
void
setupUserStatusButtons
()
{
rootView
.
findViewById
(
R
.
id
.
btn_status_online
).
setOnClickListener
(
view
->
{
presenter
.
onUserOnline
();
closeUserActionContainer
();
});
rootView
.
findViewById
(
R
.
id
.
btn_status_away
).
setOnClickListener
(
view
->
{
presenter
.
onUserAway
();
closeUserActionContainer
();
});
rootView
.
findViewById
(
R
.
id
.
btn_status_busy
).
setOnClickListener
(
view
->
{
presenter
.
onUserBusy
();
closeUserActionContainer
();
});
rootView
.
findViewById
(
R
.
id
.
btn_status_invisible
).
setOnClickListener
(
view
->
{
presenter
.
onUserOffline
();
closeUserActionContainer
();
});
}
private
void
onRenderCurrentUser
(
User
user
)
{
if
(
user
!=
null
)
{
UserRenderer
userRenderer
=
new
UserRenderer
(
user
);
userRenderer
.
showAvatar
(
rootView
.
findViewById
(
R
.
id
.
current_user_avatar
),
hostname
);
userRenderer
.
showUsername
(
rootView
.
findViewById
(
R
.
id
.
current_user_name
));
userRenderer
.
showStatusColor
(
rootView
.
findViewById
(
R
.
id
.
current_user_status
));
RocketChatCache
rocketChatCache
=
new
RocketChatCache
(
getContext
().
getApplicationContext
());
presenter
=
new
SidebarMainPresenter
(
hostname
,
new
RoomInteractor
(
new
RealmRoomRepository
(
hostname
)),
userRepository
,
rocketChatCache
,
absoluteUrlHelper
,
new
MethodCallHelper
(
getContext
(),
hostname
),
new
RealmSpotlightRepository
(
hostname
)
);
}
@Nullable
@Override
public
View
onCreateView
(
LayoutInflater
inflater
,
@Nullable
ViewGroup
container
,
@Nullable
Bundle
savedInstanceState
)
{
View
view
=
super
.
onCreateView
(
inflater
,
container
,
savedInstanceState
);
presenter
.
bindView
(
this
);
return
view
;
}
@Override
public
void
onDestroyView
()
{
presenter
.
release
();
super
.
onDestroyView
();
}
@Override
public
void
onResume
()
{
super
.
onResume
();
}
@Override
public
void
onPause
()
{
super
.
onPause
();
}
@Override
protected
int
getLayout
()
{
return
R
.
layout
.
fragment_sidebar_main
;
}
@SuppressLint
(
"RxLeakedSubscription"
)
@Override
protected
void
onSetupView
()
{
setupUserActionToggle
();
setupUserStatusButtons
();
setupLogoutButton
();
setupVersionInfo
();
searchView
=
rootView
.
findViewById
(
R
.
id
.
search
);
adapter
=
new
RoomListAdapter
();
adapter
.
setOnItemClickListener
(
new
RoomListAdapter
.
OnItemClickListener
()
{
@Override
public
void
onItemClick
(
RoomSidebar
roomSidebar
)
{
searchView
.
setQuery
(
null
,
false
);
searchView
.
clearFocus
();
presenter
.
onRoomSelected
(
roomSidebar
);
}
@Override
public
void
onItemClick
(
Spotlight
spotlight
)
{
searchView
.
setQuery
(
null
,
false
);
searchView
.
clearFocus
();
presenter
.
onSpotlightSelected
(
spotlight
);
}
});
RecyclerView
recyclerView
=
rootView
.
findViewById
(
R
.
id
.
room_list_container
);
recyclerView
.
setLayoutManager
(
new
LinearLayoutManager
(
getContext
(),
LinearLayoutManager
.
VERTICAL
,
false
));
recyclerView
.
setAdapter
(
adapter
);
loadMoreResultsText
=
rootView
.
findViewById
(
R
.
id
.
text_load_more_results
);
RxSearchView
.
queryTextChanges
(
searchView
)
.
observeOn
(
AndroidSchedulers
.
mainThread
())
.
subscribe
(
charSequence
->
{
if
(
spotlightDisposable
!=
null
&&
!
spotlightDisposable
.
isDisposed
())
{
spotlightDisposable
.
dispose
();
}
presenter
.
disposeSubscriptions
();
if
(
charSequence
.
length
()
==
0
)
{
loadMoreResultsText
.
setVisibility
(
View
.
GONE
);
adapter
.
setMode
(
RoomListAdapter
.
MODE_ROOM
);
presenter
.
bindView
(
this
);
}
else
{
filterRoomSidebarList
(
charSequence
);
}
});
loadMoreResultsText
.
setOnClickListener
(
view
->
loadMoreResults
());
}
@Override
public
void
showRoomSidebarList
(
@NonNull
List
<
RoomSidebar
>
roomSidebarList
)
{
this
.
roomSidebarList
=
roomSidebarList
;
adapter
.
setRoomSidebarList
(
roomSidebarList
);
}
@Override
public
void
filterRoomSidebarList
(
CharSequence
term
)
{
List
<
RoomSidebar
>
filteredRoomSidebarList
=
new
ArrayList
<>();
for
(
RoomSidebar
roomSidebar
:
roomSidebarList
)
{
if
(
roomSidebar
.
getRoomName
().
contains
(
term
))
{
filteredRoomSidebarList
.
add
(
roomSidebar
);
}
}
if
(
filteredRoomSidebarList
.
isEmpty
())
{
loadMoreResults
();
}
else
{
loadMoreResultsText
.
setVisibility
(
View
.
VISIBLE
);
adapter
.
setMode
(
RoomListAdapter
.
MODE_ROOM
);
adapter
.
setRoomSidebarList
(
filteredRoomSidebarList
);
}
}
private
void
loadMoreResults
()
{
spotlightDisposable
=
presenter
.
searchSpotlight
(
searchView
.
getQuery
().
toString
())
.
toObservable
()
.
observeOn
(
AndroidSchedulers
.
mainThread
())
.
subscribe
(
this
::
showSearchSuggestions
);
}
private
void
showSearchSuggestions
(
List
<
Spotlight
>
spotlightList
)
{
loadMoreResultsText
.
setVisibility
(
View
.
GONE
);
adapter
.
setMode
(
RoomListAdapter
.
MODE_SPOTLIGHT
);
adapter
.
setSpotlightList
(
spotlightList
);
}
@SuppressLint
(
"RxLeakedSubscription"
)
private
void
setupUserActionToggle
()
{
final
CompoundButton
toggleUserAction
=
rootView
.
findViewById
(
R
.
id
.
toggle_user_action
);
toggleUserAction
.
setFocusableInTouchMode
(
false
);
rootView
.
findViewById
(
R
.
id
.
user_info_container
).
setOnClickListener
(
view
->
toggleUserAction
.
toggle
());
RxCompoundButton
.
checkedChanges
(
toggleUserAction
)
.
compose
(
bindToLifecycle
())
.
subscribe
(
this
::
showUserActionContainer
,
Logger:
:
report
);
}
}
private
void
updateRoomListMode
()
{
final
List
<
RoomListHeader
>
roomListHeaders
=
new
ArrayList
<>();
roomListHeaders
.
add
(
new
UnreadRoomListHeader
(
getString
(
R
.
string
.
fragment_sidebar_main_unread_rooms_title
)
));
roomListHeaders
.
add
(
new
FavoriteRoomListHeader
(
getString
(
R
.
string
.
fragment_sidebar_main_favorite_title
)
));
roomListHeaders
.
add
(
new
LivechatRoomListHeader
(
getString
(
R
.
string
.
fragment_sidebar_main_livechat_title
)
));
roomListHeaders
.
add
(
new
ChannelRoomListHeader
(
getString
(
R
.
string
.
fragment_sidebar_main_channels_title
),
()
->
showAddRoomDialog
(
AddChannelDialogFragment
.
create
(
hostname
))
));
roomListHeaders
.
add
(
new
DirectMessageRoomListHeader
(
getString
(
R
.
string
.
fragment_sidebar_main_direct_messages_title
),
()
->
showAddRoomDialog
(
AddDirectMessageDialogFragment
.
create
(
hostname
))
));
adapter
.
setRoomListHeaders
(
roomListHeaders
);
}
@Override
public
void
onLogoutCleanUp
()
{
Activity
activity
=
getActivity
();
if
(
activity
!=
null
&&
activity
instanceof
MainActivity
)
{
((
MainActivity
)
activity
).
onLogout
();
presenter
.
onLogout
(
task
->
{
if
(
task
.
isFaulted
())
{
return
Task
.
forError
(
task
.
getError
());
public
void
showUserActionContainer
(
boolean
show
)
{
rootView
.
findViewById
(
R
.
id
.
user_action_outer_container
)
.
setVisibility
(
show
?
View
.
VISIBLE
:
View
.
GONE
);
}
public
void
toggleUserActionContainer
(
boolean
checked
)
{
CompoundButton
toggleUserAction
=
rootView
.
findViewById
(
R
.
id
.
toggle_user_action
);
toggleUserAction
.
setChecked
(
checked
);
}
@Override
public
void
showScreen
()
{
rootView
.
setVisibility
(
View
.
VISIBLE
);
}
@Override
public
void
showEmptyScreen
()
{
rootView
.
setVisibility
(
View
.
INVISIBLE
);
}
@Override
public
void
show
(
User
user
)
{
onRenderCurrentUser
(
user
);
updateRoomListMode
();
}
private
void
setupUserStatusButtons
()
{
rootView
.
findViewById
(
R
.
id
.
btn_status_online
).
setOnClickListener
(
view
->
{
presenter
.
onUserOnline
();
closeUserActionContainer
();
});
rootView
.
findViewById
(
R
.
id
.
btn_status_away
).
setOnClickListener
(
view
->
{
presenter
.
onUserAway
();
closeUserActionContainer
();
});
rootView
.
findViewById
(
R
.
id
.
btn_status_busy
).
setOnClickListener
(
view
->
{
presenter
.
onUserBusy
();
closeUserActionContainer
();
});
rootView
.
findViewById
(
R
.
id
.
btn_status_invisible
).
setOnClickListener
(
view
->
{
presenter
.
onUserOffline
();
closeUserActionContainer
();
});
}
private
void
onRenderCurrentUser
(
User
user
)
{
if
(
user
!=
null
)
{
UserRenderer
userRenderer
=
new
UserRenderer
(
user
);
userRenderer
.
showAvatar
(
rootView
.
findViewById
(
R
.
id
.
current_user_avatar
),
hostname
);
userRenderer
.
showUsername
(
rootView
.
findViewById
(
R
.
id
.
current_user_name
));
userRenderer
.
showStatusColor
(
rootView
.
findViewById
(
R
.
id
.
current_user_status
));
}
return
null
;
});
}
}
private
void
setupLogoutButton
()
{
rootView
.
findViewById
(
R
.
id
.
btn_logout
).
setOnClickListener
(
view
->
{
closeUserActionContainer
();
// Clear relative data and set new hostname if any.
presenter
.
beforeLogoutCleanUp
();
final
Activity
activity
=
getActivity
();
if
(
activity
!=
null
&&
activity
instanceof
MainActivity
)
{
// Clear subscriptions on MainPresenter.
((
MainActivity
)
activity
).
beforeLogoutCleanUp
();
}
});
}
public
void
clearSearchViewFocus
()
{
searchView
.
clearFocus
();
}
public
void
closeUserActionContainer
()
{
final
CompoundButton
toggleUserAction
=
rootView
.
findViewById
(
R
.
id
.
toggle_user_action
);
if
(
toggleUserAction
!=
null
&&
toggleUserAction
.
isChecked
())
{
toggleUserAction
.
setChecked
(
false
);
private
void
updateRoomListMode
()
{
final
List
<
RoomListHeader
>
roomListHeaders
=
new
ArrayList
<>();
roomListHeaders
.
add
(
new
UnreadRoomListHeader
(
getString
(
R
.
string
.
fragment_sidebar_main_unread_rooms_title
)
));
roomListHeaders
.
add
(
new
FavoriteRoomListHeader
(
getString
(
R
.
string
.
fragment_sidebar_main_favorite_title
)
));
roomListHeaders
.
add
(
new
LivechatRoomListHeader
(
getString
(
R
.
string
.
fragment_sidebar_main_livechat_title
)
));
roomListHeaders
.
add
(
new
ChannelRoomListHeader
(
getString
(
R
.
string
.
fragment_sidebar_main_channels_title
),
()
->
showAddRoomDialog
(
AddChannelDialogFragment
.
create
(
hostname
))
));
roomListHeaders
.
add
(
new
DirectMessageRoomListHeader
(
getString
(
R
.
string
.
fragment_sidebar_main_direct_messages_title
),
()
->
showAddRoomDialog
(
AddDirectMessageDialogFragment
.
create
(
hostname
))
));
adapter
.
setRoomListHeaders
(
roomListHeaders
);
}
@DebugLog
@Override
public
void
onPreparedToLogOut
()
{
final
Activity
activity
=
getActivity
();
if
(
activity
!=
null
&&
activity
instanceof
MainActivity
)
{
((
MainActivity
)
activity
).
onLogout
();
}
}
private
void
setupLogoutButton
()
{
rootView
.
findViewById
(
R
.
id
.
btn_logout
).
setOnClickListener
(
view
->
{
closeUserActionContainer
();
// Clear relative data and set new hostname if any.
presenter
.
prepareToLogOut
();
});
}
}
private
void
setupVersionInfo
()
{
TextView
versionInfoView
=
rootView
.
findViewById
(
R
.
id
.
version_info
);
versionInfoView
.
setText
(
getString
(
R
.
string
.
version_info_text
,
BuildConfig
.
VERSION_NAME
));
}
public
void
clearSearchViewFocus
()
{
searchView
.
clearFocus
();
}
private
void
showAddRoomDialog
(
DialogFragment
dialog
)
{
dialog
.
show
(
getFragmentManager
(),
"AbstractAddRoomDialogFragment"
);
}
public
void
closeUserActionContainer
()
{
final
CompoundButton
toggleUserAction
=
rootView
.
findViewById
(
R
.
id
.
toggle_user_action
);
if
(
toggleUserAction
!=
null
&&
toggleUserAction
.
isChecked
())
{
toggleUserAction
.
setChecked
(
false
);
}
}
private
void
setupVersionInfo
()
{
TextView
versionInfoView
=
rootView
.
findViewById
(
R
.
id
.
version_info
);
versionInfoView
.
setText
(
getString
(
R
.
string
.
version_info_text
,
BuildConfig
.
VERSION_NAME
));
}
private
void
showAddRoomDialog
(
DialogFragment
dialog
)
{
dialog
.
show
(
getFragmentManager
(),
"AbstractAddRoomDialogFragment"
);
}
}
\ No newline at end of file
app/src/main/java/chat/rocket/android/fragment/sidebar/SidebarMainPresenter.java
View file @
857abccc
...
...
@@ -18,7 +18,6 @@ import chat.rocket.android.helper.LogIfError;
import
chat.rocket.android.helper.Logger
;
import
chat.rocket.android.helper.TextUtils
;
import
chat.rocket.android.service.ConnectivityManager
;
import
chat.rocket.android.service.ConnectivityManagerApi
;
import
chat.rocket.android.shared.BasePresenter
;
import
chat.rocket.core.interactors.RoomInteractor
;
import
chat.rocket.core.models.Room
;
...
...
@@ -33,6 +32,7 @@ import chat.rocket.persistence.realm.repositories.RealmSpotlightRepository;
import
io.reactivex.Flowable
;
import
io.reactivex.android.schedulers.AndroidSchedulers
;
import
io.reactivex.disposables.Disposable
;
import
io.realm.Realm
;
public
class
SidebarMainPresenter
extends
BasePresenter
<
SidebarMainContract
.
View
>
implements
SidebarMainContract
.
Presenter
{
private
final
String
hostname
;
...
...
@@ -150,20 +150,26 @@ public class SidebarMainPresenter extends BasePresenter<SidebarMainContract.View
}
@Override
public
void
beforeLogoutCleanUp
()
{
clearSubscriptions
();
String
currentHostname
=
rocketChatCache
.
getSelectedServerHostname
();
RealmHelper
realmHelper
=
RealmStore
.
getOrCreate
(
currentHostname
);
realmHelper
.
executeTransaction
(
realm
->
{
realm
.
executeTransactionAsync
(
realmObj
->
realmObj
.
deleteAll
());
CookieManager
.
getInstance
().
removeAllCookie
();
ConnectivityManagerApi
connectivityManagerApi
=
ConnectivityManager
.
getInstance
(
RocketChatApplication
.
getInstance
());
connectivityManagerApi
.
removeServer
(
currentHostname
);
rocketChatCache
.
removeHostname
(
currentHostname
);
rocketChatCache
.
removeSelectedRoomId
(
currentHostname
);
rocketChatCache
.
setSelectedServerHostname
(
rocketChatCache
.
getFirstLoggedHostnameIfAny
());
view
.
onLogoutCleanUp
();
return
null
;
public
void
prepareToLogOut
()
{
onLogout
(
task
->
{
if
(
task
.
isFaulted
())
{
return
Task
.
forError
(
task
.
getError
());
}
clearSubscriptions
();
String
currentHostname
=
rocketChatCache
.
getSelectedServerHostname
();
RealmHelper
realmHelper
=
RealmStore
.
getOrCreate
(
currentHostname
);
return
realmHelper
.
executeTransaction
(
realm
->
{
rocketChatCache
.
removeHostname
(
currentHostname
);
rocketChatCache
.
removeSelectedRoomId
(
currentHostname
);
rocketChatCache
.
setSelectedServerHostname
(
rocketChatCache
.
getFirstLoggedHostnameIfAny
());
realm
.
executeTransactionAsync
(
Realm:
:
deleteAll
);
view
.
onPreparedToLogOut
();
ConnectivityManager
.
getInstance
(
RocketChatApplication
.
getInstance
())
.
removeServer
(
hostname
);
CookieManager
.
getInstance
().
removeAllCookie
();
return
null
;
});
});
}
...
...
@@ -223,11 +229,11 @@ public class SidebarMainPresenter extends BasePresenter<SidebarMainContract.View
.
observeOn
(
AndroidSchedulers
.
mainThread
())
.
subscribe
(
this
::
processUsers
,
Logger:
:
report
);
addSubscription
(
subscription
);
}
}
private
void
processUsers
(
List
<
User
>
userList
)
{
for
(
User
user:
userList
)
{
for
(
RoomSidebar
roomSidebar
:
roomSidebarList
)
{
for
(
User
user
:
userList
)
{
for
(
RoomSidebar
roomSidebar
:
roomSidebarList
)
{
if
(
roomSidebar
.
getRoomName
().
equals
(
user
.
getUsername
()))
{
roomSidebar
.
setUserStatus
(
user
.
getStatus
());
}
...
...
app/src/main/java/chat/rocket/android/service/RealmBasedConnectivityManager.java
View file @
857abccc
...
...
@@ -279,8 +279,11 @@ import io.reactivex.subjects.BehaviorSubject;
if
(
serviceInterface
!=
null
)
{
return
serviceInterface
.
disconnectFromServer
(
hostname
)
// //after disconnection from server, remove HOSTNAME key from HashMap
.
doAfterTerminate
(()
->
serverConnectivityList
.
remove
(
hostname
));
//after disconnection from server, remove HOSTNAME key from HashMap
.
doAfterTerminate
(()
->
{
serverConnectivityList
.
remove
(
hostname
);
serverConnectivityList
.
put
(
hostname
,
ServerConnectivity
.
STATE_DISCONNECTED
);
});
}
else
{
return
Single
.
error
(
new
IllegalStateException
(
"not prepared"
));
}
...
...
app/src/main/java/chat/rocket/android/service/RocketChatWebSocketThread.java
View file @
857abccc
...
...
@@ -229,6 +229,8 @@ public class RocketChatWebSocketThread extends HandlerThread {
RxWebSocketCallback
.
Close
result
=
_task
.
getResult
();
if
(
result
.
code
==
DDPClient
.
REASON_NETWORK_ERROR
)
{
reconnect
();
}
else
{
unregisterListenersAndClose
();
}
return
null
;
});
...
...
@@ -333,8 +335,8 @@ public class RocketChatWebSocketThread extends HandlerThread {
.
findAll
());
if
(
sessions
!=
null
&&
sessions
.
size
()
>
0
)
{
//
i
f we have a session try to resume it. At this point we're probably recovering from
// a disconnection state
//
I
f we have a session try to resume it. At this point we're probably recovering from
// a disconnection state
.
final
CompositeDisposable
disposables
=
new
CompositeDisposable
();
MethodCallHelper
methodCall
=
new
MethodCallHelper
(
realmHelper
);
disposables
.
add
(
...
...
@@ -351,7 +353,11 @@ public class RocketChatWebSocketThread extends HandlerThread {
createObserversAndRegister
();
disposables
.
clear
();
},
error
->
logErrorAndUnsubscribe
(
disposables
,
error
)
error
->
{
logErrorAndUnsubscribe
(
disposables
,
error
);
connectivityManager
.
notifyConnectionLost
(
hostname
,
DDPClient
.
REASON_NETWORK_ERROR
);
}
)
);
}
else
{
...
...
rocket-chat-core/src/main/java/chat/rocket/core/interactors/MessageInteractor.kt
View file @
857abccc
...
...
@@ -19,7 +19,7 @@ class MessageInteractor(private val messageRepository: MessageRepository,
val
roomHistoryState
=
RoomHistoryState
.
builder
()
.
setRoomId
(
room
.
roomId
)
.
setSyncState
(
SyncState
.
NOT_SYNCED
)
.
setCount
(
10
0
)
.
setCount
(
5
0
)
.
setReset
(
true
)
.
setComplete
(
false
)
.
setTimestamp
(
0
)
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment