Commit 8af265c7 authored by Leonardo Aramaki's avatar Leonardo Aramaki

Refresh opened rooms if conn state is SESSION_ESTABLISHED loading

missed messages for that channel
parent 85c02cc3
......@@ -18,6 +18,7 @@ import android.widget.TextView;
import com.facebook.drawee.view.SimpleDraweeView;
import java.util.List;
import java.util.concurrent.atomic.AtomicReference;
import chat.rocket.android.LaunchUtil;
import chat.rocket.android.R;
......@@ -49,7 +50,7 @@ public class MainActivity extends AbstractAuthedActivity implements MainContract
private RoomToolbar toolbar;
private SlidingPaneLayout pane;
private MainContract.Presenter presenter;
private volatile Snackbar statusTicker;
private volatile AtomicReference<Snackbar> statusTicker = new AtomicReference<>();
@Override
public int getLayoutContainerForFragment() {
......@@ -95,7 +96,9 @@ public class MainActivity extends AbstractAuthedActivity implements MainContract
presenter.release();
}
// Dismiss any status ticker
if (statusTicker != null) statusTicker.dismiss();
if (statusTicker.get() != null) {
statusTicker.get().dismiss();
}
super.onPause();
}
......@@ -250,31 +253,47 @@ public class MainActivity extends AbstractAuthedActivity implements MainContract
}
@Override
public synchronized void showConnectionError() {
dismissStatusTickerIfShowing();
statusTicker = Snackbar.make(findViewById(getLayoutContainerForFragment()),
public void showConnectionError() {
if (statusTicker.get() != null && statusTicker.get().isShown()) {
statusTicker.get().setText(R.string.fragment_retry_login_error_title)
.setAction(R.string.fragment_retry_login_retry_title, view -> {
statusTicker.set(null);
showConnecting();
ConnectivityManager.getInstance(getApplicationContext()).keepAliveServer();
});
} else {
Snackbar newStatusTicker = Snackbar.make(findViewById(getLayoutContainerForFragment()),
R.string.fragment_retry_login_error_title, Snackbar.LENGTH_INDEFINITE)
.setAction(R.string.fragment_retry_login_retry_title, view ->
ConnectivityManager.getInstance(getApplicationContext()).keepAliveServer());
statusTicker.show();
.setAction(R.string.fragment_retry_login_retry_title, view -> {
statusTicker.set(null);
showConnecting();
ConnectivityManager.getInstance(getApplicationContext()).keepAliveServer();
});
statusTicker.set(newStatusTicker);
statusTicker.get().show();
}
}
@Override
public synchronized void showConnecting() {
dismissStatusTickerIfShowing();
statusTicker = Snackbar.make(findViewById(getLayoutContainerForFragment()),
public void showConnecting() {
if (statusTicker.get() != null && statusTicker.get().isShown()) {
statusTicker.get().setText(R.string.server_config_activity_authenticating);
} else {
Snackbar newStatusTicker = Snackbar.make(findViewById(getLayoutContainerForFragment()),
R.string.server_config_activity_authenticating, Snackbar.LENGTH_INDEFINITE);
statusTicker.show();
statusTicker.set(newStatusTicker);
statusTicker.get().show();
}
}
@Override
public synchronized void showConnectionOk() {
public void showConnectionOk() {
dismissStatusTickerIfShowing();
}
private void dismissStatusTickerIfShowing() {
if (statusTicker != null) {
statusTicker.dismiss();
statusTicker.get().dismiss();
}
}
......@@ -334,7 +353,7 @@ public class MainActivity extends AbstractAuthedActivity implements MainContract
Fragment fragment = getSupportFragmentManager().findFragmentById(getLayoutContainerForFragment());
if (fragment != null && fragment instanceof RoomFragment) {
RoomFragment roomFragment = (RoomFragment) fragment;
roomFragment.loadMessages();
roomFragment.loadMissedMessages();
}
}
......
......@@ -212,7 +212,7 @@ public class MainPresenter extends BasePresenter<MainContract.View>
return;
}
view.showConnectionOk();
// view.showConnectionOk();
},
Logger::report
);
......@@ -227,12 +227,15 @@ public class MainPresenter extends BasePresenter<MainContract.View>
.subscribe(
connectivity -> {
if (connectivity.state == ServerConnectivity.STATE_CONNECTED) {
view.showConnectionOk();
view.refreshRoom();
//TODO: notify almost connected or something like that.
// view.showConnectionOk();
} else if (connectivity.state == ServerConnectivity.STATE_DISCONNECTED) {
if (connectivity.code == DDPClient.REASON_NETWORK_ERROR) {
view.showConnectionError();
}
} else if (connectivity.state == ServerConnectivity.STATE_SESSION_ESTABLISHED) {
view.refreshRoom();
view.showConnectionOk();
} else {
view.showConnecting();
}
......
......@@ -75,5 +75,7 @@ public interface RoomContract {
void replyMessage(@NonNull Message message, boolean justQuote);
void acceptMessageDeleteFailure(Message message);
void loadMissedMessages();
}
}
......@@ -716,7 +716,7 @@ public class RoomFragment extends AbstractChatRoomFragment implements
}
}
public void loadMessages() {
presenter.loadMessages();
public void loadMissedMessages() {
presenter.loadMissedMessages();
}
}
\ No newline at end of file
......@@ -6,11 +6,17 @@ import android.support.v4.util.Pair;
import com.hadisatrio.optional.Optional;
import org.json.JSONException;
import org.json.JSONObject;
import chat.rocket.android.BackgroundLooper;
import chat.rocket.android.RocketChatApplication;
import chat.rocket.android.RocketChatCache;
import chat.rocket.android.api.MethodCallHelper;
import chat.rocket.android.helper.AbsoluteUrlHelper;
import chat.rocket.android.helper.LogIfError;
import chat.rocket.android.helper.Logger;
import chat.rocket.android.log.RCLog;
import chat.rocket.android.service.ConnectivityManagerApi;
import chat.rocket.android.shared.BasePresenter;
import chat.rocket.core.SyncState;
......@@ -38,7 +44,7 @@ public class RoomPresenter extends BasePresenter<RoomContract.View>
private final ConnectivityManagerApi connectivityManagerApi;
private Room currentRoom;
public RoomPresenter(String roomId,
/* package */RoomPresenter(String roomId,
UserRepository userRepository,
MessageInteractor messageInteractor,
RoomRepository roomRepository,
......@@ -161,6 +167,23 @@ public class RoomPresenter extends BasePresenter<RoomContract.View>
addSubscription(subscription);
}
@Override
public void loadMissedMessages() {
RocketChatApplication appContext = RocketChatApplication.getInstance();
JSONObject openedRooms = new RocketChatCache(appContext).getOpenedRooms();
if (openedRooms.has(roomId)) {
try {
JSONObject room = openedRooms.getJSONObject(roomId);
String rid = room.optString("rid");
long ls = room.optLong("ls");
methodCallHelper.loadMissedMessages(rid, ls)
.continueWith(new LogIfError());
} catch (JSONException e) {
RCLog.e(e);
}
}
}
private String buildReplyOrQuoteMarkdown(String baseUrl, Message message, boolean justQuote) {
if (currentRoom == null || message.getUser() == null) {
return "";
......@@ -345,6 +368,11 @@ public class RoomPresenter extends BasePresenter<RoomContract.View>
})
.filter(Optional::isPresent)
.map(Optional::get)
.map(room -> {
new RocketChatCache(RocketChatApplication.getInstance())
.addOpenedRoom(room.getRoomId(), room.getLastSeen());
return room;
})
.flatMap(messageInteractor::getAllFrom)
.subscribeOn(AndroidSchedulers.from(BackgroundLooper.get()))
.observeOn(AndroidSchedulers.mainThread())
......
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