Commit 659952bf authored by Tiago Cunha's avatar Tiago Cunha Committed by GitHub

Merge pull request #212 from RocketChat/fix/firebase-crashes-20170220

Fix/firebase crashes 20170220
parents 3b05bafe 32982d9f
...@@ -54,17 +54,25 @@ public class DDPClientImpl { ...@@ -54,17 +54,25 @@ public class DDPClientImpl {
flowable = websocket.connect(url).autoConnect(); flowable = websocket.connect(url).autoConnect();
CompositeDisposable subscriptions = new CompositeDisposable(); CompositeDisposable subscriptions = new CompositeDisposable();
subscriptions.add(flowable.filter(callback -> callback instanceof RxWebSocketCallback.Open) subscriptions.add(
.subscribe(callback -> { flowable.filter(callback -> callback instanceof RxWebSocketCallback.Open)
.subscribe(
callback -> {
sendMessage("connect", sendMessage("connect",
json -> (TextUtils.isEmpty(session) ? json : json.put("session", session)).put( json -> (TextUtils.isEmpty(session) ? json : json.put("session", session))
"version", "pre2").put("support", new JSONArray().put("pre2").put("pre1")), .put(
"version", "pre2")
.put("support", new JSONArray().put("pre2").put("pre1")),
task); task);
}, err -> { },
})); err -> {
}
)
);
subscriptions.add( subscriptions.add(
flowable.filter(callback -> callback instanceof RxWebSocketCallback.Message) flowable.filter(
callback -> callback instanceof RxWebSocketCallback.Message)
.map(callback -> ((RxWebSocketCallback.Message) callback).responseBodyString) .map(callback -> ((RxWebSocketCallback.Message) callback).responseBodyString)
.map(DDPClientImpl::toJson) .map(DDPClientImpl::toJson)
.timeout(7, TimeUnit.SECONDS) .timeout(7, TimeUnit.SECONDS)
...@@ -83,9 +91,10 @@ public class DDPClientImpl { ...@@ -83,9 +91,10 @@ public class DDPClientImpl {
new DDPClientCallback.Connect.Failed(client, response.optString("version"))); new DDPClientCallback.Connect.Failed(client, response.optString("version")));
subscriptions.dispose(); subscriptions.dispose();
} }
}, err -> { },
task.trySetError(new DDPClientCallback.Connect.Timeout(client)); err -> task.trySetError(new DDPClientCallback.Connect.Timeout(client))
})); )
);
addErrorCallback(subscriptions, task); addErrorCallback(subscriptions, task);
...@@ -110,7 +119,8 @@ public class DDPClientImpl { ...@@ -110,7 +119,8 @@ public class DDPClientImpl {
.map(callback -> ((RxWebSocketCallback.Message) callback).responseBodyString) .map(callback -> ((RxWebSocketCallback.Message) callback).responseBodyString)
.map(DDPClientImpl::toJson) .map(DDPClientImpl::toJson)
.timeout(4, TimeUnit.SECONDS) .timeout(4, TimeUnit.SECONDS)
.subscribe(response -> { .subscribe(
response -> {
String msg = extractMsg(response); String msg = extractMsg(response);
if ("pong".equals(msg)) { if ("pong".equals(msg)) {
if (response.isNull("id")) { if (response.isNull("id")) {
...@@ -124,9 +134,10 @@ public class DDPClientImpl { ...@@ -124,9 +134,10 @@ public class DDPClientImpl {
} }
} }
} }
}, err -> { },
task.setError(new DDPClientCallback.Ping.Timeout(client)); err -> task.setError(new DDPClientCallback.Ping.Timeout(client))
})); )
);
addErrorCallback(subscriptions, task); addErrorCallback(subscriptions, task);
} else { } else {
...@@ -146,7 +157,8 @@ public class DDPClientImpl { ...@@ -146,7 +157,8 @@ public class DDPClientImpl {
flowable.filter(callback -> callback instanceof RxWebSocketCallback.Message) flowable.filter(callback -> callback instanceof RxWebSocketCallback.Message)
.map(callback -> ((RxWebSocketCallback.Message) callback).responseBodyString) .map(callback -> ((RxWebSocketCallback.Message) callback).responseBodyString)
.map(DDPClientImpl::toJson) .map(DDPClientImpl::toJson)
.subscribe(response -> { .subscribe(
response -> {
String msg = extractMsg(response); String msg = extractMsg(response);
if ("ready".equals(msg) && !response.isNull("subs")) { if ("ready".equals(msg) && !response.isNull("subs")) {
JSONArray ids = response.optJSONArray("subs"); JSONArray ids = response.optJSONArray("subs");
...@@ -167,8 +179,11 @@ public class DDPClientImpl { ...@@ -167,8 +179,11 @@ public class DDPClientImpl {
subscriptions.dispose(); subscriptions.dispose();
} }
} }
}, err -> { },
})); err -> {
}
)
);
addErrorCallback(subscriptions, task); addErrorCallback(subscriptions, task);
} else { } else {
...@@ -188,7 +203,8 @@ public class DDPClientImpl { ...@@ -188,7 +203,8 @@ public class DDPClientImpl {
flowable.filter(callback -> callback instanceof RxWebSocketCallback.Message) flowable.filter(callback -> callback instanceof RxWebSocketCallback.Message)
.map(callback -> ((RxWebSocketCallback.Message) callback).responseBodyString) .map(callback -> ((RxWebSocketCallback.Message) callback).responseBodyString)
.map(DDPClientImpl::toJson) .map(DDPClientImpl::toJson)
.subscribe(response -> { .subscribe(
response -> {
String msg = extractMsg(response); String msg = extractMsg(response);
if ("nosub".equals(msg) && response.isNull("error") && !response.isNull("id")) { if ("nosub".equals(msg) && response.isNull("error") && !response.isNull("id")) {
String _id = response.optString("id"); String _id = response.optString("id");
...@@ -197,8 +213,11 @@ public class DDPClientImpl { ...@@ -197,8 +213,11 @@ public class DDPClientImpl {
subscriptions.dispose(); subscriptions.dispose();
} }
} }
}, err -> { },
})); err -> {
}
)
);
addErrorCallback(subscriptions, task); addErrorCallback(subscriptions, task);
} else { } else {
...@@ -220,7 +239,8 @@ public class DDPClientImpl { ...@@ -220,7 +239,8 @@ public class DDPClientImpl {
.map(callback -> ((RxWebSocketCallback.Message) callback).responseBodyString) .map(callback -> ((RxWebSocketCallback.Message) callback).responseBodyString)
.map(DDPClientImpl::toJson) .map(DDPClientImpl::toJson)
.timeout(timeoutMs, TimeUnit.MILLISECONDS) .timeout(timeoutMs, TimeUnit.MILLISECONDS)
.subscribe(response -> { .subscribe(
response -> {
String msg = extractMsg(response); String msg = extractMsg(response);
if ("result".equals(msg)) { if ("result".equals(msg)) {
String _id = response.optString("id"); String _id = response.optString("id");
...@@ -235,11 +255,14 @@ public class DDPClientImpl { ...@@ -235,11 +255,14 @@ public class DDPClientImpl {
subscriptions.dispose(); subscriptions.dispose();
} }
} }
}, err -> { },
err -> {
if (err instanceof TimeoutException) { if (err instanceof TimeoutException) {
task.setError(new DDPClientCallback.RPC.Timeout(client)); task.setError(new DDPClientCallback.RPC.Timeout(client));
} }
})); }
)
);
addErrorCallback(subscriptions, task); addErrorCallback(subscriptions, task);
} else { } else {
...@@ -258,7 +281,8 @@ public class DDPClientImpl { ...@@ -258,7 +281,8 @@ public class DDPClientImpl {
flowable.filter(callback -> callback instanceof RxWebSocketCallback.Message) flowable.filter(callback -> callback instanceof RxWebSocketCallback.Message)
.map(callback -> ((RxWebSocketCallback.Message) callback).responseBodyString) .map(callback -> ((RxWebSocketCallback.Message) callback).responseBodyString)
.map(DDPClientImpl::toJson) .map(DDPClientImpl::toJson)
.subscribe(response -> { .subscribe(
response -> {
String msg = extractMsg(response); String msg = extractMsg(response);
if ("ping".equals(msg)) { if ("ping".equals(msg)) {
if (response.isNull("id")) { if (response.isNull("id")) {
...@@ -267,8 +291,11 @@ public class DDPClientImpl { ...@@ -267,8 +291,11 @@ public class DDPClientImpl {
sendMessage("pong", json -> json.put("id", response.getString("id"))); sendMessage("pong", json -> json.put("id", response.getString("id")));
} }
} }
}, err -> { },
})); err -> {
}
)
);
} }
public Flowable<DDPSubscription.Event> getDDPSubscription() { public Flowable<DDPSubscription.Event> getDDPSubscription() {
...@@ -325,13 +352,16 @@ public class DDPClientImpl { ...@@ -325,13 +352,16 @@ public class DDPClientImpl {
flowable.filter(callback -> callback instanceof RxWebSocketCallback.Close) flowable.filter(callback -> callback instanceof RxWebSocketCallback.Close)
.cast(RxWebSocketCallback.Close.class) .cast(RxWebSocketCallback.Close.class)
.subscribe(task::setResult, err -> { .subscribe(
task::setResult,
err -> {
if (err instanceof Exception) { if (err instanceof Exception) {
task.setError((Exception) err); task.setError((Exception) err);
} else { } else {
task.setError(new Exception(err)); task.setError(new Exception(err));
} }
}); }
);
return task.getTask().onSuccessTask(_task -> { return task.getTask().onSuccessTask(_task -> {
unsubscribeBaseListeners(); unsubscribeBaseListeners();
...@@ -358,11 +388,16 @@ public class DDPClientImpl { ...@@ -358,11 +388,16 @@ public class DDPClientImpl {
} }
private void addErrorCallback(CompositeDisposable subscriptions, TaskCompletionSource<?> task) { private void addErrorCallback(CompositeDisposable subscriptions, TaskCompletionSource<?> task) {
subscriptions.add(flowable.subscribe(base -> { subscriptions.add(
}, err -> { flowable.subscribe(
base -> {
},
err -> {
task.trySetError(new Exception(err)); task.trySetError(new Exception(err));
subscriptions.dispose(); subscriptions.dispose();
})); }
)
);
} }
public void close(int code, String reason) { public void close(int code, String reason) {
......
...@@ -33,8 +33,8 @@ android { ...@@ -33,8 +33,8 @@ android {
applicationId "chat.rocket.android" applicationId "chat.rocket.android"
minSdkVersion 16 minSdkVersion 16
targetSdkVersion 25 targetSdkVersion 25
versionCode 10 versionCode 11
versionName "1.0.1" versionName "1.0.2"
testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner" testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
vectorDrawables.useSupportLibrary = true vectorDrawables.useSupportLibrary = true
......
...@@ -75,7 +75,7 @@ abstract class AbstractAuthedActivity extends AbstractFragmentActivity { ...@@ -75,7 +75,7 @@ abstract class AbstractAuthedActivity extends AbstractFragmentActivity {
} }
} else { } else {
if (hostname.equals(newHostname)) { if (hostname.equals(newHostname)) {
// we are good updateHostname(newHostname);
return; return;
} }
......
...@@ -99,7 +99,8 @@ public abstract class AbstractDDPDocEventSubscriber implements Registrable { ...@@ -99,7 +99,8 @@ public abstract class AbstractDDPDocEventSubscriber implements Registrable {
.filter(event -> event instanceof DDPSubscription.DocEvent) .filter(event -> event instanceof DDPSubscription.DocEvent)
.cast(DDPSubscription.DocEvent.class) .cast(DDPSubscription.DocEvent.class)
.filter(event -> isTarget(event.collection)) .filter(event -> isTarget(event.collection))
.subscribe(docEvent -> { .subscribe(
docEvent -> {
try { try {
if (docEvent instanceof DDPSubscription.Added.Before) { if (docEvent instanceof DDPSubscription.Added.Before) {
onDocumentAdded((DDPSubscription.Added) docEvent); //ignore Before onDocumentAdded((DDPSubscription.Added) docEvent); //ignore Before
...@@ -115,7 +116,10 @@ public abstract class AbstractDDPDocEventSubscriber implements Registrable { ...@@ -115,7 +116,10 @@ public abstract class AbstractDDPDocEventSubscriber implements Registrable {
} catch (Exception exception) { } catch (Exception exception) {
RCLog.w(exception, "failed to handle subscription callback"); RCLog.w(exception, "failed to handle subscription callback");
} }
}); },
throwable -> {
}
);
} }
protected void onDocumentAdded(DDPSubscription.Added docEvent) { protected void onDocumentAdded(DDPSubscription.Added docEvent) {
......
...@@ -109,9 +109,17 @@ public class MethodCallObserver extends AbstractModelObserver<MethodCall> { ...@@ -109,9 +109,17 @@ public class MethodCallObserver extends AbstractModelObserver<MethodCall> {
if (task.isFaulted()) { if (task.isFaulted()) {
return realmHelper.executeTransaction(realm -> { return realmHelper.executeTransaction(realm -> {
Exception exception = task.getError(); Exception exception = task.getError();
final String errMessage = (exception instanceof DDPClientCallback.RPC.Error) final String errMessage;
? ((DDPClientCallback.RPC.Error) exception).error.toString()
: exception.getMessage(); if (exception instanceof DDPClientCallback.RPC.Error) {
errMessage = ((DDPClientCallback.RPC.Error) exception).error.toString();
} else if (exception instanceof DDPClientCallback.RPC.Timeout) {
// temp "fix"- we need to rewrite the connection layer a bit
errMessage = "{\"message\": \"Connection Timeout\"}";
} else {
errMessage = exception.getMessage();
}
realm.createOrUpdateObjectFromJson(MethodCall.class, new JSONObject() realm.createOrUpdateObjectFromJson(MethodCall.class, new JSONObject()
.put(MethodCall.ID, methodCallId) .put(MethodCall.ID, methodCallId)
.put(MethodCall.SYNC_STATE, SyncState.FAILED) .put(MethodCall.SYNC_STATE, SyncState.FAILED)
......
...@@ -11,7 +11,7 @@ public class RealmPreferences extends RealmObject { ...@@ -11,7 +11,7 @@ public class RealmPreferences extends RealmObject {
@PrimaryKey private String id; @PrimaryKey private String id;
private String newRoomNotification; private String newRoomNotification;
private boolean newMessageNotification; private String newMessageNotification;
private boolean useEmojis; private boolean useEmojis;
private boolean convertAsciiEmoji; private boolean convertAsciiEmoji;
private boolean saveMobileBandwidth; private boolean saveMobileBandwidth;
...@@ -52,7 +52,7 @@ public class RealmPreferences extends RealmObject { ...@@ -52,7 +52,7 @@ public class RealmPreferences extends RealmObject {
return newRoomNotification; return newRoomNotification;
} }
public boolean isNewMessageNotification() { public String getNewMessageNotification() {
return newMessageNotification; return newMessageNotification;
} }
...@@ -123,7 +123,8 @@ public class RealmPreferences extends RealmObject { ...@@ -123,7 +123,8 @@ public class RealmPreferences extends RealmObject {
: that.newRoomNotification == null) { : that.newRoomNotification == null) {
return false; return false;
} }
if (newMessageNotification != that.newMessageNotification) { if (newMessageNotification != null ? newMessageNotification.equals(that.newMessageNotification)
: that.newMessageNotification == null) {
return false; return false;
} }
if (useEmojis != that.useEmojis) { if (useEmojis != that.useEmojis) {
...@@ -174,7 +175,7 @@ public class RealmPreferences extends RealmObject { ...@@ -174,7 +175,7 @@ public class RealmPreferences extends RealmObject {
public int hashCode() { public int hashCode() {
int result = id != null ? id.hashCode() : 0; int result = id != null ? id.hashCode() : 0;
result = 31 * result + (newRoomNotification != null ? newRoomNotification.hashCode() : 0); result = 31 * result + (newRoomNotification != null ? newRoomNotification.hashCode() : 0);
result = 31 * result + (newMessageNotification ? 1 : 0); result = 31 * result + (newMessageNotification != null ? newMessageNotification.hashCode() : 0);
result = 31 * result + (useEmojis ? 1 : 0); result = 31 * result + (useEmojis ? 1 : 0);
result = 31 * result + (convertAsciiEmoji ? 1 : 0); result = 31 * result + (convertAsciiEmoji ? 1 : 0);
result = 31 * result + (saveMobileBandwidth ? 1 : 0); result = 31 * result + (saveMobileBandwidth ? 1 : 0);
......
...@@ -87,7 +87,7 @@ public class RealmUser extends RealmObject { ...@@ -87,7 +87,7 @@ public class RealmUser extends RealmObject {
public User asUser() { public User asUser() {
// convert email list // convert email list
final int total = emails.size(); final int total = emails != null ? emails.size() : 0;
final List<Email> coreEmails = new ArrayList<>(total); final List<Email> coreEmails = new ArrayList<>(total);
for (int i = 0; i < total; i++) { for (int i = 0; i < total; i++) {
......
...@@ -52,6 +52,9 @@ public class ImageKeyboardEditText extends EditText { ...@@ -52,6 +52,9 @@ public class ImageKeyboardEditText extends EditText {
@Override @Override
public InputConnection onCreateInputConnection(EditorInfo editorInfo) { public InputConnection onCreateInputConnection(EditorInfo editorInfo) {
final InputConnection inputConnection = super.onCreateInputConnection(editorInfo); final InputConnection inputConnection = super.onCreateInputConnection(editorInfo);
if (inputConnection == null) {
return null;
}
EditorInfoCompat.setContentMimeTypes(editorInfo, mimeTypes); EditorInfoCompat.setContentMimeTypes(editorInfo, mimeTypes);
......
...@@ -12,7 +12,8 @@ public abstract class Preferences { ...@@ -12,7 +12,8 @@ public abstract class Preferences {
@Nullable @Nullable
public abstract String getNewRoomNotification(); public abstract String getNewRoomNotification();
public abstract boolean isNewMessageNotification(); @Nullable
public abstract String getNewMessageNotification();
public abstract boolean isUseEmojis(); public abstract boolean isUseEmojis();
...@@ -51,7 +52,7 @@ public abstract class Preferences { ...@@ -51,7 +52,7 @@ public abstract class Preferences {
public abstract Builder setNewRoomNotification(String newRoomNotification); public abstract Builder setNewRoomNotification(String newRoomNotification);
public abstract Builder setNewMessageNotification(boolean newMessageNotification); public abstract Builder setNewMessageNotification(String newMessageNotification);
public abstract Builder setUseEmojis(boolean useEmojis); public abstract Builder setUseEmojis(boolean useEmojis);
......
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