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;
} }
......
<vector android:height="24dp" android:viewportHeight="1792.0" <vector xmlns:android="http://schemas.android.com/apk/res/android"
android:viewportWidth="1792.0" android:width="24dp" xmlns:android="http://schemas.android.com/apk/res/android"> android:height="24dp"
<path android:fillColor="#FFFFFFFF" android:pathData="M1100,775q0,-108 -53.5,-169t-147.5,-61q-63,0 -124,30.5t-110,84.5 -79.5,137 -30.5,180q0,112 53.5,173t150.5,61q96,0 176,-66.5t122.5,-166 42.5,-203.5zM1664,896q0,111 -37,197t-98.5,135 -131.5,74.5 -145,27.5q-6,0 -15.5,0.5t-16.5,0.5q-95,0 -142,-53 -28,-33 -33,-83 -52,66 -131.5,110t-173.5,44q-161,0 -249.5,-95.5t-88.5,-269.5q0,-157 66,-290t179,-210.5 246,-77.5q87,0 155,35.5t106,99.5l2,-19 11,-56q1,-6 5.5,-12t9.5,-6h118q5,0 13,11 5,5 3,16l-120,614q-5,24 -5,48 0,39 12.5,52t44.5,13q28,-1 57,-5.5t73,-24 77,-50 57,-89.5 24,-137q0,-292 -174,-466t-466,-174q-130,0 -248.5,51t-204,136.5 -136.5,204 -51,248.5 51,248.5 136.5,204 204,136.5 248.5,51q228,0 405,-144 11,-9 24,-8t21,12l41,49q8,12 7,24 -2,13 -12,22 -102,83 -227.5,128t-258.5,45q-156,0 -298,-61t-245,-164 -164,-245 -61,-298 61,-298 164,-245 245,-164 298,-61q344,0 556,212t212,556z"/> android:viewportHeight="1792.0"
android:viewportWidth="1792.0"
android:width="24dp">
<path
android:fillColor="#FFFFFFFF"
android:pathData="M1100,775q0,-108 -53.5,-169t-147.5,-61q-63,0 -124,30.5t-110,84.5 -79.5,137 -30.5,180q0,112 53.5,173t150.5,61q96,0 176,-66.5t122.5,-166 42.5,-203.5zM1664,896q0,111 -37,197t-98.5,135 -131.5,74.5 -145,27.5q-6,0 -15.5,0.5t-16.5,0.5q-95,0 -142,-53 -28,-33 -33,-83 -52,66 -131.5,110t-173.5,44q-161,0 -249.5,-95.5t-88.5,-269.5q0,-157 66,-290t179,-210.5 246,-77.5q87,0 155,35.5t106,99.5l2,-19 11,-56q1,-6 5.5,-12t9.5,-6h118q5,0 13,11 5,5 3,16l-120,614q-5,24 -5,48 0,39 12.5,52t44.5,13q28,-1 57,-5.5t73,-24 77,-50 57,-89.5 24,-137q0,-292 -174,-466t-466,-174q-130,0 -248.5,51t-204,136.5 -136.5,204 -51,248.5 51,248.5 136.5,204 204,136.5 248.5,51q228,0 405,-144 11,-9 24,-8t21,12l41,49q8,12 7,24 -2,13 -12,22 -102,83 -227.5,128t-258.5,45q-156,0 -298,-61t-245,-164 -164,-245 -61,-298 61,-298 164,-245 245,-164 298,-61q344,0 556,212t212,556z"/>
</vector> </vector>
<vector android:alpha="0.78" android:height="24dp" <vector xmlns:android="http://schemas.android.com/apk/res/android"
android:viewportHeight="24.0" android:viewportWidth="24.0" android:alpha="0.78"
android:width="24dp" xmlns:android="http://schemas.android.com/apk/res/android"> android:height="24dp"
<path android:fillColor="#FF000000" android:pathData="M11,15h2v2h-2zM11,7h2v6h-2zM11.99,2C6.47,2 2,6.48 2,12s4.47,10 9.99,10C17.52,22 22,17.52 22,12S17.52,2 11.99,2zM12,20c-4.42,0 -8,-3.58 -8,-8s3.58,-8 8,-8 8,3.58 8,8 -3.58,8 -8,8z"/> android:viewportHeight="24.0"
android:viewportWidth="24.0"
android:width="24dp">
<path
android:fillColor="#FF000000"
android:pathData="M11,15h2v2h-2zM11,7h2v6h-2zM11.99,2C6.47,2 2,6.48 2,12s4.47,10 9.99,10C17.52,22 22,17.52 22,12S17.52,2 11.99,2zM12,20c-4.42,0 -8,-3.58 -8,-8s3.58,-8 8,-8 8,3.58 8,8 -3.58,8 -8,8z"/>
</vector> </vector>
<vector android:height="24dp" android:viewportHeight="1792.0" <vector xmlns:android="http://schemas.android.com/apk/res/android"
android:viewportWidth="1792.0" android:width="24dp" xmlns:android="http://schemas.android.com/apk/res/android"> android:height="24dp"
<path android:fillColor="#FFFFFFFF" android:pathData="M991,1024l64,-256h-254l-64,256h254zM1759,520l-56,224q-7,24 -31,24h-327l-64,256h311q15,0 25,12 10,14 6,28l-56,224q-5,24 -31,24h-327l-81,328q-7,24 -31,24h-224q-16,0 -26,-12 -9,-12 -6,-28l78,-312h-254l-81,328q-7,24 -31,24h-225q-15,0 -25,-12 -9,-12 -6,-28l78,-312h-311q-15,0 -25,-12 -9,-12 -6,-28l56,-224q7,-24 31,-24h327l64,-256h-311q-15,0 -25,-12 -10,-14 -6,-28l56,-224q5,-24 31,-24h327l81,-328q7,-24 32,-24h224q15,0 25,12 9,12 6,28l-78,312h254l81,-328q7,-24 32,-24h224q15,0 25,12 9,12 6,28l-78,312h311q15,0 25,12 9,12 6,28z"/> android:viewportHeight="1792.0"
android:viewportWidth="1792.0"
android:width="24dp">
<path
android:fillColor="#FFFFFFFF"
android:pathData="M991,1024l64,-256h-254l-64,256h254zM1759,520l-56,224q-7,24 -31,24h-327l-64,256h311q15,0 25,12 10,14 6,28l-56,224q-5,24 -31,24h-327l-81,328q-7,24 -31,24h-224q-16,0 -26,-12 -9,-12 -6,-28l78,-312h-254l-81,328q-7,24 -31,24h-225q-15,0 -25,-12 -9,-12 -6,-28l78,-312h-311q-15,0 -25,-12 -9,-12 -6,-28l56,-224q7,-24 31,-24h327l64,-256h-311q-15,0 -25,-12 -10,-14 -6,-28l56,-224q5,-24 31,-24h327l81,-328q7,-24 32,-24h224q15,0 25,12 9,12 6,28l-78,312h254l81,-328q7,-24 32,-24h224q15,0 25,12 9,12 6,28l-78,312h311q15,0 25,12 9,12 6,28z"/>
</vector> </vector>
<vector android:height="24dp" android:viewportHeight="1792.0" <vector xmlns:android="http://schemas.android.com/apk/res/android"
android:viewportWidth="1792.0" android:width="24dp" xmlns:android="http://schemas.android.com/apk/res/android"> android:height="24dp"
<path android:fillColor="#FFFFFFFF" android:pathData="M640,768h512v-192q0,-106 -75,-181t-181,-75 -181,75 -75,181v192zM1472,864v576q0,40 -28,68t-68,28h-960q-40,0 -68,-28t-28,-68v-576q0,-40 28,-68t68,-28h32v-192q0,-184 132,-316t316,-132 316,132 132,316v192h32q40,0 68,28t28,68z"/> android:viewportHeight="1792.0"
android:viewportWidth="1792.0"
android:width="24dp">
<path
android:fillColor="#FFFFFFFF"
android:pathData="M640,768h512v-192q0,-106 -75,-181t-181,-75 -181,75 -75,181v192zM1472,864v576q0,40 -28,68t-68,28h-960q-40,0 -68,-28t-28,-68v-576q0,-40 28,-68t68,-28h32v-192q0,-184 132,-316t316,-132 316,132 132,316v192h32q40,0 68,28t28,68z"/>
</vector> </vector>
...@@ -3,7 +3,7 @@ ...@@ -3,7 +3,7 @@
<item android:id="@android:id/background"> <item android:id="@android:id/background">
<shape> <shape>
<corners android:radius="2dp" /> <corners android:radius="2dp"/>
<solid android:color="#12000000"/> <solid android:color="#12000000"/>
</shape> </shape>
</item> </item>
...@@ -11,7 +11,7 @@ ...@@ -11,7 +11,7 @@
<item android:id="@android:id/secondaryProgress"> <item android:id="@android:id/secondaryProgress">
<clip> <clip>
<shape> <shape>
<corners android:radius="2dp" /> <corners android:radius="2dp"/>
<solid android:color="@color/colorAccent_a40"/> <solid android:color="@color/colorAccent_a40"/>
</shape> </shape>
</clip> </clip>
...@@ -20,7 +20,7 @@ ...@@ -20,7 +20,7 @@
<item android:id="@android:id/progress"> <item android:id="@android:id/progress">
<clip> <clip>
<shape> <shape>
<corners android:radius="2dp" /> <corners android:radius="2dp"/>
<solid android:color="@color/colorAccent"/> <solid android:color="@color/colorAccent"/>
</shape> </shape>
</clip> </clip>
......
<vector android:height="24dp" android:viewportHeight="48.0" <vector xmlns:android="http://schemas.android.com/apk/res/android"
android:viewportWidth="48.0" android:width="24dp" xmlns:android="http://schemas.android.com/apk/res/android"> android:height="24dp"
<path android:fillColor="#A3000000" android:viewportHeight="48.0"
android:viewportWidth="48.0"
android:width="24dp">
<path
android:fillColor="#A3000000"
android:pathData="M44.99,23.47C44.99,21.42 44.38,19.45 43.16,17.62C42.07,15.97 40.54,14.52 38.62,13.29C34.91,10.92 30.03,9.62 24.88,9.62C23.16,9.62 21.47,9.77 19.82,10.05C18.8,9.1 17.61,8.24 16.35,7.57C9.6,4.3 4,7.49 4,7.49C4,7.49 9.21,11.76 8.36,15.49C6.03,17.8 4.77,20.58 4.77,23.47C4.77,23.48 4.77,23.49 4.77,23.5C4.77,23.51 4.77,23.51 4.77,23.52C4.77,26.42 6.03,29.2 8.36,31.5C9.21,35.24 4,39.5 4,39.5C4,39.5 9.6,42.69 16.35,39.43C17.61,38.75 18.8,37.89 19.82,36.94C21.47,37.23 23.16,37.37 24.88,37.37C30.03,37.37 34.91,36.07 38.62,33.7C40.54,32.48 42.07,31.02 43.16,29.38C44.38,27.55 44.99,25.58 44.99,23.53C44.99,23.52 44.99,23.51 44.99,23.5L44.99,23.47ZM24.88,12.53C34.41,12.53 42.14,17.45 42.14,23.52C42.14,29.6 34.41,34.52 24.88,34.52C22.76,34.52 20.73,34.28 18.85,33.83C16.94,36.12 12.74,39.31 8.67,38.28C9.99,36.86 11.96,34.45 11.54,30.5C9.09,28.6 7.63,26.17 7.63,23.52C7.63,17.45 15.35,12.53 24.88,12.53Z" android:pathData="M44.99,23.47C44.99,21.42 44.38,19.45 43.16,17.62C42.07,15.97 40.54,14.52 38.62,13.29C34.91,10.92 30.03,9.62 24.88,9.62C23.16,9.62 21.47,9.77 19.82,10.05C18.8,9.1 17.61,8.24 16.35,7.57C9.6,4.3 4,7.49 4,7.49C4,7.49 9.21,11.76 8.36,15.49C6.03,17.8 4.77,20.58 4.77,23.47C4.77,23.48 4.77,23.49 4.77,23.5C4.77,23.51 4.77,23.51 4.77,23.52C4.77,26.42 6.03,29.2 8.36,31.5C9.21,35.24 4,39.5 4,39.5C4,39.5 9.6,42.69 16.35,39.43C17.61,38.75 18.8,37.89 19.82,36.94C21.47,37.23 23.16,37.37 24.88,37.37C30.03,37.37 34.91,36.07 38.62,33.7C40.54,32.48 42.07,31.02 43.16,29.38C44.38,27.55 44.99,25.58 44.99,23.53C44.99,23.52 44.99,23.51 44.99,23.5L44.99,23.47ZM24.88,12.53C34.41,12.53 42.14,17.45 42.14,23.52C42.14,29.6 34.41,34.52 24.88,34.52C22.76,34.52 20.73,34.28 18.85,33.83C16.94,36.12 12.74,39.31 8.67,38.28C9.99,36.86 11.96,34.45 11.54,30.5C9.09,28.6 7.63,26.17 7.63,23.52C7.63,17.45 15.35,12.53 24.88,12.53Z"
android:strokeColor="#00000000" android:strokeWidth="1"/> android:strokeColor="#00000000"
<path android:fillColor="#A3000000" android:strokeWidth="1"/>
<path
android:fillColor="#A3000000"
android:pathData="M24.88,26.17C26.15,26.17 27.17,25.14 27.17,23.88C27.17,22.61 26.15,21.59 24.88,21.59C23.62,21.59 22.59,22.61 22.59,23.88C22.59,25.14 23.62,26.17 24.88,26.17ZM32.85,26.17C34.12,26.17 35.14,25.14 35.14,23.88C35.14,22.61 34.12,21.59 32.85,21.59C31.59,21.59 30.56,22.61 30.56,23.88C30.56,25.14 31.59,26.17 32.85,26.17ZM16.91,26.17C18.18,26.17 19.2,25.14 19.2,23.88C19.2,22.62 18.18,21.59 16.91,21.59C15.65,21.59 14.62,22.62 14.62,23.88C14.62,25.14 15.65,26.17 16.91,26.17L16.91,26.17Z" android:pathData="M24.88,26.17C26.15,26.17 27.17,25.14 27.17,23.88C27.17,22.61 26.15,21.59 24.88,21.59C23.62,21.59 22.59,22.61 22.59,23.88C22.59,25.14 23.62,26.17 24.88,26.17ZM32.85,26.17C34.12,26.17 35.14,25.14 35.14,23.88C35.14,22.61 34.12,21.59 32.85,21.59C31.59,21.59 30.56,22.61 30.56,23.88C30.56,25.14 31.59,26.17 32.85,26.17ZM16.91,26.17C18.18,26.17 19.2,25.14 19.2,23.88C19.2,22.62 18.18,21.59 16.91,21.59C15.65,21.59 14.62,22.62 14.62,23.88C14.62,25.14 15.65,26.17 16.91,26.17L16.91,26.17Z"
android:strokeColor="#00000000" android:strokeWidth="1"/> android:strokeColor="#00000000"
<path android:fillColor="#33000000" android:strokeWidth="1"/>
<path
android:fillColor="#33000000"
android:pathData="M24.88,33.08C22.76,33.08 20.73,32.86 18.85,32.48C17.17,34.23 13.69,36.59 10.1,36.5C9.62,37.22 9.11,37.8 8.67,38.28C12.74,39.31 16.94,36.12 18.85,33.83C20.73,34.28 22.76,34.52 24.88,34.52C34.34,34.52 42.01,29.68 42.13,23.67C42.01,28.88 34.34,33.08 24.88,33.08L24.88,33.08Z" android:pathData="M24.88,33.08C22.76,33.08 20.73,32.86 18.85,32.48C17.17,34.23 13.69,36.59 10.1,36.5C9.62,37.22 9.11,37.8 8.67,38.28C12.74,39.31 16.94,36.12 18.85,33.83C20.73,34.28 22.76,34.52 24.88,34.52C34.34,34.52 42.01,29.68 42.13,23.67C42.01,28.88 34.34,33.08 24.88,33.08L24.88,33.08Z"
android:strokeColor="#00000000" android:strokeWidth="1"/> android:strokeColor="#00000000"
android:strokeWidth="1"/>
</vector> </vector>
<?xml version="1.0" encoding="utf-8"?> <?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android" <shape xmlns:android="http://schemas.android.com/apk/res/android"
android:shape="oval"> android:shape="oval">
<solid android:color="@color/userstatus_away" /> <solid android:color="@color/userstatus_away"/>
<stroke <stroke
android:width="1dp" android:width="1dp"
android:color="@color/userstatus_away_outline" /> android:color="@color/userstatus_away_outline"/>
<size <size
android:width="16dp" android:width="16dp"
android:height="16dp" /> android:height="16dp"/>
</shape> </shape>
<?xml version="1.0" encoding="utf-8"?> <?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android" <shape xmlns:android="http://schemas.android.com/apk/res/android"
android:shape="oval"> android:shape="oval">
<solid android:color="@color/userstatus_busy" /> <solid android:color="@color/userstatus_busy"/>
<stroke <stroke
android:width="1dp" android:width="1dp"
android:color="@color/userstatus_busy_outline" /> android:color="@color/userstatus_busy_outline"/>
<size <size
android:width="16dp" android:width="16dp"
android:height="16dp" /> android:height="16dp"/>
</shape> </shape>
<?xml version="1.0" encoding="utf-8"?> <?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android" <shape xmlns:android="http://schemas.android.com/apk/res/android"
android:shape="oval"> android:shape="oval">
<solid android:color="@color/userstatus_offline" /> <solid android:color="@color/userstatus_offline"/>
<stroke <stroke
android:width="1dp" android:width="1dp"
android:color="@color/userstatus_offline_outline" /> android:color="@color/userstatus_offline_outline"/>
<size <size
android:width="16dp" android:width="16dp"
android:height="16dp" /> android:height="16dp"/>
</shape> </shape>
<?xml version="1.0" encoding="utf-8"?> <?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android" <shape xmlns:android="http://schemas.android.com/apk/res/android"
android:shape="oval"> android:shape="oval">
<solid android:color="@color/userstatus_online" /> <solid android:color="@color/userstatus_online"/>
<stroke <stroke
android:width="1dp" android:width="1dp"
android:color="@color/userstatus_online_outline" /> android:color="@color/userstatus_online_outline"/>
<size <size
android:width="16dp" android:width="16dp"
android:height="16dp" /> android:height="16dp"/>
</shape> </shape>
...@@ -2,24 +2,28 @@ ...@@ -2,24 +2,28 @@
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto" xmlns:app="http://schemas.android.com/apk/res-auto"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="match_parent"> android:layout_height="match_parent"
>
<include layout="@layout/sidebar" /> <include layout="@layout/sidebar"/>
<android.support.design.widget.CoordinatorLayout <android.support.design.widget.CoordinatorLayout
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="match_parent"> android:layout_height="match_parent"
>
<android.support.design.widget.AppBarLayout <android.support.design.widget.AppBarLayout
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="wrap_content"> android:layout_height="wrap_content"
>
<android.support.v7.widget.Toolbar <android.support.v7.widget.Toolbar
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:theme="@style/ThemeOverlay.AppCompat.Dark.ActionBar" android:theme="@style/ThemeOverlay.AppCompat.Dark.ActionBar"
app:popupTheme="@style/ThemeOverlay.AppCompat.Light" app:popupTheme="@style/ThemeOverlay.AppCompat.Light"
app:title="@string/app_name" /> app:title="@string/app_name"
/>
</android.support.design.widget.AppBarLayout> </android.support.design.widget.AppBarLayout>
<FrameLayout <FrameLayout
...@@ -27,7 +31,8 @@ ...@@ -27,7 +31,8 @@
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="match_parent" android:layout_height="match_parent"
android:background="@color/white" android:background="@color/white"
app:layout_behavior="@string/appbar_scrolling_view_behavior" /> app:layout_behavior="@string/appbar_scrolling_view_behavior"
/>
</android.support.design.widget.CoordinatorLayout> </android.support.design.widget.CoordinatorLayout>
</LinearLayout> </LinearLayout>
\ No newline at end of file
...@@ -2,9 +2,10 @@ ...@@ -2,9 +2,10 @@
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="match_parent" android:layout_height="match_parent"
android:orientation="horizontal"> android:orientation="horizontal"
>
<include layout="@layout/fragment_room_main" /> <include layout="@layout/fragment_room_main"/>
<include layout="@layout/room_side_menu" /> <include layout="@layout/room_side_menu"/>
</LinearLayout> </LinearLayout>
\ No newline at end of file
...@@ -3,17 +3,20 @@ ...@@ -3,17 +3,20 @@
xmlns:app="http://schemas.android.com/apk/res-auto" xmlns:app="http://schemas.android.com/apk/res-auto"
android:id="@+id/sliding_pane" android:id="@+id/sliding_pane"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="match_parent"> android:layout_height="match_parent"
>
<include layout="@layout/sidebar" /> <include layout="@layout/sidebar"/>
<android.support.design.widget.CoordinatorLayout <android.support.design.widget.CoordinatorLayout
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="match_parent"> android:layout_height="match_parent"
>
<android.support.design.widget.AppBarLayout <android.support.design.widget.AppBarLayout
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="wrap_content"> android:layout_height="wrap_content"
>
<android.support.v7.widget.Toolbar <android.support.v7.widget.Toolbar
android:id="@+id/activity_main_toolbar" android:id="@+id/activity_main_toolbar"
...@@ -21,7 +24,8 @@ ...@@ -21,7 +24,8 @@
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:theme="@style/ThemeOverlay.AppCompat.Dark.ActionBar" android:theme="@style/ThemeOverlay.AppCompat.Dark.ActionBar"
app:popupTheme="@style/ThemeOverlay.AppCompat.Light" app:popupTheme="@style/ThemeOverlay.AppCompat.Light"
app:title="@string/app_name" /> app:title="@string/app_name"
/>
</android.support.design.widget.AppBarLayout> </android.support.design.widget.AppBarLayout>
<FrameLayout <FrameLayout
...@@ -30,7 +34,8 @@ ...@@ -30,7 +34,8 @@
android:layout_height="match_parent" android:layout_height="match_parent"
android:background="@color/white" android:background="@color/white"
android:clickable="true" android:clickable="true"
app:layout_behavior="@string/appbar_scrolling_view_behavior" /> app:layout_behavior="@string/appbar_scrolling_view_behavior"
/>
</android.support.design.widget.CoordinatorLayout> </android.support.design.widget.CoordinatorLayout>
</android.support.v4.widget.SlidingPaneLayout> </android.support.v4.widget.SlidingPaneLayout>
\ No newline at end of file
...@@ -58,7 +58,8 @@ ...@@ -58,7 +58,8 @@
android:layout_gravity="end|bottom" android:layout_gravity="end|bottom"
app:elevation="2dp" app:elevation="2dp"
app:fabSize="mini" app:fabSize="mini"
app:srcCompat="@drawable/ic_arrow_forward_white_24dp" /> app:srcCompat="@drawable/ic_arrow_forward_white_24dp"
/>
<chat.rocket.android.widget.WaitingView <chat.rocket.android.widget.WaitingView
android:id="@+id/waiting" android:id="@+id/waiting"
...@@ -67,6 +68,7 @@ ...@@ -67,6 +68,7 @@
android:layout_gravity="center" android:layout_gravity="center"
android:visibility="gone" android:visibility="gone"
app:dotCount="5" app:dotCount="5"
app:dotSize="12dp" /> app:dotSize="12dp"
/>
</LinearLayout> </LinearLayout>
\ No newline at end of file
...@@ -33,7 +33,8 @@ ...@@ -33,7 +33,8 @@
android:layout_gravity="end|bottom" android:layout_gravity="end|bottom"
app:elevation="2dp" app:elevation="2dp"
app:fabSize="mini" app:fabSize="mini"
app:srcCompat="@drawable/ic_arrow_forward_white_24dp" /> app:srcCompat="@drawable/ic_arrow_forward_white_24dp"
/>
<chat.rocket.android.widget.WaitingView <chat.rocket.android.widget.WaitingView
android:id="@+id/waiting" android:id="@+id/waiting"
...@@ -42,6 +43,7 @@ ...@@ -42,6 +43,7 @@
android:layout_gravity="center" android:layout_gravity="center"
android:visibility="gone" android:visibility="gone"
app:dotCount="5" app:dotCount="5"
app:dotSize="12dp" /> app:dotSize="12dp"
/>
</LinearLayout> </LinearLayout>
\ No newline at end of file
...@@ -12,14 +12,16 @@ ...@@ -12,14 +12,16 @@
<FrameLayout <FrameLayout
android:id="@+id/room_user_titlebar" android:id="@+id/room_user_titlebar"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="?attr/actionBarSize"> android:layout_height="?attr/actionBarSize"
>
<TextView <TextView
android:layout_width="wrap_content" android:layout_width="wrap_content"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:layout_gravity="start|center_vertical" android:layout_gravity="start|center_vertical"
android:text="@string/file_uploading_title" android:text="@string/file_uploading_title"
android:textAppearance="@style/TextAppearance.AppCompat.Title" /> android:textAppearance="@style/TextAppearance.AppCompat.Title"
/>
</FrameLayout> </FrameLayout>
......
...@@ -5,12 +5,14 @@ ...@@ -5,12 +5,14 @@
android:layout_height="match_parent" android:layout_height="match_parent"
android:minWidth="288dp" android:minWidth="288dp"
android:orientation="vertical" android:orientation="vertical"
android:padding="@dimen/margin_24"> android:padding="@dimen/margin_24"
>
<android.support.design.widget.TextInputLayout <android.support.design.widget.TextInputLayout
android:id="@+id/text_input_email" android:id="@+id/text_input_email"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="wrap_content"> android:layout_height="wrap_content"
>
<android.support.design.widget.TextInputEditText <android.support.design.widget.TextInputEditText
android:id="@+id/editor_email" android:id="@+id/editor_email"
...@@ -19,17 +21,20 @@ ...@@ -19,17 +21,20 @@
android:hint="@string/dialog_user_registration_email" android:hint="@string/dialog_user_registration_email"
android:imeOptions="actionNext" android:imeOptions="actionNext"
android:inputType="textWebEmailAddress" android:inputType="textWebEmailAddress"
android:singleLine="true" /> android:singleLine="true"
/>
</android.support.design.widget.TextInputLayout> </android.support.design.widget.TextInputLayout>
<Space <Space
android:layout_width="wrap_content" android:layout_width="wrap_content"
android:layout_height="@dimen/margin_8" /> android:layout_height="@dimen/margin_8"
/>
<android.support.design.widget.TextInputLayout <android.support.design.widget.TextInputLayout
android:id="@+id/text_input_username" android:id="@+id/text_input_username"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="wrap_content"> android:layout_height="wrap_content"
>
<android.support.design.widget.TextInputEditText <android.support.design.widget.TextInputEditText
android:id="@+id/editor_username" android:id="@+id/editor_username"
...@@ -38,18 +43,21 @@ ...@@ -38,18 +43,21 @@
android:hint="@string/dialog_user_registration_username" android:hint="@string/dialog_user_registration_username"
android:imeOptions="actionNext" android:imeOptions="actionNext"
android:inputType="textWebEmailAddress" android:inputType="textWebEmailAddress"
android:singleLine="true" /> android:singleLine="true"
/>
</android.support.design.widget.TextInputLayout> </android.support.design.widget.TextInputLayout>
<Space <Space
android:layout_width="wrap_content" android:layout_width="wrap_content"
android:layout_height="@dimen/margin_8" /> android:layout_height="@dimen/margin_8"
/>
<android.support.design.widget.TextInputLayout <android.support.design.widget.TextInputLayout
android:id="@+id/text_input_passwd" android:id="@+id/text_input_passwd"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="wrap_content" android:layout_height="wrap_content"
app:passwordToggleEnabled="true"> app:passwordToggleEnabled="true"
>
<android.support.design.widget.TextInputEditText <android.support.design.widget.TextInputEditText
android:id="@+id/editor_passwd" android:id="@+id/editor_passwd"
...@@ -58,12 +66,14 @@ ...@@ -58,12 +66,14 @@
android:hint="@string/dialog_user_registration_password" android:hint="@string/dialog_user_registration_password"
android:imeOptions="actionNext" android:imeOptions="actionNext"
android:inputType="textWebPassword" android:inputType="textWebPassword"
android:singleLine="true" /> android:singleLine="true"
/>
</android.support.design.widget.TextInputLayout> </android.support.design.widget.TextInputLayout>
<Space <Space
android:layout_width="wrap_content" android:layout_width="wrap_content"
android:layout_height="@dimen/margin_16" /> android:layout_height="@dimen/margin_16"
/>
<android.support.design.widget.FloatingActionButton <android.support.design.widget.FloatingActionButton
android:id="@+id/btn_register_user" android:id="@+id/btn_register_user"
...@@ -72,7 +82,8 @@ ...@@ -72,7 +82,8 @@
android:layout_gravity="end|bottom" android:layout_gravity="end|bottom"
app:elevation="2dp" app:elevation="2dp"
app:fabSize="mini" app:fabSize="mini"
app:srcCompat="@drawable/ic_arrow_forward_white_24dp" /> app:srcCompat="@drawable/ic_arrow_forward_white_24dp"
/>
<chat.rocket.android.widget.WaitingView <chat.rocket.android.widget.WaitingView
android:id="@+id/waiting" android:id="@+id/waiting"
...@@ -80,6 +91,7 @@ ...@@ -80,6 +91,7 @@
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:layout_gravity="center" android:layout_gravity="center"
app:dotCount="5" app:dotCount="5"
app:dotSize="12dp" /> app:dotSize="12dp"
/>
</LinearLayout> </LinearLayout>
\ No newline at end of file
<?xml version="1.0" encoding="utf-8"?> <?xml version="1.0" encoding="utf-8"?>
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android" <FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="match_parent"> android:layout_height="match_parent"
>
<LinearLayout <LinearLayout
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="match_parent" android:layout_height="match_parent"
android:orientation="vertical"> android:orientation="vertical"
>
<FrameLayout <FrameLayout
android:id="@+id/room_user_titlebar" android:id="@+id/room_user_titlebar"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="?attr/actionBarSize" android:layout_height="?attr/actionBarSize"
android:paddingRight="@dimen/margin_16" android:paddingRight="@dimen/margin_16"
android:paddingStart="@dimen/margin_16"> android:paddingStart="@dimen/margin_16"
>
<TextView <TextView
android:layout_width="wrap_content" android:layout_width="wrap_content"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:layout_gravity="start|center_vertical" android:layout_gravity="start|center_vertical"
android:text="@string/users_of_room_title" android:text="@string/users_of_room_title"
android:textAppearance="@style/TextAppearance.AppCompat.Title" /> android:textAppearance="@style/TextAppearance.AppCompat.Title"
/>
<TextView <TextView
android:id="@+id/room_user_count" android:id="@+id/room_user_count"
android:layout_width="wrap_content" android:layout_width="wrap_content"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:layout_gravity="end|center_vertical" android:layout_gravity="end|center_vertical"
android:textAppearance="@style/TextAppearance.AppCompat.Small" /> android:textAppearance="@style/TextAppearance.AppCompat.Small"
/>
</FrameLayout> </FrameLayout>
<android.support.v7.widget.RecyclerView <android.support.v7.widget.RecyclerView
android:id="@+id/recyclerview" android:id="@+id/recyclerview"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="match_parent" android:layout_height="match_parent"
android:orientation="vertical" /> android:orientation="vertical"
/>
</LinearLayout> </LinearLayout>
...@@ -42,6 +48,7 @@ ...@@ -42,6 +48,7 @@
android:id="@+id/waiting" android:id="@+id/waiting"
android:layout_width="wrap_content" android:layout_width="wrap_content"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:layout_gravity="center" /> android:layout_gravity="center"
/>
</FrameLayout> </FrameLayout>
\ No newline at end of file
...@@ -5,23 +5,27 @@ ...@@ -5,23 +5,27 @@
android:gravity="center" android:gravity="center"
android:minWidth="288dp" android:minWidth="288dp"
android:orientation="vertical" android:orientation="vertical"
android:padding="@dimen/margin_24"> android:padding="@dimen/margin_24"
>
<ImageView <ImageView
android:layout_width="80dp" android:layout_width="80dp"
android:layout_height="80dp" android:layout_height="80dp"
android:layout_marginBottom="@dimen/margin_24" android:layout_marginBottom="@dimen/margin_24"
android:scaleType="fitCenter" android:scaleType="fitCenter"
android:src="@mipmap/ic_launcher" /> android:src="@mipmap/ic_launcher"
/>
<chat.rocket.android.widget.WaitingView <chat.rocket.android.widget.WaitingView
android:layout_width="wrap_content" android:layout_width="wrap_content"
android:layout_height="wrap_content" /> android:layout_height="wrap_content"
/>
<TextView <TextView
android:id="@+id/txt_caption" android:id="@+id/txt_caption"
android:layout_width="wrap_content" android:layout_width="wrap_content"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:layout_marginTop="@dimen/margin_16" android:layout_marginTop="@dimen/margin_16"
android:textAppearance="@style/TextAppearance.AppCompat.Caption" /> android:textAppearance="@style/TextAppearance.AppCompat.Caption"
/>
</LinearLayout> </LinearLayout>
\ No newline at end of file
...@@ -5,7 +5,8 @@ ...@@ -5,7 +5,8 @@
android:gravity="center" android:gravity="center"
android:orientation="vertical" android:orientation="vertical"
android:padding="@dimen/margin_16" android:padding="@dimen/margin_16"
android:theme="@style/Theme.AppCompat.Light"> android:theme="@style/Theme.AppCompat.Light"
>
<TextView <TextView
android:layout_width="match_parent" android:layout_width="match_parent"
...@@ -13,10 +14,12 @@ ...@@ -13,10 +14,12 @@
android:layout_marginBottom="@dimen/margin_16" android:layout_marginBottom="@dimen/margin_16"
android:gravity="center" android:gravity="center"
android:text="@string/fragment_home_welcome_message" android:text="@string/fragment_home_welcome_message"
android:textSize="14sp" /> android:textSize="14sp"
/>
<ImageView <ImageView
android:layout_width="wrap_content" android:layout_width="wrap_content"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:src="@mipmap/ic_launcher" /> android:src="@mipmap/ic_launcher"
/>
</LinearLayout> </LinearLayout>
\ No newline at end of file
...@@ -3,7 +3,8 @@ ...@@ -3,7 +3,8 @@
xmlns:app="http://schemas.android.com/apk/res-auto" xmlns:app="http://schemas.android.com/apk/res-auto"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="match_parent" android:layout_height="match_parent"
android:background="?attr/colorPrimaryDark"> android:background="?attr/colorPrimaryDark"
>
<LinearLayout <LinearLayout
android:layout_width="wrap_content" android:layout_width="wrap_content"
...@@ -12,19 +13,22 @@ ...@@ -12,19 +13,22 @@
android:background="@color/white" android:background="@color/white"
android:minWidth="288dp" android:minWidth="288dp"
android:orientation="horizontal" android:orientation="horizontal"
android:padding="@dimen/margin_24"> android:padding="@dimen/margin_24"
>
<LinearLayout <LinearLayout
android:layout_width="0px" android:layout_width="0px"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:layout_weight="1" android:layout_weight="1"
android:orientation="vertical"> android:orientation="vertical"
>
<TextView <TextView
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:text="@string/fragment_input_hostname_hostname" android:text="@string/fragment_input_hostname_hostname"
android:textAppearance="@style/TextAppearance.AppCompat.Caption" /> android:textAppearance="@style/TextAppearance.AppCompat.Caption"
/>
<EditText <EditText
android:id="@+id/editor_hostname" android:id="@+id/editor_hostname"
...@@ -33,12 +37,14 @@ ...@@ -33,12 +37,14 @@
android:hint="@string/fragment_input_hostname_server_hint" android:hint="@string/fragment_input_hostname_server_hint"
android:imeOptions="actionGo" android:imeOptions="actionGo"
android:inputType="textWebEditText" android:inputType="textWebEditText"
android:singleLine="true" /> android:singleLine="true"
/>
</LinearLayout> </LinearLayout>
<Space <Space
android:layout_width="@dimen/margin_8" android:layout_width="@dimen/margin_8"
android:layout_height="wrap_content" /> android:layout_height="wrap_content"
/>
<android.support.design.widget.FloatingActionButton <android.support.design.widget.FloatingActionButton
android:id="@+id/btn_connect" android:id="@+id/btn_connect"
...@@ -47,6 +53,7 @@ ...@@ -47,6 +53,7 @@
android:layout_gravity="end|bottom" android:layout_gravity="end|bottom"
app:elevation="2dp" app:elevation="2dp"
app:fabSize="mini" app:fabSize="mini"
app:srcCompat="@drawable/ic_arrow_forward_white_24dp" /> app:srcCompat="@drawable/ic_arrow_forward_white_24dp"
/>
</LinearLayout> </LinearLayout>
</FrameLayout> </FrameLayout>
\ No newline at end of file
...@@ -3,7 +3,8 @@ ...@@ -3,7 +3,8 @@
xmlns:app="http://schemas.android.com/apk/res-auto" xmlns:app="http://schemas.android.com/apk/res-auto"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="match_parent" android:layout_height="match_parent"
android:background="?attr/colorPrimaryDark"> android:background="?attr/colorPrimaryDark"
>
<LinearLayout <LinearLayout
android:layout_width="wrap_content" android:layout_width="wrap_content"
...@@ -12,12 +13,14 @@ ...@@ -12,12 +13,14 @@
android:background="@color/white" android:background="@color/white"
android:minWidth="288dp" android:minWidth="288dp"
android:orientation="vertical" android:orientation="vertical"
android:padding="@dimen/margin_24"> android:padding="@dimen/margin_24"
>
<LinearLayout <LinearLayout
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:orientation="horizontal"> android:orientation="horizontal"
>
<chat.rocket.android.widget.FontAwesomeButton <chat.rocket.android.widget.FontAwesomeButton
android:id="@+id/btn_login_with_twitter" android:id="@+id/btn_login_with_twitter"
...@@ -25,7 +28,8 @@ ...@@ -25,7 +28,8 @@
android:layout_height="48dp" android:layout_height="48dp"
android:layout_marginEnd="@dimen/margin_8" android:layout_marginEnd="@dimen/margin_8"
android:text="@string/fa_twitter" android:text="@string/fa_twitter"
android:textSize="16dp" /> android:textSize="16dp"
/>
<chat.rocket.android.widget.FontAwesomeButton <chat.rocket.android.widget.FontAwesomeButton
android:id="@+id/btn_login_with_facebook" android:id="@+id/btn_login_with_facebook"
...@@ -33,7 +37,8 @@ ...@@ -33,7 +37,8 @@
android:layout_height="48dp" android:layout_height="48dp"
android:layout_marginEnd="@dimen/margin_8" android:layout_marginEnd="@dimen/margin_8"
android:text="@string/fa_facebook_official" android:text="@string/fa_facebook_official"
android:textSize="16dp" /> android:textSize="16dp"
/>
<chat.rocket.android.widget.FontAwesomeButton <chat.rocket.android.widget.FontAwesomeButton
android:id="@+id/btn_login_with_github" android:id="@+id/btn_login_with_github"
...@@ -41,7 +46,8 @@ ...@@ -41,7 +46,8 @@
android:layout_height="48dp" android:layout_height="48dp"
android:layout_marginEnd="@dimen/margin_8" android:layout_marginEnd="@dimen/margin_8"
android:text="@string/fa_github" android:text="@string/fa_github"
android:textSize="16dp" /> android:textSize="16dp"
/>
<chat.rocket.android.widget.FontAwesomeButton <chat.rocket.android.widget.FontAwesomeButton
android:id="@+id/btn_login_with_google" android:id="@+id/btn_login_with_google"
...@@ -49,14 +55,16 @@ ...@@ -49,14 +55,16 @@
android:layout_height="48dp" android:layout_height="48dp"
android:layout_marginEnd="@dimen/margin_8" android:layout_marginEnd="@dimen/margin_8"
android:text="@string/fa_google" android:text="@string/fa_google"
android:textSize="16dp" /> android:textSize="16dp"
/>
</LinearLayout> </LinearLayout>
<android.support.design.widget.TextInputLayout <android.support.design.widget.TextInputLayout
android:id="@+id/text_input_username" android:id="@+id/text_input_username"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="wrap_content"> android:layout_height="wrap_content"
>
<android.support.design.widget.TextInputEditText <android.support.design.widget.TextInputEditText
android:id="@+id/editor_username" android:id="@+id/editor_username"
...@@ -65,18 +73,21 @@ ...@@ -65,18 +73,21 @@
android:hint="@string/fragment_login_username_or_email" android:hint="@string/fragment_login_username_or_email"
android:imeOptions="actionNext" android:imeOptions="actionNext"
android:inputType="textWebEmailAddress" android:inputType="textWebEmailAddress"
android:singleLine="true" /> android:singleLine="true"
/>
</android.support.design.widget.TextInputLayout> </android.support.design.widget.TextInputLayout>
<Space <Space
android:layout_width="wrap_content" android:layout_width="wrap_content"
android:layout_height="@dimen/margin_8" /> android:layout_height="@dimen/margin_8"
/>
<android.support.design.widget.TextInputLayout <android.support.design.widget.TextInputLayout
android:id="@+id/text_input_passwd" android:id="@+id/text_input_passwd"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="wrap_content" android:layout_height="wrap_content"
app:passwordToggleEnabled="true"> app:passwordToggleEnabled="true"
>
<android.support.design.widget.TextInputEditText <android.support.design.widget.TextInputEditText
android:id="@+id/editor_passwd" android:id="@+id/editor_passwd"
...@@ -85,17 +96,20 @@ ...@@ -85,17 +96,20 @@
android:hint="@string/fragment_login_password" android:hint="@string/fragment_login_password"
android:imeOptions="actionNext" android:imeOptions="actionNext"
android:inputType="textWebPassword" android:inputType="textWebPassword"
android:singleLine="true" /> android:singleLine="true"
/>
</android.support.design.widget.TextInputLayout> </android.support.design.widget.TextInputLayout>
<Space <Space
android:layout_width="wrap_content" android:layout_width="wrap_content"
android:layout_height="@dimen/margin_16" /> android:layout_height="@dimen/margin_16"
/>
<FrameLayout <FrameLayout
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:orientation="horizontal"> android:orientation="horizontal"
>
<android.support.design.widget.FloatingActionButton <android.support.design.widget.FloatingActionButton
android:id="@+id/btn_user_registration" android:id="@+id/btn_user_registration"
...@@ -105,7 +119,8 @@ ...@@ -105,7 +119,8 @@
app:backgroundTint="@color/white" app:backgroundTint="@color/white"
app:elevation="2dp" app:elevation="2dp"
app:fabSize="mini" app:fabSize="mini"
app:srcCompat="@drawable/ic_user_registration_blue_24dp" /> app:srcCompat="@drawable/ic_user_registration_blue_24dp"
/>
<android.support.design.widget.FloatingActionButton <android.support.design.widget.FloatingActionButton
android:id="@+id/btn_login_with_email" android:id="@+id/btn_login_with_email"
...@@ -114,7 +129,8 @@ ...@@ -114,7 +129,8 @@
android:layout_gravity="end|bottom" android:layout_gravity="end|bottom"
app:elevation="2dp" app:elevation="2dp"
app:fabSize="normal" app:fabSize="normal"
app:srcCompat="@drawable/ic_arrow_forward_white_24dp" /> app:srcCompat="@drawable/ic_arrow_forward_white_24dp"
/>
</FrameLayout> </FrameLayout>
</LinearLayout> </LinearLayout>
</FrameLayout> </FrameLayout>
\ No newline at end of file
...@@ -3,7 +3,8 @@ ...@@ -3,7 +3,8 @@
xmlns:app="http://schemas.android.com/apk/res-auto" xmlns:app="http://schemas.android.com/apk/res-auto"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="match_parent" android:layout_height="match_parent"
android:background="?attr/colorPrimaryDark"> android:background="?attr/colorPrimaryDark"
>
<LinearLayout <LinearLayout
android:layout_width="wrap_content" android:layout_width="wrap_content"
...@@ -12,13 +13,15 @@ ...@@ -12,13 +13,15 @@
android:background="@color/white" android:background="@color/white"
android:minWidth="288dp" android:minWidth="288dp"
android:orientation="vertical" android:orientation="vertical"
android:padding="@dimen/margin_24"> android:padding="@dimen/margin_24"
>
<TextView <TextView
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:text="@string/fragment_retry_login_error_title" android:text="@string/fragment_retry_login_error_title"
android:textAppearance="@style/TextAppearance.AppCompat.Title" /> android:textAppearance="@style/TextAppearance.AppCompat.Title"
/>
<TextView <TextView
android:id="@+id/txt_error_description" android:id="@+id/txt_error_description"
...@@ -26,14 +29,16 @@ ...@@ -26,14 +29,16 @@
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:layout_marginBottom="@dimen/margin_8" android:layout_marginBottom="@dimen/margin_8"
android:layout_marginTop="@dimen/margin_8" android:layout_marginTop="@dimen/margin_8"
android:textAppearance="@style/Base.TextAppearance.AppCompat.Body1" /> android:textAppearance="@style/Base.TextAppearance.AppCompat.Body1"
/>
<LinearLayout <LinearLayout
android:layout_width="wrap_content" android:layout_width="wrap_content"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:layout_gravity="center" android:layout_gravity="center"
android:gravity="center" android:gravity="center"
android:orientation="vertical"> android:orientation="vertical"
>
<android.support.design.widget.FloatingActionButton <android.support.design.widget.FloatingActionButton
android:id="@+id/btn_retry_login" android:id="@+id/btn_retry_login"
...@@ -42,13 +47,15 @@ ...@@ -42,13 +47,15 @@
android:layout_margin="@dimen/margin_8" android:layout_margin="@dimen/margin_8"
app:elevation="2dp" app:elevation="2dp"
app:fabSize="normal" app:fabSize="normal"
app:srcCompat="@drawable/ic_arrow_forward_white_24dp" /> app:srcCompat="@drawable/ic_arrow_forward_white_24dp"
/>
<TextView <TextView
android:layout_width="wrap_content" android:layout_width="wrap_content"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:text="@string/fragment_retry_login_retry_title" android:text="@string/fragment_retry_login_retry_title"
android:textAppearance="@style/TextAppearance.AppCompat.Body1" /> android:textAppearance="@style/TextAppearance.AppCompat.Body1"
/>
</LinearLayout> </LinearLayout>
...@@ -59,7 +66,8 @@ ...@@ -59,7 +66,8 @@
android:layout_gravity="center" android:layout_gravity="center"
android:layout_marginTop="@dimen/margin_16" android:layout_marginTop="@dimen/margin_16"
app:dotCount="5" app:dotCount="5"
app:dotSize="12dp" /> app:dotSize="12dp"
/>
</LinearLayout> </LinearLayout>
</FrameLayout> </FrameLayout>
\ No newline at end of file
...@@ -2,17 +2,19 @@ ...@@ -2,17 +2,19 @@
<android.support.v4.widget.DrawerLayout xmlns:android="http://schemas.android.com/apk/res/android" <android.support.v4.widget.DrawerLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/drawer_layout" android:id="@+id/drawer_layout"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="match_parent"> android:layout_height="match_parent"
>
<include layout="@layout/fragment_room_main" /> <include layout="@layout/fragment_room_main"/>
<FrameLayout <FrameLayout
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="match_parent" android:layout_height="match_parent"
android:layout_gravity="end" android:layout_gravity="end"
android:clickable="true" android:clickable="true"
android:theme="@style/AppTheme.Dark"> android:theme="@style/AppTheme.Dark"
>
<include layout="@layout/room_side_menu" /> <include layout="@layout/room_side_menu"/>
</FrameLayout> </FrameLayout>
</android.support.v4.widget.DrawerLayout> </android.support.v4.widget.DrawerLayout>
\ No newline at end of file
...@@ -18,7 +18,8 @@ ...@@ -18,7 +18,8 @@
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:theme="@style/Theme.AppCompat.Light" android:theme="@style/Theme.AppCompat.Light"
android:layout_gravity="bottom" android:layout_gravity="bottom"
android:background="@android:color/white"/> android:background="@android:color/white"
/>
<android.support.design.widget.FloatingActionButton <android.support.design.widget.FloatingActionButton
android:id="@+id/fab_upload_file" android:id="@+id/fab_upload_file"
......
...@@ -3,7 +3,8 @@ ...@@ -3,7 +3,8 @@
xmlns:tools="http://schemas.android.com/tools" xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="match_parent" android:layout_height="match_parent"
android:theme="@style/AppTheme.Dark"> android:theme="@style/AppTheme.Dark"
>
<LinearLayout <LinearLayout
android:id="@+id/user_info_container" android:id="@+id/user_info_container"
...@@ -15,22 +16,26 @@ ...@@ -15,22 +16,26 @@
android:foreground="?attr/selectableItemBackground" android:foreground="?attr/selectableItemBackground"
android:gravity="center_vertical" android:gravity="center_vertical"
android:orientation="horizontal" android:orientation="horizontal"
android:padding="@dimen/margin_16"> android:padding="@dimen/margin_16"
>
<ImageView <ImageView
android:id="@+id/current_user_status" android:id="@+id/current_user_status"
android:layout_width="8dp" android:layout_width="8dp"
android:layout_height="8dp" android:layout_height="8dp"
android:src="@drawable/userstatus_online" /> android:src="@drawable/userstatus_online"
/>
<Space <Space
android:layout_width="@dimen/margin_8" android:layout_width="@dimen/margin_8"
android:layout_height="wrap_content" /> android:layout_height="wrap_content"
/>
<ImageView <ImageView
android:id="@+id/current_user_avatar" android:id="@+id/current_user_avatar"
android:layout_width="48dp" android:layout_width="48dp"
android:layout_height="48dp" /> android:layout_height="48dp"
/>
<TextView <TextView
android:id="@+id/current_user_name" android:id="@+id/current_user_name"
...@@ -41,12 +46,14 @@ ...@@ -41,12 +46,14 @@
android:layout_marginRight="@dimen/margin_8" android:layout_marginRight="@dimen/margin_8"
android:layout_weight="1" android:layout_weight="1"
android:textSize="14sp" android:textSize="14sp"
tools:text="John Doe" /> tools:text="John Doe"
/>
<chat.rocket.android.widget.DownUpToggleView <chat.rocket.android.widget.DownUpToggleView
android:id="@+id/toggle_user_action" android:id="@+id/toggle_user_action"
android:layout_width="wrap_content" android:layout_width="wrap_content"
android:layout_height="wrap_content" /> android:layout_height="wrap_content"
/>
</LinearLayout> </LinearLayout>
...@@ -55,18 +62,21 @@ ...@@ -55,18 +62,21 @@
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:layout_alignParentBottom="true" android:layout_alignParentBottom="true"
android:layout_below="@+id/user_info_container" android:layout_below="@+id/user_info_container"
android:background="?attr/colorPrimary"> android:background="?attr/colorPrimary"
>
<LinearLayout <LinearLayout
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:orientation="vertical" android:orientation="vertical"
android:paddingStart="?attr/listPreferredItemPaddingLeft"> android:paddingStart="?attr/listPreferredItemPaddingLeft"
>
<FrameLayout <FrameLayout
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:layout_marginTop="@dimen/margin_8"> android:layout_marginTop="@dimen/margin_8"
>
<TextView <TextView
android:layout_width="wrap_content" android:layout_width="wrap_content"
...@@ -75,7 +85,8 @@ ...@@ -75,7 +85,8 @@
android:alpha="0.62" android:alpha="0.62"
android:text="@string/fragment_sidebar_main_channels_title" android:text="@string/fragment_sidebar_main_channels_title"
android:textAppearance="@style/TextAppearance.AppCompat.Body2" android:textAppearance="@style/TextAppearance.AppCompat.Body2"
android:textStyle="bold" /> android:textStyle="bold"
/>
<chat.rocket.android.widget.FontAwesomeButton <chat.rocket.android.widget.FontAwesomeButton
android:id="@+id/btn_add_channel" android:id="@+id/btn_add_channel"
...@@ -84,7 +95,8 @@ ...@@ -84,7 +95,8 @@
android:layout_height="48dp" android:layout_height="48dp"
android:layout_gravity="end|center_vertical" android:layout_gravity="end|center_vertical"
android:text="@string/fa_plus" android:text="@string/fa_plus"
android:textSize="12dp" /> android:textSize="12dp"
/>
</FrameLayout> </FrameLayout>
...@@ -93,12 +105,14 @@ ...@@ -93,12 +105,14 @@
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:layout_marginEnd="?attr/listPreferredItemPaddingRight" android:layout_marginEnd="?attr/listPreferredItemPaddingRight"
android:orientation="vertical" /> android:orientation="vertical"
/>
<FrameLayout <FrameLayout
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:layout_marginTop="@dimen/margin_8"> android:layout_marginTop="@dimen/margin_8"
>
<TextView <TextView
android:layout_width="wrap_content" android:layout_width="wrap_content"
...@@ -107,7 +121,8 @@ ...@@ -107,7 +121,8 @@
android:alpha="0.62" android:alpha="0.62"
android:text="@string/fragment_sidebar_main_direct_messages_title" android:text="@string/fragment_sidebar_main_direct_messages_title"
android:textAppearance="@style/TextAppearance.AppCompat.Body2" android:textAppearance="@style/TextAppearance.AppCompat.Body2"
android:textStyle="bold" /> android:textStyle="bold"
/>
<chat.rocket.android.widget.FontAwesomeButton <chat.rocket.android.widget.FontAwesomeButton
android:id="@+id/btn_add_direct_message" android:id="@+id/btn_add_direct_message"
...@@ -116,7 +131,8 @@ ...@@ -116,7 +131,8 @@
android:layout_height="48dp" android:layout_height="48dp"
android:layout_gravity="end|center_vertical" android:layout_gravity="end|center_vertical"
android:text="@string/fa_plus" android:text="@string/fa_plus"
android:textSize="12dp" /> android:textSize="12dp"
/>
</FrameLayout> </FrameLayout>
...@@ -125,7 +141,8 @@ ...@@ -125,7 +141,8 @@
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:layout_marginEnd="?attr/listPreferredItemPaddingRight" android:layout_marginEnd="?attr/listPreferredItemPaddingRight"
android:orientation="vertical" /> android:orientation="vertical"
/>
</LinearLayout> </LinearLayout>
</android.support.v4.widget.NestedScrollView> </android.support.v4.widget.NestedScrollView>
...@@ -139,12 +156,14 @@ ...@@ -139,12 +156,14 @@
android:background="?attr/colorPrimaryDark" android:background="?attr/colorPrimaryDark"
android:elevation="2dp" android:elevation="2dp"
android:visibility="gone" android:visibility="gone"
tools:visibility="visible"> tools:visibility="visible"
>
<LinearLayout <LinearLayout
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:orientation="vertical"> android:orientation="vertical"
>
<TextView <TextView
android:id="@+id/btn_status_online" android:id="@+id/btn_status_online"
...@@ -153,7 +172,8 @@ ...@@ -153,7 +172,8 @@
android:drawableLeft="@drawable/userstatus_online" android:drawableLeft="@drawable/userstatus_online"
android:drawablePadding="16dp" android:drawablePadding="16dp"
android:text="@string/user_status_online" android:text="@string/user_status_online"
android:textAppearance="?attr/textAppearanceListItemSmall" /> android:textAppearance="?attr/textAppearanceListItemSmall"
/>
<TextView <TextView
android:id="@+id/btn_status_away" android:id="@+id/btn_status_away"
...@@ -162,7 +182,8 @@ ...@@ -162,7 +182,8 @@
android:drawableLeft="@drawable/userstatus_away" android:drawableLeft="@drawable/userstatus_away"
android:drawablePadding="16dp" android:drawablePadding="16dp"
android:text="@string/user_status_away" android:text="@string/user_status_away"
android:textAppearance="?attr/textAppearanceListItemSmall" /> android:textAppearance="?attr/textAppearanceListItemSmall"
/>
<TextView <TextView
android:id="@+id/btn_status_busy" android:id="@+id/btn_status_busy"
...@@ -171,7 +192,8 @@ ...@@ -171,7 +192,8 @@
android:drawableLeft="@drawable/userstatus_busy" android:drawableLeft="@drawable/userstatus_busy"
android:drawablePadding="16dp" android:drawablePadding="16dp"
android:text="@string/user_status_busy" android:text="@string/user_status_busy"
android:textAppearance="?attr/textAppearanceListItemSmall" /> android:textAppearance="?attr/textAppearanceListItemSmall"
/>
<TextView <TextView
android:id="@+id/btn_status_invisible" android:id="@+id/btn_status_invisible"
...@@ -180,20 +202,24 @@ ...@@ -180,20 +202,24 @@
android:drawableLeft="@drawable/userstatus_offline" android:drawableLeft="@drawable/userstatus_offline"
android:drawablePadding="16dp" android:drawablePadding="16dp"
android:text="@string/user_status_invisible" android:text="@string/user_status_invisible"
android:textAppearance="?attr/textAppearanceListItemSmall" /> android:textAppearance="?attr/textAppearanceListItemSmall"
/>
<chat.rocket.android.widget.DividerView <chat.rocket.android.widget.DividerView
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="wrap_content" /> android:layout_height="wrap_content"
/>
<LinearLayout <LinearLayout
android:id="@+id/btn_logout" android:id="@+id/btn_logout"
style="@style/sidebar_list_item" style="@style/sidebar_list_item"
android:orientation="horizontal"> android:orientation="horizontal"
>
<FrameLayout <FrameLayout
android:layout_width="48dp" android:layout_width="48dp"
android:layout_height="match_parent"> android:layout_height="match_parent"
>
<chat.rocket.android.widget.FontAwesomeTextView <chat.rocket.android.widget.FontAwesomeTextView
android:layout_width="16dp" android:layout_width="16dp"
...@@ -201,14 +227,16 @@ ...@@ -201,14 +227,16 @@
android:layout_gravity="center" android:layout_gravity="center"
android:gravity="center" android:gravity="center"
android:text="@string/fa_sign_out" android:text="@string/fa_sign_out"
android:textSize="14dp" /> android:textSize="14dp"
/>
</FrameLayout> </FrameLayout>
<TextView <TextView
android:layout_width="wrap_content" android:layout_width="wrap_content"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:text="@string/fragment_sidebar_main_logout_title" android:text="@string/fragment_sidebar_main_logout_title"
android:textAppearance="?attr/textAppearanceListItemSmall" /> android:textAppearance="?attr/textAppearanceListItemSmall"
/>
</LinearLayout> </LinearLayout>
</LinearLayout> </LinearLayout>
</android.support.v4.widget.NestedScrollView> </android.support.v4.widget.NestedScrollView>
......
...@@ -3,25 +3,29 @@ ...@@ -3,25 +3,29 @@
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="match_parent" android:layout_height="match_parent"
android:background="?attr/colorPrimaryDark" android:background="?attr/colorPrimaryDark"
android:theme="@style/AppTheme.Dark"> android:theme="@style/AppTheme.Dark"
>
<LinearLayout <LinearLayout
android:layout_width="wrap_content" android:layout_width="wrap_content"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:layout_gravity="center" android:layout_gravity="center"
android:gravity="center" android:gravity="center"
android:orientation="vertical"> android:orientation="vertical"
>
<chat.rocket.android.widget.WaitingView <chat.rocket.android.widget.WaitingView
android:layout_width="wrap_content" android:layout_width="wrap_content"
android:layout_height="wrap_content" /> android:layout_height="wrap_content"
/>
<TextView <TextView
android:id="@+id/txt_caption" android:id="@+id/txt_caption"
android:layout_width="wrap_content" android:layout_width="wrap_content"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:layout_marginTop="@dimen/margin_32" android:layout_marginTop="@dimen/margin_32"
android:textAppearance="@style/TextAppearance.AppCompat.Caption" /> android:textAppearance="@style/TextAppearance.AppCompat.Caption"
/>
</LinearLayout> </LinearLayout>
</FrameLayout> </FrameLayout>
\ No newline at end of file
...@@ -4,66 +4,77 @@ ...@@ -4,66 +4,77 @@
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:orientation="vertical" android:orientation="vertical"
android:theme="@style/AppTheme"> android:theme="@style/AppTheme"
>
<include layout="@layout/list_item_message_newday" /> <include layout="@layout/list_item_message_newday"/>
<LinearLayout <LinearLayout
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:orientation="horizontal"> android:orientation="horizontal"
>
<ImageView <ImageView
android:id="@+id/user_avatar" android:id="@+id/user_avatar"
android:layout_width="32dp" android:layout_width="32dp"
android:layout_height="32dp" android:layout_height="32dp"
android:layout_margin="8dp" android:layout_margin="8dp"
tools:src="@drawable/ic_default_avatar" /> tools:src="@drawable/ic_default_avatar"
/>
<LinearLayout <LinearLayout
android:layout_width="0px" android:layout_width="0px"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:layout_marginEnd="8dp" android:layout_marginEnd="8dp"
android:layout_weight="1" android:layout_weight="1"
android:orientation="vertical"> android:orientation="vertical"
>
<LinearLayout <LinearLayout
android:id="@+id/user_and_timestamp_container" android:id="@+id/user_and_timestamp_container"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:orientation="horizontal"> android:orientation="horizontal"
>
<TextView <TextView
android:id="@+id/username" android:id="@+id/username"
android:layout_width="wrap_content" android:layout_width="wrap_content"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:textStyle="bold" android:textStyle="bold"
tools:text="John Doe" /> tools:text="John Doe"
/>
<Space <Space
android:layout_width="@dimen/margin_8" android:layout_width="@dimen/margin_8"
android:layout_height="wrap_content" /> android:layout_height="wrap_content"
/>
<TextView <TextView
android:id="@+id/timestamp" android:id="@+id/timestamp"
android:layout_width="wrap_content" android:layout_width="wrap_content"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:enabled="false" android:enabled="false"
tools:text="12:34" /> tools:text="12:34"
/>
</LinearLayout> </LinearLayout>
<chat.rocket.android.widget.message.RocketChatMessageLayout <chat.rocket.android.widget.message.RocketChatMessageLayout
android:id="@+id/message_body" android:id="@+id/message_body"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="wrap_content" /> android:layout_height="wrap_content"
/>
<chat.rocket.android.widget.message.RocketChatMessageUrlsLayout <chat.rocket.android.widget.message.RocketChatMessageUrlsLayout
android:id="@+id/message_urls" android:id="@+id/message_urls"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="wrap_content"/> android:layout_height="wrap_content"
/>
<chat.rocket.android.widget.message.RocketChatMessageAttachmentsLayout <chat.rocket.android.widget.message.RocketChatMessageAttachmentsLayout
android:id="@+id/message_attachments" android:id="@+id/message_attachments"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="wrap_content" /> android:layout_height="wrap_content"
/>
</LinearLayout> </LinearLayout>
</LinearLayout> </LinearLayout>
</LinearLayout> </LinearLayout>
\ No newline at end of file
...@@ -2,4 +2,5 @@ ...@@ -2,4 +2,5 @@
<Space xmlns:android="http://schemas.android.com/apk/res/android" <Space xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/space" android:id="@+id/space"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="88dp" /> android:layout_height="88dp"
\ No newline at end of file />
\ No newline at end of file
...@@ -3,12 +3,14 @@ ...@@ -3,12 +3,14 @@
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:orientation="vertical" android:orientation="vertical"
android:theme="@style/AppTheme"> android:theme="@style/AppTheme"
>
<chat.rocket.android.widget.WaitingView <chat.rocket.android.widget.WaitingView
android:layout_width="wrap_content" android:layout_width="wrap_content"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:layout_gravity="center" android:layout_gravity="center"
android:layout_margin="@dimen/margin_8" /> android:layout_margin="@dimen/margin_8"
/>
</FrameLayout> </FrameLayout>
\ No newline at end of file
...@@ -6,13 +6,15 @@ ...@@ -6,13 +6,15 @@
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:layout_margin="16dp" android:layout_margin="16dp"
android:gravity="center_vertical" android:gravity="center_vertical"
android:orientation="horizontal"> android:orientation="horizontal"
>
<View <View
android:layout_width="0px" android:layout_width="0px"
android:layout_height="1dp" android:layout_height="1dp"
android:layout_weight="1" android:layout_weight="1"
android:background="@color/newday_color" /> android:background="@color/newday_color"
/>
<TextView <TextView
android:id="@+id/newday_text" android:id="@+id/newday_text"
...@@ -23,12 +25,14 @@ ...@@ -23,12 +25,14 @@
android:textColor="@color/newday_color" android:textColor="@color/newday_color"
android:textSize="8sp" android:textSize="8sp"
android:textStyle="bold" android:textStyle="bold"
tools:text="2016/01/23" /> tools:text="2016/01/23"
/>
<View <View
android:layout_width="0px" android:layout_width="0px"
android:layout_height="1dp" android:layout_height="1dp"
android:layout_weight="1" android:layout_weight="1"
android:background="@color/newday_color" /> android:background="@color/newday_color"
/>
</LinearLayout> </LinearLayout>
\ No newline at end of file
...@@ -3,7 +3,8 @@ ...@@ -3,7 +3,8 @@
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:orientation="vertical" android:orientation="vertical"
android:theme="@style/AppTheme"> android:theme="@style/AppTheme"
>
<TextView <TextView
android:layout_width="wrap_content" android:layout_width="wrap_content"
...@@ -11,6 +12,7 @@ ...@@ -11,6 +12,7 @@
android:layout_gravity="center" android:layout_gravity="center"
android:layout_margin="@dimen/margin_16" android:layout_margin="@dimen/margin_16"
android:text="@string/start_of_conversation" android:text="@string/start_of_conversation"
android:textAppearance="@style/TextAppearance.AppCompat.Body1" /> android:textAppearance="@style/TextAppearance.AppCompat.Body1"
/>
</FrameLayout> </FrameLayout>
\ No newline at end of file
...@@ -3,18 +3,21 @@ ...@@ -3,18 +3,21 @@
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="?attr/listPreferredItemHeightSmall" android:layout_height="?attr/listPreferredItemHeightSmall"
android:gravity="center_vertical" android:gravity="center_vertical"
android:orientation="horizontal"> android:orientation="horizontal"
>
<ImageView <ImageView
android:id="@+id/room_user_status" android:id="@+id/room_user_status"
android:layout_width="8dp" android:layout_width="8dp"
android:layout_height="8dp" android:layout_height="8dp"
android:layout_margin="@dimen/margin_8" /> android:layout_margin="@dimen/margin_8"
/>
<ImageView <ImageView
android:id="@+id/room_user_avatar" android:id="@+id/room_user_avatar"
android:layout_width="24dp" android:layout_width="24dp"
android:layout_height="24dp" /> android:layout_height="24dp"
/>
<TextView <TextView
android:id="@+id/room_user_name" android:id="@+id/room_user_name"
...@@ -24,6 +27,7 @@ ...@@ -24,6 +27,7 @@
android:layout_marginLeft="@dimen/margin_8" android:layout_marginLeft="@dimen/margin_8"
android:layout_marginRight="@dimen/margin_8" android:layout_marginRight="@dimen/margin_8"
android:layout_weight="1" android:layout_weight="1"
android:textAppearance="@style/TextAppearance.AppCompat.Small" /> android:textAppearance="@style/TextAppearance.AppCompat.Small"
/>
</LinearLayout> </LinearLayout>
\ No newline at end of file
...@@ -4,27 +4,31 @@ ...@@ -4,27 +4,31 @@
android:layout_width="48dp" android:layout_width="48dp"
android:layout_height="match_parent" android:layout_height="match_parent"
android:layout_gravity="end" android:layout_gravity="end"
android:orientation="vertical"> android:orientation="vertical"
>
<chat.rocket.android.widget.FontAwesomeButton <chat.rocket.android.widget.FontAwesomeButton
android:layout_width="48dp" android:layout_width="48dp"
android:layout_height="48dp" android:layout_height="48dp"
android:enabled="false" android:enabled="false"
android:text="@string/fa_search" android:text="@string/fa_search"
android:textSize="24dp" /> android:textSize="24dp"
/>
<chat.rocket.android.widget.FontAwesomeButton <chat.rocket.android.widget.FontAwesomeButton
android:id="@+id/btn_users" android:id="@+id/btn_users"
android:layout_width="48dp" android:layout_width="48dp"
android:layout_height="48dp" android:layout_height="48dp"
android:text="@string/fa_users" android:text="@string/fa_users"
android:textSize="24dp" /> android:textSize="24dp"
/>
<chat.rocket.android.widget.FontAwesomeButton <chat.rocket.android.widget.FontAwesomeButton
android:layout_width="48dp" android:layout_width="48dp"
android:layout_height="48dp" android:layout_height="48dp"
android:enabled="false" android:enabled="false"
android:text="@string/fa_at" android:text="@string/fa_at"
android:textSize="24dp" /> android:textSize="24dp"
/>
</LinearLayout> </LinearLayout>
\ No newline at end of file
...@@ -4,38 +4,44 @@ ...@@ -4,38 +4,44 @@
android:layout_width="280dp" android:layout_width="280dp"
android:layout_height="match_parent" android:layout_height="match_parent"
android:layout_gravity="start" android:layout_gravity="start"
android:theme="@style/AppTheme.Dark"> android:theme="@style/AppTheme.Dark"
>
<android.support.v4.widget.NestedScrollView <android.support.v4.widget.NestedScrollView
android:layout_width="96dp" android:layout_width="96dp"
android:layout_height="match_parent" android:layout_height="match_parent"
android:layout_gravity="start" android:layout_gravity="start"
android:background="?attr/colorPrimaryDark"> android:background="?attr/colorPrimaryDark"
>
<LinearLayout <LinearLayout
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:orientation="vertical"> android:orientation="vertical"
>
<ImageButton <ImageButton
style="@style/Base.Widget.AppCompat.Button.Borderless" style="@style/Base.Widget.AppCompat.Button.Borderless"
android:layout_width="80dp" android:layout_width="80dp"
android:layout_height="80dp" android:layout_height="80dp"
android:layout_margin="@dimen/margin_8" android:layout_margin="@dimen/margin_8"
android:src="@mipmap/ic_launcher" /> android:src="@mipmap/ic_launcher"
/>
<chat.rocket.android.widget.FontAwesomeButton <chat.rocket.android.widget.FontAwesomeButton
style="@style/Base.Widget.AppCompat.Button.Borderless" style="@style/Base.Widget.AppCompat.Button.Borderless"
android:layout_width="80dp" android:layout_width="80dp"
android:layout_height="80dp" android:layout_height="80dp"
android:layout_margin="@dimen/margin_8" android:layout_margin="@dimen/margin_8"
android:text="@string/fa_plus" /> android:text="@string/fa_plus"
/>
</LinearLayout> </LinearLayout>
</android.support.v4.widget.NestedScrollView> </android.support.v4.widget.NestedScrollView>
<FrameLayout <FrameLayout
android:id="@+id/sidebar_fragment_container" android:id="@+id/sidebar_fragment_container"
android:layout_width="280dp" android:layout_width="280dp"
android:layout_height="match_parent" /> android:layout_height="match_parent"
/>
</android.support.v4.widget.SlidingPaneLayout> </android.support.v4.widget.SlidingPaneLayout>
\ No newline at end of file
...@@ -2,6 +2,7 @@ ...@@ -2,6 +2,7 @@
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android" <FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/content" android:id="@+id/content"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="match_parent"> android:layout_height="match_parent"
>
</FrameLayout> </FrameLayout>
\ No newline at end of file
...@@ -2,4 +2,5 @@ ...@@ -2,4 +2,5 @@
<WebView xmlns:android="http://schemas.android.com/apk/res/android" <WebView xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/webview" android:id="@+id/webview"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="match_parent" /> android:layout_height="match_parent"
\ No newline at end of file />
\ No newline at end of file
<?xml version="1.0" encoding="utf-8"?> <?xml version="1.0" encoding="utf-8"?>
<resources> <resources>
<style name="sidebar_list_item"> <style name="sidebar_list_item">
<item name="android:layout_width">match_parent</item> <item name="android:layout_width">match_parent</item>
<item name="android:layout_height">?attr/listPreferredItemHeight</item> <item name="android:layout_height">?attr/listPreferredItemHeight</item>
......
...@@ -179,7 +179,8 @@ ...@@ -179,7 +179,8 @@
value="BAND, BOR, BSR, BXOR, DIV, EQUAL, GE, GT, LAND, LE, LITERAL_INSTANCEOF, LOR, LT, MINUS, MOD, NOT_EQUAL, PLUS, QUESTION, SL, SR, STAR "/> value="BAND, BOR, BSR, BXOR, DIV, EQUAL, GE, GT, LAND, LE, LITERAL_INSTANCEOF, LOR, LT, MINUS, MOD, NOT_EQUAL, PLUS, QUESTION, SL, SR, STAR "/>
</module> </module>
<module name="AnnotationLocation"> <module name="AnnotationLocation">
<property name="tokens" value="CLASS_DEF, INTERFACE_DEF, ENUM_DEF, METHOD_DEF, CTOR_DEF"/> <property name="tokens"
value="CLASS_DEF, INTERFACE_DEF, ENUM_DEF, METHOD_DEF, CTOR_DEF"/>
</module> </module>
<module name="AnnotationLocation"> <module name="AnnotationLocation">
<property name="tokens" value="VARIABLE_DEF"/> <property name="tokens" value="VARIABLE_DEF"/>
......
<code_scheme name="GoogleStyle"> <code_scheme name="GoogleStyle">
<option name="JAVA_INDENT_OPTIONS"> <option name="JAVA_INDENT_OPTIONS">
<value> <value>
<option name="INDENT_SIZE" value="2" /> <option name="INDENT_SIZE" value="2"/>
<option name="CONTINUATION_INDENT_SIZE" value="4" /> <option name="CONTINUATION_INDENT_SIZE" value="4"/>
<option name="TAB_SIZE" value="8" /> <option name="TAB_SIZE" value="8"/>
<option name="USE_TAB_CHARACTER" value="false" /> <option name="USE_TAB_CHARACTER" value="false"/>
<option name="SMART_TABS" value="false" /> <option name="SMART_TABS" value="false"/>
<option name="LABEL_INDENT_SIZE" value="0" /> <option name="LABEL_INDENT_SIZE" value="0"/>
<option name="LABEL_INDENT_ABSOLUTE" value="false" /> <option name="LABEL_INDENT_ABSOLUTE" value="false"/>
<option name="USE_RELATIVE_INDENTS" value="false" /> <option name="USE_RELATIVE_INDENTS" value="false"/>
</value> </value>
</option> </option>
<option name="OTHER_INDENT_OPTIONS"> <option name="OTHER_INDENT_OPTIONS">
<value> <value>
<option name="INDENT_SIZE" value="2" /> <option name="INDENT_SIZE" value="2"/>
<option name="CONTINUATION_INDENT_SIZE" value="4" /> <option name="CONTINUATION_INDENT_SIZE" value="4"/>
<option name="TAB_SIZE" value="8" /> <option name="TAB_SIZE" value="8"/>
<option name="USE_TAB_CHARACTER" value="false" /> <option name="USE_TAB_CHARACTER" value="false"/>
<option name="SMART_TABS" value="false" /> <option name="SMART_TABS" value="false"/>
<option name="LABEL_INDENT_SIZE" value="0" /> <option name="LABEL_INDENT_SIZE" value="0"/>
<option name="LABEL_INDENT_ABSOLUTE" value="false" /> <option name="LABEL_INDENT_ABSOLUTE" value="false"/>
<option name="USE_RELATIVE_INDENTS" value="false" /> <option name="USE_RELATIVE_INDENTS" value="false"/>
</value> </value>
</option> </option>
<option name="LINE_SEPARATOR" value="&#xA;" /> <option name="LINE_SEPARATOR" value="&#xA;"/>
<option name="CLASS_COUNT_TO_USE_IMPORT_ON_DEMAND" value="99" /> <option name="CLASS_COUNT_TO_USE_IMPORT_ON_DEMAND" value="99"/>
<option name="NAMES_COUNT_TO_USE_IMPORT_ON_DEMAND" value="99" /> <option name="NAMES_COUNT_TO_USE_IMPORT_ON_DEMAND" value="99"/>
<option name="PACKAGES_TO_USE_IMPORT_ON_DEMAND"> <option name="PACKAGES_TO_USE_IMPORT_ON_DEMAND">
<value /> <value/>
</option> </option>
<option name="IMPORT_LAYOUT_TABLE"> <option name="IMPORT_LAYOUT_TABLE">
<value> <value>
<package name="" withSubpackages="true" static="true" /> <package name="" withSubpackages="true" static="true"/>
<emptyLine /> <emptyLine/>
<package name="com.google" withSubpackages="true" static="false" /> <package name="com.google" withSubpackages="true" static="false"/>
<emptyLine /> <emptyLine/>
<package name="android" withSubpackages="true" static="false" /> <package name="android" withSubpackages="true" static="false"/>
<package name="antenna" withSubpackages="true" static="false" /> <package name="antenna" withSubpackages="true" static="false"/>
<package name="antlr" withSubpackages="true" static="false" /> <package name="antlr" withSubpackages="true" static="false"/>
<package name="ar" withSubpackages="true" static="false" /> <package name="ar" withSubpackages="true" static="false"/>
<package name="asposewobfuscated" withSubpackages="true" static="false" /> <package name="asposewobfuscated" withSubpackages="true" static="false"/>
<package name="asquare" withSubpackages="true" static="false" /> <package name="asquare" withSubpackages="true" static="false"/>
<package name="atg" withSubpackages="true" static="false" /> <package name="atg" withSubpackages="true" static="false"/>
<package name="au" withSubpackages="true" static="false" /> <package name="au" withSubpackages="true" static="false"/>
<package name="beaver" withSubpackages="true" static="false" /> <package name="beaver" withSubpackages="true" static="false"/>
<package name="bibtex" withSubpackages="true" static="false" /> <package name="bibtex" withSubpackages="true" static="false"/>
<package name="bmsi" withSubpackages="true" static="false" /> <package name="bmsi" withSubpackages="true" static="false"/>
<package name="bsh" withSubpackages="true" static="false" /> <package name="bsh" withSubpackages="true" static="false"/>
<package name="ccl" withSubpackages="true" static="false" /> <package name="ccl" withSubpackages="true" static="false"/>
<package name="cern" withSubpackages="true" static="false" /> <package name="cern" withSubpackages="true" static="false"/>
<package name="ChartDirector" withSubpackages="true" static="false" /> <package name="ChartDirector" withSubpackages="true" static="false"/>
<package name="checkers" withSubpackages="true" static="false" /> <package name="checkers" withSubpackages="true" static="false"/>
<package name="com" withSubpackages="true" static="false" /> <package name="com" withSubpackages="true" static="false"/>
<package name="COM" withSubpackages="true" static="false" /> <package name="COM" withSubpackages="true" static="false"/>
<package name="common" withSubpackages="true" static="false" /> <package name="common" withSubpackages="true" static="false"/>
<package name="contribs" withSubpackages="true" static="false" /> <package name="contribs" withSubpackages="true" static="false"/>
<package name="corejava" withSubpackages="true" static="false" /> <package name="corejava" withSubpackages="true" static="false"/>
<package name="cryptix" withSubpackages="true" static="false" /> <package name="cryptix" withSubpackages="true" static="false"/>
<package name="cybervillains" withSubpackages="true" static="false" /> <package name="cybervillains" withSubpackages="true" static="false"/>
<package name="dalvik" withSubpackages="true" static="false" /> <package name="dalvik" withSubpackages="true" static="false"/>
<package name="danbikel" withSubpackages="true" static="false" /> <package name="danbikel" withSubpackages="true" static="false"/>
<package name="de" withSubpackages="true" static="false" /> <package name="de" withSubpackages="true" static="false"/>
<package name="EDU" withSubpackages="true" static="false" /> <package name="EDU" withSubpackages="true" static="false"/>
<package name="eg" withSubpackages="true" static="false" /> <package name="eg" withSubpackages="true" static="false"/>
<package name="eu" withSubpackages="true" static="false" /> <package name="eu" withSubpackages="true" static="false"/>
<package name="examples" withSubpackages="true" static="false" /> <package name="examples" withSubpackages="true" static="false"/>
<package name="fat" withSubpackages="true" static="false" /> <package name="fat" withSubpackages="true" static="false"/>
<package name="fit" withSubpackages="true" static="false" /> <package name="fit" withSubpackages="true" static="false"/>
<package name="fitlibrary" withSubpackages="true" static="false" /> <package name="fitlibrary" withSubpackages="true" static="false"/>
<package name="fmpp" withSubpackages="true" static="false" /> <package name="fmpp" withSubpackages="true" static="false"/>
<package name="freemarker" withSubpackages="true" static="false" /> <package name="freemarker" withSubpackages="true" static="false"/>
<package name="gnu" withSubpackages="true" static="false" /> <package name="gnu" withSubpackages="true" static="false"/>
<package name="groovy" withSubpackages="true" static="false" /> <package name="groovy" withSubpackages="true" static="false"/>
<package name="groovyjarjarantlr" withSubpackages="true" static="false" /> <package name="groovyjarjarantlr" withSubpackages="true" static="false"/>
<package name="groovyjarjarasm" withSubpackages="true" static="false" /> <package name="groovyjarjarasm" withSubpackages="true" static="false"/>
<package name="hak" withSubpackages="true" static="false" /> <package name="hak" withSubpackages="true" static="false"/>
<package name="hep" withSubpackages="true" static="false" /> <package name="hep" withSubpackages="true" static="false"/>
<package name="ie" withSubpackages="true" static="false" /> <package name="ie" withSubpackages="true" static="false"/>
<package name="io" withSubpackages="true" static="false" /> <package name="io" withSubpackages="true" static="false"/>
<package name="imageinfo" withSubpackages="true" static="false" /> <package name="imageinfo" withSubpackages="true" static="false"/>
<package name="info" withSubpackages="true" static="false" /> <package name="info" withSubpackages="true" static="false"/>
<package name="it" withSubpackages="true" static="false" /> <package name="it" withSubpackages="true" static="false"/>
<package name="jal" withSubpackages="true" static="false" /> <package name="jal" withSubpackages="true" static="false"/>
<package name="Jama" withSubpackages="true" static="false" /> <package name="Jama" withSubpackages="true" static="false"/>
<package name="japa" withSubpackages="true" static="false" /> <package name="japa" withSubpackages="true" static="false"/>
<package name="japacheckers" withSubpackages="true" static="false" /> <package name="japacheckers" withSubpackages="true" static="false"/>
<package name="jas" withSubpackages="true" static="false" /> <package name="jas" withSubpackages="true" static="false"/>
<package name="jasmin" withSubpackages="true" static="false" /> <package name="jasmin" withSubpackages="true" static="false"/>
<package name="javancss" withSubpackages="true" static="false" /> <package name="javancss" withSubpackages="true" static="false"/>
<package name="javanet" withSubpackages="true" static="false" /> <package name="javanet" withSubpackages="true" static="false"/>
<package name="javassist" withSubpackages="true" static="false" /> <package name="javassist" withSubpackages="true" static="false"/>
<package name="javazoom" withSubpackages="true" static="false" /> <package name="javazoom" withSubpackages="true" static="false"/>
<package name="java_cup" withSubpackages="true" static="false" /> <package name="java_cup" withSubpackages="true" static="false"/>
<package name="jcifs" withSubpackages="true" static="false" /> <package name="jcifs" withSubpackages="true" static="false"/>
<package name="jetty" withSubpackages="true" static="false" /> <package name="jetty" withSubpackages="true" static="false"/>
<package name="JFlex" withSubpackages="true" static="false" /> <package name="JFlex" withSubpackages="true" static="false"/>
<package name="jj2000" withSubpackages="true" static="false" /> <package name="jj2000" withSubpackages="true" static="false"/>
<package name="jline" withSubpackages="true" static="false" /> <package name="jline" withSubpackages="true" static="false"/>
<package name="jp" withSubpackages="true" static="false" /> <package name="jp" withSubpackages="true" static="false"/>
<package name="JSci" withSubpackages="true" static="false" /> <package name="JSci" withSubpackages="true" static="false"/>
<package name="jsr166y" withSubpackages="true" static="false" /> <package name="jsr166y" withSubpackages="true" static="false"/>
<package name="junit" withSubpackages="true" static="false" /> <package name="junit" withSubpackages="true" static="false"/>
<package name="jxl" withSubpackages="true" static="false" /> <package name="jxl" withSubpackages="true" static="false"/>
<package name="jxxload_help" withSubpackages="true" static="false" /> <package name="jxxload_help" withSubpackages="true" static="false"/>
<package name="kawa" withSubpackages="true" static="false" /> <package name="kawa" withSubpackages="true" static="false"/>
<package name="kea" withSubpackages="true" static="false" /> <package name="kea" withSubpackages="true" static="false"/>
<package name="libcore" withSubpackages="true" static="false" /> <package name="libcore" withSubpackages="true" static="false"/>
<package name="libsvm" withSubpackages="true" static="false" /> <package name="libsvm" withSubpackages="true" static="false"/>
<package name="lti" withSubpackages="true" static="false" /> <package name="lti" withSubpackages="true" static="false"/>
<package name="memetic" withSubpackages="true" static="false" /> <package name="memetic" withSubpackages="true" static="false"/>
<package name="mt" withSubpackages="true" static="false" /> <package name="mt" withSubpackages="true" static="false"/>
<package name="mx4j" withSubpackages="true" static="false" /> <package name="mx4j" withSubpackages="true" static="false"/>
<package name="net" withSubpackages="true" static="false" /> <package name="net" withSubpackages="true" static="false"/>
<package name="netscape" withSubpackages="true" static="false" /> <package name="netscape" withSubpackages="true" static="false"/>
<package name="nl" withSubpackages="true" static="false" /> <package name="nl" withSubpackages="true" static="false"/>
<package name="nu" withSubpackages="true" static="false" /> <package name="nu" withSubpackages="true" static="false"/>
<package name="oauth" withSubpackages="true" static="false" /> <package name="oauth" withSubpackages="true" static="false"/>
<package name="ognl" withSubpackages="true" static="false" /> <package name="ognl" withSubpackages="true" static="false"/>
<package name="opennlp" withSubpackages="true" static="false" /> <package name="opennlp" withSubpackages="true" static="false"/>
<package name="oracle" withSubpackages="true" static="false" /> <package name="oracle" withSubpackages="true" static="false"/>
<package name="org" withSubpackages="true" static="false" /> <package name="org" withSubpackages="true" static="false"/>
<package name="penn2dg" withSubpackages="true" static="false" /> <package name="penn2dg" withSubpackages="true" static="false"/>
<package name="pennconverter" withSubpackages="true" static="false" /> <package name="pennconverter" withSubpackages="true" static="false"/>
<package name="pl" withSubpackages="true" static="false" /> <package name="pl" withSubpackages="true" static="false"/>
<package name="prefuse" withSubpackages="true" static="false" /> <package name="prefuse" withSubpackages="true" static="false"/>
<package name="proguard" withSubpackages="true" static="false" /> <package name="proguard" withSubpackages="true" static="false"/>
<package name="repackage" withSubpackages="true" static="false" /> <package name="repackage" withSubpackages="true" static="false"/>
<package name="scm" withSubpackages="true" static="false" /> <package name="scm" withSubpackages="true" static="false"/>
<package name="se" withSubpackages="true" static="false" /> <package name="se" withSubpackages="true" static="false"/>
<package name="serp" withSubpackages="true" static="false" /> <package name="serp" withSubpackages="true" static="false"/>
<package name="simple" withSubpackages="true" static="false" /> <package name="simple" withSubpackages="true" static="false"/>
<package name="soot" withSubpackages="true" static="false" /> <package name="soot" withSubpackages="true" static="false"/>
<package name="sqlj" withSubpackages="true" static="false" /> <package name="sqlj" withSubpackages="true" static="false"/>
<package name="src" withSubpackages="true" static="false" /> <package name="src" withSubpackages="true" static="false"/>
<package name="ssa" withSubpackages="true" static="false" /> <package name="ssa" withSubpackages="true" static="false"/>
<package name="sun" withSubpackages="true" static="false" /> <package name="sun" withSubpackages="true" static="false"/>
<package name="sunlabs" withSubpackages="true" static="false" /> <package name="sunlabs" withSubpackages="true" static="false"/>
<package name="tcl" withSubpackages="true" static="false" /> <package name="tcl" withSubpackages="true" static="false"/>
<package name="testdata" withSubpackages="true" static="false" /> <package name="testdata" withSubpackages="true" static="false"/>
<package name="testshell" withSubpackages="true" static="false" /> <package name="testshell" withSubpackages="true" static="false"/>
<package name="testsuite" withSubpackages="true" static="false" /> <package name="testsuite" withSubpackages="true" static="false"/>
<package name="twitter4j" withSubpackages="true" static="false" /> <package name="twitter4j" withSubpackages="true" static="false"/>
<package name="uk" withSubpackages="true" static="false" /> <package name="uk" withSubpackages="true" static="false"/>
<package name="ViolinStrings" withSubpackages="true" static="false" /> <package name="ViolinStrings" withSubpackages="true" static="false"/>
<package name="weka" withSubpackages="true" static="false" /> <package name="weka" withSubpackages="true" static="false"/>
<package name="wet" withSubpackages="true" static="false" /> <package name="wet" withSubpackages="true" static="false"/>
<package name="winstone" withSubpackages="true" static="false" /> <package name="winstone" withSubpackages="true" static="false"/>
<package name="woolfel" withSubpackages="true" static="false" /> <package name="woolfel" withSubpackages="true" static="false"/>
<package name="wowza" withSubpackages="true" static="false" /> <package name="wowza" withSubpackages="true" static="false"/>
<emptyLine /> <emptyLine/>
<package name="java" withSubpackages="true" static="false" /> <package name="java" withSubpackages="true" static="false"/>
<package name="javax" withSubpackages="true" static="false" /> <package name="javax" withSubpackages="true" static="false"/>
<package name="" withSubpackages="true" static="false" /> <package name="" withSubpackages="true" static="false"/>
</value> </value>
</option> </option>
<option name="STATIC_METHODS_ORDER_WEIGHT" value="5" /> <option name="STATIC_METHODS_ORDER_WEIGHT" value="5"/>
<option name="METHODS_ORDER_WEIGHT" value="4" /> <option name="METHODS_ORDER_WEIGHT" value="4"/>
<option name="RIGHT_MARGIN" value="100" /> <option name="RIGHT_MARGIN" value="100"/>
<option name="JD_ALIGN_PARAM_COMMENTS" value="false" /> <option name="JD_ALIGN_PARAM_COMMENTS" value="false"/>
<option name="JD_ALIGN_EXCEPTION_COMMENTS" value="false" /> <option name="JD_ALIGN_EXCEPTION_COMMENTS" value="false"/>
<option name="JD_ADD_BLANK_AFTER_DESCRIPTION" value="false" /> <option name="JD_ADD_BLANK_AFTER_DESCRIPTION" value="false"/>
<option name="JD_P_AT_EMPTY_LINES" value="false" /> <option name="JD_P_AT_EMPTY_LINES" value="false"/>
<option name="JD_KEEP_EMPTY_PARAMETER" value="false" /> <option name="JD_KEEP_EMPTY_PARAMETER" value="false"/>
<option name="JD_KEEP_EMPTY_EXCEPTION" value="false" /> <option name="JD_KEEP_EMPTY_EXCEPTION" value="false"/>
<option name="JD_KEEP_EMPTY_RETURN" value="false" /> <option name="JD_KEEP_EMPTY_RETURN" value="false"/>
<option name="HTML_KEEP_BLANK_LINES" value="1" /> <option name="HTML_KEEP_BLANK_LINES" value="1"/>
<option name="HTML_ALIGN_TEXT" value="true" /> <option name="HTML_ALIGN_TEXT" value="true"/>
<option name="KEEP_LINE_BREAKS" value="false" /> <option name="KEEP_LINE_BREAKS" value="false"/>
<option name="KEEP_FIRST_COLUMN_COMMENT" value="false" /> <option name="KEEP_FIRST_COLUMN_COMMENT" value="false"/>
<option name="KEEP_CONTROL_STATEMENT_IN_ONE_LINE" value="false" /> <option name="KEEP_CONTROL_STATEMENT_IN_ONE_LINE" value="false"/>
<option name="KEEP_BLANK_LINES_IN_DECLARATIONS" value="1" /> <option name="KEEP_BLANK_LINES_IN_DECLARATIONS" value="1"/>
<option name="KEEP_BLANK_LINES_IN_CODE" value="1" /> <option name="KEEP_BLANK_LINES_IN_CODE" value="1"/>
<option name="KEEP_BLANK_LINES_BEFORE_RBRACE" value="1" /> <option name="KEEP_BLANK_LINES_BEFORE_RBRACE" value="1"/>
<option name="BLANK_LINES_AROUND_CLASS" value="0" /> <option name="BLANK_LINES_AROUND_CLASS" value="0"/>
<option name="BLANK_LINES_AROUND_FIELD" value="1" /> <option name="BLANK_LINES_AROUND_FIELD" value="1"/>
<option name="BLANK_LINES_AFTER_CLASS_HEADER" value="1" /> <option name="BLANK_LINES_AFTER_CLASS_HEADER" value="1"/>
<option name="BRACE_STYLE" value="2" /> <option name="BRACE_STYLE" value="2"/>
<option name="CLASS_BRACE_STYLE" value="2" /> <option name="CLASS_BRACE_STYLE" value="2"/>
<option name="METHOD_BRACE_STYLE" value="2" /> <option name="METHOD_BRACE_STYLE" value="2"/>
<option name="ELSE_ON_NEW_LINE" value="true" /> <option name="ELSE_ON_NEW_LINE" value="true"/>
<option name="WHILE_ON_NEW_LINE" value="true" /> <option name="WHILE_ON_NEW_LINE" value="true"/>
<option name="CATCH_ON_NEW_LINE" value="true" /> <option name="CATCH_ON_NEW_LINE" value="true"/>
<option name="FINALLY_ON_NEW_LINE" value="true" /> <option name="FINALLY_ON_NEW_LINE" value="true"/>
<option name="ALIGN_MULTILINE_PARAMETERS_IN_CALLS" value="true" /> <option name="ALIGN_MULTILINE_PARAMETERS_IN_CALLS" value="true"/>
<option name="ALIGN_MULTILINE_BINARY_OPERATION" value="true" /> <option name="ALIGN_MULTILINE_BINARY_OPERATION" value="true"/>
<option name="ALIGN_MULTILINE_ASSIGNMENT" value="true" /> <option name="ALIGN_MULTILINE_ASSIGNMENT" value="true"/>
<option name="ALIGN_MULTILINE_TERNARY_OPERATION" value="true" /> <option name="ALIGN_MULTILINE_TERNARY_OPERATION" value="true"/>
<option name="ALIGN_MULTILINE_THROWS_LIST" value="true" /> <option name="ALIGN_MULTILINE_THROWS_LIST" value="true"/>
<option name="ALIGN_MULTILINE_EXTENDS_LIST" value="true" /> <option name="ALIGN_MULTILINE_EXTENDS_LIST" value="true"/>
<option name="ALIGN_MULTILINE_PARENTHESIZED_EXPRESSION" value="true" /> <option name="ALIGN_MULTILINE_PARENTHESIZED_EXPRESSION" value="true"/>
<option name="ALIGN_MULTILINE_ARRAY_INITIALIZER_EXPRESSION" value="true" /> <option name="ALIGN_MULTILINE_ARRAY_INITIALIZER_EXPRESSION" value="true"/>
<option name="SPACE_AFTER_TYPE_CAST" value="false" /> <option name="SPACE_AFTER_TYPE_CAST" value="false"/>
<option name="SPACE_BEFORE_IF_PARENTHESES" value="false" /> <option name="SPACE_BEFORE_IF_PARENTHESES" value="false"/>
<option name="SPACE_BEFORE_WHILE_PARENTHESES" value="false" /> <option name="SPACE_BEFORE_WHILE_PARENTHESES" value="false"/>
<option name="SPACE_BEFORE_FOR_PARENTHESES" value="false" /> <option name="SPACE_BEFORE_FOR_PARENTHESES" value="false"/>
<option name="SPACE_BEFORE_CATCH_PARENTHESES" value="false" /> <option name="SPACE_BEFORE_CATCH_PARENTHESES" value="false"/>
<option name="SPACE_BEFORE_SWITCH_PARENTHESES" value="false" /> <option name="SPACE_BEFORE_SWITCH_PARENTHESES" value="false"/>
<option name="SPACE_BEFORE_SYNCHRONIZED_PARENTHESES" value="false" /> <option name="SPACE_BEFORE_SYNCHRONIZED_PARENTHESES" value="false"/>
<option name="CALL_PARAMETERS_WRAP" value="1" /> <option name="CALL_PARAMETERS_WRAP" value="1"/>
<option name="CALL_PARAMETERS_LPAREN_ON_NEXT_LINE" value="true" /> <option name="CALL_PARAMETERS_LPAREN_ON_NEXT_LINE" value="true"/>
<option name="METHOD_PARAMETERS_WRAP" value="1" /> <option name="METHOD_PARAMETERS_WRAP" value="1"/>
<option name="EXTENDS_LIST_WRAP" value="1" /> <option name="EXTENDS_LIST_WRAP" value="1"/>
<option name="THROWS_LIST_WRAP" value="1" /> <option name="THROWS_LIST_WRAP" value="1"/>
<option name="EXTENDS_KEYWORD_WRAP" value="1" /> <option name="EXTENDS_KEYWORD_WRAP" value="1"/>
<option name="THROWS_KEYWORD_WRAP" value="1" /> <option name="THROWS_KEYWORD_WRAP" value="1"/>
<option name="METHOD_CALL_CHAIN_WRAP" value="1" /> <option name="METHOD_CALL_CHAIN_WRAP" value="1"/>
<option name="BINARY_OPERATION_WRAP" value="1" /> <option name="BINARY_OPERATION_WRAP" value="1"/>
<option name="BINARY_OPERATION_SIGN_ON_NEXT_LINE" value="true" /> <option name="BINARY_OPERATION_SIGN_ON_NEXT_LINE" value="true"/>
<option name="TERNARY_OPERATION_WRAP" value="1" /> <option name="TERNARY_OPERATION_WRAP" value="1"/>
<option name="TERNARY_OPERATION_SIGNS_ON_NEXT_LINE" value="true" /> <option name="TERNARY_OPERATION_SIGNS_ON_NEXT_LINE" value="true"/>
<option name="FOR_STATEMENT_WRAP" value="1" /> <option name="FOR_STATEMENT_WRAP" value="1"/>
<option name="ARRAY_INITIALIZER_WRAP" value="1" /> <option name="ARRAY_INITIALIZER_WRAP" value="1"/>
<option name="ASSIGNMENT_WRAP" value="5" /> <option name="ASSIGNMENT_WRAP" value="5"/>
<option name="WRAP_COMMENTS" value="true" /> <option name="WRAP_COMMENTS" value="true"/>
<option name="IF_BRACE_FORCE" value="3" /> <option name="IF_BRACE_FORCE" value="3"/>
<option name="DOWHILE_BRACE_FORCE" value="3" /> <option name="DOWHILE_BRACE_FORCE" value="3"/>
<option name="WHILE_BRACE_FORCE" value="3" /> <option name="WHILE_BRACE_FORCE" value="3"/>
<option name="FOR_BRACE_FORCE" value="3" /> <option name="FOR_BRACE_FORCE" value="3"/>
<JavaCodeStyleSettings> <JavaCodeStyleSettings>
<option name="DO_NOT_WRAP_AFTER_SINGLE_ANNOTATION" value="true" /> <option name="DO_NOT_WRAP_AFTER_SINGLE_ANNOTATION" value="true"/>
<option name="CLASS_NAMES_IN_JAVADOC" value="3" /> <option name="CLASS_NAMES_IN_JAVADOC" value="3"/>
</JavaCodeStyleSettings> </JavaCodeStyleSettings>
<MarkdownNavigatorCodeStyleSettings> <MarkdownNavigatorCodeStyleSettings>
<option name="RIGHT_MARGIN" value="72" /> <option name="RIGHT_MARGIN" value="72"/>
</MarkdownNavigatorCodeStyleSettings> </MarkdownNavigatorCodeStyleSettings>
<XML> <XML>
<option name="XML_KEEP_BLANK_LINES" value="1" /> <option name="XML_KEEP_BLANK_LINES" value="1"/>
<option name="XML_LEGACY_SETTINGS_IMPORTED" value="true" /> <option name="XML_LEGACY_SETTINGS_IMPORTED" value="true"/>
</XML> </XML>
<ADDITIONAL_INDENT_OPTIONS fileType="haml"> <ADDITIONAL_INDENT_OPTIONS fileType="haml">
<option name="INDENT_SIZE" value="2" /> <option name="INDENT_SIZE" value="2"/>
</ADDITIONAL_INDENT_OPTIONS> </ADDITIONAL_INDENT_OPTIONS>
<ADDITIONAL_INDENT_OPTIONS fileType="java"> <ADDITIONAL_INDENT_OPTIONS fileType="java">
<option name="INDENT_SIZE" value="2" /> <option name="INDENT_SIZE" value="2"/>
<option name="CONTINUATION_INDENT_SIZE" value="4" /> <option name="CONTINUATION_INDENT_SIZE" value="4"/>
<option name="TAB_SIZE" value="8" /> <option name="TAB_SIZE" value="8"/>
</ADDITIONAL_INDENT_OPTIONS> </ADDITIONAL_INDENT_OPTIONS>
<ADDITIONAL_INDENT_OPTIONS fileType="js"> <ADDITIONAL_INDENT_OPTIONS fileType="js">
<option name="CONTINUATION_INDENT_SIZE" value="4" /> <option name="CONTINUATION_INDENT_SIZE" value="4"/>
</ADDITIONAL_INDENT_OPTIONS> </ADDITIONAL_INDENT_OPTIONS>
<ADDITIONAL_INDENT_OPTIONS fileType="sass"> <ADDITIONAL_INDENT_OPTIONS fileType="sass">
<option name="INDENT_SIZE" value="2" /> <option name="INDENT_SIZE" value="2"/>
</ADDITIONAL_INDENT_OPTIONS> </ADDITIONAL_INDENT_OPTIONS>
<ADDITIONAL_INDENT_OPTIONS fileType="yml"> <ADDITIONAL_INDENT_OPTIONS fileType="yml">
<option name="INDENT_SIZE" value="2" /> <option name="INDENT_SIZE" value="2"/>
</ADDITIONAL_INDENT_OPTIONS> </ADDITIONAL_INDENT_OPTIONS>
<codeStyleSettings language="ECMA Script Level 4"> <codeStyleSettings language="ECMA Script Level 4">
<option name="KEEP_BLANK_LINES_IN_CODE" value="1" /> <option name="KEEP_BLANK_LINES_IN_CODE" value="1"/>
<option name="ALIGN_MULTILINE_PARAMETERS_IN_CALLS" value="true" /> <option name="ALIGN_MULTILINE_PARAMETERS_IN_CALLS" value="true"/>
<option name="ALIGN_MULTILINE_BINARY_OPERATION" value="true" /> <option name="ALIGN_MULTILINE_BINARY_OPERATION" value="true"/>
<option name="ALIGN_MULTILINE_TERNARY_OPERATION" value="true" /> <option name="ALIGN_MULTILINE_TERNARY_OPERATION" value="true"/>
<option name="ALIGN_MULTILINE_EXTENDS_LIST" value="true" /> <option name="ALIGN_MULTILINE_EXTENDS_LIST" value="true"/>
<option name="ALIGN_MULTILINE_ARRAY_INITIALIZER_EXPRESSION" value="true" /> <option name="ALIGN_MULTILINE_ARRAY_INITIALIZER_EXPRESSION" value="true"/>
<option name="CALL_PARAMETERS_WRAP" value="1" /> <option name="CALL_PARAMETERS_WRAP" value="1"/>
<option name="METHOD_PARAMETERS_WRAP" value="1" /> <option name="METHOD_PARAMETERS_WRAP" value="1"/>
<option name="EXTENDS_LIST_WRAP" value="1" /> <option name="EXTENDS_LIST_WRAP" value="1"/>
<option name="EXTENDS_KEYWORD_WRAP" value="1" /> <option name="EXTENDS_KEYWORD_WRAP" value="1"/>
<option name="METHOD_CALL_CHAIN_WRAP" value="1" /> <option name="METHOD_CALL_CHAIN_WRAP" value="1"/>
<option name="BINARY_OPERATION_WRAP" value="1" /> <option name="BINARY_OPERATION_WRAP" value="1"/>
<option name="BINARY_OPERATION_SIGN_ON_NEXT_LINE" value="true" /> <option name="BINARY_OPERATION_SIGN_ON_NEXT_LINE" value="true"/>
<option name="TERNARY_OPERATION_WRAP" value="1" /> <option name="TERNARY_OPERATION_WRAP" value="1"/>
<option name="TERNARY_OPERATION_SIGNS_ON_NEXT_LINE" value="true" /> <option name="TERNARY_OPERATION_SIGNS_ON_NEXT_LINE" value="true"/>
<option name="FOR_STATEMENT_WRAP" value="1" /> <option name="FOR_STATEMENT_WRAP" value="1"/>
<option name="ARRAY_INITIALIZER_WRAP" value="1" /> <option name="ARRAY_INITIALIZER_WRAP" value="1"/>
<option name="ASSIGNMENT_WRAP" value="5" /> <option name="ASSIGNMENT_WRAP" value="5"/>
<option name="WRAP_COMMENTS" value="true" /> <option name="WRAP_COMMENTS" value="true"/>
<option name="IF_BRACE_FORCE" value="3" /> <option name="IF_BRACE_FORCE" value="3"/>
<option name="DOWHILE_BRACE_FORCE" value="3" /> <option name="DOWHILE_BRACE_FORCE" value="3"/>
<option name="WHILE_BRACE_FORCE" value="3" /> <option name="WHILE_BRACE_FORCE" value="3"/>
<option name="FOR_BRACE_FORCE" value="3" /> <option name="FOR_BRACE_FORCE" value="3"/>
<option name="PARENT_SETTINGS_INSTALLED" value="true" /> <option name="PARENT_SETTINGS_INSTALLED" value="true"/>
</codeStyleSettings> </codeStyleSettings>
<codeStyleSettings language="JAVA"> <codeStyleSettings language="JAVA">
<option name="RIGHT_MARGIN" value="100" /> <option name="RIGHT_MARGIN" value="100"/>
<option name="KEEP_CONTROL_STATEMENT_IN_ONE_LINE" value="false" /> <option name="KEEP_CONTROL_STATEMENT_IN_ONE_LINE" value="false"/>
<option name="KEEP_BLANK_LINES_IN_CODE" value="1" /> <option name="KEEP_BLANK_LINES_IN_CODE" value="1"/>
<option name="CALL_PARAMETERS_WRAP" value="1" /> <option name="CALL_PARAMETERS_WRAP" value="1"/>
<option name="METHOD_PARAMETERS_WRAP" value="1" /> <option name="METHOD_PARAMETERS_WRAP" value="1"/>
<option name="EXTENDS_LIST_WRAP" value="1" /> <option name="EXTENDS_LIST_WRAP" value="1"/>
<option name="THROWS_LIST_WRAP" value="1" /> <option name="THROWS_LIST_WRAP" value="1"/>
<option name="EXTENDS_KEYWORD_WRAP" value="1" /> <option name="EXTENDS_KEYWORD_WRAP" value="1"/>
<option name="THROWS_KEYWORD_WRAP" value="1" /> <option name="THROWS_KEYWORD_WRAP" value="1"/>
<option name="METHOD_CALL_CHAIN_WRAP" value="1" /> <option name="METHOD_CALL_CHAIN_WRAP" value="1"/>
<option name="BINARY_OPERATION_WRAP" value="1" /> <option name="BINARY_OPERATION_WRAP" value="1"/>
<option name="BINARY_OPERATION_SIGN_ON_NEXT_LINE" value="true" /> <option name="BINARY_OPERATION_SIGN_ON_NEXT_LINE" value="true"/>
<option name="TERNARY_OPERATION_WRAP" value="1" /> <option name="TERNARY_OPERATION_WRAP" value="1"/>
<option name="TERNARY_OPERATION_SIGNS_ON_NEXT_LINE" value="true" /> <option name="TERNARY_OPERATION_SIGNS_ON_NEXT_LINE" value="true"/>
<option name="FOR_STATEMENT_WRAP" value="1" /> <option name="FOR_STATEMENT_WRAP" value="1"/>
<option name="ARRAY_INITIALIZER_WRAP" value="1" /> <option name="ARRAY_INITIALIZER_WRAP" value="1"/>
<option name="ASSIGNMENT_WRAP" value="5" /> <option name="ASSIGNMENT_WRAP" value="5"/>
<option name="IF_BRACE_FORCE" value="3" /> <option name="IF_BRACE_FORCE" value="3"/>
<option name="DOWHILE_BRACE_FORCE" value="3" /> <option name="DOWHILE_BRACE_FORCE" value="3"/>
<option name="WHILE_BRACE_FORCE" value="3" /> <option name="WHILE_BRACE_FORCE" value="3"/>
<option name="FOR_BRACE_FORCE" value="3" /> <option name="FOR_BRACE_FORCE" value="3"/>
<indentOptions> <indentOptions>
<option name="INDENT_SIZE" value="2" /> <option name="INDENT_SIZE" value="2"/>
<option name="CONTINUATION_INDENT_SIZE" value="4" /> <option name="CONTINUATION_INDENT_SIZE" value="4"/>
<option name="TAB_SIZE" value="8" /> <option name="TAB_SIZE" value="8"/>
</indentOptions> </indentOptions>
</codeStyleSettings> </codeStyleSettings>
<codeStyleSettings language="JavaScript"> <codeStyleSettings language="JavaScript">
<option name="KEEP_BLANK_LINES_IN_CODE" value="1" /> <option name="KEEP_BLANK_LINES_IN_CODE" value="1"/>
<option name="ALIGN_MULTILINE_PARAMETERS_IN_CALLS" value="true" /> <option name="ALIGN_MULTILINE_PARAMETERS_IN_CALLS" value="true"/>
<option name="ALIGN_MULTILINE_BINARY_OPERATION" value="true" /> <option name="ALIGN_MULTILINE_BINARY_OPERATION" value="true"/>
<option name="ALIGN_MULTILINE_TERNARY_OPERATION" value="true" /> <option name="ALIGN_MULTILINE_TERNARY_OPERATION" value="true"/>
<option name="ALIGN_MULTILINE_ARRAY_INITIALIZER_EXPRESSION" value="true" /> <option name="ALIGN_MULTILINE_ARRAY_INITIALIZER_EXPRESSION" value="true"/>
<option name="CALL_PARAMETERS_WRAP" value="1" /> <option name="CALL_PARAMETERS_WRAP" value="1"/>
<option name="METHOD_PARAMETERS_WRAP" value="1" /> <option name="METHOD_PARAMETERS_WRAP" value="1"/>
<option name="METHOD_CALL_CHAIN_WRAP" value="1" /> <option name="METHOD_CALL_CHAIN_WRAP" value="1"/>
<option name="BINARY_OPERATION_WRAP" value="1" /> <option name="BINARY_OPERATION_WRAP" value="1"/>
<option name="BINARY_OPERATION_SIGN_ON_NEXT_LINE" value="true" /> <option name="BINARY_OPERATION_SIGN_ON_NEXT_LINE" value="true"/>
<option name="TERNARY_OPERATION_WRAP" value="1" /> <option name="TERNARY_OPERATION_WRAP" value="1"/>
<option name="TERNARY_OPERATION_SIGNS_ON_NEXT_LINE" value="true" /> <option name="TERNARY_OPERATION_SIGNS_ON_NEXT_LINE" value="true"/>
<option name="FOR_STATEMENT_WRAP" value="1" /> <option name="FOR_STATEMENT_WRAP" value="1"/>
<option name="ARRAY_INITIALIZER_WRAP" value="1" /> <option name="ARRAY_INITIALIZER_WRAP" value="1"/>
<option name="ASSIGNMENT_WRAP" value="5" /> <option name="ASSIGNMENT_WRAP" value="5"/>
<option name="WRAP_COMMENTS" value="true" /> <option name="WRAP_COMMENTS" value="true"/>
<option name="IF_BRACE_FORCE" value="3" /> <option name="IF_BRACE_FORCE" value="3"/>
<option name="DOWHILE_BRACE_FORCE" value="3" /> <option name="DOWHILE_BRACE_FORCE" value="3"/>
<option name="WHILE_BRACE_FORCE" value="3" /> <option name="WHILE_BRACE_FORCE" value="3"/>
<option name="FOR_BRACE_FORCE" value="3" /> <option name="FOR_BRACE_FORCE" value="3"/>
<option name="PARENT_SETTINGS_INSTALLED" value="true" /> <option name="PARENT_SETTINGS_INSTALLED" value="true"/>
</codeStyleSettings> </codeStyleSettings>
<codeStyleSettings language="PHP"> <codeStyleSettings language="PHP">
<option name="KEEP_CONTROL_STATEMENT_IN_ONE_LINE" value="false" /> <option name="KEEP_CONTROL_STATEMENT_IN_ONE_LINE" value="false"/>
<option name="KEEP_BLANK_LINES_IN_CODE" value="1" /> <option name="KEEP_BLANK_LINES_IN_CODE" value="1"/>
<option name="BLANK_LINES_AFTER_CLASS_HEADER" value="1" /> <option name="BLANK_LINES_AFTER_CLASS_HEADER" value="1"/>
<option name="ALIGN_MULTILINE_ASSIGNMENT" value="true" /> <option name="ALIGN_MULTILINE_ASSIGNMENT" value="true"/>
<option name="ALIGN_MULTILINE_TERNARY_OPERATION" value="true" /> <option name="ALIGN_MULTILINE_TERNARY_OPERATION" value="true"/>
<option name="ALIGN_MULTILINE_THROWS_LIST" value="true" /> <option name="ALIGN_MULTILINE_THROWS_LIST" value="true"/>
<option name="ALIGN_MULTILINE_EXTENDS_LIST" value="true" /> <option name="ALIGN_MULTILINE_EXTENDS_LIST" value="true"/>
<option name="ALIGN_MULTILINE_PARENTHESIZED_EXPRESSION" value="true" /> <option name="ALIGN_MULTILINE_PARENTHESIZED_EXPRESSION" value="true"/>
<option name="CALL_PARAMETERS_WRAP" value="1" /> <option name="CALL_PARAMETERS_WRAP" value="1"/>
<option name="METHOD_PARAMETERS_WRAP" value="1" /> <option name="METHOD_PARAMETERS_WRAP" value="1"/>
<option name="EXTENDS_LIST_WRAP" value="1" /> <option name="EXTENDS_LIST_WRAP" value="1"/>
<option name="THROWS_LIST_WRAP" value="1" /> <option name="THROWS_LIST_WRAP" value="1"/>
<option name="EXTENDS_KEYWORD_WRAP" value="1" /> <option name="EXTENDS_KEYWORD_WRAP" value="1"/>
<option name="THROWS_KEYWORD_WRAP" value="1" /> <option name="THROWS_KEYWORD_WRAP" value="1"/>
<option name="METHOD_CALL_CHAIN_WRAP" value="1" /> <option name="METHOD_CALL_CHAIN_WRAP" value="1"/>
<option name="BINARY_OPERATION_WRAP" value="1" /> <option name="BINARY_OPERATION_WRAP" value="1"/>
<option name="BINARY_OPERATION_SIGN_ON_NEXT_LINE" value="true" /> <option name="BINARY_OPERATION_SIGN_ON_NEXT_LINE" value="true"/>
<option name="TERNARY_OPERATION_WRAP" value="1" /> <option name="TERNARY_OPERATION_WRAP" value="1"/>
<option name="TERNARY_OPERATION_SIGNS_ON_NEXT_LINE" value="true" /> <option name="TERNARY_OPERATION_SIGNS_ON_NEXT_LINE" value="true"/>
<option name="FOR_STATEMENT_WRAP" value="1" /> <option name="FOR_STATEMENT_WRAP" value="1"/>
<option name="ARRAY_INITIALIZER_WRAP" value="1" /> <option name="ARRAY_INITIALIZER_WRAP" value="1"/>
<option name="ASSIGNMENT_WRAP" value="5" /> <option name="ASSIGNMENT_WRAP" value="5"/>
<option name="WRAP_COMMENTS" value="true" /> <option name="WRAP_COMMENTS" value="true"/>
<option name="IF_BRACE_FORCE" value="3" /> <option name="IF_BRACE_FORCE" value="3"/>
<option name="DOWHILE_BRACE_FORCE" value="3" /> <option name="DOWHILE_BRACE_FORCE" value="3"/>
<option name="WHILE_BRACE_FORCE" value="3" /> <option name="WHILE_BRACE_FORCE" value="3"/>
<option name="FOR_BRACE_FORCE" value="3" /> <option name="FOR_BRACE_FORCE" value="3"/>
<option name="PARENT_SETTINGS_INSTALLED" value="true" /> <option name="PARENT_SETTINGS_INSTALLED" value="true"/>
<indentOptions> <indentOptions>
<option name="INDENT_SIZE" value="4" /> <option name="INDENT_SIZE" value="4"/>
<option name="CONTINUATION_INDENT_SIZE" value="8" /> <option name="CONTINUATION_INDENT_SIZE" value="8"/>
<option name="TAB_SIZE" value="4" /> <option name="TAB_SIZE" value="4"/>
<option name="USE_TAB_CHARACTER" value="false" /> <option name="USE_TAB_CHARACTER" value="false"/>
<option name="SMART_TABS" value="false" /> <option name="SMART_TABS" value="false"/>
<option name="LABEL_INDENT_SIZE" value="0" /> <option name="LABEL_INDENT_SIZE" value="0"/>
<option name="LABEL_INDENT_ABSOLUTE" value="false" /> <option name="LABEL_INDENT_ABSOLUTE" value="false"/>
<option name="USE_RELATIVE_INDENTS" value="false" /> <option name="USE_RELATIVE_INDENTS" value="false"/>
</indentOptions> </indentOptions>
</codeStyleSettings> </codeStyleSettings>
</code_scheme> </code_scheme>
\ No newline at end of file
...@@ -6,21 +6,19 @@ import io.realm.RealmObject; ...@@ -6,21 +6,19 @@ import io.realm.RealmObject;
import io.realm.RealmResults; import io.realm.RealmResults;
abstract class AbstractRealmResultsObserver<T extends RealmObject> { abstract class AbstractRealmResultsObserver<T extends RealmObject> {
private final RealmHelper helper;
protected Realm realm; protected Realm realm;
private RealmChangeListener<RealmResults<T>> listener; private RealmChangeListener<RealmResults<T>> listener;
protected abstract RealmResults<T> queryItems(Realm realm);
protected abstract RealmChangeListener<RealmResults<T>> getListener();
private RealmResults<T> results; private RealmResults<T> results;
private final RealmHelper helper;
protected AbstractRealmResultsObserver(RealmHelper helper) { protected AbstractRealmResultsObserver(RealmHelper helper) {
this.helper = helper; this.helper = helper;
} }
protected abstract RealmResults<T> queryItems(Realm realm);
protected abstract RealmChangeListener<RealmResults<T>> getListener();
public void sub() { public void sub() {
unsub(); unsub();
......
...@@ -11,6 +11,7 @@ import android.widget.TextView; ...@@ -11,6 +11,7 @@ import android.widget.TextView;
import io.realm.Realm; import io.realm.Realm;
import io.realm.RealmObject; import io.realm.RealmObject;
import io.realm.RealmResults; import io.realm.RealmResults;
import java.util.Collections; import java.util.Collections;
import java.util.List; import java.util.List;
...@@ -18,6 +19,51 @@ import java.util.List; ...@@ -18,6 +19,51 @@ import java.util.List;
* ListAdapter for AutoCompleteTextView. * ListAdapter for AutoCompleteTextView.
*/ */
public abstract class RealmAutoCompleteAdapter<T extends RealmObject> extends ArrayAdapter<T> { public abstract class RealmAutoCompleteAdapter<T extends RealmObject> extends ArrayAdapter<T> {
private final int textViewResourceId;
private RealmHelper realmHelper;
private AutoCompleteFilter filter;
/**
* NOTE
* getStringForSelectedItem(T model) is automatically set to the TextView(id=textViewResourceId).
*/
protected RealmAutoCompleteAdapter(Context context, int resource, int textViewResourceId) {
super(context, resource, textViewResourceId);
this.textViewResourceId = textViewResourceId;
}
protected void filterList(List<T> items, String text) {
}
/*package*/ RealmAutoCompleteAdapter<T> initializeWith(RealmHelper realmHelper,
RealmFilter<T> itemFilter) {
this.realmHelper = realmHelper;
this.filter = new AutoCompleteFilter<T>(this, itemFilter);
return this;
}
@NonNull
@Override
public Filter getFilter() {
return filter;
}
@NonNull
@Override
public final View getView(int position, View convertView, @NonNull ViewGroup parent) {
View itemView = super.getView(position, convertView, parent);
T item = getItem(position);
TextView textView = (TextView) itemView.findViewById(textViewResourceId);
textView.setText(getStringForSelectedItem(item));
onBindItemView(itemView, item);
return itemView;
}
protected abstract void onBindItemView(View itemView, T model);
protected abstract String getStringForSelectedItem(T model);
public interface Constructor<T extends RealmObject> { public interface Constructor<T extends RealmObject> {
RealmAutoCompleteAdapter<T> getNewInstance(Context context); RealmAutoCompleteAdapter<T> getNewInstance(Context context);
} }
...@@ -26,9 +72,6 @@ public abstract class RealmAutoCompleteAdapter<T extends RealmObject> extends Ar ...@@ -26,9 +72,6 @@ public abstract class RealmAutoCompleteAdapter<T extends RealmObject> extends Ar
RealmResults<T> filterItems(Realm realm, String text); RealmResults<T> filterItems(Realm realm, String text);
} }
protected void filterList(List<T> items, String text) {
}
/** /**
* Filter for completion. * Filter for completion.
*/ */
...@@ -36,12 +79,14 @@ public abstract class RealmAutoCompleteAdapter<T extends RealmObject> extends Ar ...@@ -36,12 +79,14 @@ public abstract class RealmAutoCompleteAdapter<T extends RealmObject> extends Ar
private final RealmAutoCompleteAdapter<T> adapter; private final RealmAutoCompleteAdapter<T> adapter;
private final RealmFilter<T> realmFilter; private final RealmFilter<T> realmFilter;
/*package*/ AutoCompleteFilter(RealmAutoCompleteAdapter<T> adapter, RealmFilter<T> realmFilter) { /*package*/ AutoCompleteFilter(RealmAutoCompleteAdapter<T> adapter,
RealmFilter<T> realmFilter) {
this.adapter = adapter; this.adapter = adapter;
this.realmFilter = realmFilter; this.realmFilter = realmFilter;
} }
@Override protected FilterResults performFiltering(CharSequence charSequence) { @Override
protected FilterResults performFiltering(CharSequence charSequence) {
FilterResults results = new FilterResults(); FilterResults results = new FilterResults();
if (TextUtils.isEmpty(charSequence)) { if (TextUtils.isEmpty(charSequence)) {
results.values = Collections.emptyList(); results.values = Collections.emptyList();
...@@ -67,48 +112,9 @@ public abstract class RealmAutoCompleteAdapter<T extends RealmObject> extends Ar ...@@ -67,48 +112,9 @@ public abstract class RealmAutoCompleteAdapter<T extends RealmObject> extends Ar
} }
} }
@Override public CharSequence convertResultToString(Object resultValue) { @Override
public CharSequence convertResultToString(Object resultValue) {
return adapter.getStringForSelectedItem((T) resultValue); return adapter.getStringForSelectedItem((T) resultValue);
} }
} }
private RealmHelper realmHelper;
private AutoCompleteFilter filter;
private final int textViewResourceId;
/**
* NOTE
* getStringForSelectedItem(T model) is automatically set to the TextView(id=textViewResourceId).
*/
protected RealmAutoCompleteAdapter(Context context, int resource, int textViewResourceId) {
super(context, resource, textViewResourceId);
this.textViewResourceId = textViewResourceId;
}
/*package*/ RealmAutoCompleteAdapter<T> initializeWith(RealmHelper realmHelper,
RealmFilter<T> itemFilter) {
this.realmHelper = realmHelper;
this.filter = new AutoCompleteFilter<T>(this, itemFilter);
return this;
}
@NonNull
@Override public Filter getFilter() {
return filter;
}
@NonNull
@Override public final View getView(int position, View convertView, @NonNull ViewGroup parent) {
View itemView = super.getView(position, convertView, parent);
T item = getItem(position);
TextView textView = (TextView) itemView.findViewById(textViewResourceId);
textView.setText(getStringForSelectedItem(item));
onBindItemView(itemView, item);
return itemView;
}
protected abstract void onBindItemView(View itemView, T model);
protected abstract String getStringForSelectedItem(T model);
} }
...@@ -4,16 +4,17 @@ import android.annotation.SuppressLint; ...@@ -4,16 +4,17 @@ import android.annotation.SuppressLint;
import android.content.Context; import android.content.Context;
import android.os.Looper; import android.os.Looper;
import android.support.v7.widget.RecyclerView; import android.support.v7.widget.RecyclerView;
import bolts.Task;
import bolts.TaskCompletionSource;
import chat.rocket.android.log.RCLog;
import io.realm.Realm; import io.realm.Realm;
import io.realm.RealmConfiguration; import io.realm.RealmConfiguration;
import io.realm.RealmObject; import io.realm.RealmObject;
import io.realm.RealmResults; import io.realm.RealmResults;
import org.json.JSONException;
import java.util.Collections; import java.util.Collections;
import java.util.List; import java.util.List;
import org.json.JSONException; import bolts.Task;
import bolts.TaskCompletionSource;
import chat.rocket.android.log.RCLog;
@SuppressLint("NewApi") @SuppressLint("NewApi")
public class RealmHelper { public class RealmHelper {
...@@ -52,10 +53,6 @@ public class RealmHelper { ...@@ -52,10 +53,6 @@ public class RealmHelper {
} }
} }
public interface Transaction<T> {
T execute(Realm realm) throws JSONException;
}
public <T extends RealmObject> T executeTransactionForRead(Transaction<T> transaction) { public <T extends RealmObject> T executeTransactionForRead(Transaction<T> transaction) {
try (Realm realm = instance()) { try (Realm realm = instance()) {
T source = transaction.execute(realm); T source = transaction.execute(realm);
...@@ -159,4 +156,8 @@ public class RealmHelper { ...@@ -159,4 +156,8 @@ public class RealmHelper {
RealmAutoCompleteAdapter.Constructor constructor) { RealmAutoCompleteAdapter.Constructor constructor) {
return constructor.getNewInstance(context).initializeWith(this, filter); return constructor.getNewInstance(context).initializeWith(this, filter);
} }
public interface Transaction<T> {
T execute(Realm realm) throws JSONException;
}
} }
...@@ -4,18 +4,13 @@ import io.realm.Realm; ...@@ -4,18 +4,13 @@ import io.realm.Realm;
import io.realm.RealmChangeListener; import io.realm.RealmChangeListener;
import io.realm.RealmObject; import io.realm.RealmObject;
import io.realm.RealmResults; import io.realm.RealmResults;
import java.util.List; import java.util.List;
public class RealmListObserver<T extends RealmObject> extends AbstractRealmResultsObserver<T> { public class RealmListObserver<T extends RealmObject> extends AbstractRealmResultsObserver<T> {
public interface Query<T extends RealmObject> {
RealmResults<T> queryItems(Realm realm);
}
public interface OnUpdateListener<T extends RealmObject> {
void onUpdateResults(List<T> results);
}
private final Query<T> query; private final Query<T> query;
private OnUpdateListener<T> onUpdateListener; private OnUpdateListener<T> onUpdateListener;
private String previousResultsString;
/*package*/ RealmListObserver(RealmHelper helper, Query<T> query) { /*package*/ RealmListObserver(RealmHelper helper, Query<T> query) {
super(helper); super(helper);
...@@ -27,13 +22,13 @@ public class RealmListObserver<T extends RealmObject> extends AbstractRealmResul ...@@ -27,13 +22,13 @@ public class RealmListObserver<T extends RealmObject> extends AbstractRealmResul
return this; return this;
} }
@Override protected final RealmResults<T> queryItems(Realm realm) { @Override
protected final RealmResults<T> queryItems(Realm realm) {
return query.queryItems(realm); return query.queryItems(realm);
} }
private String previousResultsString; @Override
public final RealmChangeListener<RealmResults<T>> getListener() {
@Override public final RealmChangeListener<RealmResults<T>> getListener() {
return results -> { return results -> {
String currentResultString = results != null ? results.toString() : null; String currentResultString = results != null ? results.toString() : null;
if (previousResultsString != null && previousResultsString.equals(currentResultString)) { if (previousResultsString != null && previousResultsString.equals(currentResultString)) {
...@@ -45,4 +40,12 @@ public class RealmListObserver<T extends RealmObject> extends AbstractRealmResul ...@@ -45,4 +40,12 @@ public class RealmListObserver<T extends RealmObject> extends AbstractRealmResul
} }
}; };
} }
public interface Query<T extends RealmObject> {
RealmResults<T> queryItems(Realm realm);
}
public interface OnUpdateListener<T extends RealmObject> {
void onUpdateResults(List<T> results);
}
} }
\ No newline at end of file
...@@ -7,19 +7,12 @@ import android.view.LayoutInflater; ...@@ -7,19 +7,12 @@ import android.view.LayoutInflater;
import android.view.View; import android.view.View;
import android.view.ViewGroup; import android.view.ViewGroup;
import io.realm.RealmObject; import io.realm.RealmObject;
import java.util.List; import java.util.List;
public abstract class RealmModelListAdapter<T extends RealmObject, VM, public abstract class RealmModelListAdapter<T extends RealmObject, VM,
VH extends RealmModelViewHolder<VM>> extends RecyclerView.Adapter<VH> { VH extends RealmModelViewHolder<VM>> extends RecyclerView.Adapter<VH> {
public interface Constructor<T extends RealmObject, VM, VH extends RealmModelViewHolder<VM>> {
RealmModelListAdapter<T, VM, VH> getNewInstance(Context context);
}
public interface OnItemClickListener<VM> {
void onItemClick(VM model);
}
protected final LayoutInflater inflater; protected final LayoutInflater inflater;
private RealmListObserver<T> realmListObserver; private RealmListObserver<T> realmListObserver;
private List<VM> adapterData; private List<VM> adapterData;
...@@ -36,35 +29,41 @@ public abstract class RealmModelListAdapter<T extends RealmObject, VM, ...@@ -36,35 +29,41 @@ public abstract class RealmModelListAdapter<T extends RealmObject, VM,
return this; return this;
} }
@Override public void onAttachedToRecyclerView(RecyclerView recyclerView) { @Override
public void onAttachedToRecyclerView(RecyclerView recyclerView) {
super.onAttachedToRecyclerView(recyclerView); super.onAttachedToRecyclerView(recyclerView);
realmListObserver.sub(); realmListObserver.sub();
} }
@Override public void onDetachedFromRecyclerView(RecyclerView recyclerView) { @Override
public void onDetachedFromRecyclerView(RecyclerView recyclerView) {
realmListObserver.unsub(); realmListObserver.unsub();
super.onDetachedFromRecyclerView(recyclerView); super.onDetachedFromRecyclerView(recyclerView);
} }
protected abstract int getRealmModelViewType(VM model); protected abstract int getRealmModelViewType(VM model);
protected abstract @LayoutRes int getLayout(int viewType); protected abstract
@LayoutRes
int getLayout(int viewType);
protected abstract VH onCreateRealmModelViewHolder(int viewType, View itemView); protected abstract VH onCreateRealmModelViewHolder(int viewType, View itemView);
protected abstract List<VM> mapResultsToViewModel(List<T> results); protected abstract List<VM> mapResultsToViewModel(List<T> results);
@Override
@Override public int getItemViewType(int position) { public int getItemViewType(int position) {
return getRealmModelViewType(getItem(position)); return getRealmModelViewType(getItem(position));
} }
@Override public final VH onCreateViewHolder(ViewGroup parent, int viewType) { @Override
public final VH onCreateViewHolder(ViewGroup parent, int viewType) {
View itemView = inflater.inflate(getLayout(viewType), parent, false); View itemView = inflater.inflate(getLayout(viewType), parent, false);
return onCreateRealmModelViewHolder(viewType, itemView); return onCreateRealmModelViewHolder(viewType, itemView);
} }
@Override public void onBindViewHolder(VH holder, int position) { @Override
public void onBindViewHolder(VH holder, int position) {
VM model = getItem(position); VM model = getItem(position);
holder.itemView.setTag(model); holder.itemView.setTag(model);
holder.itemView.setOnClickListener(view -> { holder.itemView.setOnClickListener(view -> {
...@@ -76,7 +75,8 @@ public abstract class RealmModelListAdapter<T extends RealmObject, VM, ...@@ -76,7 +75,8 @@ public abstract class RealmModelListAdapter<T extends RealmObject, VM,
holder.bind(model); holder.bind(model);
} }
@Override public int getItemCount() { @Override
public int getItemCount() {
return adapterData != null ? adapterData.size() : 0; return adapterData != null ? adapterData.size() : 0;
} }
...@@ -98,4 +98,12 @@ public abstract class RealmModelListAdapter<T extends RealmObject, VM, ...@@ -98,4 +98,12 @@ public abstract class RealmModelListAdapter<T extends RealmObject, VM,
public void setOnItemClickListener(OnItemClickListener<VM> onItemClickListener) { public void setOnItemClickListener(OnItemClickListener<VM> onItemClickListener) {
this.onItemClickListener = onItemClickListener; this.onItemClickListener = onItemClickListener;
} }
public interface Constructor<T extends RealmObject, VM, VH extends RealmModelViewHolder<VM>> {
RealmModelListAdapter<T, VM, VH> getNewInstance(Context context);
}
public interface OnItemClickListener<VM> {
void onItemClick(VM model);
}
} }
...@@ -8,23 +8,10 @@ import io.realm.RealmResults; ...@@ -8,23 +8,10 @@ import io.realm.RealmResults;
public class RealmObjectObserver<T extends RealmObject> extends AbstractRealmResultsObserver<T> { public class RealmObjectObserver<T extends RealmObject> extends AbstractRealmResultsObserver<T> {
public interface Query<T extends RealmObject> {
RealmQuery<T> query(Realm realm);
}
public interface OnUpdateListener<T extends RealmObject> {
void onUpdateObject(T element);
}
public static class Impl<T extends RealmObject> {
protected T extractObjectFromResults(RealmResults<T> results) {
return results.isEmpty() ? null : results.last();
}
}
private final Query<T> query; private final Query<T> query;
private OnUpdateListener<T> onUpdateListener; private OnUpdateListener<T> onUpdateListener;
private Impl<T> impl; private Impl<T> impl;
private String previousResultString;
/*package*/ RealmObjectObserver(RealmHelper helper, Query<T> query) { /*package*/ RealmObjectObserver(RealmHelper helper, Query<T> query) {
super(helper); super(helper);
...@@ -41,13 +28,13 @@ public class RealmObjectObserver<T extends RealmObject> extends AbstractRealmRes ...@@ -41,13 +28,13 @@ public class RealmObjectObserver<T extends RealmObject> extends AbstractRealmRes
return this; return this;
} }
private String previousResultString; @Override
protected final RealmResults<T> queryItems(Realm realm) {
@Override protected final RealmResults<T> queryItems(Realm realm) {
return query.query(realm).findAll(); return query.query(realm).findAll();
} }
@Override protected final RealmChangeListener<RealmResults<T>> getListener() { @Override
protected final RealmChangeListener<RealmResults<T>> getListener() {
return element -> { return element -> {
T currentResult = impl.extractObjectFromResults(element); T currentResult = impl.extractObjectFromResults(element);
String currentResultString = currentResult != null ? currentResult.toString() : null; String currentResultString = currentResult != null ? currentResult.toString() : null;
...@@ -62,9 +49,22 @@ public class RealmObjectObserver<T extends RealmObject> extends AbstractRealmRes ...@@ -62,9 +49,22 @@ public class RealmObjectObserver<T extends RealmObject> extends AbstractRealmRes
}; };
} }
public void sub() { public void sub() {
previousResultString = null; previousResultString = null;
super.sub(); super.sub();
} }
public interface Query<T extends RealmObject> {
RealmQuery<T> query(Realm realm);
}
public interface OnUpdateListener<T extends RealmObject> {
void onUpdateObject(T element);
}
public static class Impl<T extends RealmObject> {
protected T extractObjectFromResults(RealmResults<T> results) {
return results.isEmpty() ? null : results.last();
}
}
} }
\ No newline at end of file
package chat.rocket.android.realm_helper; package chat.rocket.android.realm_helper;
import io.realm.RealmConfiguration; import io.realm.RealmConfiguration;
import java.util.HashMap; import java.util.HashMap;
public class RealmStore { public class RealmStore {
......
package chat.rocket.android.widget; package chat.rocket.android.widget;
import android.annotation.TargetApi;
import android.content.Context; import android.content.Context;
import android.content.res.TypedArray; import android.content.res.TypedArray;
import android.graphics.Color; import android.graphics.Color;
import android.support.v4.widget.Space;
import android.util.AttributeSet; import android.util.AttributeSet;
import android.view.View;
import android.widget.FrameLayout; import android.widget.FrameLayout;
/** /**
...@@ -29,7 +26,9 @@ public class DividerView extends FrameLayout { ...@@ -29,7 +26,9 @@ public class DividerView extends FrameLayout {
} }
private void initialize(Context context, AttributeSet attrs) { private void initialize(Context context, AttributeSet attrs) {
int thickness = context.getResources().getDimensionPixelSize(R.dimen.def_divider_view_thickness); int
thickness =
context.getResources().getDimensionPixelSize(R.dimen.def_divider_view_thickness);
if (attrs != null) { if (attrs != null) {
TypedArray array = TypedArray array =
......
...@@ -19,7 +19,8 @@ public class FontAwesomeButton extends AbstractCustomFontButton { ...@@ -19,7 +19,8 @@ public class FontAwesomeButton extends AbstractCustomFontButton {
super(context); super(context);
} }
@Override protected String getFont() { @Override
protected String getFont() {
return "fontawesome-webfont.ttf"; return "fontawesome-webfont.ttf";
} }
} }
...@@ -19,7 +19,8 @@ public class FontAwesomeTextView extends AbstractCustomFontTextView { ...@@ -19,7 +19,8 @@ public class FontAwesomeTextView extends AbstractCustomFontTextView {
super(context); super(context);
} }
@Override protected String getFont() { @Override
protected String getFont() {
return "fontawesome-webfont.ttf"; return "fontawesome-webfont.ttf";
} }
} }
...@@ -19,7 +19,8 @@ public class FontelloTextView extends AbstractCustomFontTextView { ...@@ -19,7 +19,8 @@ public class FontelloTextView extends AbstractCustomFontTextView {
super(context); super(context);
} }
@Override protected String getFont() { @Override
protected String getFont() {
return "fontello.ttf"; return "fontello.ttf";
} }
} }
...@@ -3,6 +3,7 @@ package chat.rocket.android.widget; ...@@ -3,6 +3,7 @@ package chat.rocket.android.widget;
import android.content.Context; import android.content.Context;
import android.graphics.Typeface; import android.graphics.Typeface;
import android.util.Log; import android.util.Log;
import java.util.Hashtable; import java.util.Hashtable;
/** /**
......
...@@ -10,6 +10,7 @@ import android.view.View; ...@@ -10,6 +10,7 @@ import android.view.View;
import android.widget.FrameLayout; import android.widget.FrameLayout;
import android.widget.ImageView; import android.widget.ImageView;
import android.widget.LinearLayout; import android.widget.LinearLayout;
import java.util.ArrayList; import java.util.ArrayList;
/** /**
...@@ -58,11 +59,13 @@ public class WaitingView extends LinearLayout { ...@@ -58,11 +59,13 @@ public class WaitingView extends LinearLayout {
} }
addOnAttachStateChangeListener(new OnAttachStateChangeListener() { addOnAttachStateChangeListener(new OnAttachStateChangeListener() {
@Override public void onViewAttachedToWindow(View view) { @Override
public void onViewAttachedToWindow(View view) {
start(); start();
} }
@Override public void onViewDetachedFromWindow(View view) { @Override
public void onViewDetachedFromWindow(View view) {
cancel(); cancel();
} }
}); });
...@@ -95,14 +98,16 @@ public class WaitingView extends LinearLayout { ...@@ -95,14 +98,16 @@ public class WaitingView extends LinearLayout {
.setDuration(duration) .setDuration(duration)
.setStartDelay(startDelay) .setStartDelay(startDelay)
.withEndAction(new Runnable() { .withEndAction(new Runnable() {
@Override public void run() { @Override
public void run() {
dot.animate() dot.animate()
.scaleX(0) .scaleX(0)
.scaleY(0) .scaleY(0)
.setDuration(duration) .setDuration(duration)
.setStartDelay(0) .setStartDelay(0)
.withEndAction(new Runnable() { .withEndAction(new Runnable() {
@Override public void run() { @Override
public void run() {
animateDot(dot, interval, duration, interval); animateDot(dot, interval, duration, interval);
} }
}) })
......
...@@ -12,6 +12,7 @@ import android.text.style.ForegroundColorSpan; ...@@ -12,6 +12,7 @@ import android.text.style.ForegroundColorSpan;
import android.text.style.StyleSpan; import android.text.style.StyleSpan;
import android.text.style.TypefaceSpan; import android.text.style.TypefaceSpan;
import android.widget.TextView; import android.widget.TextView;
import chat.rocket.android.widget.R; import chat.rocket.android.widget.R;
public class InlineHightlighter { public class InlineHightlighter {
...@@ -25,7 +26,7 @@ public class InlineHightlighter { ...@@ -25,7 +26,7 @@ public class InlineHightlighter {
} }
private static CharacterStyle[] createCharStyles(final Context context) { private static CharacterStyle[] createCharStyles(final Context context) {
return new CharacterStyle[] { return new CharacterStyle[]{
new ForegroundColorSpan(ContextCompat.getColor(context, R.color.highlight_text_color)), new ForegroundColorSpan(ContextCompat.getColor(context, R.color.highlight_text_color)),
new BackgroundColorSpan( new BackgroundColorSpan(
ContextCompat.getColor(context, R.color.highlight_text_background_color)), ContextCompat.getColor(context, R.color.highlight_text_background_color)),
......
...@@ -21,12 +21,14 @@ public class LinkMovementMethodCompat extends LinkMovementMethod { ...@@ -21,12 +21,14 @@ public class LinkMovementMethodCompat extends LinkMovementMethod {
return sInstance; return sInstance;
} }
@Override public boolean canSelectArbitrarily() { @Override
public boolean canSelectArbitrarily() {
return true; return true;
} }
// http://stackoverflow.com/a/30572151/2104686 // http://stackoverflow.com/a/30572151/2104686
@Override public boolean onTouchEvent(TextView widget, Spannable buffer, MotionEvent event) { @Override
public boolean onTouchEvent(TextView widget, Spannable buffer, MotionEvent event) {
int action = event.getAction(); int action = event.getAction();
if (action == MotionEvent.ACTION_UP || action == MotionEvent.ACTION_DOWN) { if (action == MotionEvent.ACTION_UP || action == MotionEvent.ACTION_DOWN) {
......
...@@ -11,11 +11,12 @@ import android.text.style.ClickableSpan; ...@@ -11,11 +11,12 @@ import android.text.style.ClickableSpan;
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 java.util.HashSet;
import org.nibor.autolink.LinkExtractor; import org.nibor.autolink.LinkExtractor;
import org.nibor.autolink.LinkSpan; import org.nibor.autolink.LinkSpan;
import org.nibor.autolink.LinkType; import org.nibor.autolink.LinkType;
import java.util.HashSet;
public class Linkify { public class Linkify {
private static HashSet<LinkType> sTargetType = new HashSet<>(); private static HashSet<LinkType> sTargetType = new HashSet<>();
...@@ -48,7 +49,8 @@ public class Linkify { ...@@ -48,7 +49,8 @@ public class Linkify {
private static ClickableSpan createLinkSpan(final String url) { private static ClickableSpan createLinkSpan(final String url) {
return new ClickableSpan() { return new ClickableSpan() {
@Override public void onClick(View view) { @Override
public void onClick(View view) {
final Context context = view.getContext(); final Context context = view.getContext();
try { try {
Intent intent = new Intent(Intent.ACTION_VIEW, Uri.parse(url)); Intent intent = new Intent(Intent.ACTION_VIEW, Uri.parse(url));
......
...@@ -8,23 +8,23 @@ import android.util.AttributeSet; ...@@ -8,23 +8,23 @@ import android.util.AttributeSet;
import android.view.View; import android.view.View;
import android.widget.LinearLayout; import android.widget.LinearLayout;
import android.widget.TextView; import android.widget.TextView;
import chat.rocket.android.widget.R;
import java.util.HashMap; import java.util.HashMap;
import chat.rocket.android.widget.R;
/** /**
* Room list-item view used in sidebar. * Room list-item view used in sidebar.
*/ */
public class RoomListItemView extends LinearLayout { public class RoomListItemView extends LinearLayout {
private String roomId; private static HashMap<String, Integer> ICON_TABLE = new HashMap<String, Integer>() {
private String roomName;
private static HashMap<String, Integer> ICON_TABLE = new HashMap<String, Integer>(){
{ {
put("c", R.string.fa_hashtag); put("c", R.string.fa_hashtag);
put("p", R.string.fa_lock); put("p", R.string.fa_lock);
put("d", R.string.fa_at); put("d", R.string.fa_at);
} }
}; };
private String roomId;
private String roomName;
public RoomListItemView(Context context) { public RoomListItemView(Context context) {
super(context); super(context);
......
...@@ -11,6 +11,7 @@ import android.view.ViewGroup; ...@@ -11,6 +11,7 @@ import android.view.ViewGroup;
import android.view.inputmethod.InputMethodManager; import android.view.inputmethod.InputMethodManager;
import android.widget.LinearLayout; import android.widget.LinearLayout;
import android.widget.TextView; import android.widget.TextView;
import chat.rocket.android.widget.R; import chat.rocket.android.widget.R;
public class MessageComposer extends LinearLayout { public class MessageComposer extends LinearLayout {
...@@ -47,7 +48,8 @@ public class MessageComposer extends LinearLayout { ...@@ -47,7 +48,8 @@ public class MessageComposer extends LinearLayout {
composer = (ViewGroup) LayoutInflater.from(getContext()) composer = (ViewGroup) LayoutInflater.from(getContext())
.inflate(R.layout.message_composer, this, false); .inflate(R.layout.message_composer, this, false);
composer.findViewById(R.id.btn_submit).setOnClickListener(new OnClickListener() { composer.findViewById(R.id.btn_submit).setOnClickListener(new OnClickListener() {
@Override public void onClick(View view) { @Override
public void onClick(View view) {
String messageText = getText(); String messageText = getText();
if (messageText.length() > 0) { if (messageText.length() > 0) {
if (actionListener != null) { if (actionListener != null) {
......
...@@ -12,18 +12,19 @@ import android.view.View; ...@@ -12,18 +12,19 @@ import android.view.View;
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 chat.rocket.android.widget.R;
import chat.rocket.android.widget.helper.ImageFormat;
import com.jakewharton.picasso.OkHttp3Downloader; import com.jakewharton.picasso.OkHttp3Downloader;
import com.squareup.picasso.Picasso; import com.squareup.picasso.Picasso;
import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;
import java.io.IOException; import java.io.IOException;
import chat.rocket.android.widget.R;
import chat.rocket.android.widget.helper.ImageFormat;
import okhttp3.Interceptor; import okhttp3.Interceptor;
import okhttp3.OkHttpClient; import okhttp3.OkHttpClient;
import okhttp3.Request; import okhttp3.Request;
import okhttp3.Response; import okhttp3.Response;
import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;
/** /**
*/ */
...@@ -125,7 +126,6 @@ public class RocketChatMessageAttachmentsLayout extends LinearLayout { ...@@ -125,7 +126,6 @@ public class RocketChatMessageAttachmentsLayout extends LinearLayout {
return; return;
} }
View attachmentView = inflater.inflate(R.layout.message_inline_attachment, this, false); View attachmentView = inflater.inflate(R.layout.message_inline_attachment, this, false);
new Picasso.Builder(getContext()) new Picasso.Builder(getContext())
...@@ -149,7 +149,8 @@ public class RocketChatMessageAttachmentsLayout extends LinearLayout { ...@@ -149,7 +149,8 @@ public class RocketChatMessageAttachmentsLayout extends LinearLayout {
} else { } else {
final String link = absolutize(attachmentObj.getString("title_link")); final String link = absolutize(attachmentObj.getString("title_link"));
titleView.setOnClickListener(new OnClickListener() { titleView.setOnClickListener(new OnClickListener() {
@Override public void onClick(View view) { @Override
public void onClick(View view) {
Intent intent = new Intent(Intent.ACTION_VIEW, Uri.parse(link)); Intent intent = new Intent(Intent.ACTION_VIEW, Uri.parse(link));
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
view.getContext().startActivity(intent); view.getContext().startActivity(intent);
......
...@@ -8,10 +8,11 @@ import android.util.AttributeSet; ...@@ -8,10 +8,11 @@ import android.util.AttributeSet;
import android.view.LayoutInflater; import android.view.LayoutInflater;
import android.widget.LinearLayout; import android.widget.LinearLayout;
import android.widget.TextView; import android.widget.TextView;
import com.emojione.Emojione;
import chat.rocket.android.widget.R; import chat.rocket.android.widget.R;
import chat.rocket.android.widget.helper.InlineHightlighter; import chat.rocket.android.widget.helper.InlineHightlighter;
import chat.rocket.android.widget.helper.Linkify; import chat.rocket.android.widget.helper.Linkify;
import com.emojione.Emojione;
/** /**
*/ */
......
...@@ -12,13 +12,14 @@ import android.view.View; ...@@ -12,13 +12,14 @@ import android.view.View;
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 chat.rocket.android.widget.R;
import chat.rocket.android.widget.helper.ImageFormat;
import com.squareup.picasso.Picasso; import com.squareup.picasso.Picasso;
import org.json.JSONArray; import org.json.JSONArray;
import org.json.JSONException; import org.json.JSONException;
import org.json.JSONObject; import org.json.JSONObject;
import chat.rocket.android.widget.R;
import chat.rocket.android.widget.helper.ImageFormat;
/** /**
*/ */
public class RocketChatMessageUrlsLayout extends LinearLayout { public class RocketChatMessageUrlsLayout extends LinearLayout {
...@@ -115,7 +116,6 @@ public class RocketChatMessageUrlsLayout extends LinearLayout { ...@@ -115,7 +116,6 @@ public class RocketChatMessageUrlsLayout extends LinearLayout {
} }
} }
String imageURL = null; String imageURL = null;
if (!meta.isNull("ogImage")) { if (!meta.isNull("ogImage")) {
imageURL = meta.getString("ogImage"); imageURL = meta.getString("ogImage");
...@@ -131,7 +131,6 @@ public class RocketChatMessageUrlsLayout extends LinearLayout { ...@@ -131,7 +131,6 @@ public class RocketChatMessageUrlsLayout extends LinearLayout {
((TextView) embedUrl.findViewById(R.id.title)).setText(title); ((TextView) embedUrl.findViewById(R.id.title)).setText(title);
((TextView) embedUrl.findViewById(R.id.description)).setText(description); ((TextView) embedUrl.findViewById(R.id.description)).setText(description);
ImageView image = (ImageView) embedUrl.findViewById(R.id.image); ImageView image = (ImageView) embedUrl.findViewById(R.id.image);
if (TextUtils.isEmpty(imageURL)) { if (TextUtils.isEmpty(imageURL)) {
image.setVisibility(View.GONE); image.setVisibility(View.GONE);
......
This source diff could not be displayed because it is too large. You can view the blob instead.
<?xml version="1.0" encoding="utf-8"?> <?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android"> <selector xmlns:android="http://schemas.android.com/apk/res/android">
<item android:state_checked="false" android:drawable="@drawable/down_up_toggle_down" /> <item android:state_checked="false" android:drawable="@drawable/down_up_toggle_down"/>
<item android:state_checked="true" android:drawable="@drawable/down_up_toggle_up" /> <item android:state_checked="true" android:drawable="@drawable/down_up_toggle_up"/>
<item android:drawable="@drawable/down_up_toggle_down" /> <!-- default state --> <item android:drawable="@drawable/down_up_toggle_down"/> <!-- default state -->
</selector> </selector>
\ No newline at end of file
...@@ -2,6 +2,8 @@ ...@@ -2,6 +2,8 @@
<shape xmlns:android="http://schemas.android.com/apk/res/android" <shape xmlns:android="http://schemas.android.com/apk/res/android"
android:shape="rectangle"> android:shape="rectangle">
<solid android:color="@color/highlight_text_background_color"/> <solid android:color="@color/highlight_text_background_color"/>
<stroke android:width="1dp" android:color="@color/highlight_text_border_color" /> <stroke
android:width="1dp"
android:color="@color/highlight_text_border_color"/>
<corners android:radius="4dp"/> <corners android:radius="4dp"/>
</shape> </shape>
\ No newline at end of file
<vector android:alpha="0.87" android:height="24dp" <vector xmlns:android="http://schemas.android.com/apk/res/android"
android:viewportHeight="24.0" android:viewportWidth="24.0" android:alpha="0.87"
android:width="24dp" xmlns:android="http://schemas.android.com/apk/res/android"> android:height="24dp"
<path android:fillColor="#FF000000" android:pathData="M2.01,21L23,12 2.01,3 2,10l15,2 -15,2z"/> android:viewportHeight="24.0"
android:viewportWidth="24.0"
android:width="24dp">
<path
android:fillColor="#FF000000"
android:pathData="M2.01,21L23,12 2.01,3 2,10l15,2 -15,2z"/>
</vector> </vector>
<?xml version="1.0" encoding="utf-8"?> <?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android" > <shape xmlns:android="http://schemas.android.com/apk/res/android">
<stroke android:color="@color/inline_attachment_box_outline" android:width="1dp"/> <stroke
android:color="@color/inline_attachment_box_outline"
android:width="1dp"/>
<solid android:color="@color/inline_attachment_box_background"/> <solid android:color="@color/inline_attachment_box_background"/>
<corners android:radius="2dp" /> <corners android:radius="2dp"/>
</shape> </shape>
\ No newline at end of file
...@@ -4,18 +4,21 @@ ...@@ -4,18 +4,21 @@
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:orientation="horizontal" android:orientation="horizontal"
android:layout_margin="4dp" android:layout_margin="4dp"
android:padding="4dp"> android:padding="4dp"
>
<View <View
android:layout_width="3dp" android:layout_width="3dp"
android:layout_height="match_parent" android:layout_height="match_parent"
android:layout_marginRight="5dp" android:layout_marginRight="5dp"
android:background="@color/inline_attachment_quote_line"/> android:background="@color/inline_attachment_quote_line"
/>
<LinearLayout <LinearLayout
android:layout_width="0px" android:layout_width="0px"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:layout_weight="1" android:layout_weight="1"
android:orientation="vertical"> android:orientation="vertical"
>
<TextView <TextView
android:id="@+id/title" android:id="@+id/title"
...@@ -24,7 +27,8 @@ ...@@ -24,7 +27,8 @@
android:layout_marginTop="2dp" android:layout_marginTop="2dp"
android:layout_marginBottom="2dp" android:layout_marginBottom="2dp"
android:textAppearance="@style/TextAppearance.RocketChat.MessageAttachment.Title" android:textAppearance="@style/TextAppearance.RocketChat.MessageAttachment.Title"
android:background="?attr/selectableItemBackground"/> android:background="?attr/selectableItemBackground"
/>
<ImageView <ImageView
android:id="@+id/image" android:id="@+id/image"
...@@ -34,7 +38,8 @@ ...@@ -34,7 +38,8 @@
android:layout_marginTop="4dp" android:layout_marginTop="4dp"
android:layout_marginRight="8dp" android:layout_marginRight="8dp"
android:adjustViewBounds="true" android:adjustViewBounds="true"
android:scaleType="fitStart"/> android:scaleType="fitStart"
/>
</LinearLayout> </LinearLayout>
</LinearLayout> </LinearLayout>
...@@ -5,12 +5,14 @@ ...@@ -5,12 +5,14 @@
android:orientation="horizontal" android:orientation="horizontal"
android:background="?attr/selectableItemBackground" android:background="?attr/selectableItemBackground"
android:layout_margin="4dp" android:layout_margin="4dp"
android:padding="4dp"> android:padding="4dp"
>
<View <View
android:layout_width="3dp" android:layout_width="3dp"
android:layout_height="match_parent" android:layout_height="match_parent"
android:layout_marginEnd="5dp" android:layout_marginEnd="5dp"
android:background="@color/inline_attachment_quote_line"/> android:background="@color/inline_attachment_quote_line"
/>
<ImageView <ImageView
android:id="@+id/image" android:id="@+id/image"
...@@ -20,13 +22,15 @@ ...@@ -20,13 +22,15 @@
android:layout_marginTop="2dp" android:layout_marginTop="2dp"
android:layout_marginEnd="8dp" android:layout_marginEnd="8dp"
android:adjustViewBounds="true" android:adjustViewBounds="true"
android:scaleType="fitStart"/> android:scaleType="fitStart"
/>
<LinearLayout <LinearLayout
android:layout_width="0px" android:layout_width="0px"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:layout_weight="1" android:layout_weight="1"
android:orientation="vertical"> android:orientation="vertical"
>
<TextView <TextView
android:id="@+id/hostname" android:id="@+id/hostname"
...@@ -34,7 +38,8 @@ ...@@ -34,7 +38,8 @@
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:layout_marginTop="2dp" android:layout_marginTop="2dp"
android:layout_marginBottom="2dp" android:layout_marginBottom="2dp"
android:enabled="false"/> android:enabled="false"
/>
<TextView <TextView
android:id="@+id/title" android:id="@+id/title"
...@@ -42,7 +47,8 @@ ...@@ -42,7 +47,8 @@
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:layout_marginTop="2dp" android:layout_marginTop="2dp"
android:layout_marginBottom="2dp" android:layout_marginBottom="2dp"
android:textAppearance="@style/TextAppearance.RocketChat.MessageAttachment.Title"/> android:textAppearance="@style/TextAppearance.RocketChat.MessageAttachment.Title"
/>
<TextView <TextView
android:id="@+id/description" android:id="@+id/description"
...@@ -50,7 +56,8 @@ ...@@ -50,7 +56,8 @@
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:layout_marginTop="2dp" android:layout_marginTop="2dp"
android:layout_marginBottom="2dp" android:layout_marginBottom="2dp"
android:textAppearance="@style/TextAppearance.RocketChat.MessageAttachment.Description"/> android:textAppearance="@style/TextAppearance.RocketChat.MessageAttachment.Description"
/>
</LinearLayout> </LinearLayout>
......
...@@ -3,12 +3,14 @@ ...@@ -3,12 +3,14 @@
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:background="@drawable/inline_attachment_background" android:background="@drawable/inline_attachment_background"
android:layout_margin="4dp" android:layout_margin="4dp"
android:padding="4dp"> android:padding="4dp"
>
<ImageView <ImageView
android:id="@+id/message_inline_image" android:id="@+id/message_inline_image"
android:layout_width="wrap_content" android:layout_width="wrap_content"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:maxHeight="200dp" android:maxHeight="200dp"
android:adjustViewBounds="true" android:adjustViewBounds="true"
android:scaleType="fitStart"/> android:scaleType="fitStart"
/>
</FrameLayout> </FrameLayout>
<?xml version="1.0" encoding="utf-8"?> <?xml version="1.0" encoding="utf-8"?>
<merge xmlns:android="http://schemas.android.com/apk/res/android" <merge xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="wrap_content"> android:layout_height="wrap_content"
>
<FrameLayout <FrameLayout
android:layout_width="32dp" android:layout_width="32dp"
android:layout_height="?attr/listPreferredItemHeightSmall" android:layout_height="?attr/listPreferredItemHeightSmall"
......
<?xml version="1.0" encoding="utf-8"?> <?xml version="1.0" encoding="utf-8"?>
<resources> <resources>
<style name="TextAppearance.RocketChat" parent="TextAppearance.AppCompat"/> <style name="TextAppearance.RocketChat" parent="TextAppearance.AppCompat"/>
<style name="TextAppearance.RocketChat.MessageBody" parent="TextAppearance.AppCompat.Body1"> <style name="TextAppearance.RocketChat.MessageBody" parent="TextAppearance.AppCompat.Body1">
</style> </style>
<style name="TextAppearance.RocketChat.MessageBody.Highlight"> <style name="TextAppearance.RocketChat.MessageBody.Highlight">
<item name="android:textColor">@color/highlight_text_color</item> <item name="android:textColor">@color/highlight_text_color</item>
<item name="android:typeface">monospace</item> <item name="android:typeface">monospace</item>
...@@ -11,13 +14,16 @@ ...@@ -11,13 +14,16 @@
</style> </style>
<style name="TextAppearance.RocketChat.MessageAttachment" parent="TextAppearance.AppCompat.Body1"/> <style name="TextAppearance.RocketChat.MessageAttachment" parent="TextAppearance.AppCompat.Body1"/>
<style name="TextAppearance.RocketChat.MessageAttachment.Title" parent="TextAppearance.AppCompat.Title"> <style name="TextAppearance.RocketChat.MessageAttachment.Title" parent="TextAppearance.AppCompat.Title">
<item name="android:textSize">14sp</item> <item name="android:textSize">14sp</item>
<item name="android:textColor">?android:attr/textColorLink</item> <item name="android:textColor">?android:attr/textColorLink</item>
</style> </style>
<style name="TextAppearance.RocketChat.MessageAttachment.Description"> <style name="TextAppearance.RocketChat.MessageAttachment.Description">
<item name="android:textSize">12sp</item> <item name="android:textSize">12sp</item>
</style> </style>
<style name="TextAppearance.RocketChat.MessageAttachment.Hostname" <style name="TextAppearance.RocketChat.MessageAttachment.Hostname"
parent="TextAppearance.AppCompat.Caption"> parent="TextAppearance.AppCompat.Caption">
<item name="android:textSize">8sp</item> <item name="android:textSize">8sp</item>
......
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