Commit 9c34af88 authored by Yusuke Iwaki's avatar Yusuke Iwaki

fix coding style

parent b62277c9
package chat.rocket.android_ddp; package chat.rocket.android_ddp;
import android.support.annotation.Nullable; import android.support.annotation.Nullable;
import org.json.JSONArray;
import bolts.Task; import bolts.Task;
import bolts.TaskCompletionSource; import bolts.TaskCompletionSource;
import chat.rocket.android_ddp.rx.RxWebSocketCallback; import chat.rocket.android_ddp.rx.RxWebSocketCallback;
import okhttp3.OkHttpClient; import okhttp3.OkHttpClient;
import org.json.JSONArray;
import rx.Observable; import rx.Observable;
public class DDPClient { public class DDPClient {
......
...@@ -3,17 +3,18 @@ package chat.rocket.android_ddp; ...@@ -3,17 +3,18 @@ package chat.rocket.android_ddp;
import android.support.annotation.NonNull; import android.support.annotation.NonNull;
import android.support.annotation.Nullable; import android.support.annotation.Nullable;
import android.text.TextUtils; import android.text.TextUtils;
import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;
import java.util.concurrent.TimeUnit;
import java.util.concurrent.TimeoutException;
import bolts.Task; import bolts.Task;
import bolts.TaskCompletionSource; import bolts.TaskCompletionSource;
import chat.rocket.android.log.RCLog; import chat.rocket.android.log.RCLog;
import chat.rocket.android_ddp.rx.RxWebSocket; import chat.rocket.android_ddp.rx.RxWebSocket;
import chat.rocket.android_ddp.rx.RxWebSocketCallback; import chat.rocket.android_ddp.rx.RxWebSocketCallback;
import java.util.concurrent.TimeUnit;
import java.util.concurrent.TimeoutException;
import okhttp3.OkHttpClient; import okhttp3.OkHttpClient;
import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;
import rx.Observable; import rx.Observable;
import rx.functions.Func1; import rx.functions.Func1;
import rx.subscriptions.CompositeSubscription; import rx.subscriptions.CompositeSubscription;
...@@ -30,7 +31,9 @@ public class DDPClientImpl { ...@@ -30,7 +31,9 @@ public class DDPClientImpl {
} }
private static JSONObject toJson(String s) { private static JSONObject toJson(String s) {
if (TextUtils.isEmpty(s)) return null; if (TextUtils.isEmpty(s)) {
return null;
}
try { try {
return new JSONObject(s); return new JSONObject(s);
} catch (JSONException e) { } catch (JSONException e) {
...@@ -252,14 +255,16 @@ public class DDPClientImpl { ...@@ -252,14 +255,16 @@ public class DDPClientImpl {
} }
public Observable<DDPSubscription.Event> getDDPSubscription() { public Observable<DDPSubscription.Event> getDDPSubscription() {
String[] targetMsgs = { "added", "changed", "removed", "addedBefore", "movedBefore" }; String[] targetMsgs = {"added", "changed", "removed", "addedBefore", "movedBefore"};
return observable.filter(callback -> callback instanceof RxWebSocketCallback.Message) return observable.filter(callback -> callback instanceof RxWebSocketCallback.Message)
.map(callback -> ((RxWebSocketCallback.Message) callback).responseBodyString) .map(callback -> ((RxWebSocketCallback.Message) callback).responseBodyString)
.map(DDPClientImpl::toJson) .map(DDPClientImpl::toJson)
.filter(response -> { .filter(response -> {
String msg = extractMsg(response); String msg = extractMsg(response);
for (String m : targetMsgs) { for (String m : targetMsgs) {
if (m.equals(msg)) return true; if (m.equals(msg)) {
return true;
}
} }
return false; return false;
}) })
...@@ -345,6 +350,7 @@ public class DDPClientImpl { ...@@ -345,6 +350,7 @@ public class DDPClientImpl {
} }
private interface JSONBuilder { private interface JSONBuilder {
@NonNull JSONObject create(JSONObject root) throws JSONException; @NonNull
JSONObject create(JSONObject root) throws JSONException;
} }
} }
...@@ -29,7 +29,8 @@ public class DDPSubscription { ...@@ -29,7 +29,8 @@ public class DDPSubscription {
this.id = id; this.id = id;
} }
@Override public String toString() { @Override
public String toString() {
return "NoSub[id=" + id + "]"; return "NoSub[id=" + id + "]";
} }
...@@ -53,7 +54,8 @@ public class DDPSubscription { ...@@ -53,7 +54,8 @@ public class DDPSubscription {
this.id = id; this.id = id;
} }
@Override public String toString() { @Override
public String toString() {
return "Ready[id=" + id + "]"; return "Ready[id=" + id + "]";
} }
} }
...@@ -68,7 +70,8 @@ public class DDPSubscription { ...@@ -68,7 +70,8 @@ public class DDPSubscription {
this.docID = docID; this.docID = docID;
} }
@Override public String toString() { @Override
public String toString() {
return "DocEvent[id=" + docID + ", collection=" + collection + "]"; return "DocEvent[id=" + docID + ", collection=" + collection + "]";
} }
} }
......
package chat.rocket.android_ddp.rx; package chat.rocket.android_ddp.rx;
import chat.rocket.android.log.RCLog;
import java.io.IOException; import java.io.IOException;
import chat.rocket.android.log.RCLog;
import okhttp3.OkHttpClient; import okhttp3.OkHttpClient;
import okhttp3.Request; import okhttp3.Request;
import okhttp3.RequestBody; import okhttp3.RequestBody;
...@@ -31,15 +31,18 @@ public class RxWebSocket { ...@@ -31,15 +31,18 @@ public class RxWebSocket {
WebSocketCall call = WebSocketCall.create(httpClient, request); WebSocketCall call = WebSocketCall.create(httpClient, request);
return Observable.create(new Observable.OnSubscribe<RxWebSocketCallback.Base>() { return Observable.create(new Observable.OnSubscribe<RxWebSocketCallback.Base>() {
@Override public void call(Subscriber<? super RxWebSocketCallback.Base> subscriber) { @Override
public void call(Subscriber<? super RxWebSocketCallback.Base> subscriber) {
call.enqueue(new WebSocketListener() { call.enqueue(new WebSocketListener() {
@Override public void onOpen(WebSocket webSocket, Response response) { @Override
public void onOpen(WebSocket webSocket, Response response) {
isConnected = true; isConnected = true;
RxWebSocket.this.webSocket = webSocket; RxWebSocket.this.webSocket = webSocket;
subscriber.onNext(new RxWebSocketCallback.Open(RxWebSocket.this.webSocket, response)); subscriber.onNext(new RxWebSocketCallback.Open(RxWebSocket.this.webSocket, response));
} }
@Override public void onFailure(IOException e, Response response) { @Override
public void onFailure(IOException e, Response response) {
try { try {
isConnected = false; isConnected = false;
subscriber.onError(new RxWebSocketCallback.Failure(webSocket, e, response)); subscriber.onError(new RxWebSocketCallback.Failure(webSocket, e, response));
...@@ -48,17 +51,20 @@ public class RxWebSocket { ...@@ -48,17 +51,20 @@ public class RxWebSocket {
} }
} }
@Override public void onMessage(ResponseBody responseBody) throws IOException { @Override
public void onMessage(ResponseBody responseBody) throws IOException {
isConnected = true; isConnected = true;
subscriber.onNext(new RxWebSocketCallback.Message(webSocket, responseBody)); subscriber.onNext(new RxWebSocketCallback.Message(webSocket, responseBody));
} }
@Override public void onPong(Buffer payload) { @Override
public void onPong(Buffer payload) {
isConnected = true; isConnected = true;
subscriber.onNext(new RxWebSocketCallback.Pong(webSocket, payload)); subscriber.onNext(new RxWebSocketCallback.Pong(webSocket, payload));
} }
@Override public void onClose(int code, String reason) { @Override
public void onClose(int code, String reason) {
isConnected = false; isConnected = false;
subscriber.onNext(new RxWebSocketCallback.Close(webSocket, code, reason)); subscriber.onNext(new RxWebSocketCallback.Close(webSocket, code, reason));
subscriber.onCompleted(); subscriber.onCompleted();
......
package chat.rocket.android_ddp.rx; package chat.rocket.android_ddp.rx;
import chat.rocket.android.log.RCLog; import static android.R.attr.type;
import java.io.IOException; import java.io.IOException;
import chat.rocket.android.log.RCLog;
import okhttp3.Response; import okhttp3.Response;
import okhttp3.ResponseBody; import okhttp3.ResponseBody;
import okhttp3.ws.WebSocket; import okhttp3.ws.WebSocket;
import okio.Buffer; import okio.Buffer;
import static android.R.attr.type;
public class RxWebSocketCallback { public class RxWebSocketCallback {
public static abstract class Base { public static abstract class Base {
public String type; public String type;
...@@ -19,7 +19,8 @@ public class RxWebSocketCallback { ...@@ -19,7 +19,8 @@ public class RxWebSocketCallback {
this.ws = ws; this.ws = ws;
} }
@Override public String toString() { @Override
public String toString() {
return "[" + type + "]"; return "[" + type + "]";
} }
} }
...@@ -43,7 +44,8 @@ public class RxWebSocketCallback { ...@@ -43,7 +44,8 @@ public class RxWebSocketCallback {
this.response = response; this.response = response;
} }
@Override public String toString() { @Override
public String toString() {
if (response != null) { if (response != null) {
return "[" + type + "] " + response.message(); return "[" + type + "] " + response.message();
} else { } else {
...@@ -64,7 +66,8 @@ public class RxWebSocketCallback { ...@@ -64,7 +66,8 @@ public class RxWebSocketCallback {
} }
} }
@Override public String toString() { @Override
public String toString() {
return "[" + type + "] " + responseBodyString; return "[" + type + "] " + responseBodyString;
} }
} }
...@@ -88,7 +91,8 @@ public class RxWebSocketCallback { ...@@ -88,7 +91,8 @@ public class RxWebSocketCallback {
this.reason = reason; this.reason = reason;
} }
@Override public String toString() { @Override
public String toString() {
return "[" + type + "] code=" + code + ", reason=" + reason; return "[" + type + "] code=" + code + ", reason=" + reason;
} }
} }
......
...@@ -2,6 +2,7 @@ package chat.rocket.android; ...@@ -2,6 +2,7 @@ package chat.rocket.android;
import android.content.Context; import android.content.Context;
import android.content.Intent; import android.content.Intent;
import chat.rocket.android.activity.AddServerActivity; import chat.rocket.android.activity.AddServerActivity;
import chat.rocket.android.activity.ServerConfigActivity; import chat.rocket.android.activity.ServerConfigActivity;
......
package chat.rocket.android; package chat.rocket.android;
import android.support.multidex.MultiDexApplication; import android.support.multidex.MultiDexApplication;
import chat.rocket.android.model.ServerConfig;
import chat.rocket.android.realm_helper.RealmStore;
import com.facebook.stetho.Stetho; import com.facebook.stetho.Stetho;
import com.uphyca.stetho_realm.RealmInspectorModulesProvider; import com.uphyca.stetho_realm.RealmInspectorModulesProvider;
import io.realm.Realm; import io.realm.Realm;
import io.realm.RealmConfiguration; import io.realm.RealmConfiguration;
import java.util.List; import java.util.List;
import chat.rocket.android.model.ServerConfig;
import chat.rocket.android.realm_helper.RealmStore;
import chat.rocket.android.wrappers.InstabugWrapper; import chat.rocket.android.wrappers.InstabugWrapper;
/** /**
* Customized Application-class for Rocket.Chat * Customized Application-class for Rocket.Chat
*/ */
public class RocketChatApplication extends MultiDexApplication { public class RocketChatApplication extends MultiDexApplication {
@Override public void onCreate() { @Override
public void onCreate() {
super.onCreate(); super.onCreate();
Realm.init(this); Realm.init(this);
......
...@@ -4,6 +4,7 @@ import android.content.Intent; ...@@ -4,6 +4,7 @@ import android.content.Intent;
import android.content.SharedPreferences; import android.content.SharedPreferences;
import android.os.Bundle; import android.os.Bundle;
import android.support.annotation.Nullable; import android.support.annotation.Nullable;
import chat.rocket.android.LaunchUtil; import chat.rocket.android.LaunchUtil;
import chat.rocket.android.RocketChatCache; import chat.rocket.android.RocketChatCache;
import chat.rocket.android.model.ServerConfig; import chat.rocket.android.model.ServerConfig;
...@@ -14,19 +15,8 @@ import chat.rocket.android.service.RocketChatService; ...@@ -14,19 +15,8 @@ import chat.rocket.android.service.RocketChatService;
import icepick.State; import icepick.State;
abstract class AbstractAuthedActivity extends AbstractFragmentActivity { abstract class AbstractAuthedActivity extends AbstractFragmentActivity {
private RealmListObserver<ServerConfig> unconfiguredServersObserver =
RealmStore.getDefault()
.createListObserver(realm ->
realm.where(ServerConfig.class).isNotNull("session").findAll())
.setOnUpdateListener(results -> {
if (results.isEmpty()) {
LaunchUtil.showAddServerActivity(this);
}
});
@State protected String serverConfigId; @State protected String serverConfigId;
@State protected String roomId; @State protected String roomId;
SharedPreferences.OnSharedPreferenceChangeListener preferenceChangeListener = SharedPreferences.OnSharedPreferenceChangeListener preferenceChangeListener =
(sharedPreferences, key) -> { (sharedPreferences, key) -> {
if (RocketChatCache.KEY_SELECTED_SERVER_CONFIG_ID.equals(key)) { if (RocketChatCache.KEY_SELECTED_SERVER_CONFIG_ID.equals(key)) {
...@@ -35,8 +25,18 @@ abstract class AbstractAuthedActivity extends AbstractFragmentActivity { ...@@ -35,8 +25,18 @@ abstract class AbstractAuthedActivity extends AbstractFragmentActivity {
updateRoomIdIfNeeded(sharedPreferences); updateRoomIdIfNeeded(sharedPreferences);
} }
}; };
private RealmListObserver<ServerConfig> unconfiguredServersObserver =
RealmStore.getDefault()
.createListObserver(realm ->
realm.where(ServerConfig.class).isNotNull("session").findAll())
.setOnUpdateListener(results -> {
if (results.isEmpty()) {
LaunchUtil.showAddServerActivity(this);
}
});
@Override protected void onCreate(@Nullable Bundle savedInstanceState) { @Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState); super.onCreate(savedInstanceState);
if (savedInstanceState == null) { if (savedInstanceState == null) {
Intent intent = getIntent(); Intent intent = getIntent();
...@@ -119,11 +119,14 @@ abstract class AbstractAuthedActivity extends AbstractFragmentActivity { ...@@ -119,11 +119,14 @@ abstract class AbstractAuthedActivity extends AbstractFragmentActivity {
onRoomIdUpdated(); onRoomIdUpdated();
} }
protected void onServerConfigIdUpdated() {} protected void onServerConfigIdUpdated() {
}
protected void onRoomIdUpdated() {} protected void onRoomIdUpdated() {
}
@Override protected void onResume() { @Override
protected void onResume() {
super.onResume(); super.onResume();
RocketChatService.keepalive(this); RocketChatService.keepalive(this);
unconfiguredServersObserver.sub(); unconfiguredServersObserver.sub();
...@@ -134,7 +137,8 @@ abstract class AbstractAuthedActivity extends AbstractFragmentActivity { ...@@ -134,7 +137,8 @@ abstract class AbstractAuthedActivity extends AbstractFragmentActivity {
prefs.registerOnSharedPreferenceChangeListener(preferenceChangeListener); prefs.registerOnSharedPreferenceChangeListener(preferenceChangeListener);
} }
@Override protected void onPause() { @Override
protected void onPause() {
SharedPreferences prefs = RocketChatCache.get(this); SharedPreferences prefs = RocketChatCache.get(this);
prefs.unregisterOnSharedPreferenceChangeListener(preferenceChangeListener); prefs.unregisterOnSharedPreferenceChangeListener(preferenceChangeListener);
...@@ -142,7 +146,8 @@ abstract class AbstractAuthedActivity extends AbstractFragmentActivity { ...@@ -142,7 +146,8 @@ abstract class AbstractAuthedActivity extends AbstractFragmentActivity {
super.onPause(); super.onPause();
} }
@Override protected void onSaveInstanceState(Bundle outState) { @Override
protected void onSaveInstanceState(Bundle outState) {
super.onSaveInstanceState(outState); super.onSaveInstanceState(outState);
} }
} }
...@@ -6,12 +6,10 @@ import android.support.annotation.Nullable; ...@@ -6,12 +6,10 @@ import android.support.annotation.Nullable;
import android.support.v4.app.Fragment; import android.support.v4.app.Fragment;
import android.support.v4.app.FragmentManager; import android.support.v4.app.FragmentManager;
import android.view.MotionEvent; import android.view.MotionEvent;
import com.trello.rxlifecycle.components.support.RxAppCompatActivity;
import chat.rocket.android.helper.OnBackPressListener; import chat.rocket.android.helper.OnBackPressListener;
import chat.rocket.android.log.RCLog; import chat.rocket.android.log.RCLog;
import com.trello.rxlifecycle.components.support.RxAppCompatActivity;
import chat.rocket.android.wrappers.InstabugWrapper; import chat.rocket.android.wrappers.InstabugWrapper;
import icepick.Icepick; import icepick.Icepick;
......
...@@ -3,6 +3,8 @@ package chat.rocket.android.activity; ...@@ -3,6 +3,8 @@ package chat.rocket.android.activity;
import android.os.Bundle; import android.os.Bundle;
import android.support.annotation.Nullable; import android.support.annotation.Nullable;
import android.support.v4.app.Fragment; import android.support.v4.app.Fragment;
import java.util.UUID;
import chat.rocket.android.R; import chat.rocket.android.R;
import chat.rocket.android.RocketChatCache; import chat.rocket.android.RocketChatCache;
import chat.rocket.android.fragment.server_config.InputHostnameFragment; import chat.rocket.android.fragment.server_config.InputHostnameFragment;
...@@ -11,7 +13,6 @@ import chat.rocket.android.model.ServerConfig; ...@@ -11,7 +13,6 @@ import chat.rocket.android.model.ServerConfig;
import chat.rocket.android.realm_helper.RealmListObserver; import chat.rocket.android.realm_helper.RealmListObserver;
import chat.rocket.android.realm_helper.RealmObjectObserver; import chat.rocket.android.realm_helper.RealmObjectObserver;
import chat.rocket.android.realm_helper.RealmStore; import chat.rocket.android.realm_helper.RealmStore;
import java.util.UUID;
public class AddServerActivity extends AbstractFragmentActivity { public class AddServerActivity extends AbstractFragmentActivity {
...@@ -36,11 +37,13 @@ public class AddServerActivity extends AbstractFragmentActivity { ...@@ -36,11 +37,13 @@ public class AddServerActivity extends AbstractFragmentActivity {
if (config == null || config.getState() == ServerConfig.STATE_CONNECTION_ERROR) { if (config == null || config.getState() == ServerConfig.STATE_CONNECTION_ERROR) {
showFragment(new InputHostnameFragment()); showFragment(new InputHostnameFragment());
} else { } else {
showFragment(WaitingFragment.create(getString(R.string.add_server_activity_waiting_server))); showFragment(
WaitingFragment.create(getString(R.string.add_server_activity_waiting_server)));
} }
}); });
@Override protected void onCreate(@Nullable Bundle savedInstanceState) { @Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState); super.onCreate(savedInstanceState);
setContentView(R.layout.simple_screen); setContentView(R.layout.simple_screen);
...@@ -66,28 +69,33 @@ public class AddServerActivity extends AbstractFragmentActivity { ...@@ -66,28 +69,33 @@ public class AddServerActivity extends AbstractFragmentActivity {
serverConfigId = UUID.randomUUID().toString(); serverConfigId = UUID.randomUUID().toString();
} }
@Override protected int getLayoutContainerForFragment() { @Override
protected int getLayoutContainerForFragment() {
return R.id.content; return R.id.content;
} }
@Override protected void onResume() { @Override
protected void onResume() {
super.onResume(); super.onResume();
configuredServersObserver.sub(); configuredServersObserver.sub();
targetServerConfigObserver.sub(); targetServerConfigObserver.sub();
} }
@Override protected void onPause() { @Override
protected void onPause() {
configuredServersObserver.unsub(); configuredServersObserver.unsub();
targetServerConfigObserver.unsub(); targetServerConfigObserver.unsub();
super.onPause(); super.onPause();
} }
@Override protected void showFragment(Fragment fragment) { @Override
protected void showFragment(Fragment fragment) {
injectServerConfigIdArgTo(fragment); injectServerConfigIdArgTo(fragment);
super.showFragment(fragment); super.showFragment(fragment);
} }
@Override protected void showFragmentWithBackStack(Fragment fragment) { @Override
protected void showFragmentWithBackStack(Fragment fragment) {
injectServerConfigIdArgTo(fragment); injectServerConfigIdArgTo(fragment);
super.showFragmentWithBackStack(fragment); super.showFragmentWithBackStack(fragment);
} }
...@@ -101,7 +109,8 @@ public class AddServerActivity extends AbstractFragmentActivity { ...@@ -101,7 +109,8 @@ public class AddServerActivity extends AbstractFragmentActivity {
fragment.setArguments(args); fragment.setArguments(args);
} }
@Override protected void onBackPressedNotHandled() { @Override
protected void onBackPressedNotHandled() {
moveTaskToBack(true); moveTaskToBack(true);
} }
} }
...@@ -5,6 +5,7 @@ import android.support.annotation.Nullable; ...@@ -5,6 +5,7 @@ import android.support.annotation.Nullable;
import android.support.v4.widget.SlidingPaneLayout; import android.support.v4.widget.SlidingPaneLayout;
import android.support.v7.widget.Toolbar; import android.support.v7.widget.Toolbar;
import android.view.View; import android.view.View;
import chat.rocket.android.LaunchUtil; import chat.rocket.android.LaunchUtil;
import chat.rocket.android.R; import chat.rocket.android.R;
import chat.rocket.android.api.MethodCallHelper; import chat.rocket.android.api.MethodCallHelper;
...@@ -26,11 +27,13 @@ public class MainActivity extends AbstractAuthedActivity { ...@@ -26,11 +27,13 @@ public class MainActivity extends AbstractAuthedActivity {
private RealmObjectObserver<Session> sessionObserver; private RealmObjectObserver<Session> sessionObserver;
@Override protected int getLayoutContainerForFragment() { @Override
protected int getLayoutContainerForFragment() {
return R.id.activity_main_container; return R.id.activity_main_container;
} }
@Override protected void onCreate(@Nullable Bundle savedInstanceState) { @Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState); super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main); setContentView(R.layout.activity_main);
...@@ -73,7 +76,8 @@ public class MainActivity extends AbstractAuthedActivity { ...@@ -73,7 +76,8 @@ public class MainActivity extends AbstractAuthedActivity {
if (pane != null) { if (pane != null) {
final SlidingPaneLayout subPane = (SlidingPaneLayout) findViewById(R.id.sub_sliding_pane); final SlidingPaneLayout subPane = (SlidingPaneLayout) findViewById(R.id.sub_sliding_pane);
pane.setPanelSlideListener(new SlidingPaneLayout.SimplePanelSlideListener() { pane.setPanelSlideListener(new SlidingPaneLayout.SimplePanelSlideListener() {
@Override public void onPanelClosed(View panel) { @Override
public void onPanelClosed(View panel) {
super.onPanelClosed(panel); super.onPanelClosed(panel);
if (subPane != null) { if (subPane != null) {
subPane.closePane(); subPane.closePane();
...@@ -101,7 +105,8 @@ public class MainActivity extends AbstractAuthedActivity { ...@@ -101,7 +105,8 @@ public class MainActivity extends AbstractAuthedActivity {
} }
@DebugLog @DebugLog
@Override protected void onServerConfigIdUpdated() { @Override
protected void onServerConfigIdUpdated() {
super.onServerConfigIdUpdated(); super.onServerConfigIdUpdated();
updateSessionObserver(); updateSessionObserver();
updateSidebarMainFragment(); updateSidebarMainFragment();
...@@ -142,7 +147,8 @@ public class MainActivity extends AbstractAuthedActivity { ...@@ -142,7 +147,8 @@ public class MainActivity extends AbstractAuthedActivity {
.commit(); .commit();
} }
@Override protected void onRoomIdUpdated() { @Override
protected void onRoomIdUpdated() {
super.onRoomIdUpdated(); super.onRoomIdUpdated();
if (roomId != null) { if (roomId != null) {
...@@ -153,7 +159,8 @@ public class MainActivity extends AbstractAuthedActivity { ...@@ -153,7 +159,8 @@ public class MainActivity extends AbstractAuthedActivity {
} }
} }
@Override protected void onDestroy() { @Override
protected void onDestroy() {
if (sessionObserver != null) { if (sessionObserver != null) {
sessionObserver.unsub(); sessionObserver.unsub();
sessionObserver = null; sessionObserver = null;
...@@ -161,7 +168,8 @@ public class MainActivity extends AbstractAuthedActivity { ...@@ -161,7 +168,8 @@ public class MainActivity extends AbstractAuthedActivity {
super.onDestroy(); super.onDestroy();
} }
@Override protected boolean onBackPress() { @Override
protected boolean onBackPress() {
return closeSidebarIfNeeded() || super.onBackPress(); return closeSidebarIfNeeded() || super.onBackPress();
} }
} }
...@@ -4,6 +4,7 @@ import android.content.Intent; ...@@ -4,6 +4,7 @@ import android.content.Intent;
import android.os.Bundle; import android.os.Bundle;
import android.support.annotation.Nullable; import android.support.annotation.Nullable;
import android.support.v4.app.Fragment; import android.support.v4.app.Fragment;
import chat.rocket.android.R; import chat.rocket.android.R;
import chat.rocket.android.fragment.server_config.LoginFragment; import chat.rocket.android.fragment.server_config.LoginFragment;
import chat.rocket.android.fragment.server_config.RetryLoginFragment; import chat.rocket.android.fragment.server_config.RetryLoginFragment;
...@@ -22,11 +23,13 @@ public class ServerConfigActivity extends AbstractFragmentActivity { ...@@ -22,11 +23,13 @@ public class ServerConfigActivity extends AbstractFragmentActivity {
private String serverConfigId; private String serverConfigId;
private RealmObjectObserver<Session> sessionObserver; private RealmObjectObserver<Session> sessionObserver;
@Override protected int getLayoutContainerForFragment() { @Override
protected int getLayoutContainerForFragment() {
return R.id.content; return R.id.content;
} }
@Override protected void onCreate(@Nullable Bundle savedInstanceState) { @Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState); super.onCreate(savedInstanceState);
Intent intent = getIntent(); Intent intent = getIntent();
...@@ -49,13 +52,15 @@ public class ServerConfigActivity extends AbstractFragmentActivity { ...@@ -49,13 +52,15 @@ public class ServerConfigActivity extends AbstractFragmentActivity {
showFragment(new WaitingFragment()); showFragment(new WaitingFragment());
} }
@Override protected void onResume() { @Override
protected void onResume() {
super.onResume(); super.onResume();
RocketChatService.keepalive(this); RocketChatService.keepalive(this);
sessionObserver.sub(); sessionObserver.sub();
} }
@Override protected void onPause() { @Override
protected void onPause() {
sessionObserver.unsub(); sessionObserver.unsub();
super.onPause(); super.onPause();
} }
...@@ -75,7 +80,8 @@ public class ServerConfigActivity extends AbstractFragmentActivity { ...@@ -75,7 +80,8 @@ public class ServerConfigActivity extends AbstractFragmentActivity {
final String token = session.getToken(); final String token = session.getToken();
if (!TextUtils.isEmpty(token)) { if (!TextUtils.isEmpty(token)) {
if (TextUtils.isEmpty(session.getError())) { if (TextUtils.isEmpty(session.getError())) {
showFragment(WaitingFragment.create(getString(R.string.server_config_activity_authenticating))); showFragment(
WaitingFragment.create(getString(R.string.server_config_activity_authenticating)));
} else { } else {
showFragment(new RetryLoginFragment()); showFragment(new RetryLoginFragment());
} }
...@@ -85,12 +91,14 @@ public class ServerConfigActivity extends AbstractFragmentActivity { ...@@ -85,12 +91,14 @@ public class ServerConfigActivity extends AbstractFragmentActivity {
showFragment(new LoginFragment()); showFragment(new LoginFragment());
} }
@Override protected void showFragment(Fragment fragment) { @Override
protected void showFragment(Fragment fragment) {
injectServerConfigIdArgTo(fragment); injectServerConfigIdArgTo(fragment);
super.showFragment(fragment); super.showFragment(fragment);
} }
@Override protected void showFragmentWithBackStack(Fragment fragment) { @Override
protected void showFragmentWithBackStack(Fragment fragment) {
injectServerConfigIdArgTo(fragment); injectServerConfigIdArgTo(fragment);
super.showFragmentWithBackStack(fragment); super.showFragmentWithBackStack(fragment);
} }
...@@ -104,7 +112,8 @@ public class ServerConfigActivity extends AbstractFragmentActivity { ...@@ -104,7 +112,8 @@ public class ServerConfigActivity extends AbstractFragmentActivity {
fragment.setArguments(args); fragment.setArguments(args);
} }
@Override protected void onBackPressedNotHandled() { @Override
protected void onBackPressedNotHandled() {
moveTaskToBack(true); moveTaskToBack(true);
} }
} }
package chat.rocket.android.api; package chat.rocket.android.api;
import android.support.annotation.Nullable; import android.support.annotation.Nullable;
import org.json.JSONArray;
import org.json.JSONException;
import java.util.UUID;
import bolts.Task; import bolts.Task;
import chat.rocket.android.helper.OkHttpHelper; import chat.rocket.android.helper.OkHttpHelper;
import chat.rocket.android.helper.TextUtils; import chat.rocket.android.helper.TextUtils;
...@@ -8,9 +12,6 @@ import chat.rocket.android.log.RCLog; ...@@ -8,9 +12,6 @@ import chat.rocket.android.log.RCLog;
import chat.rocket.android_ddp.DDPClient; import chat.rocket.android_ddp.DDPClient;
import chat.rocket.android_ddp.DDPClientCallback; import chat.rocket.android_ddp.DDPClientCallback;
import chat.rocket.android_ddp.DDPSubscription; import chat.rocket.android_ddp.DDPSubscription;
import java.util.UUID;
import org.json.JSONArray;
import org.json.JSONException;
import rx.Observable; import rx.Observable;
/** /**
......
package chat.rocket.android.api; package chat.rocket.android.api;
import android.content.Context; import android.content.Context;
import org.json.JSONArray;
import org.json.JSONObject;
import bolts.Task; import bolts.Task;
import chat.rocket.android.helper.TextUtils; import chat.rocket.android.helper.TextUtils;
import chat.rocket.android.realm_helper.RealmHelper; import chat.rocket.android.realm_helper.RealmHelper;
import org.json.JSONArray;
import org.json.JSONObject;
/** /**
* MethodCall for uploading file. * MethodCall for uploading file.
......
...@@ -2,6 +2,11 @@ package chat.rocket.android.api; ...@@ -2,6 +2,11 @@ package chat.rocket.android.api;
import android.content.Context; import android.content.Context;
import android.util.Patterns; import android.util.Patterns;
import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;
import java.util.UUID;
import bolts.Continuation; import bolts.Continuation;
import bolts.Task; import bolts.Task;
import chat.rocket.android.helper.CheckSum; import chat.rocket.android.helper.CheckSum;
...@@ -16,10 +21,6 @@ import chat.rocket.android.realm_helper.RealmHelper; ...@@ -16,10 +21,6 @@ import chat.rocket.android.realm_helper.RealmHelper;
import chat.rocket.android.realm_helper.RealmStore; import chat.rocket.android.realm_helper.RealmStore;
import chat.rocket.android_ddp.DDPClientCallback; import chat.rocket.android_ddp.DDPClientCallback;
import hugo.weaving.DebugLog; import hugo.weaving.DebugLog;
import java.util.UUID;
import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;
/** /**
* Utility class for creating/handling MethodCall or RPC. * Utility class for creating/handling MethodCall or RPC.
...@@ -27,10 +28,14 @@ import org.json.JSONObject; ...@@ -27,10 +28,14 @@ import org.json.JSONObject;
*/ */
public class MethodCallHelper { public class MethodCallHelper {
protected static final long TIMEOUT_MS = 4000;
protected static final Continuation<String, Task<JSONObject>> CONVERT_TO_JSON_OBJECT =
task -> Task.forResult(new JSONObject(task.getResult()));
protected static final Continuation<String, Task<JSONArray>> CONVERT_TO_JSON_ARRAY =
task -> Task.forResult(new JSONArray(task.getResult()));
protected final Context context; protected final Context context;
protected final RealmHelper realmHelper; protected final RealmHelper realmHelper;
protected final DDPClientWraper ddpClient; protected final DDPClientWraper ddpClient;
protected static final long TIMEOUT_MS = 4000;
@Deprecated @Deprecated
/** /**
...@@ -93,10 +98,6 @@ public class MethodCallHelper { ...@@ -93,10 +98,6 @@ public class MethodCallHelper {
}); });
} }
protected interface ParamBuilder {
JSONArray buildParam() throws JSONException;
}
protected final Task<String> call(String methodName, long timeout) { protected final Task<String> call(String methodName, long timeout) {
return injectErrorHandler(executeMethodCall(methodName, null, timeout)); return injectErrorHandler(executeMethodCall(methodName, null, timeout));
} }
...@@ -111,12 +112,6 @@ public class MethodCallHelper { ...@@ -111,12 +112,6 @@ public class MethodCallHelper {
} }
} }
protected static final Continuation<String, Task<JSONObject>> CONVERT_TO_JSON_OBJECT =
task -> Task.forResult(new JSONObject(task.getResult()));
protected static final Continuation<String, Task<JSONArray>> CONVERT_TO_JSON_ARRAY =
task -> Task.forResult(new JSONArray(task.getResult()));
/** /**
* Register User. * Register User.
*/ */
...@@ -340,7 +335,6 @@ public class MethodCallHelper { ...@@ -340,7 +335,6 @@ public class MethodCallHelper {
.onSuccessTask(task -> Task.forResult(null)); .onSuccessTask(task -> Task.forResult(null));
} }
public Task<Void> getPublicSettings() { public Task<Void> getPublicSettings() {
return call("public-settings/get", TIMEOUT_MS) return call("public-settings/get", TIMEOUT_MS)
.onSuccessTask(CONVERT_TO_JSON_ARRAY) .onSuccessTask(CONVERT_TO_JSON_ARRAY)
...@@ -357,4 +351,9 @@ public class MethodCallHelper { ...@@ -357,4 +351,9 @@ public class MethodCallHelper {
}); });
}); });
} }
protected interface ParamBuilder {
JSONArray buildParam() throws JSONException;
}
} }
...@@ -14,7 +14,9 @@ import com.trello.rxlifecycle.components.support.RxFragment; ...@@ -14,7 +14,9 @@ import com.trello.rxlifecycle.components.support.RxFragment;
public abstract class AbstractFragment extends RxFragment { public abstract class AbstractFragment extends RxFragment {
protected View rootView; protected View rootView;
protected abstract @LayoutRes int getLayout(); protected abstract
@LayoutRes
int getLayout();
protected abstract void onSetupView(); protected abstract void onSetupView();
......
...@@ -9,6 +9,7 @@ import android.webkit.WebResourceRequest; ...@@ -9,6 +9,7 @@ import android.webkit.WebResourceRequest;
import android.webkit.WebSettings; import android.webkit.WebSettings;
import android.webkit.WebView; import android.webkit.WebView;
import android.webkit.WebViewClient; import android.webkit.WebViewClient;
import chat.rocket.android.R; import chat.rocket.android.R;
import chat.rocket.android.helper.OnBackPressListener; import chat.rocket.android.helper.OnBackPressListener;
import hugo.weaving.DebugLog; import hugo.weaving.DebugLog;
...@@ -19,11 +20,13 @@ public abstract class AbstractWebViewFragment extends AbstractFragment ...@@ -19,11 +20,13 @@ public abstract class AbstractWebViewFragment extends AbstractFragment
private WebViewClient webviewClient = new WebViewClient() { private WebViewClient webviewClient = new WebViewClient() {
private boolean error; private boolean error;
@Override public void onPageStarted(WebView webview, String url, Bitmap favicon) { @Override
public void onPageStarted(WebView webview, String url, Bitmap favicon) {
error = false; error = false;
} }
@Override public void onPageFinished(WebView webview, String url) { @Override
public void onPageFinished(WebView webview, String url) {
if (!error) { if (!error) {
onPageLoaded(webview, url); onPageLoaded(webview, url);
} }
...@@ -35,7 +38,8 @@ public abstract class AbstractWebViewFragment extends AbstractFragment ...@@ -35,7 +38,8 @@ public abstract class AbstractWebViewFragment extends AbstractFragment
this.error = true; this.error = true;
} }
@Override public boolean shouldOverrideUrlLoading(WebView webview, String url) { @Override
public boolean shouldOverrideUrlLoading(WebView webview, String url) {
return (shouldOverride(webview, url) && onHandleCallback(webview, url)) return (shouldOverride(webview, url) && onHandleCallback(webview, url))
|| super.shouldOverrideUrlLoading(webview, url); || super.shouldOverrideUrlLoading(webview, url);
} }
...@@ -48,11 +52,13 @@ public abstract class AbstractWebViewFragment extends AbstractFragment ...@@ -48,11 +52,13 @@ public abstract class AbstractWebViewFragment extends AbstractFragment
} }
}; };
@Override protected int getLayout() { @Override
protected int getLayout() {
return R.layout.webview; return R.layout.webview;
} }
@Override protected void onSetupView() { @Override
protected void onSetupView() {
webview = (WebView) rootView.findViewById(R.id.webview); webview = (WebView) rootView.findViewById(R.id.webview);
setupWebView(); setupWebView();
...@@ -76,7 +82,8 @@ public abstract class AbstractWebViewFragment extends AbstractFragment ...@@ -76,7 +82,8 @@ public abstract class AbstractWebViewFragment extends AbstractFragment
} }
} }
@Override public boolean onBackPressed() { @Override
public boolean onBackPressed() {
if (webview.canGoBack()) { if (webview.canGoBack()) {
webview.goBack(); webview.goBack();
return true; return true;
......
...@@ -6,6 +6,7 @@ import android.support.v7.widget.Toolbar; ...@@ -6,6 +6,7 @@ import android.support.v7.widget.Toolbar;
import android.view.LayoutInflater; import android.view.LayoutInflater;
import android.view.View; import android.view.View;
import android.view.ViewGroup; import android.view.ViewGroup;
import chat.rocket.android.R; import chat.rocket.android.R;
import chat.rocket.android.fragment.AbstractFragment; import chat.rocket.android.fragment.AbstractFragment;
......
...@@ -6,15 +6,18 @@ public class HomeFragment extends AbstractChatRoomFragment { ...@@ -6,15 +6,18 @@ public class HomeFragment extends AbstractChatRoomFragment {
public HomeFragment() { public HomeFragment() {
} }
@Override protected int getLayout() { @Override
protected int getLayout() {
return R.layout.fragment_home; return R.layout.fragment_home;
} }
@Override protected void onSetupView() { @Override
protected void onSetupView() {
activityToolbar.setTitle(R.string.home_fragment_title); activityToolbar.setTitle(R.string.home_fragment_title);
} }
@Override public void onResume() { @Override
public void onResume() {
super.onResume(); super.onResume();
activityToolbar.setNavigationIcon(null); activityToolbar.setNavigationIcon(null);
activityToolbar.setTitle(R.string.home_fragment_title); activityToolbar.setTitle(R.string.home_fragment_title);
......
...@@ -12,15 +12,21 @@ import android.support.v7.app.AlertDialog; ...@@ -12,15 +12,21 @@ import android.support.v7.app.AlertDialog;
import android.support.v7.widget.LinearLayoutManager; import android.support.v7.widget.LinearLayoutManager;
import android.support.v7.widget.RecyclerView; import android.support.v7.widget.RecyclerView;
import android.view.View; import android.view.View;
import com.jakewharton.rxbinding.support.v4.widget.RxDrawerLayout;
import io.realm.Sort;
import org.json.JSONObject;
import java.lang.reflect.Field;
import java.util.UUID;
import chat.rocket.android.R; import chat.rocket.android.R;
import chat.rocket.android.api.MethodCallHelper; import chat.rocket.android.api.MethodCallHelper;
import chat.rocket.android.fragment.chatroom.dialog.FileUploadProgressDialogFragment; import chat.rocket.android.fragment.chatroom.dialog.FileUploadProgressDialogFragment;
import chat.rocket.android.fragment.chatroom.dialog.UsersOfRoomDialogFragment; import chat.rocket.android.fragment.chatroom.dialog.UsersOfRoomDialogFragment;
import chat.rocket.android.helper.FileUploadHelper;
import chat.rocket.android.helper.LoadMoreScrollListener; import chat.rocket.android.helper.LoadMoreScrollListener;
import chat.rocket.android.helper.LogcatIfError; import chat.rocket.android.helper.LogcatIfError;
import chat.rocket.android.helper.OnBackPressListener; import chat.rocket.android.helper.OnBackPressListener;
import chat.rocket.android.helper.TextUtils; import chat.rocket.android.helper.TextUtils;
import chat.rocket.android.helper.FileUploadHelper;
import chat.rocket.android.layouthelper.chatroom.MessageComposerManager; import chat.rocket.android.layouthelper.chatroom.MessageComposerManager;
import chat.rocket.android.layouthelper.chatroom.MessageListAdapter; import chat.rocket.android.layouthelper.chatroom.MessageListAdapter;
import chat.rocket.android.layouthelper.chatroom.PairedMessage; import chat.rocket.android.layouthelper.chatroom.PairedMessage;
...@@ -38,11 +44,6 @@ import chat.rocket.android.realm_helper.RealmObjectObserver; ...@@ -38,11 +44,6 @@ import chat.rocket.android.realm_helper.RealmObjectObserver;
import chat.rocket.android.realm_helper.RealmStore; import chat.rocket.android.realm_helper.RealmStore;
import chat.rocket.android.service.RocketChatService; import chat.rocket.android.service.RocketChatService;
import chat.rocket.android.widget.message.MessageComposer; import chat.rocket.android.widget.message.MessageComposer;
import com.jakewharton.rxbinding.support.v4.widget.RxDrawerLayout;
import io.realm.Sort;
import java.lang.reflect.Field;
import java.util.UUID;
import org.json.JSONObject;
/** /**
* Chat room screen. * Chat room screen.
...@@ -63,6 +64,9 @@ public class RoomFragment extends AbstractChatRoomFragment ...@@ -63,6 +64,9 @@ public class RoomFragment extends AbstractChatRoomFragment
private RealmObjectObserver<LoadMessageProcedure> procedureObserver; private RealmObjectObserver<LoadMessageProcedure> procedureObserver;
private MessageComposerManager messageComposerManager; private MessageComposerManager messageComposerManager;
public RoomFragment() {
}
/** /**
* create fragment with roomId. * create fragment with roomId.
*/ */
...@@ -75,10 +79,8 @@ public class RoomFragment extends AbstractChatRoomFragment ...@@ -75,10 +79,8 @@ public class RoomFragment extends AbstractChatRoomFragment
return fragment; return fragment;
} }
public RoomFragment() { @Override
} public void onCreate(@Nullable Bundle savedInstanceState) {
@Override public void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState); super.onCreate(savedInstanceState);
Bundle args = getArguments(); Bundle args = getArguments();
...@@ -107,11 +109,13 @@ public class RoomFragment extends AbstractChatRoomFragment ...@@ -107,11 +109,13 @@ public class RoomFragment extends AbstractChatRoomFragment
} }
} }
@Override protected int getLayout() { @Override
protected int getLayout() {
return R.layout.fragment_room; return R.layout.fragment_room;
} }
@Override protected void onSetupView() { @Override
protected void onSetupView() {
RecyclerView listView = (RecyclerView) rootView.findViewById(R.id.recyclerview); RecyclerView listView = (RecyclerView) rootView.findViewById(R.id.recyclerview);
MessageListAdapter adapter = (MessageListAdapter) realmHelper.createListAdapter(getContext(), MessageListAdapter adapter = (MessageListAdapter) realmHelper.createListAdapter(getContext(),
realm -> realm.where(Message.class) realm -> realm.where(Message.class)
...@@ -127,7 +131,8 @@ public class RoomFragment extends AbstractChatRoomFragment ...@@ -127,7 +131,8 @@ public class RoomFragment extends AbstractChatRoomFragment
listView.setLayoutManager(layoutManager); listView.setLayoutManager(layoutManager);
scrollListener = new LoadMoreScrollListener(layoutManager, 40) { scrollListener = new LoadMoreScrollListener(layoutManager, 40) {
@Override public void requestMoreItem() { @Override
public void requestMoreItem() {
loadMoreRequest(); loadMoreRequest();
} }
}; };
...@@ -138,7 +143,8 @@ public class RoomFragment extends AbstractChatRoomFragment ...@@ -138,7 +143,8 @@ public class RoomFragment extends AbstractChatRoomFragment
setupFileUploader(); setupFileUploader();
} }
@Override public void onItemClick(PairedMessage pairedMessage) { @Override
public void onItemClick(PairedMessage pairedMessage) {
if (pairedMessage.target != null) { if (pairedMessage.target != null) {
final int syncstate = pairedMessage.target.getSyncstate(); final int syncstate = pairedMessage.target.getSyncstate();
if (syncstate == SyncState.FAILED) { if (syncstate == SyncState.FAILED) {
...@@ -156,7 +162,8 @@ public class RoomFragment extends AbstractChatRoomFragment ...@@ -156,7 +162,8 @@ public class RoomFragment extends AbstractChatRoomFragment
realmHelper.executeTransaction(realm -> realmHelper.executeTransaction(realm ->
realm.where(Message.class) realm.where(Message.class)
.equalTo("_id", messageId).findAll().deleteAllFromRealm() .equalTo("_id", messageId).findAll().deleteAllFromRealm()
).continueWith(new LogcatIfError());; ).continueWith(new LogcatIfError());
;
}) })
.show(); .show();
} }
...@@ -231,7 +238,8 @@ public class RoomFragment extends AbstractChatRoomFragment ...@@ -231,7 +238,8 @@ public class RoomFragment extends AbstractChatRoomFragment
}); });
} }
@Override public void onActivityResult(int requestCode, int resultCode, Intent data) { @Override
public void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data); super.onActivityResult(requestCode, resultCode, data);
if (requestCode != RC_UPL || resultCode != Activity.RESULT_OK) { if (requestCode != RC_UPL || resultCode != Activity.RESULT_OK) {
return; return;
...@@ -332,7 +340,8 @@ public class RoomFragment extends AbstractChatRoomFragment ...@@ -332,7 +340,8 @@ public class RoomFragment extends AbstractChatRoomFragment
} }
} }
@Override public void onResume() { @Override
public void onResume() {
super.onResume(); super.onResume();
roomObserver.sub(); roomObserver.sub();
procedureObserver.sub(); procedureObserver.sub();
...@@ -340,13 +349,15 @@ public class RoomFragment extends AbstractChatRoomFragment ...@@ -340,13 +349,15 @@ public class RoomFragment extends AbstractChatRoomFragment
markAsReadIfNeeded(); markAsReadIfNeeded();
} }
@Override public void onPause() { @Override
public void onPause() {
procedureObserver.unsub(); procedureObserver.unsub();
roomObserver.unsub(); roomObserver.unsub();
super.onPause(); super.onPause();
} }
@Override public boolean onBackPressed() { @Override
public boolean onBackPressed() {
return closeSideMenuIfNeeded() || messageComposerManager.hideMessageComposerIfNeeded(); return closeSideMenuIfNeeded() || messageComposerManager.hideMessageComposerIfNeeded();
} }
} }
...@@ -6,6 +6,7 @@ import android.support.annotation.LayoutRes; ...@@ -6,6 +6,7 @@ import android.support.annotation.LayoutRes;
import android.support.annotation.NonNull; import android.support.annotation.NonNull;
import android.support.annotation.Nullable; import android.support.annotation.Nullable;
import android.support.design.widget.BottomSheetDialogFragment; import android.support.design.widget.BottomSheetDialogFragment;
import chat.rocket.android.realm_helper.RealmHelper; import chat.rocket.android.realm_helper.RealmHelper;
import chat.rocket.android.realm_helper.RealmStore; import chat.rocket.android.realm_helper.RealmStore;
...@@ -14,11 +15,14 @@ abstract class AbstractChatroomDialogFragment extends BottomSheetDialogFragment ...@@ -14,11 +15,14 @@ abstract class AbstractChatroomDialogFragment extends BottomSheetDialogFragment
protected RealmHelper realmHelper; protected RealmHelper realmHelper;
protected String roomId; protected String roomId;
protected @LayoutRes abstract int getLayout(); protected
@LayoutRes
abstract int getLayout();
protected abstract void onSetupDialog(); protected abstract void onSetupDialog();
@Override public void onCreate(@Nullable Bundle savedInstanceState) { @Override
public void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState); super.onCreate(savedInstanceState);
Bundle args = getArguments(); Bundle args = getArguments();
...@@ -33,7 +37,8 @@ abstract class AbstractChatroomDialogFragment extends BottomSheetDialogFragment ...@@ -33,7 +37,8 @@ abstract class AbstractChatroomDialogFragment extends BottomSheetDialogFragment
roomId = args.getString("roomId"); roomId = args.getString("roomId");
} }
@Override public final void setupDialog(Dialog dialog, int style) { @Override
public final void setupDialog(Dialog dialog, int style) {
super.setupDialog(dialog, style); super.setupDialog(dialog, style);
dialog.setContentView(getLayout()); dialog.setContentView(getLayout());
onSetupDialog(); onSetupDialog();
......
...@@ -7,6 +7,7 @@ import android.support.annotation.Nullable; ...@@ -7,6 +7,7 @@ import android.support.annotation.Nullable;
import android.widget.ProgressBar; import android.widget.ProgressBar;
import android.widget.TextView; import android.widget.TextView;
import android.widget.Toast; import android.widget.Toast;
import chat.rocket.android.R; import chat.rocket.android.R;
import chat.rocket.android.model.SyncState; import chat.rocket.android.model.SyncState;
import chat.rocket.android.model.internal.FileUploading; import chat.rocket.android.model.internal.FileUploading;
...@@ -21,7 +22,8 @@ public class FileUploadProgressDialogFragment extends AbstractChatroomDialogFrag ...@@ -21,7 +22,8 @@ public class FileUploadProgressDialogFragment extends AbstractChatroomDialogFrag
private String uplId; private String uplId;
private RealmObjectObserver<FileUploading> fileUploadingObserver; private RealmObjectObserver<FileUploading> fileUploadingObserver;
public FileUploadProgressDialogFragment() {} public FileUploadProgressDialogFragment() {
}
public static FileUploadProgressDialogFragment create(String serverConfigId, public static FileUploadProgressDialogFragment create(String serverConfigId,
String roomId, String uplId) { String roomId, String uplId) {
...@@ -36,12 +38,14 @@ public class FileUploadProgressDialogFragment extends AbstractChatroomDialogFrag ...@@ -36,12 +38,14 @@ public class FileUploadProgressDialogFragment extends AbstractChatroomDialogFrag
return fragment; return fragment;
} }
@Override protected void handleArgs(@NonNull Bundle args) { @Override
protected void handleArgs(@NonNull Bundle args) {
super.handleArgs(args); super.handleArgs(args);
uplId = args.getString("uplId"); uplId = args.getString("uplId");
} }
@Override public void onCreate(@Nullable Bundle savedInstanceState) { @Override
public void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState); super.onCreate(savedInstanceState);
fileUploadingObserver = realmHelper fileUploadingObserver = realmHelper
...@@ -49,11 +53,13 @@ public class FileUploadProgressDialogFragment extends AbstractChatroomDialogFrag ...@@ -49,11 +53,13 @@ public class FileUploadProgressDialogFragment extends AbstractChatroomDialogFrag
.setOnUpdateListener(this::onRenderFileUploadingState); .setOnUpdateListener(this::onRenderFileUploadingState);
} }
@Override protected int getLayout() { @Override
protected int getLayout() {
return R.layout.dialog_file_uploading; return R.layout.dialog_file_uploading;
} }
@Override protected void onSetupDialog() { @Override
protected void onSetupDialog() {
} }
...@@ -78,17 +84,20 @@ public class FileUploadProgressDialogFragment extends AbstractChatroomDialogFrag ...@@ -78,17 +84,20 @@ public class FileUploadProgressDialogFragment extends AbstractChatroomDialogFrag
} }
} }
@Override public void onResume() { @Override
public void onResume() {
super.onResume(); super.onResume();
fileUploadingObserver.sub(); fileUploadingObserver.sub();
} }
@Override public void onPause() { @Override
public void onPause() {
fileUploadingObserver.unsub(); fileUploadingObserver.unsub();
super.onPause(); super.onPause();
} }
@Override public void onCancel(DialogInterface dialog) { @Override
public void onCancel(DialogInterface dialog) {
//TODO: should cancel uploading? or continue with showing notification with progress? //TODO: should cancel uploading? or continue with showing notification with progress?
} }
} }
...@@ -7,6 +7,12 @@ import android.support.v7.widget.GridLayoutManager; ...@@ -7,6 +7,12 @@ import android.support.v7.widget.GridLayoutManager;
import android.support.v7.widget.RecyclerView; import android.support.v7.widget.RecyclerView;
import android.view.View; import android.view.View;
import android.widget.TextView; import android.widget.TextView;
import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;
import java.util.ArrayList;
import java.util.List;
import chat.rocket.android.R; import chat.rocket.android.R;
import chat.rocket.android.helper.LogcatIfError; import chat.rocket.android.helper.LogcatIfError;
import chat.rocket.android.layouthelper.chatroom.dialog.RoomUserAdapter; import chat.rocket.android.layouthelper.chatroom.dialog.RoomUserAdapter;
...@@ -15,11 +21,6 @@ import chat.rocket.android.model.SyncState; ...@@ -15,11 +21,6 @@ import chat.rocket.android.model.SyncState;
import chat.rocket.android.model.internal.GetUsersOfRoomsProcedure; import chat.rocket.android.model.internal.GetUsersOfRoomsProcedure;
import chat.rocket.android.realm_helper.RealmObjectObserver; import chat.rocket.android.realm_helper.RealmObjectObserver;
import chat.rocket.android.service.RocketChatService; import chat.rocket.android.service.RocketChatService;
import java.util.ArrayList;
import java.util.List;
import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;
/** /**
* Dialog to show members in a room. * Dialog to show members in a room.
...@@ -30,7 +31,8 @@ public class UsersOfRoomDialogFragment extends AbstractChatroomDialogFragment { ...@@ -30,7 +31,8 @@ public class UsersOfRoomDialogFragment extends AbstractChatroomDialogFragment {
private RealmObjectObserver<GetUsersOfRoomsProcedure> procedureObserver; private RealmObjectObserver<GetUsersOfRoomsProcedure> procedureObserver;
private int previousSyncState; private int previousSyncState;
public UsersOfRoomDialogFragment() {} public UsersOfRoomDialogFragment() {
}
/** /**
* create UsersOfRoomDialogFragment with required parameters. * create UsersOfRoomDialogFragment with required parameters.
...@@ -48,7 +50,8 @@ public class UsersOfRoomDialogFragment extends AbstractChatroomDialogFragment { ...@@ -48,7 +50,8 @@ public class UsersOfRoomDialogFragment extends AbstractChatroomDialogFragment {
return fragment; return fragment;
} }
@Override public void onCreate(@Nullable Bundle savedInstanceState) { @Override
public void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState); super.onCreate(savedInstanceState);
procedureObserver = realmHelper procedureObserver = realmHelper
...@@ -62,16 +65,19 @@ public class UsersOfRoomDialogFragment extends AbstractChatroomDialogFragment { ...@@ -62,16 +65,19 @@ public class UsersOfRoomDialogFragment extends AbstractChatroomDialogFragment {
} }
} }
@Override protected void handleArgs(@NonNull Bundle args) { @Override
protected void handleArgs(@NonNull Bundle args) {
super.handleArgs(args); super.handleArgs(args);
hostname = args.getString("hostname"); hostname = args.getString("hostname");
} }
@Override protected int getLayout() { @Override
protected int getLayout() {
return R.layout.dialog_users_of_room; return R.layout.dialog_users_of_room;
} }
@Override protected void onSetupDialog() { @Override
protected void onSetupDialog() {
RecyclerView recyclerView = (RecyclerView) getDialog().findViewById(R.id.recyclerview); RecyclerView recyclerView = (RecyclerView) getDialog().findViewById(R.id.recyclerview);
recyclerView.setLayoutManager(new GridLayoutManager(getContext(), 2)); recyclerView.setLayoutManager(new GridLayoutManager(getContext(), 2));
recyclerView.setAdapter(new RoomUserAdapter(getContext(), realmHelper, hostname)); recyclerView.setAdapter(new RoomUserAdapter(getContext(), realmHelper, hostname));
...@@ -90,12 +96,14 @@ public class UsersOfRoomDialogFragment extends AbstractChatroomDialogFragment { ...@@ -90,12 +96,14 @@ public class UsersOfRoomDialogFragment extends AbstractChatroomDialogFragment {
}).continueWith(new LogcatIfError()); }).continueWith(new LogcatIfError());
} }
@Override public void onResume() { @Override
public void onResume() {
super.onResume(); super.onResume();
procedureObserver.sub(); procedureObserver.sub();
} }
@Override public void onPause() { @Override
public void onPause() {
procedureObserver.unsub(); procedureObserver.unsub();
super.onPause(); super.onPause();
} }
......
...@@ -6,6 +6,10 @@ import android.text.TextUtils; ...@@ -6,6 +6,10 @@ import android.text.TextUtils;
import android.util.Base64; import android.util.Base64;
import android.webkit.JavascriptInterface; import android.webkit.JavascriptInterface;
import android.webkit.WebView; import android.webkit.WebView;
import org.json.JSONException;
import org.json.JSONObject;
import java.nio.charset.Charset;
import chat.rocket.android.api.MethodCallHelper; import chat.rocket.android.api.MethodCallHelper;
import chat.rocket.android.fragment.AbstractWebViewFragment; import chat.rocket.android.fragment.AbstractWebViewFragment;
import chat.rocket.android.helper.LogcatIfError; import chat.rocket.android.helper.LogcatIfError;
...@@ -13,9 +17,6 @@ import chat.rocket.android.log.RCLog; ...@@ -13,9 +17,6 @@ import chat.rocket.android.log.RCLog;
import chat.rocket.android.model.ServerConfig; import chat.rocket.android.model.ServerConfig;
import chat.rocket.android.model.ddp.MeteorLoginServiceConfiguration; import chat.rocket.android.model.ddp.MeteorLoginServiceConfiguration;
import chat.rocket.android.realm_helper.RealmStore; import chat.rocket.android.realm_helper.RealmStore;
import java.nio.charset.Charset;
import org.json.JSONException;
import org.json.JSONObject;
public abstract class AbstractOAuthFragment extends AbstractWebViewFragment { public abstract class AbstractOAuthFragment extends AbstractWebViewFragment {
...@@ -45,7 +46,8 @@ public abstract class AbstractOAuthFragment extends AbstractWebViewFragment { ...@@ -45,7 +46,8 @@ public abstract class AbstractOAuthFragment extends AbstractWebViewFragment {
} }
} }
@Override public void onCreate(@Nullable Bundle savedInstanceState) { @Override
public void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState); super.onCreate(savedInstanceState);
Bundle args = getArguments(); Bundle args = getArguments();
if (!hasValidArgs(args)) { if (!hasValidArgs(args)) {
...@@ -69,7 +71,8 @@ public abstract class AbstractOAuthFragment extends AbstractWebViewFragment { ...@@ -69,7 +71,8 @@ public abstract class AbstractOAuthFragment extends AbstractWebViewFragment {
url = generateURL(oauthConfig); url = generateURL(oauthConfig);
} }
@Override protected void navigateToInitialPage(WebView webview) { @Override
protected void navigateToInitialPage(WebView webview) {
if (TextUtils.isEmpty(url)) { if (TextUtils.isEmpty(url)) {
finish(); finish();
return; return;
...@@ -99,10 +102,10 @@ public abstract class AbstractOAuthFragment extends AbstractWebViewFragment { ...@@ -99,10 +102,10 @@ public abstract class AbstractOAuthFragment extends AbstractWebViewFragment {
}), "_rocketchet_hook"); }), "_rocketchet_hook");
} }
@Override protected void onPageLoaded(WebView webview, String url) { @Override
protected void onPageLoaded(WebView webview, String url) {
super.onPageLoaded(webview, url); super.onPageLoaded(webview, url);
if (url.contains(hostname) && url.contains("_oauth/" + getOAuthServiceName() + "?close")) { if (url.contains(hostname) && url.contains("_oauth/" + getOAuthServiceName() + "?close")) {
final String jsHookUrl = "javascript:" final String jsHookUrl = "javascript:"
+ "window._rocketchet_hook.handleConfig(document.getElementById('config').innerText);"; + "window._rocketchet_hook.handleConfig(document.getElementById('config').innerText);";
...@@ -110,6 +113,16 @@ public abstract class AbstractOAuthFragment extends AbstractWebViewFragment { ...@@ -110,6 +113,16 @@ public abstract class AbstractOAuthFragment extends AbstractWebViewFragment {
} }
} }
private void handleOAuthCallback(final String credentialToken, final String credentialSecret) {
new MethodCallHelper(getContext(), serverConfigId)
.loginWithOAuth(credentialToken, credentialSecret)
.continueWith(new LogcatIfError());
}
protected void onOAuthCompleted() {
}
private interface JSInterfaceCallback { private interface JSInterfaceCallback {
void hanldeResult(@Nullable JSONObject result); void hanldeResult(@Nullable JSONObject result);
} }
...@@ -121,7 +134,8 @@ public abstract class AbstractOAuthFragment extends AbstractWebViewFragment { ...@@ -121,7 +134,8 @@ public abstract class AbstractOAuthFragment extends AbstractWebViewFragment {
jsInterfaceCallback = callback; jsInterfaceCallback = callback;
} }
@JavascriptInterface public void handleConfig(String config) { @JavascriptInterface
public void handleConfig(String config) {
try { try {
jsInterfaceCallback.hanldeResult(new JSONObject(config)); jsInterfaceCallback.hanldeResult(new JSONObject(config));
} catch (Exception exception) { } catch (Exception exception) {
...@@ -129,14 +143,4 @@ public abstract class AbstractOAuthFragment extends AbstractWebViewFragment { ...@@ -129,14 +143,4 @@ public abstract class AbstractOAuthFragment extends AbstractWebViewFragment {
} }
} }
} }
private void handleOAuthCallback(final String credentialToken, final String credentialSecret) {
new MethodCallHelper(getContext(), serverConfigId)
.loginWithOAuth(credentialToken, credentialSecret)
.continueWith(new LogcatIfError());
}
protected void onOAuthCompleted() {
}
} }
...@@ -5,11 +5,13 @@ import okhttp3.HttpUrl; ...@@ -5,11 +5,13 @@ import okhttp3.HttpUrl;
public class FacebookOAuthFragment extends AbstractOAuthFragment { public class FacebookOAuthFragment extends AbstractOAuthFragment {
@Override protected String getOAuthServiceName() { @Override
protected String getOAuthServiceName() {
return "facebook"; return "facebook";
} }
@Override protected String generateURL(MeteorLoginServiceConfiguration oauthConfig) { @Override
protected String generateURL(MeteorLoginServiceConfiguration oauthConfig) {
return new HttpUrl.Builder().scheme("https") return new HttpUrl.Builder().scheme("https")
.host("www.facebook.com") .host("www.facebook.com")
.addPathSegment("v2.2") .addPathSegment("v2.2")
......
...@@ -5,11 +5,13 @@ import okhttp3.HttpUrl; ...@@ -5,11 +5,13 @@ import okhttp3.HttpUrl;
public class GitHubOAuthFragment extends AbstractOAuthFragment { public class GitHubOAuthFragment extends AbstractOAuthFragment {
@Override protected String getOAuthServiceName() { @Override
protected String getOAuthServiceName() {
return "github"; return "github";
} }
@Override protected String generateURL(MeteorLoginServiceConfiguration oauthConfig) { @Override
protected String generateURL(MeteorLoginServiceConfiguration oauthConfig) {
return new HttpUrl.Builder().scheme("https") return new HttpUrl.Builder().scheme("https")
.host("github.com") .host("github.com")
.addPathSegment("login") .addPathSegment("login")
......
...@@ -5,11 +5,13 @@ import okhttp3.HttpUrl; ...@@ -5,11 +5,13 @@ import okhttp3.HttpUrl;
public class GoogleOAuthFragment extends AbstractOAuthFragment { public class GoogleOAuthFragment extends AbstractOAuthFragment {
@Override protected String getOAuthServiceName() { @Override
protected String getOAuthServiceName() {
return "google"; return "google";
} }
@Override protected String generateURL(MeteorLoginServiceConfiguration oauthConfig) { @Override
protected String generateURL(MeteorLoginServiceConfiguration oauthConfig) {
return new HttpUrl.Builder().scheme("https") return new HttpUrl.Builder().scheme("https")
.host("accounts.google.com") .host("accounts.google.com")
.addPathSegment("o") .addPathSegment("o")
......
...@@ -4,11 +4,13 @@ import chat.rocket.android.model.ddp.MeteorLoginServiceConfiguration; ...@@ -4,11 +4,13 @@ import chat.rocket.android.model.ddp.MeteorLoginServiceConfiguration;
public class TwitterOAuthFragment extends AbstractOAuthFragment { public class TwitterOAuthFragment extends AbstractOAuthFragment {
@Override protected String getOAuthServiceName() { @Override
protected String getOAuthServiceName() {
return "twitter"; return "twitter";
} }
@Override protected String generateURL(MeteorLoginServiceConfiguration oauthConfig) { @Override
protected String generateURL(MeteorLoginServiceConfiguration oauthConfig) {
return "https://" + hostname + "/_oauth/twitter/" return "https://" + hostname + "/_oauth/twitter/"
+ "?requestTokenAndRedirect=true&state=" + getStateString(); + "?requestTokenAndRedirect=true&state=" + getStateString();
} }
......
...@@ -3,6 +3,7 @@ package chat.rocket.android.fragment.server_config; ...@@ -3,6 +3,7 @@ package chat.rocket.android.fragment.server_config;
import android.os.Bundle; import android.os.Bundle;
import android.support.annotation.Nullable; import android.support.annotation.Nullable;
import android.support.v4.app.Fragment; import android.support.v4.app.Fragment;
import chat.rocket.android.R; import chat.rocket.android.R;
import chat.rocket.android.fragment.AbstractFragment; import chat.rocket.android.fragment.AbstractFragment;
import chat.rocket.android.helper.TextUtils; import chat.rocket.android.helper.TextUtils;
...@@ -10,7 +11,8 @@ import chat.rocket.android.helper.TextUtils; ...@@ -10,7 +11,8 @@ import chat.rocket.android.helper.TextUtils;
abstract class AbstractServerConfigFragment extends AbstractFragment { abstract class AbstractServerConfigFragment extends AbstractFragment {
protected String serverConfigId; protected String serverConfigId;
@Override public void onCreate(@Nullable Bundle savedInstanceState) { @Override
public void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState); super.onCreate(savedInstanceState);
Bundle args = getArguments(); Bundle args = getArguments();
......
...@@ -2,6 +2,8 @@ package chat.rocket.android.fragment.server_config; ...@@ -2,6 +2,8 @@ package chat.rocket.android.fragment.server_config;
import android.support.design.widget.Snackbar; import android.support.design.widget.Snackbar;
import android.widget.TextView; import android.widget.TextView;
import org.json.JSONObject;
import chat.rocket.android.R; import chat.rocket.android.R;
import chat.rocket.android.RocketChatCache; import chat.rocket.android.RocketChatCache;
import chat.rocket.android.helper.LogcatIfError; import chat.rocket.android.helper.LogcatIfError;
...@@ -9,7 +11,6 @@ import chat.rocket.android.helper.TextUtils; ...@@ -9,7 +11,6 @@ import chat.rocket.android.helper.TextUtils;
import chat.rocket.android.model.ServerConfig; import chat.rocket.android.model.ServerConfig;
import chat.rocket.android.realm_helper.RealmObjectObserver; import chat.rocket.android.realm_helper.RealmObjectObserver;
import chat.rocket.android.realm_helper.RealmStore; import chat.rocket.android.realm_helper.RealmStore;
import org.json.JSONObject;
/** /**
* Input server host. * Input server host.
...@@ -23,11 +24,13 @@ public class InputHostnameFragment extends AbstractServerConfigFragment { ...@@ -23,11 +24,13 @@ public class InputHostnameFragment extends AbstractServerConfigFragment {
public InputHostnameFragment() { public InputHostnameFragment() {
} }
@Override protected int getLayout() { @Override
protected int getLayout() {
return R.layout.fragment_input_hostname; return R.layout.fragment_input_hostname;
} }
@Override protected void onSetupView() { @Override
protected void onSetupView() {
rootView.findViewById(R.id.btn_connect).setOnClickListener(view -> handleConnect()); rootView.findViewById(R.id.btn_connect).setOnClickListener(view -> handleConnect());
serverConfigObserver.sub(); serverConfigObserver.sub();
...@@ -52,11 +55,13 @@ public class InputHostnameFragment extends AbstractServerConfigFragment { ...@@ -52,11 +55,13 @@ public class InputHostnameFragment extends AbstractServerConfigFragment {
.put("state", ServerConfig.STATE_READY))).continueWith(new LogcatIfError()); .put("state", ServerConfig.STATE_READY))).continueWith(new LogcatIfError());
} }
@Override public void onResume() { @Override
public void onResume() {
super.onResume(); super.onResume();
} }
@Override public void onDestroyView() { @Override
public void onDestroyView() {
serverConfigObserver.unsub(); serverConfigObserver.unsub();
super.onDestroyView(); super.onDestroyView();
} }
......
...@@ -6,6 +6,9 @@ import android.support.design.widget.Snackbar; ...@@ -6,6 +6,9 @@ import android.support.design.widget.Snackbar;
import android.support.v4.app.Fragment; import android.support.v4.app.Fragment;
import android.view.View; import android.view.View;
import android.widget.TextView; import android.widget.TextView;
import java.util.HashMap;
import java.util.List;
import chat.rocket.android.R; import chat.rocket.android.R;
import chat.rocket.android.api.MethodCallHelper; import chat.rocket.android.api.MethodCallHelper;
import chat.rocket.android.helper.TextUtils; import chat.rocket.android.helper.TextUtils;
...@@ -14,27 +17,28 @@ import chat.rocket.android.log.RCLog; ...@@ -14,27 +17,28 @@ import chat.rocket.android.log.RCLog;
import chat.rocket.android.model.ddp.MeteorLoginServiceConfiguration; import chat.rocket.android.model.ddp.MeteorLoginServiceConfiguration;
import chat.rocket.android.realm_helper.RealmListObserver; import chat.rocket.android.realm_helper.RealmListObserver;
import chat.rocket.android.realm_helper.RealmStore; import chat.rocket.android.realm_helper.RealmStore;
import java.util.HashMap;
import java.util.List;
/** /**
* Login screen. * Login screen.
*/ */
public class LoginFragment extends AbstractServerConfigFragment { public class LoginFragment extends AbstractServerConfigFragment {
@Override protected int getLayout() { private RealmListObserver<MeteorLoginServiceConfiguration> authProvidersObserver;
@Override
protected int getLayout() {
return R.layout.fragment_login; return R.layout.fragment_login;
} }
private RealmListObserver<MeteorLoginServiceConfiguration> authProvidersObserver; @Override
public void onCreate(@Nullable Bundle savedInstanceState) {
@Override public void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState); super.onCreate(savedInstanceState);
authProvidersObserver = RealmStore.get(serverConfigId) authProvidersObserver = RealmStore.get(serverConfigId)
.createListObserver(realm -> realm.where(MeteorLoginServiceConfiguration.class).findAll()) .createListObserver(realm -> realm.where(MeteorLoginServiceConfiguration.class).findAll())
.setOnUpdateListener(this::onRenderAuthProviders); .setOnUpdateListener(this::onRenderAuthProviders);
} }
@Override protected void onSetupView() { @Override
protected void onSetupView() {
final View btnEmail = rootView.findViewById(R.id.btn_login_with_email); final View btnEmail = rootView.findViewById(R.id.btn_login_with_email);
final TextView txtUsername = (TextView) rootView.findViewById(R.id.editor_username); final TextView txtUsername = (TextView) rootView.findViewById(R.id.editor_username);
final TextView txtPasswd = (TextView) rootView.findViewById(R.id.editor_passwd); final TextView txtPasswd = (TextView) rootView.findViewById(R.id.editor_passwd);
...@@ -108,12 +112,14 @@ public class LoginFragment extends AbstractServerConfigFragment { ...@@ -108,12 +112,14 @@ public class LoginFragment extends AbstractServerConfigFragment {
} }
} }
@Override public void onResume() { @Override
public void onResume() {
super.onResume(); super.onResume();
authProvidersObserver.sub(); authProvidersObserver.sub();
} }
@Override public void onPause() { @Override
public void onPause() {
authProvidersObserver.unsub(); authProvidersObserver.unsub();
super.onPause(); super.onPause();
} }
......
...@@ -4,6 +4,7 @@ import android.os.Bundle; ...@@ -4,6 +4,7 @@ import android.os.Bundle;
import android.support.annotation.Nullable; import android.support.annotation.Nullable;
import android.view.View; import android.view.View;
import android.widget.TextView; import android.widget.TextView;
import chat.rocket.android.R; import chat.rocket.android.R;
import chat.rocket.android.api.MethodCallHelper; import chat.rocket.android.api.MethodCallHelper;
import chat.rocket.android.helper.TextUtils; import chat.rocket.android.helper.TextUtils;
...@@ -15,20 +16,23 @@ import chat.rocket.android.realm_helper.RealmStore; ...@@ -15,20 +16,23 @@ import chat.rocket.android.realm_helper.RealmStore;
* Login screen. * Login screen.
*/ */
public class RetryLoginFragment extends AbstractServerConfigFragment { public class RetryLoginFragment extends AbstractServerConfigFragment {
@Override protected int getLayout() { private RealmObjectObserver<Session> sessionObserver;
@Override
protected int getLayout() {
return R.layout.fragment_retry_login; return R.layout.fragment_retry_login;
} }
private RealmObjectObserver<Session> sessionObserver; @Override
public void onCreate(@Nullable Bundle savedInstanceState) {
@Override public void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState); super.onCreate(savedInstanceState);
sessionObserver = RealmStore.get(serverConfigId) sessionObserver = RealmStore.get(serverConfigId)
.createObjectObserver(Session::queryDefaultSession) .createObjectObserver(Session::queryDefaultSession)
.setOnUpdateListener(this::onRenderServerConfigSession); .setOnUpdateListener(this::onRenderServerConfigSession);
} }
@Override protected void onSetupView() { @Override
protected void onSetupView() {
} }
private void onRenderServerConfigSession(Session session) { private void onRenderServerConfigSession(Session session) {
...@@ -63,12 +67,14 @@ public class RetryLoginFragment extends AbstractServerConfigFragment { ...@@ -63,12 +67,14 @@ public class RetryLoginFragment extends AbstractServerConfigFragment {
} }
} }
@Override public void onResume() { @Override
public void onResume() {
super.onResume(); super.onResume();
sessionObserver.sub(); sessionObserver.sub();
} }
@Override public void onPause() { @Override
public void onPause() {
sessionObserver.unsub(); sessionObserver.unsub();
super.onPause(); super.onPause();
} }
......
...@@ -11,6 +11,7 @@ import android.view.LayoutInflater; ...@@ -11,6 +11,7 @@ import android.view.LayoutInflater;
import android.view.View; import android.view.View;
import android.widget.TextView; import android.widget.TextView;
import android.widget.Toast; import android.widget.Toast;
import chat.rocket.android.R; import chat.rocket.android.R;
import chat.rocket.android.api.MethodCallHelper; import chat.rocket.android.api.MethodCallHelper;
import chat.rocket.android.helper.TextUtils; import chat.rocket.android.helper.TextUtils;
...@@ -24,6 +25,10 @@ public class UserRegistrationDialogFragment extends DialogFragment { ...@@ -24,6 +25,10 @@ public class UserRegistrationDialogFragment extends DialogFragment {
private String email; private String email;
private String password; private String password;
public UserRegistrationDialogFragment() {
super();
}
/** /**
* create UserRegistrationDialogFragment with auto-detect email/username. * create UserRegistrationDialogFragment with auto-detect email/username.
*/ */
...@@ -40,7 +45,8 @@ public class UserRegistrationDialogFragment extends DialogFragment { ...@@ -40,7 +45,8 @@ public class UserRegistrationDialogFragment extends DialogFragment {
* create UserRegistrationDialogFragment. * create UserRegistrationDialogFragment.
*/ */
public static UserRegistrationDialogFragment create(String serverConfigId, public static UserRegistrationDialogFragment create(String serverConfigId,
String username, String email, String password) { String username, String email,
String password) {
Bundle args = new Bundle(); Bundle args = new Bundle();
args.putString("serverConfigId", serverConfigId); args.putString("serverConfigId", serverConfigId);
if (!TextUtils.isEmpty(username)) { if (!TextUtils.isEmpty(username)) {
...@@ -57,11 +63,8 @@ public class UserRegistrationDialogFragment extends DialogFragment { ...@@ -57,11 +63,8 @@ public class UserRegistrationDialogFragment extends DialogFragment {
return dialog; return dialog;
} }
public UserRegistrationDialogFragment() { @Override
super(); public void onCreate(@Nullable Bundle savedInstanceState) {
}
@Override public void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState); super.onCreate(savedInstanceState);
Bundle args = getArguments(); Bundle args = getArguments();
...@@ -74,7 +77,8 @@ public class UserRegistrationDialogFragment extends DialogFragment { ...@@ -74,7 +77,8 @@ public class UserRegistrationDialogFragment extends DialogFragment {
} }
@NonNull @NonNull
@Override public Dialog onCreateDialog(Bundle savedInstanceState) { @Override
public Dialog onCreateDialog(Bundle savedInstanceState) {
return new AlertDialog.Builder(getContext(), R.style.AppTheme_Dialog) return new AlertDialog.Builder(getContext(), R.style.AppTheme_Dialog)
.setView(createDialogView()) .setView(createDialogView())
.create(); .create();
......
...@@ -3,6 +3,7 @@ package chat.rocket.android.fragment.server_config; ...@@ -3,6 +3,7 @@ package chat.rocket.android.fragment.server_config;
import android.os.Bundle; import android.os.Bundle;
import android.view.View; import android.view.View;
import android.widget.TextView; import android.widget.TextView;
import chat.rocket.android.R; import chat.rocket.android.R;
import chat.rocket.android.helper.TextUtils; import chat.rocket.android.helper.TextUtils;
...@@ -13,6 +14,9 @@ public class WaitingFragment extends AbstractServerConfigFragment { ...@@ -13,6 +14,9 @@ public class WaitingFragment extends AbstractServerConfigFragment {
private String caption; private String caption;
public WaitingFragment() {
}
/** /**
* create new "Waiting..." screen with caption. * create new "Waiting..." screen with caption.
*/ */
...@@ -24,13 +28,13 @@ public class WaitingFragment extends AbstractServerConfigFragment { ...@@ -24,13 +28,13 @@ public class WaitingFragment extends AbstractServerConfigFragment {
return fragment; return fragment;
} }
public WaitingFragment() {} @Override
protected int getLayout() {
@Override protected int getLayout() {
return R.layout.fragment_waiting; return R.layout.fragment_waiting;
} }
@Override protected void onSetupView() { @Override
protected void onSetupView() {
Bundle args = getArguments(); Bundle args = getArguments();
if (args != null) { if (args != null) {
caption = args.getString("caption"); caption = args.getString("caption");
......
...@@ -7,13 +7,16 @@ import android.widget.CompoundButton; ...@@ -7,13 +7,16 @@ import android.widget.CompoundButton;
import android.widget.ImageView; import android.widget.ImageView;
import android.widget.LinearLayout; import android.widget.LinearLayout;
import android.widget.TextView; import android.widget.TextView;
import com.jakewharton.rxbinding.view.RxView;
import com.jakewharton.rxbinding.widget.RxCompoundButton;
import chat.rocket.android.R; import chat.rocket.android.R;
import chat.rocket.android.RocketChatCache; import chat.rocket.android.RocketChatCache;
import chat.rocket.android.api.MethodCallHelper; import chat.rocket.android.api.MethodCallHelper;
import chat.rocket.android.fragment.AbstractFragment; import chat.rocket.android.fragment.AbstractFragment;
import chat.rocket.android.fragment.sidebar.dialog.AbstractAddRoomDialogFragment; import chat.rocket.android.fragment.sidebar.dialog.AbstractAddRoomDialogFragment;
import chat.rocket.android.fragment.sidebar.dialog.AddDirectMessageDialogFragment;
import chat.rocket.android.fragment.sidebar.dialog.AddChannelDialogFragment; import chat.rocket.android.fragment.sidebar.dialog.AddChannelDialogFragment;
import chat.rocket.android.fragment.sidebar.dialog.AddDirectMessageDialogFragment;
import chat.rocket.android.helper.LogcatIfError; import chat.rocket.android.helper.LogcatIfError;
import chat.rocket.android.helper.TextUtils; import chat.rocket.android.helper.TextUtils;
import chat.rocket.android.layouthelper.chatroom.RoomListManager; import chat.rocket.android.layouthelper.chatroom.RoomListManager;
...@@ -25,8 +28,6 @@ import chat.rocket.android.realm_helper.RealmListObserver; ...@@ -25,8 +28,6 @@ import chat.rocket.android.realm_helper.RealmListObserver;
import chat.rocket.android.realm_helper.RealmObjectObserver; import chat.rocket.android.realm_helper.RealmObjectObserver;
import chat.rocket.android.realm_helper.RealmStore; import chat.rocket.android.realm_helper.RealmStore;
import chat.rocket.android.renderer.UserRenderer; import chat.rocket.android.renderer.UserRenderer;
import com.jakewharton.rxbinding.view.RxView;
import com.jakewharton.rxbinding.widget.RxCompoundButton;
public class SidebarMainFragment extends AbstractFragment { public class SidebarMainFragment extends AbstractFragment {
...@@ -52,7 +53,8 @@ public class SidebarMainFragment extends AbstractFragment { ...@@ -52,7 +53,8 @@ public class SidebarMainFragment extends AbstractFragment {
return fragment; return fragment;
} }
@Override public void onCreate(@Nullable Bundle savedInstanceState) { @Override
public void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState); super.onCreate(savedInstanceState);
Bundle args = getArguments(); Bundle args = getArguments();
...@@ -67,7 +69,8 @@ public class SidebarMainFragment extends AbstractFragment { ...@@ -67,7 +69,8 @@ public class SidebarMainFragment extends AbstractFragment {
RealmHelper realmHelper = RealmStore.get(serverConfigId); RealmHelper realmHelper = RealmStore.get(serverConfigId);
if (realmHelper != null) { if (realmHelper != null) {
roomsObserver = realmHelper roomsObserver = realmHelper
.createListObserver(realm -> realm.where(RoomSubscription.class).equalTo("open", true).findAll()) .createListObserver(
realm -> realm.where(RoomSubscription.class).equalTo("open", true).findAll())
.setOnUpdateListener(list -> roomListManager.setRooms(list)); .setOnUpdateListener(list -> roomListManager.setRooms(list));
currentUserObserver = realmHelper currentUserObserver = realmHelper
...@@ -79,7 +82,8 @@ public class SidebarMainFragment extends AbstractFragment { ...@@ -79,7 +82,8 @@ public class SidebarMainFragment extends AbstractFragment {
} }
} }
@Override protected int getLayout() { @Override
protected int getLayout() {
if (serverConfigId == null) { if (serverConfigId == null) {
return R.layout.simple_screen; return R.layout.simple_screen;
} else { } else {
...@@ -87,7 +91,8 @@ public class SidebarMainFragment extends AbstractFragment { ...@@ -87,7 +91,8 @@ public class SidebarMainFragment extends AbstractFragment {
} }
} }
@Override protected void onSetupView() { @Override
protected void onSetupView() {
if (serverConfigId == null) { if (serverConfigId == null) {
return; return;
} }
...@@ -181,7 +186,8 @@ public class SidebarMainFragment extends AbstractFragment { ...@@ -181,7 +186,8 @@ public class SidebarMainFragment extends AbstractFragment {
dialog.show(getFragmentManager(), AbstractAddRoomDialogFragment.class.getSimpleName()); dialog.show(getFragmentManager(), AbstractAddRoomDialogFragment.class.getSimpleName());
} }
@Override public void onResume() { @Override
public void onResume() {
super.onResume(); super.onResume();
if (roomsObserver != null) { if (roomsObserver != null) {
roomsObserver.sub(); roomsObserver.sub();
...@@ -189,7 +195,8 @@ public class SidebarMainFragment extends AbstractFragment { ...@@ -189,7 +195,8 @@ public class SidebarMainFragment extends AbstractFragment {
} }
} }
@Override public void onPause() { @Override
public void onPause() {
if (roomsObserver != null) { if (roomsObserver != null) {
currentUserObserver.unsub(); currentUserObserver.unsub();
roomsObserver.unsub(); roomsObserver.unsub();
......
...@@ -7,12 +7,13 @@ import android.support.annotation.NonNull; ...@@ -7,12 +7,13 @@ import android.support.annotation.NonNull;
import android.support.annotation.Nullable; import android.support.annotation.Nullable;
import android.view.View; import android.view.View;
import android.widget.Toast; import android.widget.Toast;
import com.trello.rxlifecycle.components.support.RxAppCompatDialogFragment;
import bolts.Task; import bolts.Task;
import chat.rocket.android.R; import chat.rocket.android.R;
import chat.rocket.android.api.MethodCallHelper; import chat.rocket.android.api.MethodCallHelper;
import chat.rocket.android.realm_helper.RealmHelper; import chat.rocket.android.realm_helper.RealmHelper;
import chat.rocket.android.realm_helper.RealmStore; import chat.rocket.android.realm_helper.RealmStore;
import com.trello.rxlifecycle.components.support.RxAppCompatDialogFragment;
public abstract class AbstractAddRoomDialogFragment extends RxAppCompatDialogFragment { public abstract class AbstractAddRoomDialogFragment extends RxAppCompatDialogFragment {
...@@ -20,11 +21,14 @@ public abstract class AbstractAddRoomDialogFragment extends RxAppCompatDialogFra ...@@ -20,11 +21,14 @@ public abstract class AbstractAddRoomDialogFragment extends RxAppCompatDialogFra
protected MethodCallHelper methodCall; protected MethodCallHelper methodCall;
protected String hostname; protected String hostname;
protected @LayoutRes abstract int getLayout(); protected
@LayoutRes
abstract int getLayout();
protected abstract void onSetupDialog(); protected abstract void onSetupDialog();
@Override public void onCreate(@Nullable Bundle savedInstanceState) { @Override
public void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState); super.onCreate(savedInstanceState);
Bundle args = getArguments(); Bundle args = getArguments();
...@@ -40,7 +44,8 @@ public abstract class AbstractAddRoomDialogFragment extends RxAppCompatDialogFra ...@@ -40,7 +44,8 @@ public abstract class AbstractAddRoomDialogFragment extends RxAppCompatDialogFra
hostname = args.getString("hostname"); hostname = args.getString("hostname");
} }
@Override public final void setupDialog(Dialog dialog, int style) { @Override
public final void setupDialog(Dialog dialog, int style) {
super.setupDialog(dialog, style); super.setupDialog(dialog, style);
dialog.setContentView(getLayout()); dialog.setContentView(getLayout());
onSetupDialog(); onSetupDialog();
......
...@@ -3,23 +3,27 @@ package chat.rocket.android.fragment.sidebar.dialog; ...@@ -3,23 +3,27 @@ package chat.rocket.android.fragment.sidebar.dialog;
import android.view.View; import android.view.View;
import android.widget.CompoundButton; import android.widget.CompoundButton;
import android.widget.TextView; import android.widget.TextView;
import com.jakewharton.rxbinding.view.RxView;
import com.jakewharton.rxbinding.widget.RxTextView;
import bolts.Task; import bolts.Task;
import chat.rocket.android.R; import chat.rocket.android.R;
import chat.rocket.android.helper.TextUtils; import chat.rocket.android.helper.TextUtils;
import com.jakewharton.rxbinding.view.RxView;
import com.jakewharton.rxbinding.widget.RxTextView;
/** /**
* add Channel, add Private-group. * add Channel, add Private-group.
*/ */
public class AddChannelDialogFragment extends AbstractAddRoomDialogFragment { public class AddChannelDialogFragment extends AbstractAddRoomDialogFragment {
public AddChannelDialogFragment() {} public AddChannelDialogFragment() {
}
@Override protected int getLayout() { @Override
protected int getLayout() {
return R.layout.dialog_add_channel; return R.layout.dialog_add_channel;
} }
@Override protected void onSetupDialog() { @Override
protected void onSetupDialog() {
View buttonAddChannel = getDialog().findViewById(R.id.btn_add_channel); View buttonAddChannel = getDialog().findViewById(R.id.btn_add_channel);
RxTextView.textChanges((TextView) getDialog().findViewById(R.id.editor_channel_name)) RxTextView.textChanges((TextView) getDialog().findViewById(R.id.editor_channel_name))
...@@ -35,7 +39,8 @@ public class AddChannelDialogFragment extends AbstractAddRoomDialogFragment { ...@@ -35,7 +39,8 @@ public class AddChannelDialogFragment extends AbstractAddRoomDialogFragment {
return check.isChecked(); return check.isChecked();
} }
@Override protected Task<Void> getMethodCallForSubmitAction() { @Override
protected Task<Void> getMethodCallForSubmitAction() {
TextView channelNameText = (TextView) getDialog().findViewById(R.id.editor_channel_name); TextView channelNameText = (TextView) getDialog().findViewById(R.id.editor_channel_name);
String channelName = channelNameText.getText().toString(); String channelName = channelNameText.getText().toString();
boolean isPrivate = isChecked(R.id.checkbox_private); boolean isPrivate = isChecked(R.id.checkbox_private);
......
...@@ -3,27 +3,31 @@ package chat.rocket.android.fragment.sidebar.dialog; ...@@ -3,27 +3,31 @@ package chat.rocket.android.fragment.sidebar.dialog;
import android.view.View; import android.view.View;
import android.widget.AutoCompleteTextView; import android.widget.AutoCompleteTextView;
import android.widget.TextView; import android.widget.TextView;
import com.jakewharton.rxbinding.view.RxView;
import com.jakewharton.rxbinding.widget.RxTextView;
import io.realm.Case;
import bolts.Task; import bolts.Task;
import chat.rocket.android.R; import chat.rocket.android.R;
import chat.rocket.android.helper.TextUtils; import chat.rocket.android.helper.TextUtils;
import chat.rocket.android.layouthelper.sidebar.dialog.SuggestUserAdapter; import chat.rocket.android.layouthelper.sidebar.dialog.SuggestUserAdapter;
import chat.rocket.android.model.ddp.User; import chat.rocket.android.model.ddp.User;
import chat.rocket.android.realm_helper.RealmAutoCompleteAdapter; import chat.rocket.android.realm_helper.RealmAutoCompleteAdapter;
import com.jakewharton.rxbinding.view.RxView;
import com.jakewharton.rxbinding.widget.RxTextView;
import io.realm.Case;
/** /**
* add Direct Message. * add Direct Message.
*/ */
public class AddDirectMessageDialogFragment extends AbstractAddRoomDialogFragment { public class AddDirectMessageDialogFragment extends AbstractAddRoomDialogFragment {
public AddDirectMessageDialogFragment() {} public AddDirectMessageDialogFragment() {
}
@Override protected int getLayout() { @Override
protected int getLayout() {
return R.layout.dialog_add_direct_message; return R.layout.dialog_add_direct_message;
} }
@Override protected void onSetupDialog() { @Override
protected void onSetupDialog() {
View buttonAddDirectMessage = getDialog().findViewById(R.id.btn_add_direct_message); View buttonAddDirectMessage = getDialog().findViewById(R.id.btn_add_direct_message);
AutoCompleteTextView autoCompleteTextView = AutoCompleteTextView autoCompleteTextView =
(AutoCompleteTextView) getDialog().findViewById(R.id.editor_username); (AutoCompleteTextView) getDialog().findViewById(R.id.editor_username);
...@@ -43,7 +47,8 @@ public class AddDirectMessageDialogFragment extends AbstractAddRoomDialogFragmen ...@@ -43,7 +47,8 @@ public class AddDirectMessageDialogFragment extends AbstractAddRoomDialogFragmen
buttonAddDirectMessage.setOnClickListener(view -> createRoom()); buttonAddDirectMessage.setOnClickListener(view -> createRoom());
} }
@Override protected Task<Void> getMethodCallForSubmitAction() { @Override
protected Task<Void> getMethodCallForSubmitAction() {
String username = String username =
((TextView) getDialog().findViewById(R.id.editor_username)).getText().toString(); ((TextView) getDialog().findViewById(R.id.editor_username)).getText().toString();
return methodCall.createDirectMessage(username); return methodCall.createDirectMessage(username);
......
...@@ -9,27 +9,27 @@ import android.graphics.drawable.Drawable; ...@@ -9,27 +9,27 @@ import android.graphics.drawable.Drawable;
import android.os.Handler; import android.os.Handler;
import android.os.Looper; import android.os.Looper;
import android.widget.ImageView; import android.widget.ImageView;
import bolts.Task;
import bolts.TaskCompletionSource;
import chat.rocket.android.log.RCLog;
import com.amulyakhare.textdrawable.TextDrawable; import com.amulyakhare.textdrawable.TextDrawable;
import com.squareup.picasso.Picasso; import com.squareup.picasso.Picasso;
import com.squareup.picasso.Target; import com.squareup.picasso.Target;
import java.io.UnsupportedEncodingException; import java.io.UnsupportedEncodingException;
import java.net.URLEncoder; import java.net.URLEncoder;
import bolts.Task;
import bolts.TaskCompletionSource;
import chat.rocket.android.log.RCLog;
/** /**
* Helper for rendering user avatar image. * Helper for rendering user avatar image.
*/ */
public class Avatar { public class Avatar {
private final String hostname;
private final String username;
private static final int[] COLORS = new int[]{ private static final int[] COLORS = new int[]{
0xFFF44336, 0xFFE91E63, 0xFF9C27B0, 0xFF673AB7, 0xFF3F51B5, 0xFF2196F3, 0xFFF44336, 0xFFE91E63, 0xFF9C27B0, 0xFF673AB7, 0xFF3F51B5, 0xFF2196F3,
0xFF03A9F4, 0xFF00BCD4, 0xFF009688, 0xFF4CAF50, 0xFF8BC34A, 0xFFCDDC39, 0xFF03A9F4, 0xFF00BCD4, 0xFF009688, 0xFF4CAF50, 0xFF8BC34A, 0xFFCDDC39,
0xFFFFC107, 0xFFFF9800, 0xFFFF5722, 0xFF795548, 0xFF9E9E9E, 0xFF607D8B 0xFFFFC107, 0xFFFF9800, 0xFFFF5722, 0xFF795548, 0xFF9E9E9E, 0xFF607D8B
}; };
private final String hostname;
private final String username;
public Avatar(String hostname, String username) { public Avatar(String hostname, String username) {
this.hostname = hostname; this.hostname = hostname;
...@@ -58,6 +58,21 @@ public class Avatar { ...@@ -58,6 +58,21 @@ public class Avatar {
return TextUtils.isEmpty(str) ? "" : str.substring(0, 1); return TextUtils.isEmpty(str) ? "" : str.substring(0, 1);
} }
private static Bitmap drawableToBitmap(Drawable drawable, int size) {
if (drawable instanceof BitmapDrawable) {
BitmapDrawable bitmapDrawable = (BitmapDrawable) drawable;
if (bitmapDrawable.getBitmap() != null) {
return bitmapDrawable.getBitmap();
}
}
Bitmap bitmap = Bitmap.createBitmap(size, size, Bitmap.Config.ARGB_8888);
Canvas canvas = new Canvas(bitmap);
drawable.setBounds(0, 0, canvas.getWidth(), canvas.getHeight());
drawable.draw(canvas);
return bitmap;
}
private String getImageUrl() { private String getImageUrl() {
//from Rocket.Chat:packages/rocketchat-ui/lib/avatar.coffee //from Rocket.Chat:packages/rocketchat-ui/lib/avatar.coffee
//REMARK! this is often SVG image! (see: Rocket.Chat:server/startup/avatar.coffee) //REMARK! this is often SVG image! (see: Rocket.Chat:server/startup/avatar.coffee)
...@@ -116,35 +131,23 @@ public class Avatar { ...@@ -116,35 +131,23 @@ public class Avatar {
.load(getImageUrl()) .load(getImageUrl())
.error(getTextDrawable(context)) .error(getTextDrawable(context))
.into(new Target() { .into(new Target() {
@Override public void onBitmapLoaded(Bitmap bitmap, Picasso.LoadedFrom from) { @Override
public void onBitmapLoaded(Bitmap bitmap, Picasso.LoadedFrom from) {
if (bitmap != null) { if (bitmap != null) {
task.trySetResult(bitmap); task.trySetResult(bitmap);
} }
} }
@Override public void onBitmapFailed(Drawable errorDrawable) { @Override
public void onBitmapFailed(Drawable errorDrawable) {
task.trySetResult(drawableToBitmap(errorDrawable, size)); task.trySetResult(drawableToBitmap(errorDrawable, size));
} }
@Override public void onPrepareLoad(Drawable placeHolderDrawable) { @Override
public void onPrepareLoad(Drawable placeHolderDrawable) {
} }
}); });
return task.getTask(); return task.getTask();
} }
private static Bitmap drawableToBitmap (Drawable drawable, int size) {
if (drawable instanceof BitmapDrawable) {
BitmapDrawable bitmapDrawable = (BitmapDrawable) drawable;
if(bitmapDrawable.getBitmap() != null) {
return bitmapDrawable.getBitmap();
}
}
Bitmap bitmap = Bitmap.createBitmap(size, size, Bitmap.Config.ARGB_8888);
Canvas canvas = new Canvas(bitmap);
drawable.setBounds(0, 0, canvas.getWidth(), canvas.getHeight());
drawable.draw(canvas);
return bitmap;
}
} }
package chat.rocket.android.helper; package chat.rocket.android.helper;
import chat.rocket.android.log.RCLog;
import java.text.ParseException; import java.text.ParseException;
import java.text.SimpleDateFormat; import java.text.SimpleDateFormat;
import java.util.Calendar; import java.util.Calendar;
import java.util.GregorianCalendar; import java.util.GregorianCalendar;
import java.util.TimeZone; import java.util.TimeZone;
import chat.rocket.android.log.RCLog;
/** /**
* Utility class for converting epoch ms and date-time string. * Utility class for converting epoch ms and date-time string.
......
...@@ -8,15 +8,16 @@ import android.os.ParcelFileDescriptor; ...@@ -8,15 +8,16 @@ import android.os.ParcelFileDescriptor;
import android.provider.OpenableColumns; import android.provider.OpenableColumns;
import android.support.annotation.Nullable; import android.support.annotation.Nullable;
import android.webkit.MimeTypeMap; import android.webkit.MimeTypeMap;
import org.json.JSONObject;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.util.UUID;
import chat.rocket.android.log.RCLog; import chat.rocket.android.log.RCLog;
import chat.rocket.android.model.SyncState; import chat.rocket.android.model.SyncState;
import chat.rocket.android.model.ddp.PublicSetting; import chat.rocket.android.model.ddp.PublicSetting;
import chat.rocket.android.model.internal.FileUploading; import chat.rocket.android.model.internal.FileUploading;
import chat.rocket.android.realm_helper.RealmHelper; import chat.rocket.android.realm_helper.RealmHelper;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.util.UUID;
import org.json.JSONObject;
/** /**
* utility class for uploading file. * utility class for uploading file.
...@@ -35,7 +36,9 @@ public class FileUploadHelper { ...@@ -35,7 +36,9 @@ public class FileUploadHelper {
* requestUploading file. * requestUploading file.
* returns id for observing progress. * returns id for observing progress.
*/ */
public @Nullable String requestUploading(String roomId, Uri uri) { public
@Nullable
String requestUploading(String roomId, Uri uri) {
try (Cursor cursor = context.getContentResolver().query(uri, null, null, null, null)) { try (Cursor cursor = context.getContentResolver().query(uri, null, null, null, null)) {
if (cursor != null && cursor.moveToFirst()) { if (cursor != null && cursor.moveToFirst()) {
String filename = cursor.getString(cursor.getColumnIndex(OpenableColumns.DISPLAY_NAME)); String filename = cursor.getString(cursor.getColumnIndex(OpenableColumns.DISPLAY_NAME));
......
...@@ -19,7 +19,8 @@ public abstract class LoadMoreScrollListener extends RecyclerView.OnScrollListen ...@@ -19,7 +19,8 @@ public abstract class LoadMoreScrollListener extends RecyclerView.OnScrollListen
setLoadingDone(); setLoadingDone();
} }
@Override public void onScrolled(RecyclerView recyclerView, int deltaX, int deltaY) { @Override
public void onScrolled(RecyclerView recyclerView, int deltaX, int deltaY) {
super.onScrolled(recyclerView, deltaX, deltaY); super.onScrolled(recyclerView, deltaX, deltaY);
final int visibleItemCount = recyclerView.getChildCount(); final int visibleItemCount = recyclerView.getChildCount();
......
...@@ -8,7 +8,8 @@ import chat.rocket.android.log.RCLog; ...@@ -8,7 +8,8 @@ import chat.rocket.android.log.RCLog;
* Bolts-Task continuation for just logging if error occurred. * Bolts-Task continuation for just logging if error occurred.
*/ */
public class LogcatIfError implements Continuation { public class LogcatIfError implements Continuation {
@Override public Object then(Task task) throws Exception { @Override
public Object then(Task task) throws Exception {
if (task.isFaulted()) { if (task.isFaulted()) {
RCLog.w(task.getError()); RCLog.w(task.getError());
} }
......
package chat.rocket.android.helper; package chat.rocket.android.helper;
import com.facebook.stetho.okhttp3.StethoInterceptor; import com.facebook.stetho.okhttp3.StethoInterceptor;
import java.util.concurrent.TimeUnit; import java.util.concurrent.TimeUnit;
import okhttp3.OkHttpClient; import okhttp3.OkHttpClient;
......
...@@ -7,7 +7,6 @@ public interface OnBackPressListener { ...@@ -7,7 +7,6 @@ public interface OnBackPressListener {
/** /**
* onBackPressed * onBackPressed
*
* @return whether back is handled or not. * @return whether back is handled or not.
*/ */
boolean onBackPressed(); boolean onBackPressed();
......
...@@ -7,7 +7,6 @@ public class TextUtils { ...@@ -7,7 +7,6 @@ public class TextUtils {
/** /**
* Returns true if the string is null or 0-length. * Returns true if the string is null or 0-length.
*
* @param str the string to be examined * @param str the string to be examined
* @return true if str is null or zero length * @return true if str is null or zero length
*/ */
......
...@@ -2,9 +2,10 @@ package chat.rocket.android.layouthelper; ...@@ -2,9 +2,10 @@ package chat.rocket.android.layouthelper;
import android.content.Context; import android.content.Context;
import android.support.annotation.LayoutRes; import android.support.annotation.LayoutRes;
import io.realm.RealmObject;
import chat.rocket.android.realm_helper.RealmModelListAdapter; import chat.rocket.android.realm_helper.RealmModelListAdapter;
import chat.rocket.android.realm_helper.RealmModelViewHolder; import chat.rocket.android.realm_helper.RealmModelViewHolder;
import io.realm.RealmObject;
@SuppressWarnings({"PMD.AbstractNaming", "PMD.GenericsNaming"}) @SuppressWarnings({"PMD.AbstractNaming", "PMD.GenericsNaming"})
/** /**
...@@ -19,7 +20,8 @@ public abstract class ExtRealmModelListAdapter<T extends RealmObject, VM, ...@@ -19,7 +20,8 @@ public abstract class ExtRealmModelListAdapter<T extends RealmObject, VM,
super(context); super(context);
} }
@Override public int getItemCount() { @Override
public int getItemCount() {
return super.getItemCount() + 2; return super.getItemCount() + 2;
} }
...@@ -35,7 +37,8 @@ public abstract class ExtRealmModelListAdapter<T extends RealmObject, VM, ...@@ -35,7 +37,8 @@ public abstract class ExtRealmModelListAdapter<T extends RealmObject, VM,
notifyItemChanged(position + 1); notifyItemChanged(position + 1);
} }
@Override public int getItemViewType(int position) { @Override
public int getItemViewType(int position) {
if (position == 0) { if (position == 0) {
return VIEW_TYPE_HEADER; return VIEW_TYPE_HEADER;
} }
...@@ -47,13 +50,20 @@ public abstract class ExtRealmModelListAdapter<T extends RealmObject, VM, ...@@ -47,13 +50,20 @@ public abstract class ExtRealmModelListAdapter<T extends RealmObject, VM,
return super.getItemViewType(position - 1); return super.getItemViewType(position - 1);
} }
protected abstract @LayoutRes int getHeaderLayout(); protected abstract
@LayoutRes
int getHeaderLayout();
protected abstract @LayoutRes int getFooterLayout(); protected abstract
@LayoutRes
int getFooterLayout();
protected abstract @LayoutRes int getRealmModelLayout(int viewType); protected abstract
@LayoutRes
int getRealmModelLayout(int viewType);
@Override protected final int getLayout(int viewType) { @Override
protected final int getLayout(int viewType) {
if (viewType == VIEW_TYPE_HEADER) { if (viewType == VIEW_TYPE_HEADER) {
return getHeaderLayout(); return getHeaderLayout();
} }
...@@ -64,7 +74,8 @@ public abstract class ExtRealmModelListAdapter<T extends RealmObject, VM, ...@@ -64,7 +74,8 @@ public abstract class ExtRealmModelListAdapter<T extends RealmObject, VM,
return getRealmModelLayout(viewType); return getRealmModelLayout(viewType);
} }
@Override public final void onBindViewHolder(VH holder, int position) { @Override
public final void onBindViewHolder(VH holder, int position) {
if (position == 0 || position == super.getItemCount() + 1) { if (position == 0 || position == super.getItemCount() + 1) {
return; return;
} }
......
package chat.rocket.android.layouthelper.chatroom; package chat.rocket.android.layouthelper.chatroom;
import android.support.design.widget.FloatingActionButton; import android.support.design.widget.FloatingActionButton;
import bolts.Task; import bolts.Task;
import chat.rocket.android.widget.message.MessageComposer; import chat.rocket.android.widget.message.MessageComposer;
...@@ -8,14 +9,6 @@ import chat.rocket.android.widget.message.MessageComposer; ...@@ -8,14 +9,6 @@ import chat.rocket.android.widget.message.MessageComposer;
* handling visibility of FAB-compose and MessageComposer. * handling visibility of FAB-compose and MessageComposer.
*/ */
public class MessageComposerManager { public class MessageComposerManager {
public interface SendMessageCallback {
Task<Void> onSubmit(String messageText);
}
public interface VisibilityChangedListener {
void onVisibilityChanged(boolean shown);
}
private final FloatingActionButton fabCompose; private final FloatingActionButton fabCompose;
private final MessageComposer messageComposer; private final MessageComposer messageComposer;
private SendMessageCallback sendMessageCallback; private SendMessageCallback sendMessageCallback;
...@@ -33,7 +26,8 @@ public class MessageComposerManager { ...@@ -33,7 +26,8 @@ public class MessageComposerManager {
}); });
messageComposer.setOnActionListener(new MessageComposer.ActionListener() { messageComposer.setOnActionListener(new MessageComposer.ActionListener() {
@Override public void onSubmit(String message) { @Override
public void onSubmit(String message) {
if (sendMessageCallback != null) { if (sendMessageCallback != null) {
messageComposer.setEnabled(false); messageComposer.setEnabled(false);
sendMessageCallback.onSubmit(message).onSuccess(task -> { sendMessageCallback.onSubmit(message).onSuccess(task -> {
...@@ -46,7 +40,8 @@ public class MessageComposerManager { ...@@ -46,7 +40,8 @@ public class MessageComposerManager {
} }
} }
@Override public void onCancel() { @Override
public void onCancel() {
setMessageComposerVisibility(false); setMessageComposerVisibility(false);
} }
}); });
...@@ -91,4 +86,12 @@ public class MessageComposerManager { ...@@ -91,4 +86,12 @@ public class MessageComposerManager {
} }
return false; return false;
} }
public interface SendMessageCallback {
Task<Void> onSubmit(String messageText);
}
public interface VisibilityChangedListener {
void onVisibilityChanged(boolean shown);
}
} }
...@@ -2,12 +2,13 @@ package chat.rocket.android.layouthelper.chatroom; ...@@ -2,12 +2,13 @@ package chat.rocket.android.layouthelper.chatroom;
import android.content.Context; import android.content.Context;
import android.view.View; import android.view.View;
import chat.rocket.android.R;
import chat.rocket.android.layouthelper.ExtRealmModelListAdapter;
import chat.rocket.android.model.ddp.Message;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.Collections; import java.util.Collections;
import java.util.List; import java.util.List;
import chat.rocket.android.R;
import chat.rocket.android.layouthelper.ExtRealmModelListAdapter;
import chat.rocket.android.model.ddp.Message;
/** /**
* target list adapter for chat room. * target list adapter for chat room.
...@@ -36,11 +37,13 @@ public class MessageListAdapter ...@@ -36,11 +37,13 @@ public class MessageListAdapter
notifyFooterChanged(); notifyFooterChanged();
} }
@Override protected int getHeaderLayout() { @Override
protected int getHeaderLayout() {
return R.layout.list_item_message_header; return R.layout.list_item_message_header;
} }
@Override protected int getFooterLayout() { @Override
protected int getFooterLayout() {
if (!hasNext || isLoaded) { if (!hasNext || isLoaded) {
return R.layout.list_item_message_start_of_conversation; return R.layout.list_item_message_start_of_conversation;
} else { } else {
...@@ -48,19 +51,23 @@ public class MessageListAdapter ...@@ -48,19 +51,23 @@ public class MessageListAdapter
} }
} }
@Override protected int getRealmModelViewType(PairedMessage model) { @Override
protected int getRealmModelViewType(PairedMessage model) {
return 0; return 0;
} }
@Override protected int getRealmModelLayout(int viewType) { @Override
protected int getRealmModelLayout(int viewType) {
return R.layout.list_item_message; return R.layout.list_item_message;
} }
@Override protected MessageViewHolder onCreateRealmModelViewHolder(int viewType, View itemView) { @Override
protected MessageViewHolder onCreateRealmModelViewHolder(int viewType, View itemView) {
return new MessageViewHolder(itemView, hostname, userId, token); return new MessageViewHolder(itemView, hostname, userId, token);
} }
@Override protected List<PairedMessage> mapResultsToViewModel(List<Message> results) { @Override
protected List<PairedMessage> mapResultsToViewModel(List<Message> results) {
if (results.isEmpty()) { if (results.isEmpty()) {
return Collections.emptyList(); return Collections.emptyList();
} }
......
...@@ -4,6 +4,7 @@ import android.support.annotation.Nullable; ...@@ -4,6 +4,7 @@ import android.support.annotation.Nullable;
import android.view.View; import android.view.View;
import android.widget.ImageView; import android.widget.ImageView;
import android.widget.TextView; import android.widget.TextView;
import chat.rocket.android.R; import chat.rocket.android.R;
import chat.rocket.android.helper.DateTime; import chat.rocket.android.helper.DateTime;
import chat.rocket.android.helper.TextUtils; import chat.rocket.android.helper.TextUtils;
...@@ -90,7 +91,7 @@ public class MessageViewHolder extends RealmModelViewHolder<PairedMessage> { ...@@ -90,7 +91,7 @@ public class MessageViewHolder extends RealmModelViewHolder<PairedMessage> {
} }
} }
private void setSequential( boolean sequential) { private void setSequential(boolean sequential) {
if (sequential) { if (sequential) {
avatar.setVisibility(View.INVISIBLE); avatar.setVisibility(View.INVISIBLE);
userAndTimeContainer.setVisibility(View.GONE); userAndTimeContainer.setVisibility(View.GONE);
......
...@@ -2,10 +2,11 @@ package chat.rocket.android.layouthelper.chatroom; ...@@ -2,10 +2,11 @@ package chat.rocket.android.layouthelper.chatroom;
import android.view.View; import android.view.View;
import android.view.ViewGroup; import android.view.ViewGroup;
import java.util.List;
import chat.rocket.android.helper.TextUtils; import chat.rocket.android.helper.TextUtils;
import chat.rocket.android.model.ddp.RoomSubscription; import chat.rocket.android.model.ddp.RoomSubscription;
import chat.rocket.android.widget.internal.RoomListItemView; import chat.rocket.android.widget.internal.RoomListItemView;
import java.util.List;
/** /**
* Utility class for mapping Room list into channel list ViewGroup. * Utility class for mapping Room list into channel list ViewGroup.
...@@ -13,14 +14,6 @@ import java.util.List; ...@@ -13,14 +14,6 @@ import java.util.List;
public class RoomListManager { public class RoomListManager {
private ViewGroup channelsContainer; private ViewGroup channelsContainer;
private ViewGroup dmContainer; private ViewGroup dmContainer;
/**
* Callback interface for List item clicked.
*/
public interface OnItemClickListener {
void onItemClick(RoomListItemView roomListItemView);
}
private OnItemClickListener listener; private OnItemClickListener listener;
/** /**
...@@ -31,6 +24,16 @@ public class RoomListManager { ...@@ -31,6 +24,16 @@ public class RoomListManager {
this.dmContainer = dmContainer; this.dmContainer = dmContainer;
} }
private static void removeItemIfExists(ViewGroup parent, String roomName) {
for (int i = 0; i < parent.getChildCount(); i++) {
RoomListItemView roomListItemView = (RoomListItemView) parent.getChildAt(i);
if (roomName.equals(roomListItemView.getRoomName())) {
parent.removeViewAt(i);
break;
}
}
}
/** /**
* update ViewGroups with room list. * update ViewGroups with room list.
*/ */
...@@ -126,13 +129,10 @@ public class RoomListManager { ...@@ -126,13 +129,10 @@ public class RoomListManager {
} }
} }
private static void removeItemIfExists(ViewGroup parent, String roomName) { /**
for (int i = 0; i < parent.getChildCount(); i++) { * Callback interface for List item clicked.
RoomListItemView roomListItemView = (RoomListItemView) parent.getChildAt(i); */
if (roomName.equals(roomListItemView.getRoomName())) { public interface OnItemClickListener {
parent.removeViewAt(i); void onItemClick(RoomListItemView roomListItemView);
break;
}
}
} }
} }
...@@ -5,12 +5,13 @@ import android.support.v7.widget.RecyclerView; ...@@ -5,12 +5,13 @@ import android.support.v7.widget.RecyclerView;
import android.view.LayoutInflater; import android.view.LayoutInflater;
import android.view.View; import android.view.View;
import android.view.ViewGroup; import android.view.ViewGroup;
import java.util.List;
import chat.rocket.android.R; import chat.rocket.android.R;
import chat.rocket.android.helper.TextUtils; import chat.rocket.android.helper.TextUtils;
import chat.rocket.android.model.ddp.User; import chat.rocket.android.model.ddp.User;
import chat.rocket.android.realm_helper.RealmHelper; import chat.rocket.android.realm_helper.RealmHelper;
import chat.rocket.android.renderer.UserRenderer; import chat.rocket.android.renderer.UserRenderer;
import java.util.List;
/** /**
* RecyclerView adapter for UsersOfRooms. * RecyclerView adapter for UsersOfRooms.
...@@ -33,12 +34,14 @@ public class RoomUserAdapter extends RecyclerView.Adapter<RoomUserViewHolder> { ...@@ -33,12 +34,14 @@ public class RoomUserAdapter extends RecyclerView.Adapter<RoomUserViewHolder> {
this.hostname = hostname; this.hostname = hostname;
} }
@Override public RoomUserViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { @Override
public RoomUserViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
View itemView = inflater.inflate(R.layout.listitem_room_user, parent, false); View itemView = inflater.inflate(R.layout.listitem_room_user, parent, false);
return new RoomUserViewHolder(itemView); return new RoomUserViewHolder(itemView);
} }
@Override public void onBindViewHolder(RoomUserViewHolder holder, int position) { @Override
public void onBindViewHolder(RoomUserViewHolder holder, int position) {
String username = usernames.get(position); String username = usernames.get(position);
if (TextUtils.isEmpty(username)) { if (TextUtils.isEmpty(username)) {
return; return;
...@@ -60,7 +63,8 @@ public class RoomUserAdapter extends RecyclerView.Adapter<RoomUserViewHolder> { ...@@ -60,7 +63,8 @@ public class RoomUserAdapter extends RecyclerView.Adapter<RoomUserViewHolder> {
} }
} }
@Override public int getItemCount() { @Override
public int getItemCount() {
return usernames != null ? usernames.size() : 0; return usernames != null ? usernames.size() : 0;
} }
......
...@@ -4,6 +4,7 @@ import android.support.v7.widget.RecyclerView; ...@@ -4,6 +4,7 @@ import android.support.v7.widget.RecyclerView;
import android.view.View; import android.view.View;
import android.widget.ImageView; import android.widget.ImageView;
import android.widget.TextView; import android.widget.TextView;
import chat.rocket.android.R; import chat.rocket.android.R;
/** /**
......
package chat.rocket.android.layouthelper.oauth; package chat.rocket.android.layouthelper.oauth;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import chat.rocket.android.R; import chat.rocket.android.R;
import chat.rocket.android.fragment.oauth.AbstractOAuthFragment; import chat.rocket.android.fragment.oauth.AbstractOAuthFragment;
import chat.rocket.android.fragment.oauth.FacebookOAuthFragment; import chat.rocket.android.fragment.oauth.FacebookOAuthFragment;
import chat.rocket.android.fragment.oauth.GitHubOAuthFragment; import chat.rocket.android.fragment.oauth.GitHubOAuthFragment;
import chat.rocket.android.fragment.oauth.GoogleOAuthFragment; import chat.rocket.android.fragment.oauth.GoogleOAuthFragment;
import chat.rocket.android.fragment.oauth.TwitterOAuthFragment; import chat.rocket.android.fragment.oauth.TwitterOAuthFragment;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
/** /**
* View model for OAuth login button. * View model for OAuth login button.
*/ */
public class OAuthProviderInfo { public class OAuthProviderInfo {
public String serviceName;
public int buttonId;
public Class<? extends AbstractOAuthFragment> fragmentClass;
/**
* Constructor with required parameters.
*/
private OAuthProviderInfo(String serviceName, int buttonId,
Class<? extends AbstractOAuthFragment> fragmentClass) {
this.serviceName = serviceName;
this.buttonId = buttonId;
this.fragmentClass = fragmentClass;
}
private static final ArrayList<OAuthProviderInfo> _LIST = new ArrayList<OAuthProviderInfo>() { private static final ArrayList<OAuthProviderInfo> _LIST = new ArrayList<OAuthProviderInfo>() {
{ {
add(new OAuthProviderInfo( add(new OAuthProviderInfo(
...@@ -40,6 +26,18 @@ public class OAuthProviderInfo { ...@@ -40,6 +26,18 @@ public class OAuthProviderInfo {
"facebook", R.id.btn_login_with_facebook, FacebookOAuthFragment.class)); "facebook", R.id.btn_login_with_facebook, FacebookOAuthFragment.class));
} }
}; };
public static final List<OAuthProviderInfo> LIST = Collections.unmodifiableList(_LIST); public static final List<OAuthProviderInfo> LIST = Collections.unmodifiableList(_LIST);
public String serviceName;
public int buttonId;
public Class<? extends AbstractOAuthFragment> fragmentClass;
/**
* Constructor with required parameters.
*/
private OAuthProviderInfo(String serviceName, int buttonId,
Class<? extends AbstractOAuthFragment> fragmentClass) {
this.serviceName = serviceName;
this.buttonId = buttonId;
this.fragmentClass = fragmentClass;
}
} }
...@@ -3,12 +3,13 @@ package chat.rocket.android.layouthelper.sidebar.dialog; ...@@ -3,12 +3,13 @@ package chat.rocket.android.layouthelper.sidebar.dialog;
import android.content.Context; import android.content.Context;
import android.view.View; import android.view.View;
import android.widget.ImageView; import android.widget.ImageView;
import java.util.Iterator;
import java.util.List;
import chat.rocket.android.R; import chat.rocket.android.R;
import chat.rocket.android.model.ddp.User; import chat.rocket.android.model.ddp.User;
import chat.rocket.android.realm_helper.RealmAutoCompleteAdapter; import chat.rocket.android.realm_helper.RealmAutoCompleteAdapter;
import chat.rocket.android.renderer.UserRenderer; import chat.rocket.android.renderer.UserRenderer;
import java.util.Iterator;
import java.util.List;
/** /**
* adapter to suggest user names. * adapter to suggest user names.
...@@ -21,13 +22,15 @@ public class SuggestUserAdapter extends RealmAutoCompleteAdapter<User> { ...@@ -21,13 +22,15 @@ public class SuggestUserAdapter extends RealmAutoCompleteAdapter<User> {
this.hostname = hostname; this.hostname = hostname;
} }
@Override protected void onBindItemView(View itemView, User user) { @Override
protected void onBindItemView(View itemView, User user) {
new UserRenderer(itemView.getContext(), user) new UserRenderer(itemView.getContext(), user)
.statusColorInto((ImageView) itemView.findViewById(R.id.room_user_status)) .statusColorInto((ImageView) itemView.findViewById(R.id.room_user_status))
.avatarInto((ImageView) itemView.findViewById(R.id.room_user_avatar), hostname); .avatarInto((ImageView) itemView.findViewById(R.id.room_user_avatar), hostname);
} }
@Override protected void filterList(List<User> users, String text) { @Override
protected void filterList(List<User> users, String text) {
Iterator<User> itUsers = users.iterator(); Iterator<User> itUsers = users.iterator();
final String prefix = text.toLowerCase(); final String prefix = text.toLowerCase();
while (itUsers.hasNext()) { while (itUsers.hasNext()) {
...@@ -38,7 +41,8 @@ public class SuggestUserAdapter extends RealmAutoCompleteAdapter<User> { ...@@ -38,7 +41,8 @@ public class SuggestUserAdapter extends RealmAutoCompleteAdapter<User> {
} }
} }
@Override protected String getStringForSelectedItem(User user) { @Override
protected String getStringForSelectedItem(User user) {
return user.getUsername(); return user.getUsername();
} }
} }
package chat.rocket.android.model; package chat.rocket.android.model;
import io.realm.RealmObject;
import io.realm.annotations.PrimaryKey;
import org.json.JSONObject;
import bolts.Task; import bolts.Task;
import chat.rocket.android.helper.LogcatIfError; import chat.rocket.android.helper.LogcatIfError;
import chat.rocket.android.realm_helper.RealmStore; import chat.rocket.android.realm_helper.RealmStore;
import hugo.weaving.DebugLog; import hugo.weaving.DebugLog;
import io.realm.RealmObject;
import io.realm.annotations.PrimaryKey;
import org.json.JSONObject;
/** /**
* Server configuration. * Server configuration.
...@@ -23,6 +24,35 @@ public class ServerConfig extends RealmObject { ...@@ -23,6 +24,35 @@ public class ServerConfig extends RealmObject {
private String session; private String session;
private String error; private String error;
/**
* Log the server connection is lost due to soem exception.
*/
@DebugLog
public static void logConnectionError(String serverConfigId, Exception exception) {
RealmStore.getDefault().executeTransaction(
realm -> realm.createOrUpdateObjectFromJson(ServerConfig.class, new JSONObject()
.put("serverConfigId", serverConfigId)
.put("state", STATE_CONNECTION_ERROR)
.put("error", exception.getMessage())))
.continueWith(new LogcatIfError());
}
/**
* Update the state of the ServerConfig with serverConfigId.
*/
public static Task<Void> updateState(final String serverConfigId, int state) {
return RealmStore.getDefault().executeTransaction(realm -> {
ServerConfig config =
realm.where(ServerConfig.class).equalTo("serverConfigId", serverConfigId).findFirst();
if (config == null || config.getState() != state) {
realm.createOrUpdateObjectFromJson(ServerConfig.class, new JSONObject()
.put("serverConfigId", serverConfigId)
.put("state", state));
}
return null;
});
}
public String getServerConfigId() { public String getServerConfigId() {
return serverConfigId; return serverConfigId;
} }
...@@ -62,32 +92,4 @@ public class ServerConfig extends RealmObject { ...@@ -62,32 +92,4 @@ public class ServerConfig extends RealmObject {
public void setError(String error) { public void setError(String error) {
this.error = error; this.error = error;
} }
/**
* Log the server connection is lost due to soem exception.
*/
@DebugLog public static void logConnectionError(String serverConfigId, Exception exception) {
RealmStore.getDefault().executeTransaction(
realm -> realm.createOrUpdateObjectFromJson(ServerConfig.class, new JSONObject()
.put("serverConfigId", serverConfigId)
.put("state", STATE_CONNECTION_ERROR)
.put("error", exception.getMessage())))
.continueWith(new LogcatIfError());
}
/**
* Update the state of the ServerConfig with serverConfigId.
*/
public static Task<Void> updateState(final String serverConfigId, int state) {
return RealmStore.getDefault().executeTransaction(realm -> {
ServerConfig config =
realm.where(ServerConfig.class).equalTo("serverConfigId", serverConfigId).findFirst();
if (config == null || config.getState() != state) {
realm.createOrUpdateObjectFromJson(ServerConfig.class, new JSONObject()
.put("serverConfigId", serverConfigId)
.put("state", state));
}
return null;
});
}
} }
package chat.rocket.android.model.ddp; package chat.rocket.android.model.ddp;
import chat.rocket.android.model.SyncState;
import io.realm.RealmObject; import io.realm.RealmObject;
import io.realm.annotations.PrimaryKey; import io.realm.annotations.PrimaryKey;
import org.json.JSONException; import org.json.JSONException;
import org.json.JSONObject; import org.json.JSONObject;
import chat.rocket.android.model.SyncState;
/** /**
* Message. * Message.
*/ */
...@@ -25,6 +26,18 @@ public class Message extends RealmObject { ...@@ -25,6 +26,18 @@ public class Message extends RealmObject {
private String attachments; //JSONArray. private String attachments; //JSONArray.
private String urls; //JSONArray. private String urls; //JSONArray.
public static JSONObject customizeJson(JSONObject messageJson) throws JSONException {
long ts = messageJson.getJSONObject("ts").getLong("$date");
messageJson.remove("ts");
messageJson.put("ts", ts).put("syncstate", SyncState.SYNCED);
if (messageJson.isNull("groupable")) {
messageJson.put("groupable", true);
}
return messageJson;
}
public String get_id() { public String get_id() {
return _id; return _id;
} }
...@@ -104,16 +117,4 @@ public class Message extends RealmObject { ...@@ -104,16 +117,4 @@ public class Message extends RealmObject {
public void setUrls(String urls) { public void setUrls(String urls) {
this.urls = urls; this.urls = urls;
} }
public static JSONObject customizeJson(JSONObject messageJson) throws JSONException {
long ts = messageJson.getJSONObject("ts").getLong("$date");
messageJson.remove("ts");
messageJson.put("ts", ts).put("syncstate", SyncState.SYNCED);
if (messageJson.isNull("groupable")) {
messageJson.put("groupable", true);
}
return messageJson;
}
} }
package chat.rocket.android.model.ddp; package chat.rocket.android.model.ddp;
import android.support.annotation.Nullable; import android.support.annotation.Nullable;
import chat.rocket.android.realm_helper.RealmHelper;
import io.realm.RealmObject; import io.realm.RealmObject;
import io.realm.annotations.PrimaryKey; import io.realm.annotations.PrimaryKey;
import org.json.JSONException; import org.json.JSONException;
import org.json.JSONObject; import org.json.JSONObject;
import chat.rocket.android.realm_helper.RealmHelper;
/** /**
* public setting model. * public setting model.
*/ */
...@@ -20,6 +21,45 @@ public class PublicSetting extends RealmObject { ...@@ -20,6 +21,45 @@ public class PublicSetting extends RealmObject {
private long _updatedAt; private long _updatedAt;
private String meta; //JSON private String meta; //JSON
public static JSONObject customizeJson(JSONObject settingJson) throws JSONException {
if (!settingJson.isNull("_updatedAt")) {
long updatedAt = settingJson.getJSONObject("_updatedAt").getLong("$date");
settingJson.remove("_updatedAt");
settingJson.put("_updatedAt", updatedAt);
}
return settingJson;
}
private static
@Nullable
PublicSetting get(RealmHelper realmHelper, String _id) {
return realmHelper.executeTransactionForRead(realm ->
realm.where(PublicSetting.class).equalTo("_id", _id).findFirst());
}
public static
@Nullable
String getString(RealmHelper realmHelper,
String _id, String defaultValue) {
PublicSetting setting = get(realmHelper, _id);
if (setting != null) {
return setting.getValue();
}
return defaultValue;
}
public static
@Nullable
boolean getBoolean(RealmHelper realmHelper,
String _id, boolean defaultValue) {
PublicSetting setting = get(realmHelper, _id);
if (setting != null) {
return Boolean.parseBoolean(setting.getValue());
}
return defaultValue;
}
public String get_id() { public String get_id() {
return _id; return _id;
} }
...@@ -67,37 +107,4 @@ public class PublicSetting extends RealmObject { ...@@ -67,37 +107,4 @@ public class PublicSetting extends RealmObject {
public void setMeta(String meta) { public void setMeta(String meta) {
this.meta = meta; this.meta = meta;
} }
public static JSONObject customizeJson(JSONObject settingJson) throws JSONException {
if (!settingJson.isNull("_updatedAt")) {
long updatedAt = settingJson.getJSONObject("_updatedAt").getLong("$date");
settingJson.remove("_updatedAt");
settingJson.put("_updatedAt", updatedAt);
}
return settingJson;
}
private static @Nullable PublicSetting get(RealmHelper realmHelper, String _id) {
return realmHelper.executeTransactionForRead(realm ->
realm.where(PublicSetting.class).equalTo("_id", _id).findFirst());
}
public static @Nullable String getString(RealmHelper realmHelper,
String _id, String defaultValue) {
PublicSetting setting = get(realmHelper, _id);
if (setting != null) {
return setting.getValue();
}
return defaultValue;
}
public static @Nullable boolean getBoolean(RealmHelper realmHelper,
String _id, boolean defaultValue) {
PublicSetting setting = get(realmHelper, _id);
if (setting != null) {
return Boolean.parseBoolean(setting.getValue());
}
return defaultValue;
}
} }
...@@ -26,6 +26,22 @@ public class RoomSubscription extends RealmObject { ...@@ -26,6 +26,22 @@ public class RoomSubscription extends RealmObject {
private long _updatedAt; private long _updatedAt;
private long ls; //last seen. private long ls; //last seen.
public static JSONObject customizeJson(JSONObject roomSubscriptionJson) throws JSONException {
if (!roomSubscriptionJson.isNull("ls")) {
long ls = roomSubscriptionJson.getJSONObject("ls").getLong("$date");
roomSubscriptionJson.remove("ls");
roomSubscriptionJson.put("ls", ls);
}
if (!roomSubscriptionJson.isNull("_updatedAt")) {
long updatedAt = roomSubscriptionJson.getJSONObject("_updatedAt").getLong("$date");
roomSubscriptionJson.remove("_updatedAt");
roomSubscriptionJson.put("_updatedAt", updatedAt);
}
return roomSubscriptionJson;
}
public String get_id() { public String get_id() {
return _id; return _id;
} }
...@@ -97,20 +113,4 @@ public class RoomSubscription extends RealmObject { ...@@ -97,20 +113,4 @@ public class RoomSubscription extends RealmObject {
public void setLs(long ls) { public void setLs(long ls) {
this.ls = ls; this.ls = ls;
} }
public static JSONObject customizeJson(JSONObject roomSubscriptionJson) throws JSONException {
if (!roomSubscriptionJson.isNull("ls")) {
long ls = roomSubscriptionJson.getJSONObject("ls").getLong("$date");
roomSubscriptionJson.remove("ls");
roomSubscriptionJson.put("ls", ls);
}
if (!roomSubscriptionJson.isNull("_updatedAt")) {
long updatedAt = roomSubscriptionJson.getJSONObject("_updatedAt").getLong("$date");
roomSubscriptionJson.remove("_updatedAt");
roomSubscriptionJson.put("_updatedAt", updatedAt);
}
return roomSubscriptionJson;
}
} }
...@@ -23,6 +23,10 @@ public class User extends RealmObject { ...@@ -23,6 +23,10 @@ public class User extends RealmObject {
private double utcOffset; private double utcOffset;
private RealmList<Email> emails; private RealmList<Email> emails;
public static RealmQuery<User> queryCurrentUser(Realm realm) {
return realm.where(User.class).isNotEmpty("emails");
}
public String get_id() { public String get_id() {
return _id; return _id;
} }
...@@ -62,8 +66,4 @@ public class User extends RealmObject { ...@@ -62,8 +66,4 @@ public class User extends RealmObject {
public void setEmails(RealmList<Email> emails) { public void setEmails(RealmList<Email> emails) {
this.emails = emails; this.emails = emails;
} }
public static RealmQuery<User> queryCurrentUser(Realm realm) {
return realm.where(User.class).isNotEmpty("emails");
}
} }
...@@ -2,6 +2,12 @@ package chat.rocket.android.model.internal; ...@@ -2,6 +2,12 @@ package chat.rocket.android.model.internal;
import android.content.Context; import android.content.Context;
import android.support.annotation.Nullable; import android.support.annotation.Nullable;
import io.realm.RealmObject;
import io.realm.annotations.PrimaryKey;
import org.json.JSONObject;
import java.util.HashMap;
import java.util.UUID;
import bolts.Task; import bolts.Task;
import bolts.TaskCompletionSource; import bolts.TaskCompletionSource;
import chat.rocket.android.helper.LogcatIfError; import chat.rocket.android.helper.LogcatIfError;
...@@ -11,14 +17,10 @@ import chat.rocket.android.model.SyncState; ...@@ -11,14 +17,10 @@ import chat.rocket.android.model.SyncState;
import chat.rocket.android.realm_helper.RealmHelper; import chat.rocket.android.realm_helper.RealmHelper;
import chat.rocket.android.realm_helper.RealmObjectObserver; import chat.rocket.android.realm_helper.RealmObjectObserver;
import chat.rocket.android.service.RocketChatService; import chat.rocket.android.service.RocketChatService;
import io.realm.RealmObject;
import io.realm.annotations.PrimaryKey;
import java.util.HashMap;
import java.util.UUID;
import org.json.JSONObject;
public class MethodCall extends RealmObject { public class MethodCall extends RealmObject {
private static final HashMap<String, RealmObjectObserver<MethodCall>> REF_MAP = new HashMap<>();
@PrimaryKey private String methodCallId; @PrimaryKey private String methodCallId;
private int syncstate; private int syncstate;
private String name; private String name;
...@@ -26,77 +28,12 @@ public class MethodCall extends RealmObject { ...@@ -26,77 +28,12 @@ public class MethodCall extends RealmObject {
private String resultJson; private String resultJson;
private long timeout; private long timeout;
public String getMethodCallId() {
return methodCallId;
}
public void setMethodCallId(String methodCallId) {
this.methodCallId = methodCallId;
}
public int getSyncstate() {
return syncstate;
}
public void setSyncstate(int syncstate) {
this.syncstate = syncstate;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getParamsJson() {
return paramsJson;
}
public void setParamsJson(String paramsJson) {
this.paramsJson = paramsJson;
}
public String getResultJson() {
return resultJson;
}
public void setResultJson(String resultJson) {
this.resultJson = resultJson;
}
public long getTimeout() {
return timeout;
}
public void setTimeout(long timeout) {
this.timeout = timeout;
}
public static class Error extends Exception {
public Error(String message) {
super(message);
}
public Error(Throwable exception) {
super(exception);
}
}
public static class Timeout extends Exception {
public Timeout() {
super("MethodCall.Timeout");
}
}
private static final HashMap<String, RealmObjectObserver<MethodCall>> REF_MAP = new HashMap<>();
/** /**
* insert a new record to request a method call. * insert a new record to request a method call.
*/ */
public static Task<String> execute(@Nullable final Context context, public static Task<String> execute(@Nullable final Context context,
RealmHelper realmHelper, String name, String paramsJson, long timeout) { RealmHelper realmHelper, String name, String paramsJson,
long timeout) {
final String newId = UUID.randomUUID().toString(); final String newId = UUID.randomUUID().toString();
TaskCompletionSource<String> task = new TaskCompletionSource<>(); TaskCompletionSource<String> task = new TaskCompletionSource<>();
realmHelper.executeTransaction(realm -> { realmHelper.executeTransaction(realm -> {
...@@ -156,4 +93,68 @@ public class MethodCall extends RealmObject { ...@@ -156,4 +93,68 @@ public class MethodCall extends RealmObject {
.findAll() .findAll()
.deleteAllFromRealm()); .deleteAllFromRealm());
} }
public String getMethodCallId() {
return methodCallId;
}
public void setMethodCallId(String methodCallId) {
this.methodCallId = methodCallId;
}
public int getSyncstate() {
return syncstate;
}
public void setSyncstate(int syncstate) {
this.syncstate = syncstate;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getParamsJson() {
return paramsJson;
}
public void setParamsJson(String paramsJson) {
this.paramsJson = paramsJson;
}
public String getResultJson() {
return resultJson;
}
public void setResultJson(String resultJson) {
this.resultJson = resultJson;
}
public long getTimeout() {
return timeout;
}
public void setTimeout(long timeout) {
this.timeout = timeout;
}
public static class Error extends Exception {
public Error(String message) {
super(message);
}
public Error(Throwable exception) {
super(exception);
}
}
public static class Timeout extends Exception {
public Timeout() {
super("MethodCall.Timeout");
}
}
} }
package chat.rocket.android.model.internal; package chat.rocket.android.model.internal;
import chat.rocket.android.helper.LogcatIfError;
import chat.rocket.android.helper.TextUtils;
import chat.rocket.android.realm_helper.RealmHelper;
import hugo.weaving.DebugLog;
import io.realm.Realm; import io.realm.Realm;
import io.realm.RealmObject; import io.realm.RealmObject;
import io.realm.RealmQuery; import io.realm.RealmQuery;
import io.realm.annotations.PrimaryKey; import io.realm.annotations.PrimaryKey;
import org.json.JSONObject; import org.json.JSONObject;
import chat.rocket.android.helper.LogcatIfError;
import chat.rocket.android.helper.TextUtils;
import chat.rocket.android.realm_helper.RealmHelper;
import hugo.weaving.DebugLog;
/** /**
* Login session info. * Login session info.
*/ */
...@@ -20,6 +21,31 @@ public class Session extends RealmObject { ...@@ -20,6 +21,31 @@ public class Session extends RealmObject {
private boolean tokenVerified; private boolean tokenVerified;
private String error; private String error;
public static RealmQuery<Session> queryDefaultSession(Realm realm) {
return realm.where(Session.class).equalTo("sessionId", Session.DEFAULT_ID);
}
/**
* Log the server connection is lost due to soem exception.
*/
@DebugLog
public static void logError(RealmHelper realmHelper, Exception exception) {
String errString = exception.getMessage();
if (!TextUtils.isEmpty(errString) && errString.contains("[403]")) {
realmHelper.executeTransaction(realm -> {
realm.delete(Session.class);
return null;
}).continueWith(new LogcatIfError());
} else {
realmHelper.executeTransaction(
realm -> realm.createOrUpdateObjectFromJson(Session.class, new JSONObject()
.put("sessionId", Session.DEFAULT_ID)
.put("tokenVerified", false)
.put("error", errString)))
.continueWith(new LogcatIfError());
}
}
public int getSessionId() { public int getSessionId() {
return sessionId; return sessionId;
} }
...@@ -51,28 +77,4 @@ public class Session extends RealmObject { ...@@ -51,28 +77,4 @@ public class Session extends RealmObject {
public void setError(String error) { public void setError(String error) {
this.error = error; this.error = error;
} }
public static RealmQuery<Session> queryDefaultSession(Realm realm) {
return realm.where(Session.class).equalTo("sessionId", Session.DEFAULT_ID);
}
/**
* Log the server connection is lost due to soem exception.
*/
@DebugLog public static void logError(RealmHelper realmHelper, Exception exception) {
String errString = exception.getMessage();
if (!TextUtils.isEmpty(errString) && errString.contains("[403]")) {
realmHelper.executeTransaction(realm -> {
realm.delete(Session.class);
return null;
}).continueWith(new LogcatIfError());
} else {
realmHelper.executeTransaction(
realm -> realm.createOrUpdateObjectFromJson(Session.class, new JSONObject()
.put("sessionId", Session.DEFAULT_ID)
.put("tokenVerified", false)
.put("error", errString)))
.continueWith(new LogcatIfError());
}
}
} }
...@@ -2,6 +2,7 @@ package chat.rocket.android.renderer; ...@@ -2,6 +2,7 @@ package chat.rocket.android.renderer;
import android.content.Context; import android.content.Context;
import android.view.View; import android.view.View;
import chat.rocket.android.renderer.optional.Condition; import chat.rocket.android.renderer.optional.Condition;
import chat.rocket.android.renderer.optional.Optional; import chat.rocket.android.renderer.optional.Optional;
......
...@@ -3,6 +3,7 @@ package chat.rocket.android.renderer; ...@@ -3,6 +3,7 @@ package chat.rocket.android.renderer;
import android.content.Context; import android.content.Context;
import android.widget.ProgressBar; import android.widget.ProgressBar;
import android.widget.TextView; import android.widget.TextView;
import chat.rocket.android.model.internal.FileUploading; import chat.rocket.android.model.internal.FileUploading;
/** /**
...@@ -43,11 +44,11 @@ public class FileUploadingRenderer extends AbstractRenderer<FileUploading> { ...@@ -43,11 +44,11 @@ public class FileUploadingRenderer extends AbstractRenderer<FileUploading> {
uploadedSizeText.setText(String.format("%,d", uploaded)); uploadedSizeText.setText(String.format("%,d", uploaded));
totalSizeText.setText(String.format("%,d", total)); totalSizeText.setText(String.format("%,d", total));
} else if (total < 8 * 1048576) { //<8MB } else if (total < 8 * 1048576) { //<8MB
uploadedSizeText.setText(String.format("%,d", uploaded/1024)); uploadedSizeText.setText(String.format("%,d", uploaded / 1024));
totalSizeText.setText(String.format("%,d KB", total/1024)); totalSizeText.setText(String.format("%,d KB", total / 1024));
} else { } else {
uploadedSizeText.setText(String.format("%,d", uploaded/1048576)); uploadedSizeText.setText(String.format("%,d", uploaded / 1048576));
totalSizeText.setText(String.format("%,d MB", total/1048576)); totalSizeText.setText(String.format("%,d MB", total / 1048576));
} }
return this; return this;
......
...@@ -4,6 +4,7 @@ import android.content.Context; ...@@ -4,6 +4,7 @@ import android.content.Context;
import android.view.View; import android.view.View;
import android.widget.ImageView; import android.widget.ImageView;
import android.widget.TextView; import android.widget.TextView;
import chat.rocket.android.R; import chat.rocket.android.R;
import chat.rocket.android.helper.DateTime; import chat.rocket.android.helper.DateTime;
import chat.rocket.android.helper.TextUtils; import chat.rocket.android.helper.TextUtils;
......
...@@ -3,6 +3,7 @@ package chat.rocket.android.renderer; ...@@ -3,6 +3,7 @@ package chat.rocket.android.renderer;
import android.content.Context; import android.content.Context;
import android.widget.ImageView; import android.widget.ImageView;
import android.widget.TextView; import android.widget.TextView;
import chat.rocket.android.R; import chat.rocket.android.R;
import chat.rocket.android.helper.Avatar; import chat.rocket.android.helper.Avatar;
import chat.rocket.android.helper.TextUtils; import chat.rocket.android.helper.TextUtils;
......
package chat.rocket.android.renderer.optional; package chat.rocket.android.renderer.optional;
import android.view.View; import android.view.View;
import java.util.HashMap; import java.util.HashMap;
public class ViewVisibilityOptional extends HashMap<String, View> implements Optional { public class ViewVisibilityOptional extends HashMap<String, View> implements Optional {
@Override public void onDataExists(String key) { @Override
public void onDataExists(String key) {
if (containsKey(key)) { if (containsKey(key)) {
get(key).setVisibility(View.VISIBLE); get(key).setVisibility(View.VISIBLE);
} }
} }
@Override public void onNoData(String key) { @Override
public void onNoData(String key) {
if (containsKey(key)) { if (containsKey(key)) {
get(key).setVisibility(View.GONE); get(key).setVisibility(View.GONE);
} }
......
...@@ -5,15 +5,16 @@ import android.content.Context; ...@@ -5,15 +5,16 @@ import android.content.Context;
import android.content.Intent; import android.content.Intent;
import android.os.IBinder; import android.os.IBinder;
import android.support.annotation.Nullable; import android.support.annotation.Nullable;
import io.realm.RealmResults;
import java.util.HashMap;
import java.util.List;
import bolts.Task; import bolts.Task;
import chat.rocket.android.helper.LogcatIfError; import chat.rocket.android.helper.LogcatIfError;
import chat.rocket.android.model.ServerConfig; import chat.rocket.android.model.ServerConfig;
import chat.rocket.android.realm_helper.RealmHelper; import chat.rocket.android.realm_helper.RealmHelper;
import chat.rocket.android.realm_helper.RealmListObserver; import chat.rocket.android.realm_helper.RealmListObserver;
import chat.rocket.android.realm_helper.RealmStore; import chat.rocket.android.realm_helper.RealmStore;
import io.realm.RealmResults;
import java.util.HashMap;
import java.util.List;
/** /**
* Background service for Rocket.Chat.Application class. * Background service for Rocket.Chat.Application class.
...@@ -31,7 +32,8 @@ public class RocketChatService extends Service { ...@@ -31,7 +32,8 @@ public class RocketChatService extends Service {
context.startService(new Intent(context, RocketChatService.class)); context.startService(new Intent(context, RocketChatService.class));
} }
@Override public void onCreate() { @Override
public void onCreate() {
super.onCreate(); super.onCreate();
webSocketThreads = new HashMap<>(); webSocketThreads = new HashMap<>();
realmHelper = RealmStore.getDefault(); realmHelper = RealmStore.getDefault();
...@@ -50,19 +52,21 @@ public class RocketChatService extends Service { ...@@ -50,19 +52,21 @@ public class RocketChatService extends Service {
RealmResults<ServerConfig> configs = realm.where(ServerConfig.class) RealmResults<ServerConfig> configs = realm.where(ServerConfig.class)
.notEqualTo("state", ServerConfig.STATE_READY) .notEqualTo("state", ServerConfig.STATE_READY)
.findAll(); .findAll();
for (ServerConfig config: configs) { for (ServerConfig config : configs) {
config.setState(ServerConfig.STATE_READY); config.setState(ServerConfig.STATE_READY);
} }
return null; return null;
}).continueWith(new LogcatIfError());; }).continueWith(new LogcatIfError());
;
} }
@Override public int onStartCommand(Intent intent, int flags, int startId) { @Override
public int onStartCommand(Intent intent, int flags, int startId) {
List<ServerConfig> configs = realmHelper.executeTransactionForReadResults(realm -> List<ServerConfig> configs = realmHelper.executeTransactionForReadResults(realm ->
realm.where(ServerConfig.class) realm.where(ServerConfig.class)
.equalTo("state", ServerConfig.STATE_CONNECTED) .equalTo("state", ServerConfig.STATE_CONNECTED)
.findAll()); .findAll());
for (ServerConfig config: configs) { for (ServerConfig config : configs) {
String serverConfigId = config.getServerConfigId(); String serverConfigId = config.getServerConfigId();
if (webSocketThreads.containsKey(serverConfigId)) { if (webSocketThreads.containsKey(serverConfigId)) {
RocketChatWebSocketThread thread = webSocketThreads.get(serverConfigId); RocketChatWebSocketThread thread = webSocketThreads.get(serverConfigId);
...@@ -122,7 +126,8 @@ public class RocketChatService extends Service { ...@@ -122,7 +126,8 @@ public class RocketChatService extends Service {
}); });
} }
@Override public void onDestroy() { @Override
public void onDestroy() {
if (connectionRequiredServerConfigObserver != null) { if (connectionRequiredServerConfigObserver != null) {
connectionRequiredServerConfigObserver.unsub(); connectionRequiredServerConfigObserver.unsub();
} }
......
...@@ -3,6 +3,11 @@ package chat.rocket.android.service; ...@@ -3,6 +3,11 @@ package chat.rocket.android.service;
import android.content.Context; import android.content.Context;
import android.os.Handler; import android.os.Handler;
import android.os.HandlerThread; import android.os.HandlerThread;
import org.json.JSONObject;
import java.lang.reflect.Constructor;
import java.util.ArrayList;
import java.util.Iterator;
import bolts.Continuation; import bolts.Continuation;
import bolts.Task; import bolts.Task;
import bolts.TaskCompletionSource; import bolts.TaskCompletionSource;
...@@ -18,22 +23,18 @@ import chat.rocket.android.service.ddp.base.ActiveUsersSubscriber; ...@@ -18,22 +23,18 @@ import chat.rocket.android.service.ddp.base.ActiveUsersSubscriber;
import chat.rocket.android.service.ddp.base.LoginServiceConfigurationSubscriber; import chat.rocket.android.service.ddp.base.LoginServiceConfigurationSubscriber;
import chat.rocket.android.service.ddp.base.UserDataSubscriber; import chat.rocket.android.service.ddp.base.UserDataSubscriber;
import chat.rocket.android.service.observer.CurrentUserObserver; import chat.rocket.android.service.observer.CurrentUserObserver;
import chat.rocket.android.service.observer.GetUsersOfRoomsProcedureObserver; import chat.rocket.android.service.observer.FileUploadingToS3Observer;
import chat.rocket.android.service.observer.FileUploadingWithUfsObserver; import chat.rocket.android.service.observer.FileUploadingWithUfsObserver;
import chat.rocket.android.service.observer.GetUsersOfRoomsProcedureObserver;
import chat.rocket.android.service.observer.LoadMessageProcedureObserver; import chat.rocket.android.service.observer.LoadMessageProcedureObserver;
import chat.rocket.android.service.observer.MethodCallObserver; import chat.rocket.android.service.observer.MethodCallObserver;
import chat.rocket.android.service.observer.NewMessageObserver; import chat.rocket.android.service.observer.NewMessageObserver;
import chat.rocket.android.service.observer.NotificationItemObserver; import chat.rocket.android.service.observer.NotificationItemObserver;
import chat.rocket.android.service.observer.ReactiveNotificationManager; import chat.rocket.android.service.observer.ReactiveNotificationManager;
import chat.rocket.android.service.observer.FileUploadingToS3Observer;
import chat.rocket.android.service.observer.SessionObserver; import chat.rocket.android.service.observer.SessionObserver;
import chat.rocket.android.service.observer.TokenLoginObserver; import chat.rocket.android.service.observer.TokenLoginObserver;
import chat.rocket.android_ddp.DDPClientCallback; import chat.rocket.android_ddp.DDPClientCallback;
import hugo.weaving.DebugLog; import hugo.weaving.DebugLog;
import java.lang.reflect.Constructor;
import java.util.ArrayList;
import java.util.Iterator;
import org.json.JSONObject;
/** /**
* Thread for handling WebSocket connection. * Thread for handling WebSocket connection.
...@@ -74,11 +75,13 @@ public class RocketChatWebSocketThread extends HandlerThread { ...@@ -74,11 +75,13 @@ public class RocketChatWebSocketThread extends HandlerThread {
/** /**
* create new Thread. * create new Thread.
*/ */
@DebugLog public static Task<RocketChatWebSocketThread> getStarted(Context appContext, @DebugLog
public static Task<RocketChatWebSocketThread> getStarted(Context appContext,
ServerConfig config) { ServerConfig config) {
TaskCompletionSource<RocketChatWebSocketThread> task = new TaskCompletionSource<>(); TaskCompletionSource<RocketChatWebSocketThread> task = new TaskCompletionSource<>();
new RocketChatWebSocketThread(appContext, config.getServerConfigId()) { new RocketChatWebSocketThread(appContext, config.getServerConfigId()) {
@Override protected void onLooperPrepared() { @Override
protected void onLooperPrepared() {
try { try {
super.onLooperPrepared(); super.onLooperPrepared();
task.setResult(this); task.setResult(this);
...@@ -92,7 +95,16 @@ public class RocketChatWebSocketThread extends HandlerThread { ...@@ -92,7 +95,16 @@ public class RocketChatWebSocketThread extends HandlerThread {
_task.getResult().connect().onSuccessTask(__task -> _task)); _task.getResult().connect().onSuccessTask(__task -> _task));
} }
@Override protected void onLooperPrepared() { /**
* destroy the thread.
*/
@DebugLog
public static void destroy(RocketChatWebSocketThread thread) {
thread.quit();
}
@Override
protected void onLooperPrepared() {
super.onLooperPrepared(); super.onLooperPrepared();
forceInvalidateTokens(); forceInvalidateTokens();
} }
...@@ -110,14 +122,8 @@ public class RocketChatWebSocketThread extends HandlerThread { ...@@ -110,14 +122,8 @@ public class RocketChatWebSocketThread extends HandlerThread {
}).continueWith(new LogcatIfError()); }).continueWith(new LogcatIfError());
} }
/** @Override
* destroy the thread. public boolean quit() {
*/
@DebugLog public static void destroy(RocketChatWebSocketThread thread) {
thread.quit();
}
@Override public boolean quit() {
if (isAlive()) { if (isAlive()) {
new Handler(getLooper()).post(() -> { new Handler(getLooper()).post(() -> {
RCLog.d("thread %s: quit()", Thread.currentThread().getId()); RCLog.d("thread %s: quit()", Thread.currentThread().getId());
...@@ -133,7 +139,8 @@ public class RocketChatWebSocketThread extends HandlerThread { ...@@ -133,7 +139,8 @@ public class RocketChatWebSocketThread extends HandlerThread {
/** /**
* synchronize the state of the thread with ServerConfig. * synchronize the state of the thread with ServerConfig.
*/ */
@DebugLog public void keepalive() { @DebugLog
public void keepalive() {
if (ddpClient == null || !ddpClient.isConnected()) { if (ddpClient == null || !ddpClient.isConnected()) {
defaultRealm.executeTransaction(realm -> { defaultRealm.executeTransaction(realm -> {
ServerConfig config = realm.where(ServerConfig.class) ServerConfig config = realm.where(ServerConfig.class)
...@@ -154,7 +161,8 @@ public class RocketChatWebSocketThread extends HandlerThread { ...@@ -154,7 +161,8 @@ public class RocketChatWebSocketThread extends HandlerThread {
} }
} }
@DebugLog private Task<Void> connect() { @DebugLog
private Task<Void> connect() {
final ServerConfig config = defaultRealm.executeTransactionForRead(realm -> final ServerConfig config = defaultRealm.executeTransactionForRead(realm ->
realm.where(ServerConfig.class).equalTo("serverConfigId", serverConfigId).findFirst()); realm.where(ServerConfig.class).equalTo("serverConfigId", serverConfigId).findFirst());
...@@ -177,7 +185,8 @@ public class RocketChatWebSocketThread extends HandlerThread { ...@@ -177,7 +185,8 @@ public class RocketChatWebSocketThread extends HandlerThread {
return task; return task;
}).onSuccess(new Continuation<DDPClientCallback.Connect, Object>() { }).onSuccess(new Continuation<DDPClientCallback.Connect, Object>() {
// TODO type detection doesn't work due to retrolambda's bug... // TODO type detection doesn't work due to retrolambda's bug...
@Override public Object then(Task<DDPClientCallback.Connect> task) @Override
public Object then(Task<DDPClientCallback.Connect> task)
throws Exception { throws Exception {
registerListeners(); registerListeners();
......
...@@ -2,18 +2,19 @@ package chat.rocket.android.service.ddp; ...@@ -2,18 +2,19 @@ package chat.rocket.android.service.ddp;
import android.content.Context; import android.content.Context;
import android.text.TextUtils; import android.text.TextUtils;
import io.realm.Realm;
import io.realm.RealmObject;
import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;
import java.util.Iterator;
import chat.rocket.android.api.DDPClientWraper; import chat.rocket.android.api.DDPClientWraper;
import chat.rocket.android.helper.LogcatIfError; import chat.rocket.android.helper.LogcatIfError;
import chat.rocket.android.log.RCLog; import chat.rocket.android.log.RCLog;
import chat.rocket.android.realm_helper.RealmHelper; import chat.rocket.android.realm_helper.RealmHelper;
import chat.rocket.android.service.Registerable; import chat.rocket.android.service.Registerable;
import chat.rocket.android_ddp.DDPSubscription; import chat.rocket.android_ddp.DDPSubscription;
import io.realm.Realm;
import io.realm.RealmObject;
import java.util.Iterator;
import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;
import rx.Subscription; import rx.Subscription;
public abstract class AbstractDDPDocEventSubscriber implements Registerable { public abstract class AbstractDDPDocEventSubscriber implements Registerable {
...@@ -49,11 +50,14 @@ public abstract class AbstractDDPDocEventSubscriber implements Registerable { ...@@ -49,11 +50,14 @@ public abstract class AbstractDDPDocEventSubscriber implements Registerable {
return json; return json;
} }
protected void onRegister() {} protected void onRegister() {
}
protected void onUnregister() {} protected void onUnregister() {
}
@Override public final void register() { @Override
public final void register() {
isUnsubscribed = false; isUnsubscribed = false;
JSONArray params = null; JSONArray params = null;
try { try {
...@@ -170,7 +174,8 @@ public abstract class AbstractDDPDocEventSubscriber implements Registerable { ...@@ -170,7 +174,8 @@ public abstract class AbstractDDPDocEventSubscriber implements Registerable {
} }
} }
@Override public final void unregister() { @Override
public final void unregister() {
isUnsubscribed = true; isUnsubscribed = true;
onUnregister(); onUnregister();
if (rxSubscription != null) { if (rxSubscription != null) {
......
package chat.rocket.android.service.ddp.base; package chat.rocket.android.service.ddp.base;
import android.content.Context; import android.content.Context;
import org.json.JSONArray;
import chat.rocket.android.api.DDPClientWraper; import chat.rocket.android.api.DDPClientWraper;
import chat.rocket.android.realm_helper.RealmHelper; import chat.rocket.android.realm_helper.RealmHelper;
import chat.rocket.android.service.ddp.AbstractDDPDocEventSubscriber; import chat.rocket.android.service.ddp.AbstractDDPDocEventSubscriber;
import org.json.JSONArray;
abstract class AbstractBaseSubscriber extends AbstractDDPDocEventSubscriber { abstract class AbstractBaseSubscriber extends AbstractDDPDocEventSubscriber {
protected AbstractBaseSubscriber(Context context, String hostname, RealmHelper realmHelper, protected AbstractBaseSubscriber(Context context, String hostname, RealmHelper realmHelper,
...@@ -12,17 +13,20 @@ abstract class AbstractBaseSubscriber extends AbstractDDPDocEventSubscriber { ...@@ -12,17 +13,20 @@ abstract class AbstractBaseSubscriber extends AbstractDDPDocEventSubscriber {
super(context, hostname, realmHelper, ddpClient); super(context, hostname, realmHelper, ddpClient);
} }
@Override protected final JSONArray getSubscriptionParams() { @Override
protected final JSONArray getSubscriptionParams() {
return null; return null;
} }
@Override protected final boolean shouldTruncateTableOnInitialize() { @Override
protected final boolean shouldTruncateTableOnInitialize() {
return true; return true;
} }
protected abstract String getSubscriptionCallbackName(); protected abstract String getSubscriptionCallbackName();
@Override protected final boolean isTarget(String callbackName) { @Override
protected final boolean isTarget(String callbackName) {
return getSubscriptionCallbackName().equals(callbackName); return getSubscriptionCallbackName().equals(callbackName);
} }
} }
package chat.rocket.android.service.ddp.base; package chat.rocket.android.service.ddp.base;
import android.content.Context; import android.content.Context;
import io.realm.RealmObject;
import chat.rocket.android.api.DDPClientWraper;
import chat.rocket.android.model.ddp.User; import chat.rocket.android.model.ddp.User;
import chat.rocket.android.realm_helper.RealmHelper; import chat.rocket.android.realm_helper.RealmHelper;
import chat.rocket.android.api.DDPClientWraper;
import io.realm.RealmObject;
/** /**
* "activeUsers" subscriber. * "activeUsers" subscriber.
...@@ -15,15 +16,18 @@ public class ActiveUsersSubscriber extends AbstractBaseSubscriber { ...@@ -15,15 +16,18 @@ public class ActiveUsersSubscriber extends AbstractBaseSubscriber {
super(context, hostname, realmHelper, ddpClient); super(context, hostname, realmHelper, ddpClient);
} }
@Override protected String getSubscriptionName() { @Override
protected String getSubscriptionName() {
return "activeUsers"; return "activeUsers";
} }
@Override protected String getSubscriptionCallbackName() { @Override
protected String getSubscriptionCallbackName() {
return "users"; return "users";
} }
@Override protected Class<? extends RealmObject> getModelClass() { @Override
protected Class<? extends RealmObject> getModelClass() {
return User.class; return User.class;
} }
} }
package chat.rocket.android.service.ddp.base; package chat.rocket.android.service.ddp.base;
import android.content.Context; import android.content.Context;
import io.realm.RealmObject;
import chat.rocket.android.api.DDPClientWraper;
import chat.rocket.android.model.ddp.MeteorLoginServiceConfiguration; import chat.rocket.android.model.ddp.MeteorLoginServiceConfiguration;
import chat.rocket.android.realm_helper.RealmHelper; import chat.rocket.android.realm_helper.RealmHelper;
import chat.rocket.android.api.DDPClientWraper;
import io.realm.RealmObject;
/** /**
* meteor.loginServiceConfiguration subscriber * meteor.loginServiceConfiguration subscriber
...@@ -15,15 +16,18 @@ public class LoginServiceConfigurationSubscriber extends AbstractBaseSubscriber ...@@ -15,15 +16,18 @@ public class LoginServiceConfigurationSubscriber extends AbstractBaseSubscriber
super(context, hostname, realmHelper, ddpClient); super(context, hostname, realmHelper, ddpClient);
} }
@Override protected String getSubscriptionName() { @Override
protected String getSubscriptionName() {
return "meteor.loginServiceConfiguration"; return "meteor.loginServiceConfiguration";
} }
@Override protected String getSubscriptionCallbackName() { @Override
protected String getSubscriptionCallbackName() {
return "meteor_accounts_loginServiceConfiguration"; return "meteor_accounts_loginServiceConfiguration";
} }
@Override protected Class<? extends RealmObject> getModelClass() { @Override
protected Class<? extends RealmObject> getModelClass() {
return MeteorLoginServiceConfiguration.class; return MeteorLoginServiceConfiguration.class;
} }
} }
package chat.rocket.android.service.ddp.base; package chat.rocket.android.service.ddp.base;
import android.content.Context; import android.content.Context;
import io.realm.RealmObject;
import chat.rocket.android.api.DDPClientWraper; import chat.rocket.android.api.DDPClientWraper;
import chat.rocket.android.model.ddp.User; import chat.rocket.android.model.ddp.User;
import chat.rocket.android.realm_helper.RealmHelper; import chat.rocket.android.realm_helper.RealmHelper;
import io.realm.RealmObject;
/** /**
* "userData" subscriber. * "userData" subscriber.
...@@ -15,15 +16,18 @@ public class UserDataSubscriber extends AbstractBaseSubscriber { ...@@ -15,15 +16,18 @@ public class UserDataSubscriber extends AbstractBaseSubscriber {
super(context, hostname, realmHelper, ddpClient); super(context, hostname, realmHelper, ddpClient);
} }
@Override protected String getSubscriptionName() { @Override
protected String getSubscriptionName() {
return "userData"; return "userData";
} }
@Override protected String getSubscriptionCallbackName() { @Override
protected String getSubscriptionCallbackName() {
return "users"; return "users";
} }
@Override protected Class<? extends RealmObject> getModelClass() { @Override
protected Class<? extends RealmObject> getModelClass() {
return User.class; return User.class;
} }
} }
package chat.rocket.android.service.ddp.stream; package chat.rocket.android.service.ddp.stream;
import android.content.Context; import android.content.Context;
import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;
import chat.rocket.android.api.DDPClientWraper; import chat.rocket.android.api.DDPClientWraper;
import chat.rocket.android.helper.LogcatIfError; import chat.rocket.android.helper.LogcatIfError;
import chat.rocket.android.log.RCLog; import chat.rocket.android.log.RCLog;
import chat.rocket.android.realm_helper.RealmHelper; import chat.rocket.android.realm_helper.RealmHelper;
import chat.rocket.android.service.ddp.AbstractDDPDocEventSubscriber; import chat.rocket.android.service.ddp.AbstractDDPDocEventSubscriber;
import chat.rocket.android_ddp.DDPSubscription; import chat.rocket.android_ddp.DDPSubscription;
import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;
abstract class AbstractStreamNotifyEventSubscriber extends AbstractDDPDocEventSubscriber { abstract class AbstractStreamNotifyEventSubscriber extends AbstractDDPDocEventSubscriber {
protected AbstractStreamNotifyEventSubscriber(Context context, String hostname, protected AbstractStreamNotifyEventSubscriber(Context context, String hostname,
RealmHelper realmHelper, DDPClientWraper ddpClient) { RealmHelper realmHelper,
DDPClientWraper ddpClient) {
super(context, hostname, realmHelper, ddpClient); super(context, hostname, realmHelper, ddpClient);
} }
@Override protected final boolean shouldTruncateTableOnInitialize() { @Override
protected final boolean shouldTruncateTableOnInitialize() {
return false; return false;
} }
@Override protected final boolean isTarget(String callbackName) { @Override
protected final boolean isTarget(String callbackName) {
return getSubscriptionName().equals(callbackName); return getSubscriptionName().equals(callbackName);
} }
protected abstract String getSubscriptionParam(); protected abstract String getSubscriptionParam();
@Override protected final JSONArray getSubscriptionParams() throws JSONException { @Override
protected final JSONArray getSubscriptionParams() throws JSONException {
return new JSONArray().put(getSubscriptionParam()).put(false); return new JSONArray().put(getSubscriptionParam()).put(false);
} }
protected abstract String getPrimaryKeyForModel(); protected abstract String getPrimaryKeyForModel();
@Override protected final void onDocumentAdded(DDPSubscription.Added docEvent) { @Override
protected final void onDocumentAdded(DDPSubscription.Added docEvent) {
// do nothing. // do nothing.
} }
@Override protected final void onDocumentRemoved(DDPSubscription.Removed docEvent) { @Override
protected final void onDocumentRemoved(DDPSubscription.Removed docEvent) {
// do nothing. // do nothing.
} }
@Override protected final void onDocumentChanged(DDPSubscription.Changed docEvent) { @Override
protected final void onDocumentChanged(DDPSubscription.Changed docEvent) {
try { try {
if (!docEvent.fields.getString("eventName").equals(getSubscriptionParam())) { if (!docEvent.fields.getString("eventName").equals(getSubscriptionParam())) {
return; return;
......
package chat.rocket.android.service.ddp.stream; package chat.rocket.android.service.ddp.stream;
import android.content.Context; import android.content.Context;
import chat.rocket.android.api.DDPClientWraper; import chat.rocket.android.api.DDPClientWraper;
import chat.rocket.android.realm_helper.RealmHelper; import chat.rocket.android.realm_helper.RealmHelper;
abstract class AbstractStreamNotifyUserEventSubscriber extends AbstractStreamNotifyEventSubscriber { abstract class AbstractStreamNotifyUserEventSubscriber extends AbstractStreamNotifyEventSubscriber {
protected final String userId; protected final String userId;
protected AbstractStreamNotifyUserEventSubscriber(Context context, String hostname, protected AbstractStreamNotifyUserEventSubscriber(Context context, String hostname,
RealmHelper realmHelper, DDPClientWraper ddpClient, String userId) { RealmHelper realmHelper,
DDPClientWraper ddpClient, String userId) {
super(context, hostname, realmHelper, ddpClient); super(context, hostname, realmHelper, ddpClient);
this.userId = userId; this.userId = userId;
} }
@Override protected final String getSubscriptionName() { @Override
protected final String getSubscriptionName() {
return "stream-notify-user"; return "stream-notify-user";
} }
@Override protected final String getSubscriptionParam() { @Override
protected final String getSubscriptionParam() {
return userId + "/" + getSubscriptionSubParam(); return userId + "/" + getSubscriptionSubParam();
} }
......
package chat.rocket.android.service.ddp.stream; package chat.rocket.android.service.ddp.stream;
import android.content.Context; import android.content.Context;
import chat.rocket.android.api.DDPClientWraper;
import chat.rocket.android.model.ddp.RoomSubscription;
import chat.rocket.android.realm_helper.RealmHelper;
import io.realm.RealmObject; import io.realm.RealmObject;
import org.json.JSONException; import org.json.JSONException;
import org.json.JSONObject; import org.json.JSONObject;
import chat.rocket.android.api.DDPClientWraper;
import chat.rocket.android.model.ddp.RoomSubscription;
import chat.rocket.android.realm_helper.RealmHelper;
public class StreamNotifyUserSubscriptionsChanged extends AbstractStreamNotifyUserEventSubscriber { public class StreamNotifyUserSubscriptionsChanged extends AbstractStreamNotifyUserEventSubscriber {
public StreamNotifyUserSubscriptionsChanged(Context context, String hostname, public StreamNotifyUserSubscriptionsChanged(Context context, String hostname,
RealmHelper realmHelper, DDPClientWraper ddpClient, String userId) { RealmHelper realmHelper, DDPClientWraper ddpClient,
String userId) {
super(context, hostname, realmHelper, ddpClient, userId); super(context, hostname, realmHelper, ddpClient, userId);
} }
@Override protected String getSubscriptionSubParam() { @Override
protected String getSubscriptionSubParam() {
return "subscriptions-changed"; return "subscriptions-changed";
} }
@Override protected Class<? extends RealmObject> getModelClass() { @Override
protected Class<? extends RealmObject> getModelClass() {
return RoomSubscription.class; return RoomSubscription.class;
} }
@Override protected JSONObject customizeFieldJson(JSONObject json) throws JSONException { @Override
protected JSONObject customizeFieldJson(JSONObject json) throws JSONException {
return RoomSubscription.customizeJson(super.customizeFieldJson(json)); return RoomSubscription.customizeJson(super.customizeFieldJson(json));
} }
@Override protected String getPrimaryKeyForModel() { @Override
protected String getPrimaryKeyForModel() {
return "rid"; return "rid";
} }
} }
package chat.rocket.android.service.ddp.stream; package chat.rocket.android.service.ddp.stream;
import android.content.Context; import android.content.Context;
import chat.rocket.android.api.DDPClientWraper;
import chat.rocket.android.model.ddp.Message;
import chat.rocket.android.realm_helper.RealmHelper;
import io.realm.RealmObject; import io.realm.RealmObject;
import org.json.JSONException; import org.json.JSONException;
import org.json.JSONObject; import org.json.JSONObject;
import chat.rocket.android.api.DDPClientWraper;
import chat.rocket.android.model.ddp.Message;
import chat.rocket.android.realm_helper.RealmHelper;
/** /**
* stream-room-message subscriber. * stream-room-message subscriber.
*/ */
...@@ -20,23 +21,28 @@ public class StreamRoomMessage extends AbstractStreamNotifyEventSubscriber { ...@@ -20,23 +21,28 @@ public class StreamRoomMessage extends AbstractStreamNotifyEventSubscriber {
this.roomId = roomId; this.roomId = roomId;
} }
@Override protected String getSubscriptionName() { @Override
protected String getSubscriptionName() {
return "stream-room-messages"; return "stream-room-messages";
} }
@Override protected String getSubscriptionParam() { @Override
protected String getSubscriptionParam() {
return roomId; return roomId;
} }
@Override protected Class<? extends RealmObject> getModelClass() { @Override
protected Class<? extends RealmObject> getModelClass() {
return Message.class; return Message.class;
} }
@Override protected String getPrimaryKeyForModel() { @Override
protected String getPrimaryKeyForModel() {
return "_id"; return "_id";
} }
@Override protected JSONObject customizeFieldJson(JSONObject json) throws JSONException { @Override
protected JSONObject customizeFieldJson(JSONObject json) throws JSONException {
return Message.customizeJson(super.customizeFieldJson(json)); return Message.customizeJson(super.customizeFieldJson(json));
} }
} }
...@@ -2,6 +2,7 @@ package chat.rocket.android.service.internal; ...@@ -2,6 +2,7 @@ package chat.rocket.android.service.internal;
import android.content.Context; import android.content.Context;
import android.content.SharedPreferences; import android.content.SharedPreferences;
import chat.rocket.android.RocketChatCache; import chat.rocket.android.RocketChatCache;
import chat.rocket.android.helper.TextUtils; import chat.rocket.android.helper.TextUtils;
import chat.rocket.android.model.ddp.RoomSubscription; import chat.rocket.android.model.ddp.RoomSubscription;
...@@ -12,6 +13,12 @@ public abstract class AbstractRocketChatCacheObserver implements Registerable { ...@@ -12,6 +13,12 @@ public abstract class AbstractRocketChatCacheObserver implements Registerable {
private final Context context; private final Context context;
private final RealmHelper realmHelper; private final RealmHelper realmHelper;
private String roomId; private String roomId;
private SharedPreferences.OnSharedPreferenceChangeListener listener =
(prefs, key) -> {
if (RocketChatCache.KEY_SELECTED_ROOM_ID.equals(key)) {
updateRoomIdWith(prefs);
}
};
protected AbstractRocketChatCacheObserver(Context context, RealmHelper realmHelper) { protected AbstractRocketChatCacheObserver(Context context, RealmHelper realmHelper) {
this.context = context; this.context = context;
...@@ -40,20 +47,15 @@ public abstract class AbstractRocketChatCacheObserver implements Registerable { ...@@ -40,20 +47,15 @@ public abstract class AbstractRocketChatCacheObserver implements Registerable {
protected abstract void onRoomIdUpdated(String roomId); protected abstract void onRoomIdUpdated(String roomId);
private SharedPreferences.OnSharedPreferenceChangeListener listener = @Override
(prefs, key) -> { public final void register() {
if (RocketChatCache.KEY_SELECTED_ROOM_ID.equals(key)) {
updateRoomIdWith(prefs);
}
};
@Override public final void register() {
SharedPreferences prefs = RocketChatCache.get(context); SharedPreferences prefs = RocketChatCache.get(context);
prefs.registerOnSharedPreferenceChangeListener(listener); prefs.registerOnSharedPreferenceChangeListener(listener);
updateRoomIdWith(prefs); updateRoomIdWith(prefs);
} }
@Override public final void unregister() { @Override
public final void unregister() {
RocketChatCache.get(context).unregisterOnSharedPreferenceChangeListener(listener); RocketChatCache.get(context).unregisterOnSharedPreferenceChangeListener(listener);
} }
} }
...@@ -3,6 +3,7 @@ package chat.rocket.android.service.internal; ...@@ -3,6 +3,7 @@ package chat.rocket.android.service.internal;
import android.content.Context; import android.content.Context;
import android.os.Handler; import android.os.Handler;
import android.os.Looper; import android.os.Looper;
import chat.rocket.android.api.DDPClientWraper; import chat.rocket.android.api.DDPClientWraper;
import chat.rocket.android.realm_helper.RealmHelper; import chat.rocket.android.realm_helper.RealmHelper;
import chat.rocket.android.service.Registerable; import chat.rocket.android.service.Registerable;
...@@ -12,14 +13,13 @@ import chat.rocket.android.service.ddp.stream.StreamRoomMessage; ...@@ -12,14 +13,13 @@ import chat.rocket.android.service.ddp.stream.StreamRoomMessage;
* wrapper for managing stream-notify-message depending on RocketChatCache. * wrapper for managing stream-notify-message depending on RocketChatCache.
*/ */
public class StreamRoomMessageManager implements Registerable { public class StreamRoomMessageManager implements Registerable {
private StreamRoomMessage streamRoomMessage;
private final Context context; private final Context context;
private final String hostname; private final String hostname;
private final RealmHelper realmHelper; private final RealmHelper realmHelper;
private final DDPClientWraper ddpClient; private final DDPClientWraper ddpClient;
private final AbstractRocketChatCacheObserver cacheObserver; private final AbstractRocketChatCacheObserver cacheObserver;
private final Handler handler; private final Handler handler;
private StreamRoomMessage streamRoomMessage;
public StreamRoomMessageManager(Context context, String hostname, public StreamRoomMessageManager(Context context, String hostname,
RealmHelper realmHelper, DDPClientWraper ddpClient) { RealmHelper realmHelper, DDPClientWraper ddpClient) {
...@@ -29,7 +29,8 @@ public class StreamRoomMessageManager implements Registerable { ...@@ -29,7 +29,8 @@ public class StreamRoomMessageManager implements Registerable {
this.ddpClient = ddpClient; this.ddpClient = ddpClient;
cacheObserver = new AbstractRocketChatCacheObserver(context, realmHelper) { cacheObserver = new AbstractRocketChatCacheObserver(context, realmHelper) {
@Override protected void onRoomIdUpdated(String roomId) { @Override
protected void onRoomIdUpdated(String roomId) {
unregisterStreamNotifyMessageIfNeeded(); unregisterStreamNotifyMessageIfNeeded();
registerStreamNotifyMessage(roomId); registerStreamNotifyMessage(roomId);
} }
...@@ -53,11 +54,13 @@ public class StreamRoomMessageManager implements Registerable { ...@@ -53,11 +54,13 @@ public class StreamRoomMessageManager implements Registerable {
}); });
} }
@Override public void register() { @Override
public void register() {
cacheObserver.register(); cacheObserver.register();
} }
@Override public void unregister() { @Override
public void unregister() {
unregisterStreamNotifyMessageIfNeeded(); unregisterStreamNotifyMessageIfNeeded();
cacheObserver.unregister(); cacheObserver.unregister();
} }
......
...@@ -2,6 +2,7 @@ package chat.rocket.android.service.notification; ...@@ -2,6 +2,7 @@ package chat.rocket.android.service.notification;
import android.app.IntentService; import android.app.IntentService;
import android.content.Intent; import android.content.Intent;
import chat.rocket.android.model.internal.NotificationItem; import chat.rocket.android.model.internal.NotificationItem;
import chat.rocket.android.realm_helper.RealmHelper; import chat.rocket.android.realm_helper.RealmHelper;
import chat.rocket.android.realm_helper.RealmStore; import chat.rocket.android.realm_helper.RealmStore;
...@@ -14,7 +15,8 @@ public class NotificationDismissalCallbackService extends IntentService { ...@@ -14,7 +15,8 @@ public class NotificationDismissalCallbackService extends IntentService {
super(NotificationDismissalCallbackService.class.getSimpleName()); super(NotificationDismissalCallbackService.class.getSimpleName());
} }
@Override protected void onHandleIntent(Intent intent) { @Override
protected void onHandleIntent(Intent intent) {
if (!intent.hasExtra("serverConfigId") || !intent.hasExtra("roomId")) { if (!intent.hasExtra("serverConfigId") || !intent.hasExtra("roomId")) {
return; return;
} }
......
package chat.rocket.android.service.observer; package chat.rocket.android.service.observer;
import android.content.Context; import android.content.Context;
import io.realm.RealmObject;
import chat.rocket.android.api.DDPClientWraper;
import chat.rocket.android.realm_helper.RealmHelper; import chat.rocket.android.realm_helper.RealmHelper;
import chat.rocket.android.realm_helper.RealmListObserver; import chat.rocket.android.realm_helper.RealmListObserver;
import chat.rocket.android.service.Registerable; import chat.rocket.android.service.Registerable;
import chat.rocket.android.api.DDPClientWraper;
import io.realm.RealmObject;
abstract class AbstractModelObserver<T extends RealmObject> abstract class AbstractModelObserver<T extends RealmObject>
implements Registerable, RealmListObserver.Query<T>, RealmListObserver.OnUpdateListener<T> { implements Registerable, RealmListObserver.Query<T>, RealmListObserver.OnUpdateListener<T> {
...@@ -25,11 +26,13 @@ abstract class AbstractModelObserver<T extends RealmObject> ...@@ -25,11 +26,13 @@ abstract class AbstractModelObserver<T extends RealmObject>
observer = realmHelper.createListObserver(this).setOnUpdateListener(this); observer = realmHelper.createListObserver(this).setOnUpdateListener(this);
} }
@Override public void register() { @Override
public void register() {
observer.sub(); observer.sub();
} }
@Override public void unregister() { @Override
public void unregister() {
observer.unsub(); observer.unsub();
} }
} }
package chat.rocket.android.service.observer; package chat.rocket.android.service.observer;
import android.content.Context; import android.content.Context;
import io.realm.Realm;
import io.realm.RealmResults;
import java.util.ArrayList;
import java.util.List;
import chat.rocket.android.api.DDPClientWraper; import chat.rocket.android.api.DDPClientWraper;
import chat.rocket.android.api.MethodCallHelper; import chat.rocket.android.api.MethodCallHelper;
import chat.rocket.android.helper.LogcatIfError; import chat.rocket.android.helper.LogcatIfError;
...@@ -9,19 +14,13 @@ import chat.rocket.android.realm_helper.RealmHelper; ...@@ -9,19 +14,13 @@ import chat.rocket.android.realm_helper.RealmHelper;
import chat.rocket.android.service.Registerable; import chat.rocket.android.service.Registerable;
import chat.rocket.android.service.ddp.stream.StreamNotifyUserSubscriptionsChanged; import chat.rocket.android.service.ddp.stream.StreamNotifyUserSubscriptionsChanged;
import hugo.weaving.DebugLog; import hugo.weaving.DebugLog;
import io.realm.Realm;
import io.realm.RealmResults;
import java.util.ArrayList;
import java.util.List;
/** /**
* observe the user with emails. * observe the user with emails.
*/ */
public class CurrentUserObserver extends AbstractModelObserver<User> { public class CurrentUserObserver extends AbstractModelObserver<User> {
private boolean currentUserExists;
private final MethodCallHelper methodCall; private final MethodCallHelper methodCall;
private boolean currentUserExists;
private ArrayList<Registerable> listeners; private ArrayList<Registerable> listeners;
public CurrentUserObserver(Context context, String hostname, public CurrentUserObserver(Context context, String hostname,
...@@ -31,11 +30,13 @@ public class CurrentUserObserver extends AbstractModelObserver<User> { ...@@ -31,11 +30,13 @@ public class CurrentUserObserver extends AbstractModelObserver<User> {
currentUserExists = false; currentUserExists = false;
} }
@Override public RealmResults<User> queryItems(Realm realm) { @Override
public RealmResults<User> queryItems(Realm realm) {
return User.queryCurrentUser(realm).findAll(); return User.queryCurrentUser(realm).findAll();
} }
@Override public void onUpdateResults(List<User> results) { @Override
public void onUpdateResults(List<User> results) {
boolean exists = !results.isEmpty(); boolean exists = !results.isEmpty();
if (currentUserExists != exists) { if (currentUserExists != exists) {
......
...@@ -2,6 +2,14 @@ package chat.rocket.android.service.observer; ...@@ -2,6 +2,14 @@ package chat.rocket.android.service.observer;
import android.content.Context; import android.content.Context;
import android.net.Uri; import android.net.Uri;
import io.realm.Realm;
import io.realm.RealmResults;
import org.json.JSONArray;
import org.json.JSONObject;
import java.io.IOException;
import java.io.InputStream;
import java.util.List;
import bolts.Task; import bolts.Task;
import chat.rocket.android.api.DDPClientWraper; import chat.rocket.android.api.DDPClientWraper;
import chat.rocket.android.api.FileUploadingHelper; import chat.rocket.android.api.FileUploadingHelper;
...@@ -11,11 +19,6 @@ import chat.rocket.android.log.RCLog; ...@@ -11,11 +19,6 @@ import chat.rocket.android.log.RCLog;
import chat.rocket.android.model.SyncState; import chat.rocket.android.model.SyncState;
import chat.rocket.android.model.internal.FileUploading; import chat.rocket.android.model.internal.FileUploading;
import chat.rocket.android.realm_helper.RealmHelper; import chat.rocket.android.realm_helper.RealmHelper;
import io.realm.Realm;
import io.realm.RealmResults;
import java.io.IOException;
import java.io.InputStream;
import java.util.List;
import okhttp3.MediaType; import okhttp3.MediaType;
import okhttp3.MultipartBody; import okhttp3.MultipartBody;
import okhttp3.Request; import okhttp3.Request;
...@@ -24,8 +27,6 @@ import okhttp3.Response; ...@@ -24,8 +27,6 @@ import okhttp3.Response;
import okio.BufferedSink; import okio.BufferedSink;
import okio.Okio; import okio.Okio;
import okio.Source; import okio.Source;
import org.json.JSONArray;
import org.json.JSONObject;
/** /**
* execute file uploading and requesting sendMessage with attachment. * execute file uploading and requesting sendMessage with attachment.
...@@ -61,14 +62,16 @@ public class FileUploadingToS3Observer extends AbstractModelObserver<FileUploadi ...@@ -61,14 +62,16 @@ public class FileUploadingToS3Observer extends AbstractModelObserver<FileUploadi
}).continueWith(new LogcatIfError()); }).continueWith(new LogcatIfError());
} }
@Override public RealmResults<FileUploading> queryItems(Realm realm) { @Override
public RealmResults<FileUploading> queryItems(Realm realm) {
return realm.where(FileUploading.class) return realm.where(FileUploading.class)
.equalTo("syncstate", SyncState.NOT_SYNCED) .equalTo("syncstate", SyncState.NOT_SYNCED)
.equalTo("storageType", FileUploading.STORAGE_TYPE_S3) .equalTo("storageType", FileUploading.STORAGE_TYPE_S3)
.findAll(); .findAll();
} }
@Override public void onUpdateResults(List<FileUploading> results) { @Override
public void onUpdateResults(List<FileUploading> results) {
if (results.isEmpty()) { if (results.isEmpty()) {
return; return;
} }
...@@ -111,15 +114,19 @@ public class FileUploadingToS3Observer extends AbstractModelObserver<FileUploadi ...@@ -111,15 +114,19 @@ public class FileUploadingToS3Observer extends AbstractModelObserver<FileUploadi
bodyBuilder.addFormDataPart("file", filename, bodyBuilder.addFormDataPart("file", filename,
new RequestBody() { new RequestBody() {
private long numBytes = 0; private long numBytes = 0;
@Override public MediaType contentType() {
@Override
public MediaType contentType() {
return MediaType.parse(mimeType); return MediaType.parse(mimeType);
} }
@Override public long contentLength() throws IOException { @Override
public long contentLength() throws IOException {
return filesize; return filesize;
} }
@Override public void writeTo(BufferedSink sink) throws IOException { @Override
public void writeTo(BufferedSink sink) throws IOException {
InputStream inputStream = context.getContentResolver().openInputStream(fileUri); InputStream inputStream = context.getContentResolver().openInputStream(fileUri);
try (Source source = Okio.source(inputStream)) { try (Source source = Okio.source(inputStream)) {
long readBytes; long readBytes;
......
...@@ -2,6 +2,12 @@ package chat.rocket.android.service.observer; ...@@ -2,6 +2,12 @@ package chat.rocket.android.service.observer;
import android.content.Context; import android.content.Context;
import android.net.Uri; import android.net.Uri;
import io.realm.Realm;
import io.realm.RealmResults;
import org.json.JSONObject;
import java.io.InputStream;
import java.util.List;
import bolts.Task; import bolts.Task;
import chat.rocket.android.api.DDPClientWraper; import chat.rocket.android.api.DDPClientWraper;
import chat.rocket.android.api.FileUploadingHelper; import chat.rocket.android.api.FileUploadingHelper;
...@@ -13,15 +19,10 @@ import chat.rocket.android.model.ddp.User; ...@@ -13,15 +19,10 @@ import chat.rocket.android.model.ddp.User;
import chat.rocket.android.model.internal.FileUploading; import chat.rocket.android.model.internal.FileUploading;
import chat.rocket.android.model.internal.Session; import chat.rocket.android.model.internal.Session;
import chat.rocket.android.realm_helper.RealmHelper; import chat.rocket.android.realm_helper.RealmHelper;
import io.realm.Realm;
import io.realm.RealmResults;
import java.io.InputStream;
import java.util.List;
import okhttp3.MediaType; import okhttp3.MediaType;
import okhttp3.Request; import okhttp3.Request;
import okhttp3.RequestBody; import okhttp3.RequestBody;
import okhttp3.Response; import okhttp3.Response;
import org.json.JSONObject;
/** /**
* execute file uploading and requesting sendMessage with attachment. * execute file uploading and requesting sendMessage with attachment.
...@@ -65,7 +66,8 @@ public class FileUploadingWithUfsObserver extends AbstractModelObserver<FileUplo ...@@ -65,7 +66,8 @@ public class FileUploadingWithUfsObserver extends AbstractModelObserver<FileUplo
}).continueWith(new LogcatIfError()); }).continueWith(new LogcatIfError());
} }
@Override public RealmResults<FileUploading> queryItems(Realm realm) { @Override
public RealmResults<FileUploading> queryItems(Realm realm) {
return realm.where(FileUploading.class) return realm.where(FileUploading.class)
.equalTo("syncstate", SyncState.NOT_SYNCED) .equalTo("syncstate", SyncState.NOT_SYNCED)
.beginGroup() .beginGroup()
...@@ -76,7 +78,8 @@ public class FileUploadingWithUfsObserver extends AbstractModelObserver<FileUplo ...@@ -76,7 +78,8 @@ public class FileUploadingWithUfsObserver extends AbstractModelObserver<FileUplo
.findAll(); .findAll();
} }
@Override public void onUpdateResults(List<FileUploading> results) { @Override
public void onUpdateResults(List<FileUploading> results) {
if (results.isEmpty()) { if (results.isEmpty()) {
return; return;
} }
......
package chat.rocket.android.service.observer; package chat.rocket.android.service.observer;
import android.content.Context; import android.content.Context;
import io.realm.Realm;
import io.realm.RealmResults;
import org.json.JSONObject;
import java.util.List;
import bolts.Task; import bolts.Task;
import chat.rocket.android.api.DDPClientWraper; import chat.rocket.android.api.DDPClientWraper;
import chat.rocket.android.api.MethodCallHelper; import chat.rocket.android.api.MethodCallHelper;
...@@ -8,10 +13,6 @@ import chat.rocket.android.log.RCLog; ...@@ -8,10 +13,6 @@ import chat.rocket.android.log.RCLog;
import chat.rocket.android.model.SyncState; import chat.rocket.android.model.SyncState;
import chat.rocket.android.model.internal.GetUsersOfRoomsProcedure; import chat.rocket.android.model.internal.GetUsersOfRoomsProcedure;
import chat.rocket.android.realm_helper.RealmHelper; import chat.rocket.android.realm_helper.RealmHelper;
import io.realm.Realm;
import io.realm.RealmResults;
import java.util.List;
import org.json.JSONObject;
/** /**
* Model observer for executing getUsersOfRooms. * Model observer for executing getUsersOfRooms.
...@@ -27,13 +28,15 @@ public class GetUsersOfRoomsProcedureObserver ...@@ -27,13 +28,15 @@ public class GetUsersOfRoomsProcedureObserver
methodCall = new MethodCallHelper(realmHelper, ddpClient); methodCall = new MethodCallHelper(realmHelper, ddpClient);
} }
@Override public RealmResults<GetUsersOfRoomsProcedure> queryItems(Realm realm) { @Override
public RealmResults<GetUsersOfRoomsProcedure> queryItems(Realm realm) {
return realm.where(GetUsersOfRoomsProcedure.class) return realm.where(GetUsersOfRoomsProcedure.class)
.equalTo("syncstate", SyncState.NOT_SYNCED) .equalTo("syncstate", SyncState.NOT_SYNCED)
.findAll(); .findAll();
} }
@Override public void onUpdateResults(List<GetUsersOfRoomsProcedure> results) { @Override
public void onUpdateResults(List<GetUsersOfRoomsProcedure> results) {
if (results == null || results.isEmpty()) { if (results == null || results.isEmpty()) {
return; return;
} }
......
package chat.rocket.android.service.observer; package chat.rocket.android.service.observer;
import android.content.Context; import android.content.Context;
import io.realm.Realm;
import io.realm.RealmResults;
import io.realm.Sort;
import org.json.JSONObject;
import java.util.List;
import bolts.Task; import bolts.Task;
import chat.rocket.android.api.DDPClientWraper; import chat.rocket.android.api.DDPClientWraper;
import chat.rocket.android.api.MethodCallHelper; import chat.rocket.android.api.MethodCallHelper;
...@@ -9,11 +15,6 @@ import chat.rocket.android.model.SyncState; ...@@ -9,11 +15,6 @@ import chat.rocket.android.model.SyncState;
import chat.rocket.android.model.ddp.Message; import chat.rocket.android.model.ddp.Message;
import chat.rocket.android.model.internal.LoadMessageProcedure; import chat.rocket.android.model.internal.LoadMessageProcedure;
import chat.rocket.android.realm_helper.RealmHelper; import chat.rocket.android.realm_helper.RealmHelper;
import io.realm.Realm;
import io.realm.RealmResults;
import io.realm.Sort;
import java.util.List;
import org.json.JSONObject;
/** /**
* Background process for loading messages. * Background process for loading messages.
...@@ -28,13 +29,15 @@ public class LoadMessageProcedureObserver extends AbstractModelObserver<LoadMess ...@@ -28,13 +29,15 @@ public class LoadMessageProcedureObserver extends AbstractModelObserver<LoadMess
methodCall = new MethodCallHelper(realmHelper, ddpClient); methodCall = new MethodCallHelper(realmHelper, ddpClient);
} }
@Override public RealmResults<LoadMessageProcedure> queryItems(Realm realm) { @Override
public RealmResults<LoadMessageProcedure> queryItems(Realm realm) {
return realm.where(LoadMessageProcedure.class) return realm.where(LoadMessageProcedure.class)
.equalTo("syncstate", SyncState.NOT_SYNCED) .equalTo("syncstate", SyncState.NOT_SYNCED)
.findAll(); .findAll();
} }
@Override public void onUpdateResults(List<LoadMessageProcedure> results) { @Override
public void onUpdateResults(List<LoadMessageProcedure> results) {
if (results == null || results.isEmpty()) { if (results == null || results.isEmpty()) {
return; return;
} }
......
package chat.rocket.android.service.observer; package chat.rocket.android.service.observer;
import android.content.Context; import android.content.Context;
import io.realm.Realm;
import io.realm.RealmResults;
import org.json.JSONObject;
import java.util.List;
import chat.rocket.android.api.DDPClientWraper;
import chat.rocket.android.helper.CheckSum; import chat.rocket.android.helper.CheckSum;
import chat.rocket.android.helper.LogcatIfError; import chat.rocket.android.helper.LogcatIfError;
import chat.rocket.android.model.SyncState; import chat.rocket.android.model.SyncState;
import chat.rocket.android.model.internal.MethodCall; import chat.rocket.android.model.internal.MethodCall;
import chat.rocket.android.realm_helper.RealmHelper; import chat.rocket.android.realm_helper.RealmHelper;
import chat.rocket.android.api.DDPClientWraper;
import chat.rocket.android_ddp.DDPClientCallback; import chat.rocket.android_ddp.DDPClientCallback;
import io.realm.Realm;
import io.realm.RealmResults;
import java.util.List;
import org.json.JSONObject;
/** /**
* Observing MethodCall record, executing RPC if needed. * Observing MethodCall record, executing RPC if needed.
...@@ -47,7 +48,8 @@ public class MethodCallObserver extends AbstractModelObserver<MethodCall> { ...@@ -47,7 +48,8 @@ public class MethodCallObserver extends AbstractModelObserver<MethodCall> {
}).continueWith(new LogcatIfError()); }).continueWith(new LogcatIfError());
} }
@Override public RealmResults<MethodCall> queryItems(Realm realm) { @Override
public RealmResults<MethodCall> queryItems(Realm realm) {
return realm.where(MethodCall.class) return realm.where(MethodCall.class)
.isNotNull("name") .isNotNull("name")
.equalTo("syncstate", SyncState.NOT_SYNCED) .equalTo("syncstate", SyncState.NOT_SYNCED)
...@@ -68,7 +70,8 @@ public class MethodCallObserver extends AbstractModelObserver<MethodCall> { ...@@ -68,7 +70,8 @@ public class MethodCallObserver extends AbstractModelObserver<MethodCall> {
return CheckSum.sha256(stringBuilder.toString()); return CheckSum.sha256(stringBuilder.toString());
} }
@Override public void onUpdateResults(List<MethodCall> results) { @Override
public void onUpdateResults(List<MethodCall> results) {
String digest = getDigestFor(results); String digest = getDigestFor(results);
if (prevDigest == null) { if (prevDigest == null) {
if (digest == null) { if (digest == null) {
......
package chat.rocket.android.service.observer; package chat.rocket.android.service.observer;
import android.content.Context; import android.content.Context;
import io.realm.Realm;
import io.realm.RealmResults;
import org.json.JSONObject;
import java.util.List;
import chat.rocket.android.api.DDPClientWraper; import chat.rocket.android.api.DDPClientWraper;
import chat.rocket.android.api.MethodCallHelper; import chat.rocket.android.api.MethodCallHelper;
import chat.rocket.android.helper.LogcatIfError; import chat.rocket.android.helper.LogcatIfError;
...@@ -8,10 +13,6 @@ import chat.rocket.android.log.RCLog; ...@@ -8,10 +13,6 @@ import chat.rocket.android.log.RCLog;
import chat.rocket.android.model.SyncState; import chat.rocket.android.model.SyncState;
import chat.rocket.android.model.ddp.Message; import chat.rocket.android.model.ddp.Message;
import chat.rocket.android.realm_helper.RealmHelper; import chat.rocket.android.realm_helper.RealmHelper;
import io.realm.Realm;
import io.realm.RealmResults;
import java.util.List;
import org.json.JSONObject;
/** /**
* Observe messages for sending. * Observe messages for sending.
...@@ -38,14 +39,16 @@ public class NewMessageObserver extends AbstractModelObserver<Message> { ...@@ -38,14 +39,16 @@ public class NewMessageObserver extends AbstractModelObserver<Message> {
}).continueWith(new LogcatIfError()); }).continueWith(new LogcatIfError());
} }
@Override public RealmResults<Message> queryItems(Realm realm) { @Override
public RealmResults<Message> queryItems(Realm realm) {
return realm.where(Message.class) return realm.where(Message.class)
.equalTo("syncstate", SyncState.NOT_SYNCED) .equalTo("syncstate", SyncState.NOT_SYNCED)
.isNotNull("rid") .isNotNull("rid")
.findAll(); .findAll();
} }
@Override public void onUpdateResults(List<Message> results) { @Override
public void onUpdateResults(List<Message> results) {
if (results.isEmpty()) { if (results.isEmpty()) {
return; return;
} }
......
...@@ -10,6 +10,10 @@ import android.support.annotation.Nullable; ...@@ -10,6 +10,10 @@ import android.support.annotation.Nullable;
import android.support.v4.app.NotificationCompat; import android.support.v4.app.NotificationCompat;
import android.support.v4.app.NotificationManagerCompat; import android.support.v4.app.NotificationManagerCompat;
import android.support.v4.content.ContextCompat; import android.support.v4.content.ContextCompat;
import io.realm.Realm;
import io.realm.RealmResults;
import java.util.List;
import bolts.Task; import bolts.Task;
import chat.rocket.android.R; import chat.rocket.android.R;
import chat.rocket.android.activity.MainActivity; import chat.rocket.android.activity.MainActivity;
...@@ -21,9 +25,6 @@ import chat.rocket.android.model.internal.NotificationItem; ...@@ -21,9 +25,6 @@ import chat.rocket.android.model.internal.NotificationItem;
import chat.rocket.android.realm_helper.RealmHelper; import chat.rocket.android.realm_helper.RealmHelper;
import chat.rocket.android.realm_helper.RealmStore; import chat.rocket.android.realm_helper.RealmStore;
import chat.rocket.android.service.notification.NotificationDismissalCallbackService; import chat.rocket.android.service.notification.NotificationDismissalCallbackService;
import io.realm.Realm;
import io.realm.RealmResults;
import java.util.List;
/** /**
* observes NotificationItem and notify/cancel notification. * observes NotificationItem and notify/cancel notification.
...@@ -34,11 +35,13 @@ public class NotificationItemObserver extends AbstractModelObserver<Notification ...@@ -34,11 +35,13 @@ public class NotificationItemObserver extends AbstractModelObserver<Notification
super(context, hostname, realmHelper, ddpClient); super(context, hostname, realmHelper, ddpClient);
} }
@Override public RealmResults<NotificationItem> queryItems(Realm realm) { @Override
public RealmResults<NotificationItem> queryItems(Realm realm) {
return realm.where(NotificationItem.class).findAll(); return realm.where(NotificationItem.class).findAll();
} }
@Override public void onUpdateResults(List<NotificationItem> results) { @Override
public void onUpdateResults(List<NotificationItem> results) {
if (results.isEmpty()) { if (results.isEmpty()) {
return; return;
} }
...@@ -114,7 +117,8 @@ public class NotificationItemObserver extends AbstractModelObserver<Notification ...@@ -114,7 +117,8 @@ public class NotificationItemObserver extends AbstractModelObserver<Notification
} }
private Notification generateNotification(String roomId, String title, private Notification generateNotification(String roomId, String title,
@NonNull String description, int unreadCount, @Nullable Bitmap icon) { @NonNull String description, int unreadCount,
@Nullable Bitmap icon) {
NotificationCompat.Builder builder = new NotificationCompat.Builder(context) NotificationCompat.Builder builder = new NotificationCompat.Builder(context)
.setContentTitle(title) .setContentTitle(title)
......
package chat.rocket.android.service.observer; package chat.rocket.android.service.observer;
import android.content.Context; import android.content.Context;
import io.realm.Realm;
import io.realm.RealmResults;
import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;
import java.util.List;
import chat.rocket.android.api.DDPClientWraper; import chat.rocket.android.api.DDPClientWraper;
import chat.rocket.android.helper.LogcatIfError; import chat.rocket.android.helper.LogcatIfError;
import chat.rocket.android.log.RCLog; import chat.rocket.android.log.RCLog;
import chat.rocket.android.model.ddp.RoomSubscription; import chat.rocket.android.model.ddp.RoomSubscription;
import chat.rocket.android.model.internal.NotificationItem; import chat.rocket.android.model.internal.NotificationItem;
import chat.rocket.android.realm_helper.RealmHelper; import chat.rocket.android.realm_helper.RealmHelper;
import io.realm.Realm;
import io.realm.RealmResults;
import java.util.List;
import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;
/** /**
* observing room subscriptions with unread>0. * observing room subscriptions with unread>0.
...@@ -23,13 +24,15 @@ public class ReactiveNotificationManager extends AbstractModelObserver<RoomSubsc ...@@ -23,13 +24,15 @@ public class ReactiveNotificationManager extends AbstractModelObserver<RoomSubsc
super(context, hostname, realmHelper, ddpClient); super(context, hostname, realmHelper, ddpClient);
} }
@Override public RealmResults<RoomSubscription> queryItems(Realm realm) { @Override
public RealmResults<RoomSubscription> queryItems(Realm realm) {
return realm.where(RoomSubscription.class) return realm.where(RoomSubscription.class)
.equalTo("open", true) .equalTo("open", true)
.findAll(); .findAll();
} }
@Override public void onUpdateResults(List<RoomSubscription> roomSubscriptions) { @Override
public void onUpdateResults(List<RoomSubscription> roomSubscriptions) {
JSONArray notifications = new JSONArray(); JSONArray notifications = new JSONArray();
for (RoomSubscription roomSubscription : roomSubscriptions) { for (RoomSubscription roomSubscription : roomSubscriptions) {
final String roomId = roomSubscription.getRid(); final String roomId = roomSubscription.getRid();
......
package chat.rocket.android.service.observer; package chat.rocket.android.service.observer;
import android.content.Context; import android.content.Context;
import io.realm.Realm;
import io.realm.RealmResults;
import java.util.List;
import chat.rocket.android.api.DDPClientWraper; import chat.rocket.android.api.DDPClientWraper;
import chat.rocket.android.api.MethodCallHelper; import chat.rocket.android.api.MethodCallHelper;
import chat.rocket.android.helper.LogcatIfError; import chat.rocket.android.helper.LogcatIfError;
...@@ -12,17 +16,13 @@ import chat.rocket.android.model.internal.Session; ...@@ -12,17 +16,13 @@ import chat.rocket.android.model.internal.Session;
import chat.rocket.android.realm_helper.RealmHelper; import chat.rocket.android.realm_helper.RealmHelper;
import chat.rocket.android.service.internal.StreamRoomMessageManager; import chat.rocket.android.service.internal.StreamRoomMessageManager;
import hugo.weaving.DebugLog; import hugo.weaving.DebugLog;
import io.realm.Realm;
import io.realm.RealmResults;
import java.util.List;
/** /**
* Observes user is logged into server. * Observes user is logged into server.
*/ */
public class SessionObserver extends AbstractModelObserver<Session> { public class SessionObserver extends AbstractModelObserver<Session> {
private int count;
private final StreamRoomMessageManager streamNotifyMessage; private final StreamRoomMessageManager streamNotifyMessage;
private int count;
/** /**
* constructor. * constructor.
...@@ -35,7 +35,8 @@ public class SessionObserver extends AbstractModelObserver<Session> { ...@@ -35,7 +35,8 @@ public class SessionObserver extends AbstractModelObserver<Session> {
streamNotifyMessage = new StreamRoomMessageManager(context, hostname, realmHelper, ddpClient); streamNotifyMessage = new StreamRoomMessageManager(context, hostname, realmHelper, ddpClient);
} }
@Override public RealmResults<Session> queryItems(Realm realm) { @Override
public RealmResults<Session> queryItems(Realm realm) {
return realm.where(Session.class) return realm.where(Session.class)
.isNotNull("token") .isNotNull("token")
.equalTo("tokenVerified", true) .equalTo("tokenVerified", true)
...@@ -43,7 +44,8 @@ public class SessionObserver extends AbstractModelObserver<Session> { ...@@ -43,7 +44,8 @@ public class SessionObserver extends AbstractModelObserver<Session> {
.findAll(); .findAll();
} }
@Override public void onUpdateResults(List<Session> results) { @Override
public void onUpdateResults(List<Session> results) {
int origCount = count; int origCount = count;
count = results.size(); count = results.size();
if (origCount > 0 && count > 0) { if (origCount > 0 && count > 0) {
...@@ -62,13 +64,15 @@ public class SessionObserver extends AbstractModelObserver<Session> { ...@@ -62,13 +64,15 @@ public class SessionObserver extends AbstractModelObserver<Session> {
} }
} }
@DebugLog private void onLogin() { @DebugLog
private void onLogin() {
streamNotifyMessage.register(); streamNotifyMessage.register();
new MethodCallHelper(realmHelper, ddpClient).getPublicSettings() new MethodCallHelper(realmHelper, ddpClient).getPublicSettings()
.continueWith(new LogcatIfError()); .continueWith(new LogcatIfError());
} }
@DebugLog private void onLogout() { @DebugLog
private void onLogout() {
streamNotifyMessage.unregister(); streamNotifyMessage.unregister();
realmHelper.executeTransaction(realm -> { realmHelper.executeTransaction(realm -> {
......
package chat.rocket.android.service.observer; package chat.rocket.android.service.observer;
import android.content.Context; import android.content.Context;
import io.realm.Realm;
import io.realm.RealmResults;
import java.util.List;
import chat.rocket.android.api.DDPClientWraper;
import chat.rocket.android.api.MethodCallHelper; import chat.rocket.android.api.MethodCallHelper;
import chat.rocket.android.helper.LogcatIfError; import chat.rocket.android.helper.LogcatIfError;
import chat.rocket.android.model.internal.Session; import chat.rocket.android.model.internal.Session;
import chat.rocket.android.realm_helper.RealmHelper; import chat.rocket.android.realm_helper.RealmHelper;
import chat.rocket.android.api.DDPClientWraper;
import io.realm.Realm;
import io.realm.RealmResults;
import java.util.List;
public class TokenLoginObserver extends AbstractModelObserver<Session> { public class TokenLoginObserver extends AbstractModelObserver<Session> {
...@@ -20,7 +21,8 @@ public class TokenLoginObserver extends AbstractModelObserver<Session> { ...@@ -20,7 +21,8 @@ public class TokenLoginObserver extends AbstractModelObserver<Session> {
methodCall = new MethodCallHelper(realmHelper, ddpClient); methodCall = new MethodCallHelper(realmHelper, ddpClient);
} }
@Override public RealmResults<Session> queryItems(Realm realm) { @Override
public RealmResults<Session> queryItems(Realm realm) {
return realm.where(Session.class) return realm.where(Session.class)
.isNotNull("token") .isNotNull("token")
.equalTo("tokenVerified", false) .equalTo("tokenVerified", false)
...@@ -28,7 +30,8 @@ public class TokenLoginObserver extends AbstractModelObserver<Session> { ...@@ -28,7 +30,8 @@ public class TokenLoginObserver extends AbstractModelObserver<Session> {
.findAll(); .findAll();
} }
@Override public void onUpdateResults(List<Session> results) { @Override
public void onUpdateResults(List<Session> results) {
if (results.isEmpty()) { if (results.isEmpty()) {
return; return;
} }
......
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
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