Unverified Commit 857abccc authored by Leonardo Aramaki's avatar Leonardo Aramaki Committed by GitHub

Merge pull request #596 from RocketChat/fix/logout-and-login-same-user

[FIX] Logout and login with the same user
parents 9bcef2c4 b1a1e4a3
...@@ -3,7 +3,8 @@ apply plugin: 'io.fabric' ...@@ -3,7 +3,8 @@ apply plugin: 'io.fabric'
repositories { repositories {
maven { url 'https://maven.fabric.io/public' } 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' apply plugin: 'kotlin-android'
...@@ -100,7 +101,7 @@ ext { ...@@ -100,7 +101,7 @@ ext {
playLibVersion = '11.6.0' playLibVersion = '11.6.0'
stethoVersion = '1.5.0' stethoVersion = '1.5.0'
stethoOkhttp3Version = '1.5.0' stethoOkhttp3Version = '1.5.0'
stethoRealmVersion = '2.1.0' stethoRealmVersion = '2.2.2'
rxbindingVersion = '2.0.0' rxbindingVersion = '2.0.0'
rxlifecycleVersion = '2.1.0' rxlifecycleVersion = '2.1.0'
icepickVersion = '3.2.0' icepickVersion = '3.2.0'
......
...@@ -347,15 +347,12 @@ public class MainActivity extends AbstractAuthedActivity implements MainContract ...@@ -347,15 +347,12 @@ public class MainActivity extends AbstractAuthedActivity implements MainContract
@DebugLog @DebugLog
public void onLogout() { public void onLogout() {
presenter.prepareToLogout();
if (new RocketChatCache(getApplicationContext()).getSelectedServerHostname() == null) { if (new RocketChatCache(getApplicationContext()).getSelectedServerHostname() == null) {
finish();
LaunchUtil.showMainActivity(this); LaunchUtil.showMainActivity(this);
} else { } else {
onHostnameUpdated(); onHostnameUpdated();
} }
} }
@DebugLog
public void beforeLogoutCleanUp() {
presenter.beforeLogoutCleanUp();
}
} }
...@@ -40,6 +40,6 @@ public interface MainContract { ...@@ -40,6 +40,6 @@ public interface MainContract {
void loadSignedInServers(String hostname); void loadSignedInServers(String hostname);
void beforeLogoutCleanUp(); void prepareToLogout();
} }
} }
...@@ -28,6 +28,7 @@ import chat.rocket.core.models.Session; ...@@ -28,6 +28,7 @@ import chat.rocket.core.models.Session;
import chat.rocket.core.models.User; import chat.rocket.core.models.User;
import chat.rocket.core.repositories.PublicSettingRepository; import chat.rocket.core.repositories.PublicSettingRepository;
import chat.rocket.core.utils.Pair; import chat.rocket.core.utils.Pair;
import hugo.weaving.DebugLog;
import io.reactivex.Flowable; import io.reactivex.Flowable;
import io.reactivex.android.schedulers.AndroidSchedulers; import io.reactivex.android.schedulers.AndroidSchedulers;
import io.reactivex.disposables.Disposable; import io.reactivex.disposables.Disposable;
...@@ -133,8 +134,9 @@ public class MainPresenter extends BasePresenter<MainContract.View> ...@@ -133,8 +134,9 @@ public class MainPresenter extends BasePresenter<MainContract.View>
addSubscription(subscription); addSubscription(subscription);
} }
@DebugLog
@Override @Override
public void beforeLogoutCleanUp() { public void prepareToLogout() {
clearSubscriptions(); clearSubscriptions();
} }
......
...@@ -77,7 +77,7 @@ public class RoomPresenter extends BasePresenter<RoomContract.View> ...@@ -77,7 +77,7 @@ public class RoomPresenter extends BasePresenter<RoomContract.View>
.observeOn(AndroidSchedulers.mainThread()) .observeOn(AndroidSchedulers.mainThread())
.subscribe( .subscribe(
success -> { success -> {
if (success) { if (!success) {
connectivityManagerApi.keepAliveServer(); connectivityManagerApi.keepAliveServer();
} }
}, },
...@@ -89,14 +89,13 @@ public class RoomPresenter extends BasePresenter<RoomContract.View> ...@@ -89,14 +89,13 @@ public class RoomPresenter extends BasePresenter<RoomContract.View>
@Override @Override
public void loadMoreMessages() { public void loadMoreMessages() {
final Disposable subscription = getSingleRoom() final Disposable subscription = getSingleRoom()
.flatMap(messageInteractor::loadMoreMessages) .flatMap(messageInteractor::loadMoreMessages)
.subscribeOn(AndroidSchedulers.from(BackgroundLooper.get())) .subscribeOn(AndroidSchedulers.from(BackgroundLooper.get()))
.observeOn(AndroidSchedulers.mainThread()) .observeOn(AndroidSchedulers.mainThread())
.subscribe( .subscribe(
success -> { success -> {
if (success) { if (!success) {
connectivityManagerApi.keepAliveServer(); connectivityManagerApi.keepAliveServer();
} }
}, },
......
...@@ -18,81 +18,81 @@ import chat.rocket.core.repositories.PublicSettingRepository; ...@@ -18,81 +18,81 @@ import chat.rocket.core.repositories.PublicSettingRepository;
import io.reactivex.android.schedulers.AndroidSchedulers; import io.reactivex.android.schedulers.AndroidSchedulers;
public class LoginPresenter extends BasePresenter<LoginContract.View> public class LoginPresenter extends BasePresenter<LoginContract.View>
implements LoginContract.Presenter { implements LoginContract.Presenter {
private final LoginServiceConfigurationRepository loginServiceConfigurationRepository; private final LoginServiceConfigurationRepository loginServiceConfigurationRepository;
private final PublicSettingRepository publicSettingRepository; private final PublicSettingRepository publicSettingRepository;
private final MethodCallHelper methodCallHelper; private final MethodCallHelper methodCallHelper;
public LoginPresenter(LoginServiceConfigurationRepository loginServiceConfigurationRepository, public LoginPresenter(LoginServiceConfigurationRepository loginServiceConfigurationRepository,
PublicSettingRepository publicSettingRepository, PublicSettingRepository publicSettingRepository,
MethodCallHelper methodCallHelper) { MethodCallHelper methodCallHelper) {
this.loginServiceConfigurationRepository = loginServiceConfigurationRepository; this.loginServiceConfigurationRepository = loginServiceConfigurationRepository;
this.publicSettingRepository = publicSettingRepository; this.publicSettingRepository = publicSettingRepository;
this.methodCallHelper = methodCallHelper; 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;
} }
view.showLoader(); @Override
public void bindView(@NonNull LoginContract.View view) {
addSubscription( super.bindView(view);
publicSettingRepository.getById(PublicSettingsConstants.LDAP.ENABLE)
.subscribeOn(AndroidSchedulers.from(BackgroundLooper.get())) getLoginServices();
.observeOn(AndroidSchedulers.mainThread()) }
.subscribe(
publicSettingOptional -> doLogin(username, password, publicSettingOptional), @Override
Logger::report public void login(String username, String password) {
) if (TextUtils.isEmpty(username) || TextUtils.isEmpty(password)) {
); return;
} }
private void getLoginServices() { view.showLoader();
addSubscription(
loginServiceConfigurationRepository.getAll() addSubscription(
.subscribeOn(AndroidSchedulers.from(BackgroundLooper.get())) publicSettingRepository.getById(PublicSettingsConstants.LDAP.ENABLE)
.observeOn(AndroidSchedulers.mainThread()) .subscribeOn(AndroidSchedulers.from(BackgroundLooper.get()))
.subscribe( .observeOn(AndroidSchedulers.mainThread())
loginServiceConfigurations -> view.showLoginServices(loginServiceConfigurations), .subscribe(
Logger::report publicSettingOptional -> doLogin(username, password, publicSettingOptional),
) Logger::report
); )
} );
}
private void doLogin(String username, String password, Optional<PublicSetting> optional) {
call(username, password, optional) private void getLoginServices() {
.continueWith(task -> { addSubscription(
if (task.isFaulted()) { loginServiceConfigurationRepository.getAll()
view.hideLoader(); .subscribeOn(AndroidSchedulers.from(BackgroundLooper.get()))
.observeOn(AndroidSchedulers.mainThread())
final Exception error = task.getError(); .subscribe(
loginServiceConfigurations -> view.showLoginServices(loginServiceConfigurations),
if (error instanceof TwoStepAuthException) { Logger::report
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); 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);
}
} }
...@@ -25,7 +25,7 @@ public interface SidebarMainContract { ...@@ -25,7 +25,7 @@ public interface SidebarMainContract {
void show(User user); void show(User user);
void onLogoutCleanUp(); void onPreparedToLogOut();
} }
interface Presenter extends BaseContract.Presenter<View> { interface Presenter extends BaseContract.Presenter<View> {
...@@ -48,6 +48,6 @@ public interface SidebarMainContract { ...@@ -48,6 +48,6 @@ public interface SidebarMainContract {
void onLogout(Continuation<Void, Object> continuation); void onLogout(Continuation<Void, Object> continuation);
void beforeLogoutCleanUp(); void prepareToLogOut();
} }
} }
\ No newline at end of file
...@@ -18,7 +18,6 @@ import chat.rocket.android.helper.LogIfError; ...@@ -18,7 +18,6 @@ import chat.rocket.android.helper.LogIfError;
import chat.rocket.android.helper.Logger; import chat.rocket.android.helper.Logger;
import chat.rocket.android.helper.TextUtils; import chat.rocket.android.helper.TextUtils;
import chat.rocket.android.service.ConnectivityManager; import chat.rocket.android.service.ConnectivityManager;
import chat.rocket.android.service.ConnectivityManagerApi;
import chat.rocket.android.shared.BasePresenter; import chat.rocket.android.shared.BasePresenter;
import chat.rocket.core.interactors.RoomInteractor; import chat.rocket.core.interactors.RoomInteractor;
import chat.rocket.core.models.Room; import chat.rocket.core.models.Room;
...@@ -33,6 +32,7 @@ import chat.rocket.persistence.realm.repositories.RealmSpotlightRepository; ...@@ -33,6 +32,7 @@ import chat.rocket.persistence.realm.repositories.RealmSpotlightRepository;
import io.reactivex.Flowable; import io.reactivex.Flowable;
import io.reactivex.android.schedulers.AndroidSchedulers; import io.reactivex.android.schedulers.AndroidSchedulers;
import io.reactivex.disposables.Disposable; import io.reactivex.disposables.Disposable;
import io.realm.Realm;
public class SidebarMainPresenter extends BasePresenter<SidebarMainContract.View> implements SidebarMainContract.Presenter { public class SidebarMainPresenter extends BasePresenter<SidebarMainContract.View> implements SidebarMainContract.Presenter {
private final String hostname; private final String hostname;
...@@ -150,20 +150,26 @@ public class SidebarMainPresenter extends BasePresenter<SidebarMainContract.View ...@@ -150,20 +150,26 @@ public class SidebarMainPresenter extends BasePresenter<SidebarMainContract.View
} }
@Override @Override
public void beforeLogoutCleanUp() { public void prepareToLogOut() {
clearSubscriptions(); onLogout(task -> {
String currentHostname = rocketChatCache.getSelectedServerHostname(); if (task.isFaulted()) {
RealmHelper realmHelper = RealmStore.getOrCreate(currentHostname); return Task.forError(task.getError());
realmHelper.executeTransaction(realm -> { }
realm.executeTransactionAsync(realmObj -> realmObj.deleteAll());
CookieManager.getInstance().removeAllCookie(); clearSubscriptions();
ConnectivityManagerApi connectivityManagerApi = ConnectivityManager.getInstance(RocketChatApplication.getInstance()); String currentHostname = rocketChatCache.getSelectedServerHostname();
connectivityManagerApi.removeServer(currentHostname); RealmHelper realmHelper = RealmStore.getOrCreate(currentHostname);
rocketChatCache.removeHostname(currentHostname); return realmHelper.executeTransaction(realm -> {
rocketChatCache.removeSelectedRoomId(currentHostname); rocketChatCache.removeHostname(currentHostname);
rocketChatCache.setSelectedServerHostname(rocketChatCache.getFirstLoggedHostnameIfAny()); rocketChatCache.removeSelectedRoomId(currentHostname);
view.onLogoutCleanUp(); rocketChatCache.setSelectedServerHostname(rocketChatCache.getFirstLoggedHostnameIfAny());
return null; 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 ...@@ -223,11 +229,11 @@ public class SidebarMainPresenter extends BasePresenter<SidebarMainContract.View
.observeOn(AndroidSchedulers.mainThread()) .observeOn(AndroidSchedulers.mainThread())
.subscribe(this::processUsers, Logger::report); .subscribe(this::processUsers, Logger::report);
addSubscription(subscription); addSubscription(subscription);
} }
private void processUsers(List<User> userList) { private void processUsers(List<User> userList) {
for (User user: userList) { for (User user : userList) {
for(RoomSidebar roomSidebar: roomSidebarList) { for (RoomSidebar roomSidebar : roomSidebarList) {
if (roomSidebar.getRoomName().equals(user.getUsername())) { if (roomSidebar.getRoomName().equals(user.getUsername())) {
roomSidebar.setUserStatus(user.getStatus()); roomSidebar.setUserStatus(user.getStatus());
} }
......
...@@ -279,8 +279,11 @@ import io.reactivex.subjects.BehaviorSubject; ...@@ -279,8 +279,11 @@ import io.reactivex.subjects.BehaviorSubject;
if (serviceInterface != null) { if (serviceInterface != null) {
return serviceInterface.disconnectFromServer(hostname) return serviceInterface.disconnectFromServer(hostname)
// //after disconnection from server, remove HOSTNAME key from HashMap //after disconnection from server, remove HOSTNAME key from HashMap
.doAfterTerminate(() -> serverConnectivityList.remove(hostname)); .doAfterTerminate(() -> {
serverConnectivityList.remove(hostname);
serverConnectivityList.put(hostname, ServerConnectivity.STATE_DISCONNECTED);
});
} else { } else {
return Single.error(new IllegalStateException("not prepared")); return Single.error(new IllegalStateException("not prepared"));
} }
......
...@@ -229,6 +229,8 @@ public class RocketChatWebSocketThread extends HandlerThread { ...@@ -229,6 +229,8 @@ public class RocketChatWebSocketThread extends HandlerThread {
RxWebSocketCallback.Close result = _task.getResult(); RxWebSocketCallback.Close result = _task.getResult();
if (result.code == DDPClient.REASON_NETWORK_ERROR) { if (result.code == DDPClient.REASON_NETWORK_ERROR) {
reconnect(); reconnect();
} else {
unregisterListenersAndClose();
} }
return null; return null;
}); });
...@@ -333,8 +335,8 @@ public class RocketChatWebSocketThread extends HandlerThread { ...@@ -333,8 +335,8 @@ public class RocketChatWebSocketThread extends HandlerThread {
.findAll()); .findAll());
if (sessions != null && sessions.size() > 0) { if (sessions != null && sessions.size() > 0) {
// if we have a session try to resume it. At this point we're probably recovering from // If we have a session try to resume it. At this point we're probably recovering from
// a disconnection state // a disconnection state.
final CompositeDisposable disposables = new CompositeDisposable(); final CompositeDisposable disposables = new CompositeDisposable();
MethodCallHelper methodCall = new MethodCallHelper(realmHelper); MethodCallHelper methodCall = new MethodCallHelper(realmHelper);
disposables.add( disposables.add(
...@@ -351,7 +353,11 @@ public class RocketChatWebSocketThread extends HandlerThread { ...@@ -351,7 +353,11 @@ public class RocketChatWebSocketThread extends HandlerThread {
createObserversAndRegister(); createObserversAndRegister();
disposables.clear(); disposables.clear();
}, },
error -> logErrorAndUnsubscribe(disposables, error) error -> {
logErrorAndUnsubscribe(disposables, error);
connectivityManager.notifyConnectionLost(hostname,
DDPClient.REASON_NETWORK_ERROR);
}
) )
); );
} else { } else {
......
...@@ -19,7 +19,7 @@ class MessageInteractor(private val messageRepository: MessageRepository, ...@@ -19,7 +19,7 @@ class MessageInteractor(private val messageRepository: MessageRepository,
val roomHistoryState = RoomHistoryState.builder() val roomHistoryState = RoomHistoryState.builder()
.setRoomId(room.roomId) .setRoomId(room.roomId)
.setSyncState(SyncState.NOT_SYNCED) .setSyncState(SyncState.NOT_SYNCED)
.setCount(100) .setCount(50)
.setReset(true) .setReset(true)
.setComplete(false) .setComplete(false)
.setTimestamp(0) .setTimestamp(0)
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment