Commit 6dd32a92 authored by Yusuke Iwaki's avatar Yusuke Iwaki

call rooms/get on login.

parent 3ad85083
......@@ -4,10 +4,12 @@ import android.util.Patterns;
import bolts.Continuation;
import bolts.Task;
import chat.rocket.android.model.MethodCall;
import chat.rocket.android.model.Room;
import chat.rocket.android.model.ServerConfig;
import chat.rocket.android.ws.RocketChatWebSocketAPI;
import java.util.UUID;
import jp.co.crowdworks.realm_java_helpers_bolts.RealmHelperBolts;
import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;
......@@ -91,8 +93,8 @@ public class MethodCallHelper {
task -> Task.forResult(null)); // nothing to do.
}
private Continuation<String, Task<Void>> saveToken() {
return task -> RealmHelperBolts.executeTransaction(realm ->
private Task<Void> saveToken(Task<String> task) {
return RealmHelperBolts.executeTransaction(realm ->
realm.createOrUpdateObjectFromJson(ServerConfig.class, new JSONObject()
.put("id", serverConfigId)
.put("token", task.getResult())
......@@ -112,7 +114,7 @@ public class MethodCallHelper {
param.put("password", new JSONObject()
.put("digest", CheckSum.sha256(password))
.put("algorithm", "sha-256"));
}, task -> Task.forResult(task.getResult().getString("token"))).onSuccessTask(saveToken());
}, task -> Task.forResult(task.getResult().getString("token"))).onSuccessTask(this::saveToken);
}
/**
......@@ -124,7 +126,7 @@ public class MethodCallHelper {
.put("oauth", new JSONObject()
.put("credentialToken", credentialToken)
.put("credentialSecret", credentialSecret)),
task -> Task.forResult(task.getResult().getString("token"))).onSuccessTask(saveToken());
task -> Task.forResult(task.getResult().getString("token"))).onSuccessTask(this::saveToken);
}
/**
......@@ -132,7 +134,7 @@ public class MethodCallHelper {
*/
public Task<Void> loginWithToken(final String token) {
return call("login", param -> param.put("resume", token),
task -> Task.forResult(task.getResult().getString("token"))).onSuccessTask(saveToken());
task -> Task.forResult(task.getResult().getString("token"))).onSuccessTask(this::saveToken);
}
/**
......@@ -141,4 +143,36 @@ public class MethodCallHelper {
public Task<Void> logout() {
return call("logout", task -> Task.forResult(null));
}
/**
* request "rooms/get".
*/
public Task<Void> getRooms() {
return call("rooms/get", param -> param.put("$date", 0), this::updateRooms);
}
private Task<Void> updateRooms(Task<JSONObject> task) {
JSONObject result = task.getResult();
try {
JSONArray updatedRooms = result.getJSONArray("update");
for (int i = 0; i < updatedRooms.length(); i++) {
updatedRooms.getJSONObject(i).put("serverConfigId", serverConfigId);
}
return RealmHelperBolts.executeTransaction(realm -> {
realm.createOrUpdateAllFromJson(Room.class, result.getJSONArray("update"));
JSONArray removedRooms = result.getJSONArray("remove");
for (int i = 0; i < removedRooms.length(); i++) {
realm.where(Room.class)
.equalTo("serverConfigId", serverConfigId)
.equalTo("_id", removedRooms.getJSONObject(i).getString("_id"))
.findAll().deleteAllFromRealm();
}
return null;
});
} catch (JSONException exception) {
return Task.forError(exception);
}
}
}
package chat.rocket.android.model;
import io.realm.RealmObject;
import io.realm.annotations.PrimaryKey;
/**
* Chat Room.
*/
@SuppressWarnings("PMD.ShortVariable")
public class Room extends RealmObject {
@PrimaryKey private String _id;
private String serverConfigId;
private String name;
private String t; //type { c: channel, d: direct message, p: private }
private User u; //User who created this room.
private String topic;
}
package chat.rocket.android.model;
import io.realm.RealmObject;
import io.realm.annotations.PrimaryKey;
/**
* User.
*/
@SuppressWarnings("PMD.ShortVariable")
public class User extends RealmObject {
@PrimaryKey private String _id;
private String username;
}
......@@ -11,6 +11,7 @@ import chat.rocket.android.helper.TextUtils;
import chat.rocket.android.model.ServerConfig;
import chat.rocket.android.service.ddp_subscriber.LoginServiceConfigurationSubscriber;
import chat.rocket.android.service.observer.MethodCallObserver;
import chat.rocket.android.service.observer.SessionObserver;
import chat.rocket.android.service.observer.TokenLoginObserver;
import chat.rocket.android.ws.RocketChatWebSocketAPI;
import chat.rocket.android_ddp.DDPClientCallback;
......@@ -30,7 +31,8 @@ public class RocketChatWebSocketThread extends HandlerThread {
private static final Class[] REGISTERABLE_CLASSES = {
LoginServiceConfigurationSubscriber.class,
TokenLoginObserver.class,
MethodCallObserver.class
MethodCallObserver.class,
SessionObserver.class
};
private final Context appContext;
private final String serverConfigId;
......
package chat.rocket.android.service.observer;
import android.content.Context;
import chat.rocket.android.helper.LogcatIfError;
import chat.rocket.android.helper.MethodCallHelper;
import chat.rocket.android.model.ServerConfig;
import chat.rocket.android.ws.RocketChatWebSocketAPI;
import hugo.weaving.DebugLog;
import io.realm.Realm;
import io.realm.RealmResults;
import java.util.List;
/**
* Observes user is logged into server.
*/
public class SessionObserver extends AbstractModelObserver<ServerConfig> {
private int count;
public SessionObserver(Context context, String serverConfigId, RocketChatWebSocketAPI api) {
super(context, serverConfigId, api);
count = 0;
}
@Override protected RealmResults<ServerConfig> queryItems(Realm realm) {
return realm.where(ServerConfig.class)
.equalTo("id", serverConfigId)
.isNotNull("hostname")
.isNull("connectionError")
.isNotNull("session")
.isNotNull("token")
.equalTo("tokenVerified", true)
.findAll();
}
@Override protected void onCollectionChanged(List<ServerConfig> list) {
int origCount = count;
count = list.size();
if (origCount > 0 && count > 0) {
return;
}
if (count == 0) {
if (origCount > 0) {
onLogout();
}
return;
}
if (origCount == 0 && count > 0) {
onLogin();
}
}
@DebugLog private void onLogin() {
new MethodCallHelper(serverConfigId).getRooms()
.continueWith(new LogcatIfError());
}
@DebugLog private void onLogout() {
}
}
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