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

fix coding style

parent b62277c9
......@@ -2,47 +2,47 @@ apply plugin: 'com.android.library'
apply plugin: 'me.tatarka.retrolambda'
buildscript {
repositories {
jcenter()
}
dependencies {
classpath rootProject.ext.androidPlugin
classpath rootProject.ext.retroLambdaPlugin
classpath rootProject.ext.retroLambdaPatch
}
repositories {
jcenter()
}
dependencies {
classpath rootProject.ext.androidPlugin
classpath rootProject.ext.retroLambdaPlugin
classpath rootProject.ext.retroLambdaPatch
}
}
android {
compileSdkVersion rootProject.ext.compileSdkVersion
buildToolsVersion rootProject.ext.buildToolsVersion
compileSdkVersion rootProject.ext.compileSdkVersion
buildToolsVersion rootProject.ext.buildToolsVersion
compileOptions {
sourceCompatibility JavaVersion.VERSION_1_8
targetCompatibility JavaVersion.VERSION_1_8
}
defaultConfig {
minSdkVersion rootProject.ext.minSdkVersion
targetSdkVersion rootProject.ext.compileSdkVersion
versionCode 1
versionName "0.0.8"
}
buildTypes {
debug {
defaultConfig {
minSdkVersion rootProject.ext.minSdkVersionDebug
}
compileOptions {
sourceCompatibility JavaVersion.VERSION_1_8
targetCompatibility JavaVersion.VERSION_1_8
}
defaultConfig {
minSdkVersion rootProject.ext.minSdkVersion
targetSdkVersion rootProject.ext.compileSdkVersion
versionCode 1
versionName "0.0.8"
}
release {
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
buildTypes {
debug {
defaultConfig {
minSdkVersion rootProject.ext.minSdkVersionDebug
}
}
release {
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
}
}
}
}
dependencies {
compile project(':log-wrapper')
compile rootProject.ext.supportAnnotations
compile 'com.squareup.okhttp3:okhttp-ws:3.4.1'
compile rootProject.ext.rxJava
compile rootProject.ext.boltsTask
compile project(':log-wrapper')
compile rootProject.ext.supportAnnotations
compile 'com.squareup.okhttp3:okhttp-ws:3.4.1'
compile rootProject.ext.rxJava
compile rootProject.ext.boltsTask
}
<lint>
<issue id="InvalidPackage">
<ignore regexp="okio.*jar"/>
</issue>
<issue id="InvalidPackage">
<ignore regexp="okio.*jar"/>
</issue>
</lint>
\ No newline at end of file
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="chat.rocket.android_ddp">
package="chat.rocket.android_ddp">
<application
android:allowBackup="true"
android:label="@string/app_name"
android:supportsRtl="true">
<application
android:allowBackup="true"
android:label="@string/app_name"
android:supportsRtl="true">
</application>
</application>
</manifest>
package chat.rocket.android_ddp;
import android.support.annotation.Nullable;
import org.json.JSONArray;
import bolts.Task;
import bolts.TaskCompletionSource;
import chat.rocket.android_ddp.rx.RxWebSocketCallback;
import okhttp3.OkHttpClient;
import org.json.JSONArray;
import rx.Observable;
public class DDPClient {
......@@ -34,7 +35,7 @@ public class DDPClient {
}
public Task<DDPClientCallback.RPC> rpc(String method, JSONArray params, String id,
long timeoutMs) {
long timeoutMs) {
TaskCompletionSource<DDPClientCallback.RPC> task = new TaskCompletionSource<>();
impl.rpc(task, method, params, id, timeoutMs);
return task.getTask();
......
......@@ -3,17 +3,18 @@ package chat.rocket.android_ddp;
import android.support.annotation.NonNull;
import android.support.annotation.Nullable;
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.TaskCompletionSource;
import chat.rocket.android.log.RCLog;
import chat.rocket.android_ddp.rx.RxWebSocket;
import chat.rocket.android_ddp.rx.RxWebSocketCallback;
import java.util.concurrent.TimeUnit;
import java.util.concurrent.TimeoutException;
import okhttp3.OkHttpClient;
import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;
import rx.Observable;
import rx.functions.Func1;
import rx.subscriptions.CompositeSubscription;
......@@ -30,7 +31,9 @@ public class DDPClientImpl {
}
private static JSONObject toJson(String s) {
if (TextUtils.isEmpty(s)) return null;
if (TextUtils.isEmpty(s)) {
return null;
}
try {
return new JSONObject(s);
} catch (JSONException e) {
......@@ -47,7 +50,7 @@ public class DDPClientImpl {
}
public void connect(final TaskCompletionSource<DDPClientCallback.Connect> task, final String url,
String session) {
String session) {
try {
observable = websocket.connect(url).autoConnect();
CompositeSubscription subscriptions = new CompositeSubscription();
......@@ -95,7 +98,7 @@ public class DDPClientImpl {
}
public void ping(final TaskCompletionSource<DDPClientCallback.Ping> task,
@Nullable final String id) {
@Nullable final String id) {
CompositeSubscription subscriptions = new CompositeSubscription();
subscriptions.add(
......@@ -131,7 +134,7 @@ public class DDPClientImpl {
}
public void sub(final TaskCompletionSource<DDPSubscription.Ready> task, String name,
JSONArray params, String id) {
JSONArray params, String id) {
CompositeSubscription subscriptions = new CompositeSubscription();
subscriptions.add(
......@@ -168,7 +171,7 @@ public class DDPClientImpl {
}
public void unsub(final TaskCompletionSource<DDPSubscription.NoSub> task,
@Nullable final String id) {
@Nullable final String id) {
CompositeSubscription subscriptions = new CompositeSubscription();
subscriptions.add(
......@@ -193,7 +196,7 @@ public class DDPClientImpl {
}
public void rpc(final TaskCompletionSource<DDPClientCallback.RPC> task, String method,
JSONArray params, String id, long timeoutMs) {
JSONArray params, String id, long timeoutMs) {
CompositeSubscription subscriptions = new CompositeSubscription();
subscriptions.add(
......@@ -252,14 +255,16 @@ public class DDPClientImpl {
}
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)
.map(callback -> ((RxWebSocketCallback.Message) callback).responseBodyString)
.map(DDPClientImpl::toJson)
.filter(response -> {
String msg = extractMsg(response);
for (String m : targetMsgs) {
if (m.equals(msg)) return true;
if (m.equals(msg)) {
return true;
}
}
return false;
})
......@@ -345,6 +350,7 @@ public class DDPClientImpl {
}
private interface JSONBuilder {
@NonNull JSONObject create(JSONObject root) throws JSONException;
@NonNull
JSONObject create(JSONObject root) throws JSONException;
}
}
......@@ -29,7 +29,8 @@ public class DDPSubscription {
this.id = id;
}
@Override public String toString() {
@Override
public String toString() {
return "NoSub[id=" + id + "]";
}
......@@ -53,7 +54,8 @@ public class DDPSubscription {
this.id = id;
}
@Override public String toString() {
@Override
public String toString() {
return "Ready[id=" + id + "]";
}
}
......@@ -68,7 +70,8 @@ public class DDPSubscription {
this.docID = docID;
}
@Override public String toString() {
@Override
public String toString() {
return "DocEvent[id=" + docID + ", collection=" + collection + "]";
}
}
......@@ -85,7 +88,7 @@ public class DDPSubscription {
public String before;
public Before(DDPClient client, String collection, String docID, JSONObject fields,
String before) {
String before) {
super(client, collection, docID, fields);
this.before = before;
}
......@@ -97,7 +100,7 @@ public class DDPSubscription {
public JSONArray cleared;
public Changed(DDPClient client, String collection, String docID, JSONObject fields,
@NonNull JSONArray cleared) {
@NonNull JSONArray cleared) {
super(client, collection, docID);
this.fields = fields;
this.cleared = cleared;
......
package chat.rocket.android_ddp.rx;
import chat.rocket.android.log.RCLog;
import java.io.IOException;
import chat.rocket.android.log.RCLog;
import okhttp3.OkHttpClient;
import okhttp3.Request;
import okhttp3.RequestBody;
......@@ -31,15 +31,18 @@ public class RxWebSocket {
WebSocketCall call = WebSocketCall.create(httpClient, request);
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() {
@Override public void onOpen(WebSocket webSocket, Response response) {
@Override
public void onOpen(WebSocket webSocket, Response response) {
isConnected = true;
RxWebSocket.this.webSocket = webSocket;
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 {
isConnected = false;
subscriber.onError(new RxWebSocketCallback.Failure(webSocket, e, response));
......@@ -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;
subscriber.onNext(new RxWebSocketCallback.Message(webSocket, responseBody));
}
@Override public void onPong(Buffer payload) {
@Override
public void onPong(Buffer payload) {
isConnected = true;
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;
subscriber.onNext(new RxWebSocketCallback.Close(webSocket, code, reason));
subscriber.onCompleted();
......
package chat.rocket.android_ddp.rx;
import chat.rocket.android.log.RCLog;
import static android.R.attr.type;
import java.io.IOException;
import chat.rocket.android.log.RCLog;
import okhttp3.Response;
import okhttp3.ResponseBody;
import okhttp3.ws.WebSocket;
import okio.Buffer;
import static android.R.attr.type;
public class RxWebSocketCallback {
public static abstract class Base {
public String type;
......@@ -19,7 +19,8 @@ public class RxWebSocketCallback {
this.ws = ws;
}
@Override public String toString() {
@Override
public String toString() {
return "[" + type + "]";
}
}
......@@ -43,7 +44,8 @@ public class RxWebSocketCallback {
this.response = response;
}
@Override public String toString() {
@Override
public String toString() {
if (response != null) {
return "[" + type + "] " + response.message();
} else {
......@@ -64,7 +66,8 @@ public class RxWebSocketCallback {
}
}
@Override public String toString() {
@Override
public String toString() {
return "[" + type + "] " + responseBodyString;
}
}
......@@ -88,7 +91,8 @@ public class RxWebSocketCallback {
this.reason = reason;
}
@Override public String toString() {
@Override
public String toString() {
return "[" + type + "] code=" + code + ", reason=" + reason;
}
}
......
<resources>
<string name="app_name">android-ddp</string>
<string name="app_name">android-ddp</string>
</resources>
......@@ -6,128 +6,128 @@ apply plugin: 'com.github.triplet.play'
apply from: '../config/quality/quality.gradle'
buildscript {
repositories {
jcenter()
mavenCentral()
}
dependencies {
classpath rootProject.ext.androidPlugin
// NOTE: Do not place your application dependencies here; they belong
// in the individual module build.gradle files
classpath rootProject.ext.retroLambdaPlugin
classpath rootProject.ext.retroLambdaPatch
classpath rootProject.ext.realmPlugin
classpath 'com.jakewharton.hugo:hugo-plugin:1.2.1'
classpath 'com.google.gms:google-services:3.0.0'
classpath 'com.github.triplet.gradle:play-publisher:1.1.5'
}
// Exclude the version that the android plugin depends on.
configurations.classpath.exclude group: 'com.android.tools.external.lombok'
repositories {
jcenter()
mavenCentral()
}
dependencies {
classpath rootProject.ext.androidPlugin
// NOTE: Do not place your application dependencies here; they belong
// in the individual module build.gradle files
classpath rootProject.ext.retroLambdaPlugin
classpath rootProject.ext.retroLambdaPatch
classpath rootProject.ext.realmPlugin
classpath 'com.jakewharton.hugo:hugo-plugin:1.2.1'
classpath 'com.google.gms:google-services:3.0.0'
classpath 'com.github.triplet.gradle:play-publisher:1.1.5'
}
// Exclude the version that the android plugin depends on.
configurations.classpath.exclude group: 'com.android.tools.external.lombok'
}
android {
compileSdkVersion rootProject.ext.compileSdkVersion
buildToolsVersion rootProject.ext.buildToolsVersion
defaultConfig {
applicationId "chat.rocket.android"
minSdkVersion rootProject.ext.minSdkVersion
targetSdkVersion rootProject.ext.compileSdkVersion
versionCode 2
versionName "1.0"
testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
vectorDrawables.useSupportLibrary = true
multiDexEnabled true
}
signingConfigs {
release {
storeFile project.rootProject.file('Rocket.jks').getCanonicalFile()
storePassword System.getenv("KEYSTORE_PASSWORD")
keyAlias System.getenv("KEY_ALIAS")
keyPassword System.getenv("KEY_PASSWORD")
compileSdkVersion rootProject.ext.compileSdkVersion
buildToolsVersion rootProject.ext.buildToolsVersion
defaultConfig {
applicationId "chat.rocket.android"
minSdkVersion rootProject.ext.minSdkVersion
targetSdkVersion rootProject.ext.compileSdkVersion
versionCode 2
versionName "1.0"
testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
vectorDrawables.useSupportLibrary = true
multiDexEnabled true
}
signingConfigs {
release {
storeFile project.rootProject.file('Rocket.jks').getCanonicalFile()
storePassword System.getenv("KEYSTORE_PASSWORD")
keyAlias System.getenv("KEY_ALIAS")
keyPassword System.getenv("KEY_PASSWORD")
}
}
}
buildTypes {
debug {
defaultConfig {
minSdkVersion rootProject.ext.minSdkVersionDebug
}
buildTypes {
debug {
defaultConfig {
minSdkVersion rootProject.ext.minSdkVersionDebug
}
}
release {
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
signingConfig signingConfigs.release
}
}
release {
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
signingConfig signingConfigs.release
productFlavors {
qa {
// something - qa builds will have some extra stuff for alpha testers
}
prod {
// another
}
}
}
productFlavors {
qa {
// something - qa builds will have some extra stuff for alpha testers
packagingOptions {
exclude 'META-INF/LICENSE.txt'
exclude 'META-INF/NOTICE.txt'
}
prod {
// another
compileOptions {
sourceCompatibility JavaVersion.VERSION_1_8
targetCompatibility JavaVersion.VERSION_1_8
}
lintOptions {
//avoiding okio error: https://github.com/square/okhttp/issues/896
lintConfig file("lint.xml")
}
}
packagingOptions {
exclude 'META-INF/LICENSE.txt'
exclude 'META-INF/NOTICE.txt'
}
compileOptions {
sourceCompatibility JavaVersion.VERSION_1_8
targetCompatibility JavaVersion.VERSION_1_8
}
lintOptions {
//avoiding okio error: https://github.com/square/okhttp/issues/896
lintConfig file("lint.xml")
}
}
play {
jsonFile = file('rocket-chat.json')
track = "${track}"
jsonFile = file('rocket-chat.json')
track = "${track}"
}
repositories {
mavenCentral()
maven { url 'https://github.com/lijingle1/stetho-realm/raw/master/maven-repo' }
maven { url 'http://dl.bintray.com/amulyakhare/maven' }
maven { url "https://clojars.org/repo/" } //for icepick.
mavenCentral()
maven { url 'https://github.com/lijingle1/stetho-realm/raw/master/maven-repo' }
maven { url 'http://dl.bintray.com/amulyakhare/maven' }
maven { url "https://clojars.org/repo/" } //for icepick.
}
dependencies {
compile project(':log-wrapper')
compile project(':android-ddp')
compile project(':rocket-chat-android-widgets')
compile project(':realm-helpers')
compile rootProject.ext.supportAppCompat
compile rootProject.ext.supportDesign
qaCompile('com.instabug.library:instabug:3.1.0') {
exclude group: 'io.reactivex'
}
compile 'com.android.support:multidex:1.0.1'
compile project(':log-wrapper')
compile project(':android-ddp')
compile project(':rocket-chat-android-widgets')
compile project(':realm-helpers')
compile rootProject.ext.supportAppCompat
compile rootProject.ext.supportDesign
qaCompile('com.instabug.library:instabug:3.1.0') {
exclude group: 'io.reactivex'
}
compile 'com.android.support:multidex:1.0.1'
compile 'com.google.firebase:firebase-core:10.0.0'
compile 'com.google.firebase:firebase-crash:10.0.0'
compile 'com.google.firebase:firebase-core:10.0.0'
compile 'com.google.firebase:firebase-crash:10.0.0'
compile rootProject.ext.okhttp3
compile rootProject.ext.picasso
compile rootProject.ext.okhttp3
compile rootProject.ext.picasso
compile 'com.facebook.stetho:stetho:1.4.1'
compile 'com.facebook.stetho:stetho-okhttp3:1.4.1'
compile 'com.uphyca:stetho_realm:2.0.1'
compile 'com.facebook.stetho:stetho:1.4.1'
compile 'com.facebook.stetho:stetho-okhttp3:1.4.1'
compile 'com.uphyca:stetho_realm:2.0.1'
compile 'com.jakewharton.rxbinding:rxbinding:0.4.0'
compile 'com.jakewharton.rxbinding:rxbinding-support-v4:0.4.0'
compile 'com.jakewharton.rxbinding:rxbinding:0.4.0'
compile 'com.jakewharton.rxbinding:rxbinding-support-v4:0.4.0'
compile 'com.trello:rxlifecycle:1.0'
compile 'com.trello:rxlifecycle-android:1.0'
compile 'com.trello:rxlifecycle-components:1.0'
compile 'com.trello:rxlifecycle:1.0'
compile 'com.trello:rxlifecycle-android:1.0'
compile 'com.trello:rxlifecycle-components:1.0'
compile 'com.amulyakhare:com.amulyakhare.textdrawable:1.0.1'
compile 'com.amulyakhare:com.amulyakhare.textdrawable:1.0.1'
compile 'frankiesardo:icepick:3.2.0'
provided 'frankiesardo:icepick-processor:3.2.0'
compile 'frankiesardo:icepick:3.2.0'
provided 'frankiesardo:icepick-processor:3.2.0'
}
apply plugin: 'com.google.gms.google-services'
<lint>
<issue id="InvalidPackage">
<ignore regexp="okio.*jar"/>
</issue>
<issue id="NewApi">
<ignore regexp="Try-with-resources requires API level 19"/>
</issue>
<issue id="InvalidPackage">
<ignore regexp="okio.*jar"/>
</issue>
<issue id="NewApi">
<ignore regexp="Try-with-resources requires API level 19"/>
</issue>
</lint>
\ No newline at end of file
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="chat.rocket.android">
<uses-permission android:name="android.permission.INTERNET"/>
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>
<application
android:name=".RocketChatApplication"
android:allowBackup="true"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:supportsRtl="true"
android:theme="@style/AppTheme">
<activity
android:name=".activity.MainActivity"
android:windowSoftInputMode="adjustResize">
<intent-filter>
<action android:name="android.intent.action.MAIN"/>
<category android:name="android.intent.category.DEFAULT"/>
<category android:name="android.intent.category.LAUNCHER"/>
</intent-filter>
</activity>
<activity
android:name=".activity.AddServerActivity"
android:windowSoftInputMode="adjustResize"/>
<activity
android:name=".activity.ServerConfigActivity"
android:windowSoftInputMode="adjustResize"/>
<service android:name=".service.RocketChatService"/>
<service android:name=".service.notification.NotificationDismissalCallbackService"/>
</application>
package="chat.rocket.android">
<uses-permission android:name="android.permission.INTERNET"/>
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>
<application
android:name=".RocketChatApplication"
android:allowBackup="true"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:supportsRtl="true"
android:theme="@style/AppTheme">
<activity
android:name=".activity.MainActivity"
android:windowSoftInputMode="adjustResize">
<intent-filter>
<action android:name="android.intent.action.MAIN"/>
<category android:name="android.intent.category.DEFAULT"/>
<category android:name="android.intent.category.LAUNCHER"/>
</intent-filter>
</activity>
<activity
android:name=".activity.AddServerActivity"
android:windowSoftInputMode="adjustResize"/>
<activity
android:name=".activity.ServerConfigActivity"
android:windowSoftInputMode="adjustResize"/>
<service android:name=".service.RocketChatService"/>
<service android:name=".service.notification.NotificationDismissalCallbackService"/>
</application>
</manifest>
......@@ -2,6 +2,7 @@ package chat.rocket.android;
import android.content.Context;
import android.content.Intent;
import chat.rocket.android.activity.AddServerActivity;
import chat.rocket.android.activity.ServerConfigActivity;
......
package chat.rocket.android;
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.uphyca.stetho_realm.RealmInspectorModulesProvider;
import io.realm.Realm;
import io.realm.RealmConfiguration;
import java.util.List;
import chat.rocket.android.model.ServerConfig;
import chat.rocket.android.realm_helper.RealmStore;
import chat.rocket.android.wrappers.InstabugWrapper;
/**
* Customized Application-class for Rocket.Chat
*/
public class RocketChatApplication extends MultiDexApplication {
@Override public void onCreate() {
@Override
public void onCreate() {
super.onCreate();
Realm.init(this);
......
......@@ -4,6 +4,7 @@ import android.content.Intent;
import android.content.SharedPreferences;
import android.os.Bundle;
import android.support.annotation.Nullable;
import chat.rocket.android.LaunchUtil;
import chat.rocket.android.RocketChatCache;
import chat.rocket.android.model.ServerConfig;
......@@ -14,19 +15,8 @@ import chat.rocket.android.service.RocketChatService;
import icepick.State;
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 roomId;
SharedPreferences.OnSharedPreferenceChangeListener preferenceChangeListener =
(sharedPreferences, key) -> {
if (RocketChatCache.KEY_SELECTED_SERVER_CONFIG_ID.equals(key)) {
......@@ -35,8 +25,18 @@ abstract class AbstractAuthedActivity extends AbstractFragmentActivity {
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);
if (savedInstanceState == null) {
Intent intent = getIntent();
......@@ -119,11 +119,14 @@ abstract class AbstractAuthedActivity extends AbstractFragmentActivity {
onRoomIdUpdated();
}
protected void onServerConfigIdUpdated() {}
protected void onServerConfigIdUpdated() {
}
protected void onRoomIdUpdated() {}
protected void onRoomIdUpdated() {
}
@Override protected void onResume() {
@Override
protected void onResume() {
super.onResume();
RocketChatService.keepalive(this);
unconfiguredServersObserver.sub();
......@@ -134,7 +137,8 @@ abstract class AbstractAuthedActivity extends AbstractFragmentActivity {
prefs.registerOnSharedPreferenceChangeListener(preferenceChangeListener);
}
@Override protected void onPause() {
@Override
protected void onPause() {
SharedPreferences prefs = RocketChatCache.get(this);
prefs.unregisterOnSharedPreferenceChangeListener(preferenceChangeListener);
......@@ -142,7 +146,8 @@ abstract class AbstractAuthedActivity extends AbstractFragmentActivity {
super.onPause();
}
@Override protected void onSaveInstanceState(Bundle outState) {
@Override
protected void onSaveInstanceState(Bundle outState) {
super.onSaveInstanceState(outState);
}
}
......@@ -6,12 +6,10 @@ import android.support.annotation.Nullable;
import android.support.v4.app.Fragment;
import android.support.v4.app.FragmentManager;
import android.view.MotionEvent;
import com.trello.rxlifecycle.components.support.RxAppCompatActivity;
import chat.rocket.android.helper.OnBackPressListener;
import chat.rocket.android.log.RCLog;
import com.trello.rxlifecycle.components.support.RxAppCompatActivity;
import chat.rocket.android.wrappers.InstabugWrapper;
import icepick.Icepick;
......
......@@ -3,6 +3,8 @@ package chat.rocket.android.activity;
import android.os.Bundle;
import android.support.annotation.Nullable;
import android.support.v4.app.Fragment;
import java.util.UUID;
import chat.rocket.android.R;
import chat.rocket.android.RocketChatCache;
import chat.rocket.android.fragment.server_config.InputHostnameFragment;
......@@ -11,7 +13,6 @@ import chat.rocket.android.model.ServerConfig;
import chat.rocket.android.realm_helper.RealmListObserver;
import chat.rocket.android.realm_helper.RealmObjectObserver;
import chat.rocket.android.realm_helper.RealmStore;
import java.util.UUID;
public class AddServerActivity extends AbstractFragmentActivity {
......@@ -36,11 +37,13 @@ public class AddServerActivity extends AbstractFragmentActivity {
if (config == null || config.getState() == ServerConfig.STATE_CONNECTION_ERROR) {
showFragment(new InputHostnameFragment());
} 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);
setContentView(R.layout.simple_screen);
......@@ -66,28 +69,33 @@ public class AddServerActivity extends AbstractFragmentActivity {
serverConfigId = UUID.randomUUID().toString();
}
@Override protected int getLayoutContainerForFragment() {
@Override
protected int getLayoutContainerForFragment() {
return R.id.content;
}
@Override protected void onResume() {
@Override
protected void onResume() {
super.onResume();
configuredServersObserver.sub();
targetServerConfigObserver.sub();
}
@Override protected void onPause() {
@Override
protected void onPause() {
configuredServersObserver.unsub();
targetServerConfigObserver.unsub();
super.onPause();
}
@Override protected void showFragment(Fragment fragment) {
@Override
protected void showFragment(Fragment fragment) {
injectServerConfigIdArgTo(fragment);
super.showFragment(fragment);
}
@Override protected void showFragmentWithBackStack(Fragment fragment) {
@Override
protected void showFragmentWithBackStack(Fragment fragment) {
injectServerConfigIdArgTo(fragment);
super.showFragmentWithBackStack(fragment);
}
......@@ -101,7 +109,8 @@ public class AddServerActivity extends AbstractFragmentActivity {
fragment.setArguments(args);
}
@Override protected void onBackPressedNotHandled() {
@Override
protected void onBackPressedNotHandled() {
moveTaskToBack(true);
}
}
......@@ -5,6 +5,7 @@ import android.support.annotation.Nullable;
import android.support.v4.widget.SlidingPaneLayout;
import android.support.v7.widget.Toolbar;
import android.view.View;
import chat.rocket.android.LaunchUtil;
import chat.rocket.android.R;
import chat.rocket.android.api.MethodCallHelper;
......@@ -26,11 +27,13 @@ public class MainActivity extends AbstractAuthedActivity {
private RealmObjectObserver<Session> sessionObserver;
@Override protected int getLayoutContainerForFragment() {
@Override
protected int getLayoutContainerForFragment() {
return R.id.activity_main_container;
}
@Override protected void onCreate(@Nullable Bundle savedInstanceState) {
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
......@@ -73,7 +76,8 @@ public class MainActivity extends AbstractAuthedActivity {
if (pane != null) {
final SlidingPaneLayout subPane = (SlidingPaneLayout) findViewById(R.id.sub_sliding_pane);
pane.setPanelSlideListener(new SlidingPaneLayout.SimplePanelSlideListener() {
@Override public void onPanelClosed(View panel) {
@Override
public void onPanelClosed(View panel) {
super.onPanelClosed(panel);
if (subPane != null) {
subPane.closePane();
......@@ -101,7 +105,8 @@ public class MainActivity extends AbstractAuthedActivity {
}
@DebugLog
@Override protected void onServerConfigIdUpdated() {
@Override
protected void onServerConfigIdUpdated() {
super.onServerConfigIdUpdated();
updateSessionObserver();
updateSidebarMainFragment();
......@@ -142,7 +147,8 @@ public class MainActivity extends AbstractAuthedActivity {
.commit();
}
@Override protected void onRoomIdUpdated() {
@Override
protected void onRoomIdUpdated() {
super.onRoomIdUpdated();
if (roomId != null) {
......@@ -153,7 +159,8 @@ public class MainActivity extends AbstractAuthedActivity {
}
}
@Override protected void onDestroy() {
@Override
protected void onDestroy() {
if (sessionObserver != null) {
sessionObserver.unsub();
sessionObserver = null;
......@@ -161,7 +168,8 @@ public class MainActivity extends AbstractAuthedActivity {
super.onDestroy();
}
@Override protected boolean onBackPress() {
@Override
protected boolean onBackPress() {
return closeSidebarIfNeeded() || super.onBackPress();
}
}
......@@ -4,6 +4,7 @@ import android.content.Intent;
import android.os.Bundle;
import android.support.annotation.Nullable;
import android.support.v4.app.Fragment;
import chat.rocket.android.R;
import chat.rocket.android.fragment.server_config.LoginFragment;
import chat.rocket.android.fragment.server_config.RetryLoginFragment;
......@@ -22,11 +23,13 @@ public class ServerConfigActivity extends AbstractFragmentActivity {
private String serverConfigId;
private RealmObjectObserver<Session> sessionObserver;
@Override protected int getLayoutContainerForFragment() {
@Override
protected int getLayoutContainerForFragment() {
return R.id.content;
}
@Override protected void onCreate(@Nullable Bundle savedInstanceState) {
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
Intent intent = getIntent();
......@@ -49,13 +52,15 @@ public class ServerConfigActivity extends AbstractFragmentActivity {
showFragment(new WaitingFragment());
}
@Override protected void onResume() {
@Override
protected void onResume() {
super.onResume();
RocketChatService.keepalive(this);
sessionObserver.sub();
}
@Override protected void onPause() {
@Override
protected void onPause() {
sessionObserver.unsub();
super.onPause();
}
......@@ -75,7 +80,8 @@ public class ServerConfigActivity extends AbstractFragmentActivity {
final String token = session.getToken();
if (!TextUtils.isEmpty(token)) {
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 {
showFragment(new RetryLoginFragment());
}
......@@ -85,12 +91,14 @@ public class ServerConfigActivity extends AbstractFragmentActivity {
showFragment(new LoginFragment());
}
@Override protected void showFragment(Fragment fragment) {
@Override
protected void showFragment(Fragment fragment) {
injectServerConfigIdArgTo(fragment);
super.showFragment(fragment);
}
@Override protected void showFragmentWithBackStack(Fragment fragment) {
@Override
protected void showFragmentWithBackStack(Fragment fragment) {
injectServerConfigIdArgTo(fragment);
super.showFragmentWithBackStack(fragment);
}
......@@ -104,7 +112,8 @@ public class ServerConfigActivity extends AbstractFragmentActivity {
fragment.setArguments(args);
}
@Override protected void onBackPressedNotHandled() {
@Override
protected void onBackPressedNotHandled() {
moveTaskToBack(true);
}
}
package chat.rocket.android.api;
import android.support.annotation.Nullable;
import org.json.JSONArray;
import org.json.JSONException;
import java.util.UUID;
import bolts.Task;
import chat.rocket.android.helper.OkHttpHelper;
import chat.rocket.android.helper.TextUtils;
......@@ -8,9 +12,6 @@ import chat.rocket.android.log.RCLog;
import chat.rocket.android_ddp.DDPClient;
import chat.rocket.android_ddp.DDPClientCallback;
import chat.rocket.android_ddp.DDPSubscription;
import java.util.UUID;
import org.json.JSONArray;
import org.json.JSONException;
import rx.Observable;
/**
......@@ -85,7 +86,7 @@ public class DDPClientWraper {
* Execute raw RPC.
*/
public Task<DDPClientCallback.RPC> rpc(String methodCallId, String methodName, String params,
long timeoutMs) {
long timeoutMs) {
RCLog.d("rpc:[%s]> %s(%s) timeout=%d", methodCallId, methodName, params, timeoutMs);
if (TextUtils.isEmpty(params)) {
return ddpClient.rpc(methodName, null, methodCallId, timeoutMs).continueWithTask(task -> {
......
package chat.rocket.android.api;
import android.content.Context;
import org.json.JSONArray;
import org.json.JSONObject;
import bolts.Task;
import chat.rocket.android.helper.TextUtils;
import chat.rocket.android.realm_helper.RealmHelper;
import org.json.JSONArray;
import org.json.JSONObject;
/**
* MethodCall for uploading file.
......@@ -20,7 +21,7 @@ public class FileUploadingHelper extends MethodCallHelper {
}
public Task<JSONObject> uploadRequest(String filename, long filesize, String mimeType,
String roomId) {
String roomId) {
return call("slingshot/uploadRequest", TIMEOUT_MS, () -> new JSONArray()
.put("rocketchat-uploads")
.put(new JSONObject()
......@@ -40,7 +41,7 @@ public class FileUploadingHelper extends MethodCallHelper {
}
public Task<JSONObject> ufsCreate(String filename, long filesize, String mimeType, String store,
String roomId) {
String roomId) {
return call("ufsCreate", TIMEOUT_MS, () -> new JSONArray().put(new JSONObject()
.put("name", filename)
.put("size", filesize)
......
......@@ -2,6 +2,11 @@ package chat.rocket.android.api;
import android.content.Context;
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.Task;
import chat.rocket.android.helper.CheckSum;
......@@ -16,10 +21,6 @@ import chat.rocket.android.realm_helper.RealmHelper;
import chat.rocket.android.realm_helper.RealmStore;
import chat.rocket.android_ddp.DDPClientCallback;
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.
......@@ -27,10 +28,14 @@ import org.json.JSONObject;
*/
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 RealmHelper realmHelper;
protected final DDPClientWraper ddpClient;
protected static final long TIMEOUT_MS = 4000;
@Deprecated
/**
......@@ -93,10 +98,6 @@ public class MethodCallHelper {
});
}
protected interface ParamBuilder {
JSONArray buildParam() throws JSONException;
}
protected final Task<String> call(String methodName, long timeout) {
return injectErrorHandler(executeMethodCall(methodName, null, timeout));
}
......@@ -111,17 +112,11 @@ 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.
*/
public Task<String> registerUser(final String name, final String email,
final String password, final String confirmPassword) {
final String password, final String confirmPassword) {
return call("registerUser", TIMEOUT_MS, () -> new JSONArray().put(new JSONObject()
.put("name", name)
.put("email", email)
......@@ -175,7 +170,7 @@ public class MethodCallHelper {
* Login with OAuth.
*/
public Task<Void> loginWithOAuth(final String credentialToken,
final String credentialSecret) {
final String credentialSecret) {
return call("login", TIMEOUT_MS, () -> new JSONArray().put(new JSONObject()
.put("oauth", new JSONObject()
.put("credentialToken", credentialToken)
......@@ -241,7 +236,7 @@ public class MethodCallHelper {
* Load messages for room.
*/
public Task<JSONArray> loadHistory(final String roomId, final long timestamp,
final int count, final long lastSeen) {
final int count, final long lastSeen) {
return call("loadHistory", TIMEOUT_MS, () -> new JSONArray()
.put(roomId)
.put(timestamp > 0 ? new JSONObject().put("$date", timestamp) : JSONObject.NULL)
......@@ -340,7 +335,6 @@ public class MethodCallHelper {
.onSuccessTask(task -> Task.forResult(null));
}
public Task<Void> getPublicSettings() {
return call("public-settings/get", TIMEOUT_MS)
.onSuccessTask(CONVERT_TO_JSON_ARRAY)
......@@ -357,4 +351,9 @@ public class MethodCallHelper {
});
});
}
protected interface ParamBuilder {
JSONArray buildParam() throws JSONException;
}
}
......@@ -14,14 +14,16 @@ import com.trello.rxlifecycle.components.support.RxFragment;
public abstract class AbstractFragment extends RxFragment {
protected View rootView;
protected abstract @LayoutRes int getLayout();
protected abstract
@LayoutRes
int getLayout();
protected abstract void onSetupView();
@Nullable
@Override
public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container,
@Nullable Bundle savedInstanceState) {
@Nullable Bundle savedInstanceState) {
rootView = inflater.inflate(getLayout(), container, false);
onSetupView();
return rootView;
......
......@@ -9,6 +9,7 @@ import android.webkit.WebResourceRequest;
import android.webkit.WebSettings;
import android.webkit.WebView;
import android.webkit.WebViewClient;
import chat.rocket.android.R;
import chat.rocket.android.helper.OnBackPressListener;
import hugo.weaving.DebugLog;
......@@ -19,11 +20,13 @@ public abstract class AbstractWebViewFragment extends AbstractFragment
private WebViewClient webviewClient = new WebViewClient() {
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;
}
@Override public void onPageFinished(WebView webview, String url) {
@Override
public void onPageFinished(WebView webview, String url) {
if (!error) {
onPageLoaded(webview, url);
}
......@@ -35,7 +38,8 @@ public abstract class AbstractWebViewFragment extends AbstractFragment
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))
|| super.shouldOverrideUrlLoading(webview, url);
}
......@@ -48,11 +52,13 @@ public abstract class AbstractWebViewFragment extends AbstractFragment
}
};
@Override protected int getLayout() {
@Override
protected int getLayout() {
return R.layout.webview;
}
@Override protected void onSetupView() {
@Override
protected void onSetupView() {
webview = (WebView) rootView.findViewById(R.id.webview);
setupWebView();
......@@ -76,7 +82,8 @@ public abstract class AbstractWebViewFragment extends AbstractFragment
}
}
@Override public boolean onBackPressed() {
@Override
public boolean onBackPressed() {
if (webview.canGoBack()) {
webview.goBack();
return true;
......
......@@ -6,6 +6,7 @@ import android.support.v7.widget.Toolbar;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import chat.rocket.android.R;
import chat.rocket.android.fragment.AbstractFragment;
......@@ -15,7 +16,7 @@ abstract class AbstractChatRoomFragment extends AbstractFragment {
@Nullable
@Override
public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container,
@Nullable Bundle savedInstanceState) {
@Nullable Bundle savedInstanceState) {
activityToolbar = (Toolbar) getActivity().findViewById(R.id.activity_main_toolbar);
return super.onCreateView(inflater, container, savedInstanceState);
}
......
......@@ -6,15 +6,18 @@ public class HomeFragment extends AbstractChatRoomFragment {
public HomeFragment() {
}
@Override protected int getLayout() {
@Override
protected int getLayout() {
return R.layout.fragment_home;
}
@Override protected void onSetupView() {
@Override
protected void onSetupView() {
activityToolbar.setTitle(R.string.home_fragment_title);
}
@Override public void onResume() {
@Override
public void onResume() {
super.onResume();
activityToolbar.setNavigationIcon(null);
activityToolbar.setTitle(R.string.home_fragment_title);
......
......@@ -12,15 +12,21 @@ import android.support.v7.app.AlertDialog;
import android.support.v7.widget.LinearLayoutManager;
import android.support.v7.widget.RecyclerView;
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.api.MethodCallHelper;
import chat.rocket.android.fragment.chatroom.dialog.FileUploadProgressDialogFragment;
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.LogcatIfError;
import chat.rocket.android.helper.OnBackPressListener;
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.MessageListAdapter;
import chat.rocket.android.layouthelper.chatroom.PairedMessage;
......@@ -38,11 +44,6 @@ import chat.rocket.android.realm_helper.RealmObjectObserver;
import chat.rocket.android.realm_helper.RealmStore;
import chat.rocket.android.service.RocketChatService;
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.
......@@ -63,6 +64,9 @@ public class RoomFragment extends AbstractChatRoomFragment
private RealmObjectObserver<LoadMessageProcedure> procedureObserver;
private MessageComposerManager messageComposerManager;
public RoomFragment() {
}
/**
* create fragment with roomId.
*/
......@@ -75,10 +79,8 @@ public class RoomFragment extends AbstractChatRoomFragment
return fragment;
}
public RoomFragment() {
}
@Override public void onCreate(@Nullable Bundle savedInstanceState) {
@Override
public void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
Bundle args = getArguments();
......@@ -107,11 +109,13 @@ public class RoomFragment extends AbstractChatRoomFragment
}
}
@Override protected int getLayout() {
@Override
protected int getLayout() {
return R.layout.fragment_room;
}
@Override protected void onSetupView() {
@Override
protected void onSetupView() {
RecyclerView listView = (RecyclerView) rootView.findViewById(R.id.recyclerview);
MessageListAdapter adapter = (MessageListAdapter) realmHelper.createListAdapter(getContext(),
realm -> realm.where(Message.class)
......@@ -127,7 +131,8 @@ public class RoomFragment extends AbstractChatRoomFragment
listView.setLayoutManager(layoutManager);
scrollListener = new LoadMoreScrollListener(layoutManager, 40) {
@Override public void requestMoreItem() {
@Override
public void requestMoreItem() {
loadMoreRequest();
}
};
......@@ -138,7 +143,8 @@ public class RoomFragment extends AbstractChatRoomFragment
setupFileUploader();
}
@Override public void onItemClick(PairedMessage pairedMessage) {
@Override
public void onItemClick(PairedMessage pairedMessage) {
if (pairedMessage.target != null) {
final int syncstate = pairedMessage.target.getSyncstate();
if (syncstate == SyncState.FAILED) {
......@@ -156,7 +162,8 @@ public class RoomFragment extends AbstractChatRoomFragment
realmHelper.executeTransaction(realm ->
realm.where(Message.class)
.equalTo("_id", messageId).findAll().deleteAllFromRealm()
).continueWith(new LogcatIfError());;
).continueWith(new LogcatIfError());
;
})
.show();
}
......@@ -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);
if (requestCode != RC_UPL || resultCode != Activity.RESULT_OK) {
return;
......@@ -332,7 +340,8 @@ public class RoomFragment extends AbstractChatRoomFragment
}
}
@Override public void onResume() {
@Override
public void onResume() {
super.onResume();
roomObserver.sub();
procedureObserver.sub();
......@@ -340,13 +349,15 @@ public class RoomFragment extends AbstractChatRoomFragment
markAsReadIfNeeded();
}
@Override public void onPause() {
@Override
public void onPause() {
procedureObserver.unsub();
roomObserver.unsub();
super.onPause();
}
@Override public boolean onBackPressed() {
@Override
public boolean onBackPressed() {
return closeSideMenuIfNeeded() || messageComposerManager.hideMessageComposerIfNeeded();
}
}
......@@ -6,6 +6,7 @@ import android.support.annotation.LayoutRes;
import android.support.annotation.NonNull;
import android.support.annotation.Nullable;
import android.support.design.widget.BottomSheetDialogFragment;
import chat.rocket.android.realm_helper.RealmHelper;
import chat.rocket.android.realm_helper.RealmStore;
......@@ -14,11 +15,14 @@ abstract class AbstractChatroomDialogFragment extends BottomSheetDialogFragment
protected RealmHelper realmHelper;
protected String roomId;
protected @LayoutRes abstract int getLayout();
protected
@LayoutRes
abstract int getLayout();
protected abstract void onSetupDialog();
@Override public void onCreate(@Nullable Bundle savedInstanceState) {
@Override
public void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
Bundle args = getArguments();
......@@ -33,7 +37,8 @@ abstract class AbstractChatroomDialogFragment extends BottomSheetDialogFragment
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);
dialog.setContentView(getLayout());
onSetupDialog();
......
......@@ -7,6 +7,7 @@ import android.support.annotation.Nullable;
import android.widget.ProgressBar;
import android.widget.TextView;
import android.widget.Toast;
import chat.rocket.android.R;
import chat.rocket.android.model.SyncState;
import chat.rocket.android.model.internal.FileUploading;
......@@ -21,10 +22,11 @@ public class FileUploadProgressDialogFragment extends AbstractChatroomDialogFrag
private String uplId;
private RealmObjectObserver<FileUploading> fileUploadingObserver;
public FileUploadProgressDialogFragment() {}
public FileUploadProgressDialogFragment() {
}
public static FileUploadProgressDialogFragment create(String serverConfigId,
String roomId, String uplId) {
String roomId, String uplId) {
Bundle args = new Bundle();
args.putString("serverConfigId", serverConfigId);
args.putString("roomId", roomId);
......@@ -36,12 +38,14 @@ public class FileUploadProgressDialogFragment extends AbstractChatroomDialogFrag
return fragment;
}
@Override protected void handleArgs(@NonNull Bundle args) {
@Override
protected void handleArgs(@NonNull Bundle args) {
super.handleArgs(args);
uplId = args.getString("uplId");
}
@Override public void onCreate(@Nullable Bundle savedInstanceState) {
@Override
public void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
fileUploadingObserver = realmHelper
......@@ -49,11 +53,13 @@ public class FileUploadProgressDialogFragment extends AbstractChatroomDialogFrag
.setOnUpdateListener(this::onRenderFileUploadingState);
}
@Override protected int getLayout() {
@Override
protected int getLayout() {
return R.layout.dialog_file_uploading;
}
@Override protected void onSetupDialog() {
@Override
protected void onSetupDialog() {
}
......@@ -78,17 +84,20 @@ public class FileUploadProgressDialogFragment extends AbstractChatroomDialogFrag
}
}
@Override public void onResume() {
@Override
public void onResume() {
super.onResume();
fileUploadingObserver.sub();
}
@Override public void onPause() {
@Override
public void onPause() {
fileUploadingObserver.unsub();
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?
}
}
......@@ -7,6 +7,12 @@ import android.support.v7.widget.GridLayoutManager;
import android.support.v7.widget.RecyclerView;
import android.view.View;
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.helper.LogcatIfError;
import chat.rocket.android.layouthelper.chatroom.dialog.RoomUserAdapter;
......@@ -15,11 +21,6 @@ import chat.rocket.android.model.SyncState;
import chat.rocket.android.model.internal.GetUsersOfRoomsProcedure;
import chat.rocket.android.realm_helper.RealmObjectObserver;
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.
......@@ -30,13 +31,14 @@ public class UsersOfRoomDialogFragment extends AbstractChatroomDialogFragment {
private RealmObjectObserver<GetUsersOfRoomsProcedure> procedureObserver;
private int previousSyncState;
public UsersOfRoomDialogFragment() {}
public UsersOfRoomDialogFragment() {
}
/**
* create UsersOfRoomDialogFragment with required parameters.
*/
public static UsersOfRoomDialogFragment create(String serverConfigId,
String roomId, String hostname) {
String roomId, String hostname) {
Bundle args = new Bundle();
args.putString("serverConfigId", serverConfigId);
args.putString("roomId", roomId);
......@@ -48,7 +50,8 @@ public class UsersOfRoomDialogFragment extends AbstractChatroomDialogFragment {
return fragment;
}
@Override public void onCreate(@Nullable Bundle savedInstanceState) {
@Override
public void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
procedureObserver = realmHelper
......@@ -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);
hostname = args.getString("hostname");
}
@Override protected int getLayout() {
@Override
protected int getLayout() {
return R.layout.dialog_users_of_room;
}
@Override protected void onSetupDialog() {
@Override
protected void onSetupDialog() {
RecyclerView recyclerView = (RecyclerView) getDialog().findViewById(R.id.recyclerview);
recyclerView.setLayoutManager(new GridLayoutManager(getContext(), 2));
recyclerView.setAdapter(new RoomUserAdapter(getContext(), realmHelper, hostname));
......@@ -90,12 +96,14 @@ public class UsersOfRoomDialogFragment extends AbstractChatroomDialogFragment {
}).continueWith(new LogcatIfError());
}
@Override public void onResume() {
@Override
public void onResume() {
super.onResume();
procedureObserver.sub();
}
@Override public void onPause() {
@Override
public void onPause() {
procedureObserver.unsub();
super.onPause();
}
......
......@@ -6,6 +6,10 @@ import android.text.TextUtils;
import android.util.Base64;
import android.webkit.JavascriptInterface;
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.fragment.AbstractWebViewFragment;
import chat.rocket.android.helper.LogcatIfError;
......@@ -13,9 +17,6 @@ import chat.rocket.android.log.RCLog;
import chat.rocket.android.model.ServerConfig;
import chat.rocket.android.model.ddp.MeteorLoginServiceConfiguration;
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 {
......@@ -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);
Bundle args = getArguments();
if (!hasValidArgs(args)) {
......@@ -69,7 +71,8 @@ public abstract class AbstractOAuthFragment extends AbstractWebViewFragment {
url = generateURL(oauthConfig);
}
@Override protected void navigateToInitialPage(WebView webview) {
@Override
protected void navigateToInitialPage(WebView webview) {
if (TextUtils.isEmpty(url)) {
finish();
return;
......@@ -99,10 +102,10 @@ public abstract class AbstractOAuthFragment extends AbstractWebViewFragment {
}), "_rocketchet_hook");
}
@Override protected void onPageLoaded(WebView webview, String url) {
@Override
protected void onPageLoaded(WebView webview, String url) {
super.onPageLoaded(webview, url);
if (url.contains(hostname) && url.contains("_oauth/" + getOAuthServiceName() + "?close")) {
final String jsHookUrl = "javascript:"
+ "window._rocketchet_hook.handleConfig(document.getElementById('config').innerText);";
......@@ -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 {
void hanldeResult(@Nullable JSONObject result);
}
......@@ -121,7 +134,8 @@ public abstract class AbstractOAuthFragment extends AbstractWebViewFragment {
jsInterfaceCallback = callback;
}
@JavascriptInterface public void handleConfig(String config) {
@JavascriptInterface
public void handleConfig(String config) {
try {
jsInterfaceCallback.hanldeResult(new JSONObject(config));
} catch (Exception exception) {
......@@ -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;
public class FacebookOAuthFragment extends AbstractOAuthFragment {
@Override protected String getOAuthServiceName() {
@Override
protected String getOAuthServiceName() {
return "facebook";
}
@Override protected String generateURL(MeteorLoginServiceConfiguration oauthConfig) {
@Override
protected String generateURL(MeteorLoginServiceConfiguration oauthConfig) {
return new HttpUrl.Builder().scheme("https")
.host("www.facebook.com")
.addPathSegment("v2.2")
......
......@@ -5,11 +5,13 @@ import okhttp3.HttpUrl;
public class GitHubOAuthFragment extends AbstractOAuthFragment {
@Override protected String getOAuthServiceName() {
@Override
protected String getOAuthServiceName() {
return "github";
}
@Override protected String generateURL(MeteorLoginServiceConfiguration oauthConfig) {
@Override
protected String generateURL(MeteorLoginServiceConfiguration oauthConfig) {
return new HttpUrl.Builder().scheme("https")
.host("github.com")
.addPathSegment("login")
......
......@@ -5,11 +5,13 @@ import okhttp3.HttpUrl;
public class GoogleOAuthFragment extends AbstractOAuthFragment {
@Override protected String getOAuthServiceName() {
@Override
protected String getOAuthServiceName() {
return "google";
}
@Override protected String generateURL(MeteorLoginServiceConfiguration oauthConfig) {
@Override
protected String generateURL(MeteorLoginServiceConfiguration oauthConfig) {
return new HttpUrl.Builder().scheme("https")
.host("accounts.google.com")
.addPathSegment("o")
......
......@@ -4,11 +4,13 @@ import chat.rocket.android.model.ddp.MeteorLoginServiceConfiguration;
public class TwitterOAuthFragment extends AbstractOAuthFragment {
@Override protected String getOAuthServiceName() {
@Override
protected String getOAuthServiceName() {
return "twitter";
}
@Override protected String generateURL(MeteorLoginServiceConfiguration oauthConfig) {
@Override
protected String generateURL(MeteorLoginServiceConfiguration oauthConfig) {
return "https://" + hostname + "/_oauth/twitter/"
+ "?requestTokenAndRedirect=true&state=" + getStateString();
}
......
......@@ -3,6 +3,7 @@ package chat.rocket.android.fragment.server_config;
import android.os.Bundle;
import android.support.annotation.Nullable;
import android.support.v4.app.Fragment;
import chat.rocket.android.R;
import chat.rocket.android.fragment.AbstractFragment;
import chat.rocket.android.helper.TextUtils;
......@@ -10,7 +11,8 @@ import chat.rocket.android.helper.TextUtils;
abstract class AbstractServerConfigFragment extends AbstractFragment {
protected String serverConfigId;
@Override public void onCreate(@Nullable Bundle savedInstanceState) {
@Override
public void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
Bundle args = getArguments();
......
......@@ -2,6 +2,8 @@ package chat.rocket.android.fragment.server_config;
import android.support.design.widget.Snackbar;
import android.widget.TextView;
import org.json.JSONObject;
import chat.rocket.android.R;
import chat.rocket.android.RocketChatCache;
import chat.rocket.android.helper.LogcatIfError;
......@@ -9,7 +11,6 @@ import chat.rocket.android.helper.TextUtils;
import chat.rocket.android.model.ServerConfig;
import chat.rocket.android.realm_helper.RealmObjectObserver;
import chat.rocket.android.realm_helper.RealmStore;
import org.json.JSONObject;
/**
* Input server host.
......@@ -23,11 +24,13 @@ public class InputHostnameFragment extends AbstractServerConfigFragment {
public InputHostnameFragment() {
}
@Override protected int getLayout() {
@Override
protected int getLayout() {
return R.layout.fragment_input_hostname;
}
@Override protected void onSetupView() {
@Override
protected void onSetupView() {
rootView.findViewById(R.id.btn_connect).setOnClickListener(view -> handleConnect());
serverConfigObserver.sub();
......@@ -52,11 +55,13 @@ public class InputHostnameFragment extends AbstractServerConfigFragment {
.put("state", ServerConfig.STATE_READY))).continueWith(new LogcatIfError());
}
@Override public void onResume() {
@Override
public void onResume() {
super.onResume();
}
@Override public void onDestroyView() {
@Override
public void onDestroyView() {
serverConfigObserver.unsub();
super.onDestroyView();
}
......
......@@ -6,6 +6,9 @@ import android.support.design.widget.Snackbar;
import android.support.v4.app.Fragment;
import android.view.View;
import android.widget.TextView;
import java.util.HashMap;
import java.util.List;
import chat.rocket.android.R;
import chat.rocket.android.api.MethodCallHelper;
import chat.rocket.android.helper.TextUtils;
......@@ -14,27 +17,28 @@ import chat.rocket.android.log.RCLog;
import chat.rocket.android.model.ddp.MeteorLoginServiceConfiguration;
import chat.rocket.android.realm_helper.RealmListObserver;
import chat.rocket.android.realm_helper.RealmStore;
import java.util.HashMap;
import java.util.List;
/**
* Login screen.
*/
public class LoginFragment extends AbstractServerConfigFragment {
@Override protected int getLayout() {
private RealmListObserver<MeteorLoginServiceConfiguration> authProvidersObserver;
@Override
protected int getLayout() {
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);
authProvidersObserver = RealmStore.get(serverConfigId)
.createListObserver(realm -> realm.where(MeteorLoginServiceConfiguration.class).findAll())
.setOnUpdateListener(this::onRenderAuthProviders);
}
@Override protected void onSetupView() {
@Override
protected void onSetupView() {
final View btnEmail = rootView.findViewById(R.id.btn_login_with_email);
final TextView txtUsername = (TextView) rootView.findViewById(R.id.editor_username);
final TextView txtPasswd = (TextView) rootView.findViewById(R.id.editor_passwd);
......@@ -80,7 +84,7 @@ public class LoginFragment extends AbstractServerConfigFragment {
for (MeteorLoginServiceConfiguration authProvider : authProviders) {
for (OAuthProviderInfo info : OAuthProviderInfo.LIST) {
if (!supportedMap.get(info.serviceName)
&& info.serviceName.equals(authProvider.getService())) {
&& info.serviceName.equals(authProvider.getService())) {
supportedMap.put(info.serviceName, true);
viewMap.get(info.serviceName).setOnClickListener(view -> {
Fragment fragment = null;
......@@ -108,12 +112,14 @@ public class LoginFragment extends AbstractServerConfigFragment {
}
}
@Override public void onResume() {
@Override
public void onResume() {
super.onResume();
authProvidersObserver.sub();
}
@Override public void onPause() {
@Override
public void onPause() {
authProvidersObserver.unsub();
super.onPause();
}
......
......@@ -4,6 +4,7 @@ import android.os.Bundle;
import android.support.annotation.Nullable;
import android.view.View;
import android.widget.TextView;
import chat.rocket.android.R;
import chat.rocket.android.api.MethodCallHelper;
import chat.rocket.android.helper.TextUtils;
......@@ -15,20 +16,23 @@ import chat.rocket.android.realm_helper.RealmStore;
* Login screen.
*/
public class RetryLoginFragment extends AbstractServerConfigFragment {
@Override protected int getLayout() {
private RealmObjectObserver<Session> sessionObserver;
@Override
protected int getLayout() {
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);
sessionObserver = RealmStore.get(serverConfigId)
.createObjectObserver(Session::queryDefaultSession)
.setOnUpdateListener(this::onRenderServerConfigSession);
}
@Override protected void onSetupView() {
@Override
protected void onSetupView() {
}
private void onRenderServerConfigSession(Session session) {
......@@ -63,12 +67,14 @@ public class RetryLoginFragment extends AbstractServerConfigFragment {
}
}
@Override public void onResume() {
@Override
public void onResume() {
super.onResume();
sessionObserver.sub();
}
@Override public void onPause() {
@Override
public void onPause() {
sessionObserver.unsub();
super.onPause();
}
......
......@@ -11,6 +11,7 @@ import android.view.LayoutInflater;
import android.view.View;
import android.widget.TextView;
import android.widget.Toast;
import chat.rocket.android.R;
import chat.rocket.android.api.MethodCallHelper;
import chat.rocket.android.helper.TextUtils;
......@@ -24,11 +25,15 @@ public class UserRegistrationDialogFragment extends DialogFragment {
private String email;
private String password;
public UserRegistrationDialogFragment() {
super();
}
/**
* create UserRegistrationDialogFragment with auto-detect email/username.
*/
public static UserRegistrationDialogFragment create(String serverConfigId,
String usernameOrEmail, String password) {
String usernameOrEmail, String password) {
if (Patterns.EMAIL_ADDRESS.matcher(usernameOrEmail).matches()) {
return create(serverConfigId, null, usernameOrEmail, password);
} else {
......@@ -40,7 +45,8 @@ public class UserRegistrationDialogFragment extends DialogFragment {
* create UserRegistrationDialogFragment.
*/
public static UserRegistrationDialogFragment create(String serverConfigId,
String username, String email, String password) {
String username, String email,
String password) {
Bundle args = new Bundle();
args.putString("serverConfigId", serverConfigId);
if (!TextUtils.isEmpty(username)) {
......@@ -57,11 +63,8 @@ public class UserRegistrationDialogFragment extends DialogFragment {
return dialog;
}
public UserRegistrationDialogFragment() {
super();
}
@Override public void onCreate(@Nullable Bundle savedInstanceState) {
@Override
public void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
Bundle args = getArguments();
......@@ -74,7 +77,8 @@ public class UserRegistrationDialogFragment extends DialogFragment {
}
@NonNull
@Override public Dialog onCreateDialog(Bundle savedInstanceState) {
@Override
public Dialog onCreateDialog(Bundle savedInstanceState) {
return new AlertDialog.Builder(getContext(), R.style.AppTheme_Dialog)
.setView(createDialogView())
.create();
......
......@@ -3,6 +3,7 @@ package chat.rocket.android.fragment.server_config;
import android.os.Bundle;
import android.view.View;
import android.widget.TextView;
import chat.rocket.android.R;
import chat.rocket.android.helper.TextUtils;
......@@ -13,6 +14,9 @@ public class WaitingFragment extends AbstractServerConfigFragment {
private String caption;
public WaitingFragment() {
}
/**
* create new "Waiting..." screen with caption.
*/
......@@ -24,13 +28,13 @@ public class WaitingFragment extends AbstractServerConfigFragment {
return fragment;
}
public WaitingFragment() {}
@Override protected int getLayout() {
@Override
protected int getLayout() {
return R.layout.fragment_waiting;
}
@Override protected void onSetupView() {
@Override
protected void onSetupView() {
Bundle args = getArguments();
if (args != null) {
caption = args.getString("caption");
......
......@@ -7,13 +7,16 @@ import android.widget.CompoundButton;
import android.widget.ImageView;
import android.widget.LinearLayout;
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.RocketChatCache;
import chat.rocket.android.api.MethodCallHelper;
import chat.rocket.android.fragment.AbstractFragment;
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.AddDirectMessageDialogFragment;
import chat.rocket.android.helper.LogcatIfError;
import chat.rocket.android.helper.TextUtils;
import chat.rocket.android.layouthelper.chatroom.RoomListManager;
......@@ -25,8 +28,6 @@ import chat.rocket.android.realm_helper.RealmListObserver;
import chat.rocket.android.realm_helper.RealmObjectObserver;
import chat.rocket.android.realm_helper.RealmStore;
import chat.rocket.android.renderer.UserRenderer;
import com.jakewharton.rxbinding.view.RxView;
import com.jakewharton.rxbinding.widget.RxCompoundButton;
public class SidebarMainFragment extends AbstractFragment {
......@@ -52,7 +53,8 @@ public class SidebarMainFragment extends AbstractFragment {
return fragment;
}
@Override public void onCreate(@Nullable Bundle savedInstanceState) {
@Override
public void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
Bundle args = getArguments();
......@@ -67,7 +69,8 @@ public class SidebarMainFragment extends AbstractFragment {
RealmHelper realmHelper = RealmStore.get(serverConfigId);
if (realmHelper != null) {
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));
currentUserObserver = realmHelper
......@@ -79,7 +82,8 @@ public class SidebarMainFragment extends AbstractFragment {
}
}
@Override protected int getLayout() {
@Override
protected int getLayout() {
if (serverConfigId == null) {
return R.layout.simple_screen;
} else {
......@@ -87,7 +91,8 @@ public class SidebarMainFragment extends AbstractFragment {
}
}
@Override protected void onSetupView() {
@Override
protected void onSetupView() {
if (serverConfigId == null) {
return;
}
......@@ -181,7 +186,8 @@ public class SidebarMainFragment extends AbstractFragment {
dialog.show(getFragmentManager(), AbstractAddRoomDialogFragment.class.getSimpleName());
}
@Override public void onResume() {
@Override
public void onResume() {
super.onResume();
if (roomsObserver != null) {
roomsObserver.sub();
......@@ -189,7 +195,8 @@ public class SidebarMainFragment extends AbstractFragment {
}
}
@Override public void onPause() {
@Override
public void onPause() {
if (roomsObserver != null) {
currentUserObserver.unsub();
roomsObserver.unsub();
......
......@@ -7,12 +7,13 @@ import android.support.annotation.NonNull;
import android.support.annotation.Nullable;
import android.view.View;
import android.widget.Toast;
import com.trello.rxlifecycle.components.support.RxAppCompatDialogFragment;
import bolts.Task;
import chat.rocket.android.R;
import chat.rocket.android.api.MethodCallHelper;
import chat.rocket.android.realm_helper.RealmHelper;
import chat.rocket.android.realm_helper.RealmStore;
import com.trello.rxlifecycle.components.support.RxAppCompatDialogFragment;
public abstract class AbstractAddRoomDialogFragment extends RxAppCompatDialogFragment {
......@@ -20,11 +21,14 @@ public abstract class AbstractAddRoomDialogFragment extends RxAppCompatDialogFra
protected MethodCallHelper methodCall;
protected String hostname;
protected @LayoutRes abstract int getLayout();
protected
@LayoutRes
abstract int getLayout();
protected abstract void onSetupDialog();
@Override public void onCreate(@Nullable Bundle savedInstanceState) {
@Override
public void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
Bundle args = getArguments();
......@@ -40,7 +44,8 @@ public abstract class AbstractAddRoomDialogFragment extends RxAppCompatDialogFra
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);
dialog.setContentView(getLayout());
onSetupDialog();
......
......@@ -3,23 +3,27 @@ package chat.rocket.android.fragment.sidebar.dialog;
import android.view.View;
import android.widget.CompoundButton;
import android.widget.TextView;
import com.jakewharton.rxbinding.view.RxView;
import com.jakewharton.rxbinding.widget.RxTextView;
import bolts.Task;
import chat.rocket.android.R;
import chat.rocket.android.helper.TextUtils;
import com.jakewharton.rxbinding.view.RxView;
import com.jakewharton.rxbinding.widget.RxTextView;
/**
* add Channel, add Private-group.
*/
public class AddChannelDialogFragment extends AbstractAddRoomDialogFragment {
public AddChannelDialogFragment() {}
public AddChannelDialogFragment() {
}
@Override protected int getLayout() {
@Override
protected int getLayout() {
return R.layout.dialog_add_channel;
}
@Override protected void onSetupDialog() {
@Override
protected void onSetupDialog() {
View buttonAddChannel = getDialog().findViewById(R.id.btn_add_channel);
RxTextView.textChanges((TextView) getDialog().findViewById(R.id.editor_channel_name))
......@@ -35,7 +39,8 @@ public class AddChannelDialogFragment extends AbstractAddRoomDialogFragment {
return check.isChecked();
}
@Override protected Task<Void> getMethodCallForSubmitAction() {
@Override
protected Task<Void> getMethodCallForSubmitAction() {
TextView channelNameText = (TextView) getDialog().findViewById(R.id.editor_channel_name);
String channelName = channelNameText.getText().toString();
boolean isPrivate = isChecked(R.id.checkbox_private);
......
......@@ -3,27 +3,31 @@ package chat.rocket.android.fragment.sidebar.dialog;
import android.view.View;
import android.widget.AutoCompleteTextView;
import android.widget.TextView;
import com.jakewharton.rxbinding.view.RxView;
import com.jakewharton.rxbinding.widget.RxTextView;
import io.realm.Case;
import bolts.Task;
import chat.rocket.android.R;
import chat.rocket.android.helper.TextUtils;
import chat.rocket.android.layouthelper.sidebar.dialog.SuggestUserAdapter;
import chat.rocket.android.model.ddp.User;
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.
*/
public class AddDirectMessageDialogFragment extends AbstractAddRoomDialogFragment {
public AddDirectMessageDialogFragment() {}
public AddDirectMessageDialogFragment() {
}
@Override protected int getLayout() {
@Override
protected int getLayout() {
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);
AutoCompleteTextView autoCompleteTextView =
(AutoCompleteTextView) getDialog().findViewById(R.id.editor_username);
......@@ -43,7 +47,8 @@ public class AddDirectMessageDialogFragment extends AbstractAddRoomDialogFragmen
buttonAddDirectMessage.setOnClickListener(view -> createRoom());
}
@Override protected Task<Void> getMethodCallForSubmitAction() {
@Override
protected Task<Void> getMethodCallForSubmitAction() {
String username =
((TextView) getDialog().findViewById(R.id.editor_username)).getText().toString();
return methodCall.createDirectMessage(username);
......
......@@ -9,27 +9,27 @@ import android.graphics.drawable.Drawable;
import android.os.Handler;
import android.os.Looper;
import android.widget.ImageView;
import bolts.Task;
import bolts.TaskCompletionSource;
import chat.rocket.android.log.RCLog;
import com.amulyakhare.textdrawable.TextDrawable;
import com.squareup.picasso.Picasso;
import com.squareup.picasso.Target;
import java.io.UnsupportedEncodingException;
import java.net.URLEncoder;
import bolts.Task;
import bolts.TaskCompletionSource;
import chat.rocket.android.log.RCLog;
/**
* Helper for rendering user avatar image.
*/
public class Avatar {
private final String hostname;
private final String username;
private static final int[] COLORS = new int[]{
0xFFF44336, 0xFFE91E63, 0xFF9C27B0, 0xFF673AB7, 0xFF3F51B5, 0xFF2196F3,
0xFF03A9F4, 0xFF00BCD4, 0xFF009688, 0xFF4CAF50, 0xFF8BC34A, 0xFFCDDC39,
0xFFFFC107, 0xFFFF9800, 0xFFFF5722, 0xFF795548, 0xFF9E9E9E, 0xFF607D8B
};
private final String hostname;
private final String username;
public Avatar(String hostname, String username) {
this.hostname = hostname;
......@@ -58,6 +58,21 @@ public class Avatar {
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() {
//from Rocket.Chat:packages/rocketchat-ui/lib/avatar.coffee
//REMARK! this is often SVG image! (see: Rocket.Chat:server/startup/avatar.coffee)
......@@ -116,35 +131,23 @@ public class Avatar {
.load(getImageUrl())
.error(getTextDrawable(context))
.into(new Target() {
@Override public void onBitmapLoaded(Bitmap bitmap, Picasso.LoadedFrom from) {
@Override
public void onBitmapLoaded(Bitmap bitmap, Picasso.LoadedFrom from) {
if (bitmap != null) {
task.trySetResult(bitmap);
}
}
@Override public void onBitmapFailed(Drawable errorDrawable) {
@Override
public void onBitmapFailed(Drawable errorDrawable) {
task.trySetResult(drawableToBitmap(errorDrawable, size));
}
@Override public void onPrepareLoad(Drawable placeHolderDrawable) {
@Override
public void onPrepareLoad(Drawable placeHolderDrawable) {
}
});
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;
import chat.rocket.android.log.RCLog;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.GregorianCalendar;
import java.util.TimeZone;
import chat.rocket.android.log.RCLog;
/**
* Utility class for converting epoch ms and date-time string.
......
......@@ -8,15 +8,16 @@ import android.os.ParcelFileDescriptor;
import android.provider.OpenableColumns;
import android.support.annotation.Nullable;
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.model.SyncState;
import chat.rocket.android.model.ddp.PublicSetting;
import chat.rocket.android.model.internal.FileUploading;
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.
......@@ -35,7 +36,9 @@ public class FileUploadHelper {
* requestUploading file.
* 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)) {
if (cursor != null && cursor.moveToFirst()) {
String filename = cursor.getString(cursor.getColumnIndex(OpenableColumns.DISPLAY_NAME));
......@@ -54,7 +57,7 @@ public class FileUploadHelper {
}
private String insertRequestRecord(String roomId,
Uri uri, String filename, long filesize, String mimeType) {
Uri uri, String filename, long filesize, String mimeType) {
final String uplId = UUID.randomUUID().toString();
final String storageType =
PublicSetting.getString(realmHelper, "FileUpload_Storage_Type", null);
......
......@@ -19,7 +19,8 @@ public abstract class LoadMoreScrollListener extends RecyclerView.OnScrollListen
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);
final int visibleItemCount = recyclerView.getChildCount();
......
......@@ -8,7 +8,8 @@ import chat.rocket.android.log.RCLog;
* Bolts-Task continuation for just logging if error occurred.
*/
public class LogcatIfError implements Continuation {
@Override public Object then(Task task) throws Exception {
@Override
public Object then(Task task) throws Exception {
if (task.isFaulted()) {
RCLog.w(task.getError());
}
......
package chat.rocket.android.helper;
import com.facebook.stetho.okhttp3.StethoInterceptor;
import java.util.concurrent.TimeUnit;
import okhttp3.OkHttpClient;
......
......@@ -7,7 +7,6 @@ public interface OnBackPressListener {
/**
* onBackPressed
*
* @return whether back is handled or not.
*/
boolean onBackPressed();
......
......@@ -7,7 +7,6 @@ public class TextUtils {
/**
* Returns true if the string is null or 0-length.
*
* @param str the string to be examined
* @return true if str is null or zero length
*/
......@@ -21,7 +20,7 @@ public class TextUtils {
*/
@SuppressWarnings("PMD.ShortMethodName")
public static CharSequence or(CharSequence str,
CharSequence defaultValue) {
CharSequence defaultValue) {
if (isEmpty(str)) {
return defaultValue;
}
......
......@@ -2,9 +2,10 @@ package chat.rocket.android.layouthelper;
import android.content.Context;
import android.support.annotation.LayoutRes;
import io.realm.RealmObject;
import chat.rocket.android.realm_helper.RealmModelListAdapter;
import chat.rocket.android.realm_helper.RealmModelViewHolder;
import io.realm.RealmObject;
@SuppressWarnings({"PMD.AbstractNaming", "PMD.GenericsNaming"})
/**
......@@ -19,7 +20,8 @@ public abstract class ExtRealmModelListAdapter<T extends RealmObject, VM,
super(context);
}
@Override public int getItemCount() {
@Override
public int getItemCount() {
return super.getItemCount() + 2;
}
......@@ -35,7 +37,8 @@ public abstract class ExtRealmModelListAdapter<T extends RealmObject, VM,
notifyItemChanged(position + 1);
}
@Override public int getItemViewType(int position) {
@Override
public int getItemViewType(int position) {
if (position == 0) {
return VIEW_TYPE_HEADER;
}
......@@ -47,13 +50,20 @@ public abstract class ExtRealmModelListAdapter<T extends RealmObject, VM,
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) {
return getHeaderLayout();
}
......@@ -64,7 +74,8 @@ public abstract class ExtRealmModelListAdapter<T extends RealmObject, VM,
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) {
return;
}
......
package chat.rocket.android.layouthelper.chatroom;
import android.support.design.widget.FloatingActionButton;
import bolts.Task;
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.
*/
public class MessageComposerManager {
public interface SendMessageCallback {
Task<Void> onSubmit(String messageText);
}
public interface VisibilityChangedListener {
void onVisibilityChanged(boolean shown);
}
private final FloatingActionButton fabCompose;
private final MessageComposer messageComposer;
private SendMessageCallback sendMessageCallback;
......@@ -33,7 +26,8 @@ public class MessageComposerManager {
});
messageComposer.setOnActionListener(new MessageComposer.ActionListener() {
@Override public void onSubmit(String message) {
@Override
public void onSubmit(String message) {
if (sendMessageCallback != null) {
messageComposer.setEnabled(false);
sendMessageCallback.onSubmit(message).onSuccess(task -> {
......@@ -46,7 +40,8 @@ public class MessageComposerManager {
}
}
@Override public void onCancel() {
@Override
public void onCancel() {
setMessageComposerVisibility(false);
}
});
......@@ -91,4 +86,12 @@ public class MessageComposerManager {
}
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;
import android.content.Context;
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.Collections;
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.
......@@ -36,11 +37,13 @@ public class MessageListAdapter
notifyFooterChanged();
}
@Override protected int getHeaderLayout() {
@Override
protected int getHeaderLayout() {
return R.layout.list_item_message_header;
}
@Override protected int getFooterLayout() {
@Override
protected int getFooterLayout() {
if (!hasNext || isLoaded) {
return R.layout.list_item_message_start_of_conversation;
} else {
......@@ -48,19 +51,23 @@ public class MessageListAdapter
}
}
@Override protected int getRealmModelViewType(PairedMessage model) {
@Override
protected int getRealmModelViewType(PairedMessage model) {
return 0;
}
@Override protected int getRealmModelLayout(int viewType) {
@Override
protected int getRealmModelLayout(int viewType) {
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);
}
@Override protected List<PairedMessage> mapResultsToViewModel(List<Message> results) {
@Override
protected List<PairedMessage> mapResultsToViewModel(List<Message> results) {
if (results.isEmpty()) {
return Collections.emptyList();
}
......
......@@ -4,6 +4,7 @@ import android.support.annotation.Nullable;
import android.view.View;
import android.widget.ImageView;
import android.widget.TextView;
import chat.rocket.android.R;
import chat.rocket.android.helper.DateTime;
import chat.rocket.android.helper.TextUtils;
......@@ -90,7 +91,7 @@ public class MessageViewHolder extends RealmModelViewHolder<PairedMessage> {
}
}
private void setSequential( boolean sequential) {
private void setSequential(boolean sequential) {
if (sequential) {
avatar.setVisibility(View.INVISIBLE);
userAndTimeContainer.setVisibility(View.GONE);
......
......@@ -2,10 +2,11 @@ package chat.rocket.android.layouthelper.chatroom;
import android.view.View;
import android.view.ViewGroup;
import java.util.List;
import chat.rocket.android.helper.TextUtils;
import chat.rocket.android.model.ddp.RoomSubscription;
import chat.rocket.android.widget.internal.RoomListItemView;
import java.util.List;
/**
* Utility class for mapping Room list into channel list ViewGroup.
......@@ -13,14 +14,6 @@ import java.util.List;
public class RoomListManager {
private ViewGroup channelsContainer;
private ViewGroup dmContainer;
/**
* Callback interface for List item clicked.
*/
public interface OnItemClickListener {
void onItemClick(RoomListItemView roomListItemView);
}
private OnItemClickListener listener;
/**
......@@ -31,6 +24,16 @@ public class RoomListManager {
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.
*/
......@@ -109,7 +112,7 @@ public class RoomListManager {
}
private void updateRoomItemView(RoomListItemView roomListItemView,
RoomSubscription roomSubscription) {
RoomSubscription roomSubscription) {
roomListItemView
.setRoomId(roomSubscription.getRid())
.setRoomName(roomSubscription.getName())
......@@ -126,13 +129,10 @@ public class RoomListManager {
}
}
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;
}
}
/**
* Callback interface for List item clicked.
*/
public interface OnItemClickListener {
void onItemClick(RoomListItemView roomListItemView);
}
}
......@@ -5,12 +5,13 @@ import android.support.v7.widget.RecyclerView;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import java.util.List;
import chat.rocket.android.R;
import chat.rocket.android.helper.TextUtils;
import chat.rocket.android.model.ddp.User;
import chat.rocket.android.realm_helper.RealmHelper;
import chat.rocket.android.renderer.UserRenderer;
import java.util.List;
/**
* RecyclerView adapter for UsersOfRooms.
......@@ -33,12 +34,14 @@ public class RoomUserAdapter extends RecyclerView.Adapter<RoomUserViewHolder> {
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);
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);
if (TextUtils.isEmpty(username)) {
return;
......@@ -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;
}
......
......@@ -4,6 +4,7 @@ import android.support.v7.widget.RecyclerView;
import android.view.View;
import android.widget.ImageView;
import android.widget.TextView;
import chat.rocket.android.R;
/**
......
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.fragment.oauth.AbstractOAuthFragment;
import chat.rocket.android.fragment.oauth.FacebookOAuthFragment;
import chat.rocket.android.fragment.oauth.GitHubOAuthFragment;
import chat.rocket.android.fragment.oauth.GoogleOAuthFragment;
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.
*/
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>() {
{
add(new OAuthProviderInfo(
......@@ -40,6 +26,18 @@ public class OAuthProviderInfo {
"facebook", R.id.btn_login_with_facebook, FacebookOAuthFragment.class));
}
};
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;
import android.content.Context;
import android.view.View;
import android.widget.ImageView;
import java.util.Iterator;
import java.util.List;
import chat.rocket.android.R;
import chat.rocket.android.model.ddp.User;
import chat.rocket.android.realm_helper.RealmAutoCompleteAdapter;
import chat.rocket.android.renderer.UserRenderer;
import java.util.Iterator;
import java.util.List;
/**
* adapter to suggest user names.
......@@ -21,13 +22,15 @@ public class SuggestUserAdapter extends RealmAutoCompleteAdapter<User> {
this.hostname = hostname;
}
@Override protected void onBindItemView(View itemView, User user) {
@Override
protected void onBindItemView(View itemView, User user) {
new UserRenderer(itemView.getContext(), user)
.statusColorInto((ImageView) itemView.findViewById(R.id.room_user_status))
.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();
final String prefix = text.toLowerCase();
while (itUsers.hasNext()) {
......@@ -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();
}
}
package chat.rocket.android.model;
import io.realm.RealmObject;
import io.realm.annotations.PrimaryKey;
import org.json.JSONObject;
import bolts.Task;
import chat.rocket.android.helper.LogcatIfError;
import chat.rocket.android.realm_helper.RealmStore;
import hugo.weaving.DebugLog;
import io.realm.RealmObject;
import io.realm.annotations.PrimaryKey;
import org.json.JSONObject;
/**
* Server configuration.
......@@ -23,6 +24,35 @@ public class ServerConfig extends RealmObject {
private String session;
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() {
return serverConfigId;
}
......@@ -62,32 +92,4 @@ public class ServerConfig extends RealmObject {
public void setError(String 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;
import chat.rocket.android.model.SyncState;
import io.realm.RealmObject;
import io.realm.annotations.PrimaryKey;
import org.json.JSONException;
import org.json.JSONObject;
import chat.rocket.android.model.SyncState;
/**
* Message.
*/
......@@ -25,6 +26,18 @@ public class Message extends RealmObject {
private String attachments; //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() {
return _id;
}
......@@ -104,16 +117,4 @@ public class Message extends RealmObject {
public void setUrls(String 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;
import android.support.annotation.Nullable;
import chat.rocket.android.realm_helper.RealmHelper;
import io.realm.RealmObject;
import io.realm.annotations.PrimaryKey;
import org.json.JSONException;
import org.json.JSONObject;
import chat.rocket.android.realm_helper.RealmHelper;
/**
* public setting model.
*/
......@@ -20,6 +21,45 @@ public class PublicSetting extends RealmObject {
private long _updatedAt;
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() {
return _id;
}
......@@ -67,37 +107,4 @@ public class PublicSetting extends RealmObject {
public void setMeta(String 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 {
private long _updatedAt;
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() {
return _id;
}
......@@ -97,20 +113,4 @@ public class RoomSubscription extends RealmObject {
public void setLs(long 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 {
private double utcOffset;
private RealmList<Email> emails;
public static RealmQuery<User> queryCurrentUser(Realm realm) {
return realm.where(User.class).isNotEmpty("emails");
}
public String get_id() {
return _id;
}
......@@ -62,8 +66,4 @@ public class User extends RealmObject {
public void setEmails(RealmList<Email> 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;
import android.content.Context;
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.TaskCompletionSource;
import chat.rocket.android.helper.LogcatIfError;
......@@ -11,14 +17,10 @@ import chat.rocket.android.model.SyncState;
import chat.rocket.android.realm_helper.RealmHelper;
import chat.rocket.android.realm_helper.RealmObjectObserver;
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 {
private static final HashMap<String, RealmObjectObserver<MethodCall>> REF_MAP = new HashMap<>();
@PrimaryKey private String methodCallId;
private int syncstate;
private String name;
......@@ -26,77 +28,12 @@ public class MethodCall extends RealmObject {
private String resultJson;
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.
*/
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();
TaskCompletionSource<String> task = new TaskCompletionSource<>();
realmHelper.executeTransaction(realm -> {
......@@ -156,4 +93,68 @@ public class MethodCall extends RealmObject {
.findAll()
.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;
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.RealmObject;
import io.realm.RealmQuery;
import io.realm.annotations.PrimaryKey;
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.
*/
......@@ -20,6 +21,31 @@ public class Session extends RealmObject {
private boolean tokenVerified;
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() {
return sessionId;
}
......@@ -51,28 +77,4 @@ public class Session extends RealmObject {
public void setError(String 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;
import android.content.Context;
import android.view.View;
import chat.rocket.android.renderer.optional.Condition;
import chat.rocket.android.renderer.optional.Optional;
......@@ -19,7 +20,7 @@ abstract class AbstractRenderer<T> {
}
protected boolean shouldHandle(View target, Condition additionalCondition, Optional optional,
String key) {
String key) {
if (target == null || object == null) {
if (optional != null) {
optional.onNoData(key);
......
......@@ -3,6 +3,7 @@ package chat.rocket.android.renderer;
import android.content.Context;
import android.widget.ProgressBar;
import android.widget.TextView;
import chat.rocket.android.model.internal.FileUploading;
/**
......@@ -43,11 +44,11 @@ public class FileUploadingRenderer extends AbstractRenderer<FileUploading> {
uploadedSizeText.setText(String.format("%,d", uploaded));
totalSizeText.setText(String.format("%,d", total));
} else if (total < 8 * 1048576) { //<8MB
uploadedSizeText.setText(String.format("%,d", uploaded/1024));
totalSizeText.setText(String.format("%,d KB", total/1024));
uploadedSizeText.setText(String.format("%,d", uploaded / 1024));
totalSizeText.setText(String.format("%,d KB", total / 1024));
} else {
uploadedSizeText.setText(String.format("%,d", uploaded/1048576));
totalSizeText.setText(String.format("%,d MB", total/1048576));
uploadedSizeText.setText(String.format("%,d", uploaded / 1048576));
totalSizeText.setText(String.format("%,d MB", total / 1048576));
}
return this;
......
......@@ -4,6 +4,7 @@ import android.content.Context;
import android.view.View;
import android.widget.ImageView;
import android.widget.TextView;
import chat.rocket.android.R;
import chat.rocket.android.helper.DateTime;
import chat.rocket.android.helper.TextUtils;
......@@ -105,7 +106,7 @@ public class MessageRenderer extends AbstractRenderer<Message> {
* show urls in RocketChatMessageUrlsLayout.
*/
public MessageRenderer attachmentsInto(RocketChatMessageAttachmentsLayout attachmentsLayout,
String hostname, String userId, String token) {
String hostname, String userId, String token) {
if (!shouldHandle(attachmentsLayout)) {
return this;
}
......
......@@ -3,6 +3,7 @@ package chat.rocket.android.renderer;
import android.content.Context;
import android.widget.ImageView;
import android.widget.TextView;
import chat.rocket.android.R;
import chat.rocket.android.helper.Avatar;
import chat.rocket.android.helper.TextUtils;
......
package chat.rocket.android.renderer.optional;
import android.view.View;
import java.util.HashMap;
public class ViewVisibilityOptional extends HashMap<String, View> implements Optional {
@Override public void onDataExists(String key) {
@Override
public void onDataExists(String key) {
if (containsKey(key)) {
get(key).setVisibility(View.VISIBLE);
}
}
@Override public void onNoData(String key) {
@Override
public void onNoData(String key) {
if (containsKey(key)) {
get(key).setVisibility(View.GONE);
}
......
......@@ -5,15 +5,16 @@ import android.content.Context;
import android.content.Intent;
import android.os.IBinder;
import android.support.annotation.Nullable;
import io.realm.RealmResults;
import java.util.HashMap;
import java.util.List;
import bolts.Task;
import chat.rocket.android.helper.LogcatIfError;
import chat.rocket.android.model.ServerConfig;
import chat.rocket.android.realm_helper.RealmHelper;
import chat.rocket.android.realm_helper.RealmListObserver;
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.
......@@ -31,16 +32,17 @@ public class RocketChatService extends Service {
context.startService(new Intent(context, RocketChatService.class));
}
@Override public void onCreate() {
@Override
public void onCreate() {
super.onCreate();
webSocketThreads = new HashMap<>();
realmHelper = RealmStore.getDefault();
connectionRequiredServerConfigObserver = realmHelper
.createListObserver(realm -> realm.where(ServerConfig.class)
.isNotNull("hostname")
.equalTo("state", ServerConfig.STATE_READY)
.findAll())
.setOnUpdateListener(this::connectToServerWithServerConfig);
.createListObserver(realm -> realm.where(ServerConfig.class)
.isNotNull("hostname")
.equalTo("state", ServerConfig.STATE_READY)
.findAll())
.setOnUpdateListener(this::connectToServerWithServerConfig);
refreshServerConfigState();
}
......@@ -50,19 +52,21 @@ public class RocketChatService extends Service {
RealmResults<ServerConfig> configs = realm.where(ServerConfig.class)
.notEqualTo("state", ServerConfig.STATE_READY)
.findAll();
for (ServerConfig config: configs) {
for (ServerConfig config : configs) {
config.setState(ServerConfig.STATE_READY);
}
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 ->
realm.where(ServerConfig.class)
.equalTo("state", ServerConfig.STATE_CONNECTED)
.findAll());
for (ServerConfig config: configs) {
for (ServerConfig config : configs) {
String serverConfigId = config.getServerConfigId();
if (webSocketThreads.containsKey(serverConfigId)) {
RocketChatWebSocketThread thread = webSocketThreads.get(serverConfigId);
......@@ -122,7 +126,8 @@ public class RocketChatService extends Service {
});
}
@Override public void onDestroy() {
@Override
public void onDestroy() {
if (connectionRequiredServerConfigObserver != null) {
connectionRequiredServerConfigObserver.unsub();
}
......
......@@ -3,6 +3,11 @@ package chat.rocket.android.service;
import android.content.Context;
import android.os.Handler;
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.Task;
import bolts.TaskCompletionSource;
......@@ -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.UserDataSubscriber;
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.GetUsersOfRoomsProcedureObserver;
import chat.rocket.android.service.observer.LoadMessageProcedureObserver;
import chat.rocket.android.service.observer.MethodCallObserver;
import chat.rocket.android.service.observer.NewMessageObserver;
import chat.rocket.android.service.observer.NotificationItemObserver;
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.TokenLoginObserver;
import chat.rocket.android_ddp.DDPClientCallback;
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.
......@@ -74,11 +75,13 @@ public class RocketChatWebSocketThread extends HandlerThread {
/**
* create new Thread.
*/
@DebugLog public static Task<RocketChatWebSocketThread> getStarted(Context appContext,
ServerConfig config) {
@DebugLog
public static Task<RocketChatWebSocketThread> getStarted(Context appContext,
ServerConfig config) {
TaskCompletionSource<RocketChatWebSocketThread> task = new TaskCompletionSource<>();
new RocketChatWebSocketThread(appContext, config.getServerConfigId()) {
@Override protected void onLooperPrepared() {
@Override
protected void onLooperPrepared() {
try {
super.onLooperPrepared();
task.setResult(this);
......@@ -92,7 +95,16 @@ public class RocketChatWebSocketThread extends HandlerThread {
_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();
forceInvalidateTokens();
}
......@@ -110,14 +122,8 @@ public class RocketChatWebSocketThread extends HandlerThread {
}).continueWith(new LogcatIfError());
}
/**
* destroy the thread.
*/
@DebugLog public static void destroy(RocketChatWebSocketThread thread) {
thread.quit();
}
@Override public boolean quit() {
@Override
public boolean quit() {
if (isAlive()) {
new Handler(getLooper()).post(() -> {
RCLog.d("thread %s: quit()", Thread.currentThread().getId());
......@@ -133,7 +139,8 @@ public class RocketChatWebSocketThread extends HandlerThread {
/**
* synchronize the state of the thread with ServerConfig.
*/
@DebugLog public void keepalive() {
@DebugLog
public void keepalive() {
if (ddpClient == null || !ddpClient.isConnected()) {
defaultRealm.executeTransaction(realm -> {
ServerConfig config = realm.where(ServerConfig.class)
......@@ -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 ->
realm.where(ServerConfig.class).equalTo("serverConfigId", serverConfigId).findFirst());
......@@ -177,7 +185,8 @@ public class RocketChatWebSocketThread extends HandlerThread {
return task;
}).onSuccess(new Continuation<DDPClientCallback.Connect, Object>() {
// 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 {
registerListeners();
......
......@@ -2,18 +2,19 @@ package chat.rocket.android.service.ddp;
import android.content.Context;
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.helper.LogcatIfError;
import chat.rocket.android.log.RCLog;
import chat.rocket.android.realm_helper.RealmHelper;
import chat.rocket.android.service.Registerable;
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;
public abstract class AbstractDDPDocEventSubscriber implements Registerable {
......@@ -26,7 +27,7 @@ public abstract class AbstractDDPDocEventSubscriber implements Registerable {
private Subscription rxSubscription;
protected AbstractDDPDocEventSubscriber(Context context, String hostname,
RealmHelper realmHelper, DDPClientWraper ddpClient) {
RealmHelper realmHelper, DDPClientWraper ddpClient) {
this.context = context;
this.hostname = hostname;
this.realmHelper = realmHelper;
......@@ -49,11 +50,14 @@ public abstract class AbstractDDPDocEventSubscriber implements Registerable {
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;
JSONArray params = null;
try {
......@@ -170,7 +174,8 @@ public abstract class AbstractDDPDocEventSubscriber implements Registerable {
}
}
@Override public final void unregister() {
@Override
public final void unregister() {
isUnsubscribed = true;
onUnregister();
if (rxSubscription != null) {
......
package chat.rocket.android.service.ddp.base;
import android.content.Context;
import org.json.JSONArray;
import chat.rocket.android.api.DDPClientWraper;
import chat.rocket.android.realm_helper.RealmHelper;
import chat.rocket.android.service.ddp.AbstractDDPDocEventSubscriber;
import org.json.JSONArray;
abstract class AbstractBaseSubscriber extends AbstractDDPDocEventSubscriber {
protected AbstractBaseSubscriber(Context context, String hostname, RealmHelper realmHelper,
DDPClientWraper ddpClient) {
DDPClientWraper ddpClient) {
super(context, hostname, realmHelper, ddpClient);
}
@Override protected final JSONArray getSubscriptionParams() {
@Override
protected final JSONArray getSubscriptionParams() {
return null;
}
@Override protected final boolean shouldTruncateTableOnInitialize() {
@Override
protected final boolean shouldTruncateTableOnInitialize() {
return true;
}
protected abstract String getSubscriptionCallbackName();
@Override protected final boolean isTarget(String callbackName) {
@Override
protected final boolean isTarget(String callbackName) {
return getSubscriptionCallbackName().equals(callbackName);
}
}
package chat.rocket.android.service.ddp.base;
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.realm_helper.RealmHelper;
import chat.rocket.android.api.DDPClientWraper;
import io.realm.RealmObject;
/**
* "activeUsers" subscriber.
*/
public class ActiveUsersSubscriber extends AbstractBaseSubscriber {
public ActiveUsersSubscriber(Context context, String hostname, RealmHelper realmHelper,
DDPClientWraper ddpClient) {
DDPClientWraper ddpClient) {
super(context, hostname, realmHelper, ddpClient);
}
@Override protected String getSubscriptionName() {
@Override
protected String getSubscriptionName() {
return "activeUsers";
}
@Override protected String getSubscriptionCallbackName() {
@Override
protected String getSubscriptionCallbackName() {
return "users";
}
@Override protected Class<? extends RealmObject> getModelClass() {
@Override
protected Class<? extends RealmObject> getModelClass() {
return User.class;
}
}
package chat.rocket.android.service.ddp.base;
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.realm_helper.RealmHelper;
import chat.rocket.android.api.DDPClientWraper;
import io.realm.RealmObject;
/**
* meteor.loginServiceConfiguration subscriber
*/
public class LoginServiceConfigurationSubscriber extends AbstractBaseSubscriber {
public LoginServiceConfigurationSubscriber(Context context, String hostname,
RealmHelper realmHelper, DDPClientWraper ddpClient) {
RealmHelper realmHelper, DDPClientWraper ddpClient) {
super(context, hostname, realmHelper, ddpClient);
}
@Override protected String getSubscriptionName() {
@Override
protected String getSubscriptionName() {
return "meteor.loginServiceConfiguration";
}
@Override protected String getSubscriptionCallbackName() {
@Override
protected String getSubscriptionCallbackName() {
return "meteor_accounts_loginServiceConfiguration";
}
@Override protected Class<? extends RealmObject> getModelClass() {
@Override
protected Class<? extends RealmObject> getModelClass() {
return MeteorLoginServiceConfiguration.class;
}
}
package chat.rocket.android.service.ddp.base;
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.realm_helper.RealmHelper;
import io.realm.RealmObject;
/**
* "userData" subscriber.
*/
public class UserDataSubscriber extends AbstractBaseSubscriber {
public UserDataSubscriber(Context context, String hostname, RealmHelper realmHelper,
DDPClientWraper ddpClient) {
DDPClientWraper ddpClient) {
super(context, hostname, realmHelper, ddpClient);
}
@Override protected String getSubscriptionName() {
@Override
protected String getSubscriptionName() {
return "userData";
}
@Override protected String getSubscriptionCallbackName() {
@Override
protected String getSubscriptionCallbackName() {
return "users";
}
@Override protected Class<? extends RealmObject> getModelClass() {
@Override
protected Class<? extends RealmObject> getModelClass() {
return User.class;
}
}
package chat.rocket.android.service.ddp.stream;
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.helper.LogcatIfError;
import chat.rocket.android.log.RCLog;
import chat.rocket.android.realm_helper.RealmHelper;
import chat.rocket.android.service.ddp.AbstractDDPDocEventSubscriber;
import chat.rocket.android_ddp.DDPSubscription;
import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;
abstract class AbstractStreamNotifyEventSubscriber extends AbstractDDPDocEventSubscriber {
protected AbstractStreamNotifyEventSubscriber(Context context, String hostname,
RealmHelper realmHelper, DDPClientWraper ddpClient) {
RealmHelper realmHelper,
DDPClientWraper ddpClient) {
super(context, hostname, realmHelper, ddpClient);
}
@Override protected final boolean shouldTruncateTableOnInitialize() {
@Override
protected final boolean shouldTruncateTableOnInitialize() {
return false;
}
@Override protected final boolean isTarget(String callbackName) {
@Override
protected final boolean isTarget(String callbackName) {
return getSubscriptionName().equals(callbackName);
}
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);
}
protected abstract String getPrimaryKeyForModel();
@Override protected final void onDocumentAdded(DDPSubscription.Added docEvent) {
@Override
protected final void onDocumentAdded(DDPSubscription.Added docEvent) {
// do nothing.
}
@Override protected final void onDocumentRemoved(DDPSubscription.Removed docEvent) {
@Override
protected final void onDocumentRemoved(DDPSubscription.Removed docEvent) {
// do nothing.
}
@Override protected final void onDocumentChanged(DDPSubscription.Changed docEvent) {
@Override
protected final void onDocumentChanged(DDPSubscription.Changed docEvent) {
try {
if (!docEvent.fields.getString("eventName").equals(getSubscriptionParam())) {
return;
......
package chat.rocket.android.service.ddp.stream;
import android.content.Context;
import chat.rocket.android.api.DDPClientWraper;
import chat.rocket.android.realm_helper.RealmHelper;
abstract class AbstractStreamNotifyUserEventSubscriber extends AbstractStreamNotifyEventSubscriber {
protected final String userId;
protected AbstractStreamNotifyUserEventSubscriber(Context context, String hostname,
RealmHelper realmHelper, DDPClientWraper ddpClient, String userId) {
RealmHelper realmHelper,
DDPClientWraper ddpClient, String userId) {
super(context, hostname, realmHelper, ddpClient);
this.userId = userId;
}
@Override protected final String getSubscriptionName() {
@Override
protected final String getSubscriptionName() {
return "stream-notify-user";
}
@Override protected final String getSubscriptionParam() {
@Override
protected final String getSubscriptionParam() {
return userId + "/" + getSubscriptionSubParam();
}
......
package chat.rocket.android.service.ddp.stream;
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 org.json.JSONException;
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 StreamNotifyUserSubscriptionsChanged(Context context, String hostname,
RealmHelper realmHelper, DDPClientWraper ddpClient, String userId) {
RealmHelper realmHelper, DDPClientWraper ddpClient,
String userId) {
super(context, hostname, realmHelper, ddpClient, userId);
}
@Override protected String getSubscriptionSubParam() {
@Override
protected String getSubscriptionSubParam() {
return "subscriptions-changed";
}
@Override protected Class<? extends RealmObject> getModelClass() {
@Override
protected Class<? extends RealmObject> getModelClass() {
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));
}
@Override protected String getPrimaryKeyForModel() {
@Override
protected String getPrimaryKeyForModel() {
return "rid";
}
}
package chat.rocket.android.service.ddp.stream;
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 org.json.JSONException;
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.
*/
......@@ -15,28 +16,33 @@ public class StreamRoomMessage extends AbstractStreamNotifyEventSubscriber {
private String roomId;
public StreamRoomMessage(Context context, String hostname,
RealmHelper realmHelper, DDPClientWraper ddpClient, String roomId) {
RealmHelper realmHelper, DDPClientWraper ddpClient, String roomId) {
super(context, hostname, realmHelper, ddpClient);
this.roomId = roomId;
}
@Override protected String getSubscriptionName() {
@Override
protected String getSubscriptionName() {
return "stream-room-messages";
}
@Override protected String getSubscriptionParam() {
@Override
protected String getSubscriptionParam() {
return roomId;
}
@Override protected Class<? extends RealmObject> getModelClass() {
@Override
protected Class<? extends RealmObject> getModelClass() {
return Message.class;
}
@Override protected String getPrimaryKeyForModel() {
@Override
protected String getPrimaryKeyForModel() {
return "_id";
}
@Override protected JSONObject customizeFieldJson(JSONObject json) throws JSONException {
@Override
protected JSONObject customizeFieldJson(JSONObject json) throws JSONException {
return Message.customizeJson(super.customizeFieldJson(json));
}
}
......@@ -2,6 +2,7 @@ package chat.rocket.android.service.internal;
import android.content.Context;
import android.content.SharedPreferences;
import chat.rocket.android.RocketChatCache;
import chat.rocket.android.helper.TextUtils;
import chat.rocket.android.model.ddp.RoomSubscription;
......@@ -12,6 +13,12 @@ public abstract class AbstractRocketChatCacheObserver implements Registerable {
private final Context context;
private final RealmHelper realmHelper;
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) {
this.context = context;
......@@ -40,20 +47,15 @@ public abstract class AbstractRocketChatCacheObserver implements Registerable {
protected abstract void onRoomIdUpdated(String roomId);
private SharedPreferences.OnSharedPreferenceChangeListener listener =
(prefs, key) -> {
if (RocketChatCache.KEY_SELECTED_ROOM_ID.equals(key)) {
updateRoomIdWith(prefs);
}
};
@Override public final void register() {
@Override
public final void register() {
SharedPreferences prefs = RocketChatCache.get(context);
prefs.registerOnSharedPreferenceChangeListener(listener);
updateRoomIdWith(prefs);
}
@Override public final void unregister() {
@Override
public final void unregister() {
RocketChatCache.get(context).unregisterOnSharedPreferenceChangeListener(listener);
}
}
......@@ -3,6 +3,7 @@ package chat.rocket.android.service.internal;
import android.content.Context;
import android.os.Handler;
import android.os.Looper;
import chat.rocket.android.api.DDPClientWraper;
import chat.rocket.android.realm_helper.RealmHelper;
import chat.rocket.android.service.Registerable;
......@@ -12,24 +13,24 @@ import chat.rocket.android.service.ddp.stream.StreamRoomMessage;
* wrapper for managing stream-notify-message depending on RocketChatCache.
*/
public class StreamRoomMessageManager implements Registerable {
private StreamRoomMessage streamRoomMessage;
private final Context context;
private final String hostname;
private final RealmHelper realmHelper;
private final DDPClientWraper ddpClient;
private final AbstractRocketChatCacheObserver cacheObserver;
private final Handler handler;
private StreamRoomMessage streamRoomMessage;
public StreamRoomMessageManager(Context context, String hostname,
RealmHelper realmHelper, DDPClientWraper ddpClient) {
RealmHelper realmHelper, DDPClientWraper ddpClient) {
this.context = context;
this.hostname = hostname;
this.realmHelper = realmHelper;
this.ddpClient = ddpClient;
cacheObserver = new AbstractRocketChatCacheObserver(context, realmHelper) {
@Override protected void onRoomIdUpdated(String roomId) {
@Override
protected void onRoomIdUpdated(String roomId) {
unregisterStreamNotifyMessageIfNeeded();
registerStreamNotifyMessage(roomId);
}
......@@ -53,11 +54,13 @@ public class StreamRoomMessageManager implements Registerable {
});
}
@Override public void register() {
@Override
public void register() {
cacheObserver.register();
}
@Override public void unregister() {
@Override
public void unregister() {
unregisterStreamNotifyMessageIfNeeded();
cacheObserver.unregister();
}
......
......@@ -2,6 +2,7 @@ package chat.rocket.android.service.notification;
import android.app.IntentService;
import android.content.Intent;
import chat.rocket.android.model.internal.NotificationItem;
import chat.rocket.android.realm_helper.RealmHelper;
import chat.rocket.android.realm_helper.RealmStore;
......@@ -14,7 +15,8 @@ public class NotificationDismissalCallbackService extends IntentService {
super(NotificationDismissalCallbackService.class.getSimpleName());
}
@Override protected void onHandleIntent(Intent intent) {
@Override
protected void onHandleIntent(Intent intent) {
if (!intent.hasExtra("serverConfigId") || !intent.hasExtra("roomId")) {
return;
}
......
package chat.rocket.android.service.observer;
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.RealmListObserver;
import chat.rocket.android.service.Registerable;
import chat.rocket.android.api.DDPClientWraper;
import io.realm.RealmObject;
abstract class AbstractModelObserver<T extends RealmObject>
implements Registerable, RealmListObserver.Query<T>, RealmListObserver.OnUpdateListener<T> {
......@@ -17,7 +18,7 @@ abstract class AbstractModelObserver<T extends RealmObject>
private final RealmListObserver observer;
protected AbstractModelObserver(Context context, String hostname,
RealmHelper realmHelper, DDPClientWraper ddpClient) {
RealmHelper realmHelper, DDPClientWraper ddpClient) {
this.context = context;
this.hostname = hostname;
this.realmHelper = realmHelper;
......@@ -25,11 +26,13 @@ abstract class AbstractModelObserver<T extends RealmObject>
observer = realmHelper.createListObserver(this).setOnUpdateListener(this);
}
@Override public void register() {
@Override
public void register() {
observer.sub();
}
@Override public void unregister() {
@Override
public void unregister() {
observer.unsub();
}
}
package chat.rocket.android.service.observer;
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.MethodCallHelper;
import chat.rocket.android.helper.LogcatIfError;
......@@ -9,33 +14,29 @@ import chat.rocket.android.realm_helper.RealmHelper;
import chat.rocket.android.service.Registerable;
import chat.rocket.android.service.ddp.stream.StreamNotifyUserSubscriptionsChanged;
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.
*/
public class CurrentUserObserver extends AbstractModelObserver<User> {
private boolean currentUserExists;
private final MethodCallHelper methodCall;
private boolean currentUserExists;
private ArrayList<Registerable> listeners;
public CurrentUserObserver(Context context, String hostname,
RealmHelper realmHelper, DDPClientWraper ddpClient) {
RealmHelper realmHelper, DDPClientWraper ddpClient) {
super(context, hostname, realmHelper, ddpClient);
methodCall = new MethodCallHelper(realmHelper, ddpClient);
currentUserExists = false;
}
@Override public RealmResults<User> queryItems(Realm realm) {
@Override
public RealmResults<User> queryItems(Realm realm) {
return User.queryCurrentUser(realm).findAll();
}
@Override public void onUpdateResults(List<User> results) {
@Override
public void onUpdateResults(List<User> results) {
boolean exists = !results.isEmpty();
if (currentUserExists != exists) {
......
......@@ -2,6 +2,14 @@ package chat.rocket.android.service.observer;
import android.content.Context;
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 chat.rocket.android.api.DDPClientWraper;
import chat.rocket.android.api.FileUploadingHelper;
......@@ -11,11 +19,6 @@ import chat.rocket.android.log.RCLog;
import chat.rocket.android.model.SyncState;
import chat.rocket.android.model.internal.FileUploading;
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.MultipartBody;
import okhttp3.Request;
......@@ -24,8 +27,6 @@ import okhttp3.Response;
import okio.BufferedSink;
import okio.Okio;
import okio.Source;
import org.json.JSONArray;
import org.json.JSONObject;
/**
* execute file uploading and requesting sendMessage with attachment.
......@@ -34,7 +35,7 @@ public class FileUploadingToS3Observer extends AbstractModelObserver<FileUploadi
private FileUploadingHelper methodCall;
public FileUploadingToS3Observer(Context context, String hostname,
RealmHelper realmHelper, DDPClientWraper ddpClient) {
RealmHelper realmHelper, DDPClientWraper ddpClient) {
super(context, hostname, realmHelper, ddpClient);
methodCall = new FileUploadingHelper(realmHelper, ddpClient);
......@@ -61,14 +62,16 @@ public class FileUploadingToS3Observer extends AbstractModelObserver<FileUploadi
}).continueWith(new LogcatIfError());
}
@Override public RealmResults<FileUploading> queryItems(Realm realm) {
@Override
public RealmResults<FileUploading> queryItems(Realm realm) {
return realm.where(FileUploading.class)
.equalTo("syncstate", SyncState.NOT_SYNCED)
.equalTo("storageType", FileUploading.STORAGE_TYPE_S3)
.findAll();
}
@Override public void onUpdateResults(List<FileUploading> results) {
@Override
public void onUpdateResults(List<FileUploading> results) {
if (results.isEmpty()) {
return;
}
......@@ -111,15 +114,19 @@ public class FileUploadingToS3Observer extends AbstractModelObserver<FileUploadi
bodyBuilder.addFormDataPart("file", filename,
new RequestBody() {
private long numBytes = 0;
@Override public MediaType contentType() {
@Override
public MediaType contentType() {
return MediaType.parse(mimeType);
}
@Override public long contentLength() throws IOException {
@Override
public long contentLength() throws IOException {
return filesize;
}
@Override public void writeTo(BufferedSink sink) throws IOException {
@Override
public void writeTo(BufferedSink sink) throws IOException {
InputStream inputStream = context.getContentResolver().openInputStream(fileUri);
try (Source source = Okio.source(inputStream)) {
long readBytes;
......
......@@ -2,6 +2,12 @@ package chat.rocket.android.service.observer;
import android.content.Context;
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 chat.rocket.android.api.DDPClientWraper;
import chat.rocket.android.api.FileUploadingHelper;
......@@ -13,15 +19,10 @@ import chat.rocket.android.model.ddp.User;
import chat.rocket.android.model.internal.FileUploading;
import chat.rocket.android.model.internal.Session;
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.Request;
import okhttp3.RequestBody;
import okhttp3.Response;
import org.json.JSONObject;
/**
* execute file uploading and requesting sendMessage with attachment.
......@@ -30,7 +31,7 @@ public class FileUploadingWithUfsObserver extends AbstractModelObserver<FileUplo
private FileUploadingHelper methodCall;
public FileUploadingWithUfsObserver(Context context, String hostname,
RealmHelper realmHelper, DDPClientWraper ddpClient) {
RealmHelper realmHelper, DDPClientWraper ddpClient) {
super(context, hostname, realmHelper, ddpClient);
methodCall = new FileUploadingHelper(realmHelper, ddpClient);
......@@ -65,7 +66,8 @@ public class FileUploadingWithUfsObserver extends AbstractModelObserver<FileUplo
}).continueWith(new LogcatIfError());
}
@Override public RealmResults<FileUploading> queryItems(Realm realm) {
@Override
public RealmResults<FileUploading> queryItems(Realm realm) {
return realm.where(FileUploading.class)
.equalTo("syncstate", SyncState.NOT_SYNCED)
.beginGroup()
......@@ -76,7 +78,8 @@ public class FileUploadingWithUfsObserver extends AbstractModelObserver<FileUplo
.findAll();
}
@Override public void onUpdateResults(List<FileUploading> results) {
@Override
public void onUpdateResults(List<FileUploading> results) {
if (results.isEmpty()) {
return;
}
......
package chat.rocket.android.service.observer;
import android.content.Context;
import io.realm.Realm;
import io.realm.RealmResults;
import org.json.JSONObject;
import java.util.List;
import bolts.Task;
import chat.rocket.android.api.DDPClientWraper;
import chat.rocket.android.api.MethodCallHelper;
......@@ -8,10 +13,6 @@ import chat.rocket.android.log.RCLog;
import chat.rocket.android.model.SyncState;
import chat.rocket.android.model.internal.GetUsersOfRoomsProcedure;
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.
......@@ -22,18 +23,20 @@ public class GetUsersOfRoomsProcedureObserver
private final MethodCallHelper methodCall;
public GetUsersOfRoomsProcedureObserver(Context context, String hostname,
RealmHelper realmHelper, DDPClientWraper ddpClient) {
RealmHelper realmHelper, DDPClientWraper ddpClient) {
super(context, hostname, 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)
.equalTo("syncstate", SyncState.NOT_SYNCED)
.findAll();
}
@Override public void onUpdateResults(List<GetUsersOfRoomsProcedure> results) {
@Override
public void onUpdateResults(List<GetUsersOfRoomsProcedure> results) {
if (results == null || results.isEmpty()) {
return;
}
......
package chat.rocket.android.service.observer;
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 chat.rocket.android.api.DDPClientWraper;
import chat.rocket.android.api.MethodCallHelper;
......@@ -9,11 +15,6 @@ import chat.rocket.android.model.SyncState;
import chat.rocket.android.model.ddp.Message;
import chat.rocket.android.model.internal.LoadMessageProcedure;
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.
......@@ -23,18 +24,20 @@ public class LoadMessageProcedureObserver extends AbstractModelObserver<LoadMess
private final MethodCallHelper methodCall;
public LoadMessageProcedureObserver(Context context, String hostname,
RealmHelper realmHelper, DDPClientWraper ddpClient) {
RealmHelper realmHelper, DDPClientWraper ddpClient) {
super(context, hostname, 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)
.equalTo("syncstate", SyncState.NOT_SYNCED)
.findAll();
}
@Override public void onUpdateResults(List<LoadMessageProcedure> results) {
@Override
public void onUpdateResults(List<LoadMessageProcedure> results) {
if (results == null || results.isEmpty()) {
return;
}
......
package chat.rocket.android.service.observer;
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.LogcatIfError;
import chat.rocket.android.model.SyncState;
import chat.rocket.android.model.internal.MethodCall;
import chat.rocket.android.realm_helper.RealmHelper;
import chat.rocket.android.api.DDPClientWraper;
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.
......@@ -24,7 +25,7 @@ public class MethodCallObserver extends AbstractModelObserver<MethodCall> {
* constructor.
*/
public MethodCallObserver(Context context, String hostname,
RealmHelper realmHelper, DDPClientWraper ddpClient) {
RealmHelper realmHelper, DDPClientWraper ddpClient) {
super(context, hostname, realmHelper, ddpClient);
realmHelper.executeTransaction(realm -> {
// resume pending operations.
......@@ -47,7 +48,8 @@ public class MethodCallObserver extends AbstractModelObserver<MethodCall> {
}).continueWith(new LogcatIfError());
}
@Override public RealmResults<MethodCall> queryItems(Realm realm) {
@Override
public RealmResults<MethodCall> queryItems(Realm realm) {
return realm.where(MethodCall.class)
.isNotNull("name")
.equalTo("syncstate", SyncState.NOT_SYNCED)
......@@ -68,7 +70,8 @@ public class MethodCallObserver extends AbstractModelObserver<MethodCall> {
return CheckSum.sha256(stringBuilder.toString());
}
@Override public void onUpdateResults(List<MethodCall> results) {
@Override
public void onUpdateResults(List<MethodCall> results) {
String digest = getDigestFor(results);
if (prevDigest == null) {
if (digest == null) {
......
package chat.rocket.android.service.observer;
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.MethodCallHelper;
import chat.rocket.android.helper.LogcatIfError;
......@@ -8,10 +13,6 @@ import chat.rocket.android.log.RCLog;
import chat.rocket.android.model.SyncState;
import chat.rocket.android.model.ddp.Message;
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.
......@@ -21,7 +22,7 @@ public class NewMessageObserver extends AbstractModelObserver<Message> {
private final MethodCallHelper methodCall;
public NewMessageObserver(Context context, String hostname,
RealmHelper realmHelper, DDPClientWraper ddpClient) {
RealmHelper realmHelper, DDPClientWraper ddpClient) {
super(context, hostname, realmHelper, ddpClient);
methodCall = new MethodCallHelper(realmHelper, ddpClient);
......@@ -38,14 +39,16 @@ public class NewMessageObserver extends AbstractModelObserver<Message> {
}).continueWith(new LogcatIfError());
}
@Override public RealmResults<Message> queryItems(Realm realm) {
@Override
public RealmResults<Message> queryItems(Realm realm) {
return realm.where(Message.class)
.equalTo("syncstate", SyncState.NOT_SYNCED)
.isNotNull("rid")
.findAll();
}
@Override public void onUpdateResults(List<Message> results) {
@Override
public void onUpdateResults(List<Message> results) {
if (results.isEmpty()) {
return;
}
......
......@@ -10,6 +10,10 @@ import android.support.annotation.Nullable;
import android.support.v4.app.NotificationCompat;
import android.support.v4.app.NotificationManagerCompat;
import android.support.v4.content.ContextCompat;
import io.realm.Realm;
import io.realm.RealmResults;
import java.util.List;
import bolts.Task;
import chat.rocket.android.R;
import chat.rocket.android.activity.MainActivity;
......@@ -21,24 +25,23 @@ import chat.rocket.android.model.internal.NotificationItem;
import chat.rocket.android.realm_helper.RealmHelper;
import chat.rocket.android.realm_helper.RealmStore;
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.
*/
public class NotificationItemObserver extends AbstractModelObserver<NotificationItem> {
public NotificationItemObserver(Context context, String hostname, RealmHelper realmHelper,
DDPClientWraper ddpClient) {
DDPClientWraper 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();
}
@Override public void onUpdateResults(List<NotificationItem> results) {
@Override
public void onUpdateResults(List<NotificationItem> results) {
if (results.isEmpty()) {
return;
}
......@@ -114,7 +117,8 @@ public class NotificationItemObserver extends AbstractModelObserver<Notification
}
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)
.setContentTitle(title)
......
package chat.rocket.android.service.observer;
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.helper.LogcatIfError;
import chat.rocket.android.log.RCLog;
import chat.rocket.android.model.ddp.RoomSubscription;
import chat.rocket.android.model.internal.NotificationItem;
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.
*/
public class ReactiveNotificationManager extends AbstractModelObserver<RoomSubscription> {
public ReactiveNotificationManager(Context context, String hostname,
RealmHelper realmHelper, DDPClientWraper ddpClient) {
RealmHelper realmHelper, DDPClientWraper 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)
.equalTo("open", true)
.findAll();
}
@Override public void onUpdateResults(List<RoomSubscription> roomSubscriptions) {
@Override
public void onUpdateResults(List<RoomSubscription> roomSubscriptions) {
JSONArray notifications = new JSONArray();
for (RoomSubscription roomSubscription : roomSubscriptions) {
final String roomId = roomSubscription.getRid();
......
package chat.rocket.android.service.observer;
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.helper.LogcatIfError;
......@@ -12,30 +16,27 @@ import chat.rocket.android.model.internal.Session;
import chat.rocket.android.realm_helper.RealmHelper;
import chat.rocket.android.service.internal.StreamRoomMessageManager;
import hugo.weaving.DebugLog;
import io.realm.Realm;
import io.realm.RealmResults;
import java.util.List;
/**
* Observes user is logged into server.
*/
public class SessionObserver extends AbstractModelObserver<Session> {
private int count;
private final StreamRoomMessageManager streamNotifyMessage;
private int count;
/**
* constructor.
*/
public SessionObserver(Context context, String hostname,
RealmHelper realmHelper, DDPClientWraper ddpClient) {
RealmHelper realmHelper, DDPClientWraper ddpClient) {
super(context, hostname, realmHelper, ddpClient);
count = 0;
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)
.isNotNull("token")
.equalTo("tokenVerified", true)
......@@ -43,7 +44,8 @@ public class SessionObserver extends AbstractModelObserver<Session> {
.findAll();
}
@Override public void onUpdateResults(List<Session> results) {
@Override
public void onUpdateResults(List<Session> results) {
int origCount = count;
count = results.size();
if (origCount > 0 && count > 0) {
......@@ -62,13 +64,15 @@ public class SessionObserver extends AbstractModelObserver<Session> {
}
}
@DebugLog private void onLogin() {
@DebugLog
private void onLogin() {
streamNotifyMessage.register();
new MethodCallHelper(realmHelper, ddpClient).getPublicSettings()
.continueWith(new LogcatIfError());
}
@DebugLog private void onLogout() {
@DebugLog
private void onLogout() {
streamNotifyMessage.unregister();
realmHelper.executeTransaction(realm -> {
......
package chat.rocket.android.service.observer;
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.helper.LogcatIfError;
import chat.rocket.android.model.internal.Session;
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> {
private final MethodCallHelper methodCall;
public TokenLoginObserver(Context context, String hostname,
RealmHelper realmHelper, DDPClientWraper ddpClient) {
RealmHelper realmHelper, DDPClientWraper ddpClient) {
super(context, hostname, 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)
.isNotNull("token")
.equalTo("tokenVerified", false)
......@@ -28,7 +30,8 @@ public class TokenLoginObserver extends AbstractModelObserver<Session> {
.findAll();
}
@Override public void onUpdateResults(List<Session> results) {
@Override
public void onUpdateResults(List<Session> results) {
if (results.isEmpty()) {
return;
}
......
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment