From 4f468a4b8f5a62457b8d3398166b82ba724bad23 Mon Sep 17 00:00:00 2001 From: link2xt Date: Tue, 28 Feb 2023 10:08:54 +0000 Subject: [PATCH 01/25] Add DcJsonrpcInstance class --- jni/dc_wrapper.c | 43 +++++++++++++++++++ scripts/ndk-make.sh | 8 ++-- src/com/b44t/messenger/DcAccounts.java | 2 + src/com/b44t/messenger/DcJsonrpcInstance.java | 22 ++++++++++ 4 files changed, 71 insertions(+), 4 deletions(-) create mode 100644 src/com/b44t/messenger/DcJsonrpcInstance.java diff --git a/jni/dc_wrapper.c b/jni/dc_wrapper.c index 5b985bdb49..08fd01986f 100644 --- a/jni/dc_wrapper.c +++ b/jni/dc_wrapper.c @@ -245,6 +245,11 @@ JNIEXPORT jlong Java_com_b44t_messenger_DcAccounts_getEventEmitterCPtr(JNIEnv *e return (jlong)dc_accounts_get_event_emitter(get_dc_accounts(env, obj)); } +JNIEXPORT jlong Java_com_b44t_messenger_DcAccounts_getJsonrpcInstanceCPtr(JNIEnv *env, jobject obj) +{ + return (jlong)dc_jsonrpc_init(get_dc_accounts(env, obj)); +} + JNIEXPORT void Java_com_b44t_messenger_DcAccounts_startIo(JNIEnv *env, jobject obj) { @@ -2137,3 +2142,41 @@ JNIEXPORT jbyteArray Java_com_b44t_messenger_DcHttpResponse_getBlob(JNIEnv *env, dc_str_unref((char*)ptr); return ret; } + +/******************************************************************************* + * DcJsonrpcInstance + ******************************************************************************/ + +static dc_jsonrpc_instance_t* get_dc_jsonrpc_instance(JNIEnv *env, jobject obj) +{ + static jfieldID fid = 0; + if (fid==0) { + jclass cls = (*env)->GetObjectClass(env, obj); + fid = (*env)->GetFieldID(env, cls, "jsonrpcInstanceCPtr", "J" /*Signature, J=long*/); + } + if (fid) { + return (dc_jsonrpc_instance_t*)(*env)->GetLongField(env, obj, fid); + } + return NULL; +} + + +JNIEXPORT void Java_com_b44t_messenger_DcJsonrpcInstance_unrefJsonrpcInstanceCPtr(JNIEnv *env, jobject obj) +{ + dc_jsonrpc_unref(get_dc_jsonrpc_instance(env, obj)); +} + +JNIEXPORT void Java_com_b44t_messenger_DcJsonrpcInstance_request(JNIEnv *env, jobject obj, jstring request) +{ + CHAR_REF(request); + dc_jsonrpc_request(get_dc_jsonrpc_instance(env, obj), request); + CHAR_UNREF(request); +} + +JNIEXPORT jstring Java_com_b44t_messenger_DcJsonrpcInstance_getNextResponse(JNIEnv *env, jobject obj) +{ + char* temp = dc_jsonrpc_next_response(get_dc_jsonrpc_instance(env, obj)); + jstring ret = JSTRING_NEW(temp); + dc_str_unref(temp); + return ret; +} diff --git a/scripts/ndk-make.sh b/scripts/ndk-make.sh index 4a2044e5b7..8ec2b80ba6 100755 --- a/scripts/ndk-make.sh +++ b/scripts/ndk-make.sh @@ -115,7 +115,7 @@ if test -z $1 || test $1 = armeabi-v7a; then TARGET_CC="$TOOLCHAIN/bin/armv7a-linux-androideabi16-clang" \ TARGET_AR="$TOOLCHAIN/bin/llvm-ar" \ TARGET_RANLIB="$TOOLCHAIN/bin/llvm-ranlib" \ - cargo build $RELEASEFLAG --target armv7-linux-androideabi -p deltachat_ffi + cargo build $RELEASEFLAG --target armv7-linux-androideabi -p deltachat_ffi --features jsonrpc cp target/armv7-linux-androideabi/$RELEASE/libdeltachat.a $jnidir/armeabi-v7a fi @@ -124,7 +124,7 @@ if test -z $1 || test $1 = arm64-v8a; then TARGET_CC="$TOOLCHAIN/bin/aarch64-linux-android21-clang" \ TARGET_AR="$TOOLCHAIN/bin/llvm-ar" \ TARGET_RANLIB="$TOOLCHAIN/bin/llvm-ranlib" \ - cargo build $RELEASEFLAG --target aarch64-linux-android -p deltachat_ffi + cargo build $RELEASEFLAG --target aarch64-linux-android -p deltachat_ffi --features jsonrpc cp target/aarch64-linux-android/$RELEASE/libdeltachat.a $jnidir/arm64-v8a fi @@ -133,7 +133,7 @@ if test -z $1 || test $1 = x86; then TARGET_CC="$TOOLCHAIN/bin/i686-linux-android16-clang" \ TARGET_AR="$TOOLCHAIN/bin/llvm-ar" \ TARGET_RANLIB="$TOOLCHAIN/bin/llvm-ranlib" \ - cargo build $RELEASEFLAG --target i686-linux-android -p deltachat_ffi + cargo build $RELEASEFLAG --target i686-linux-android -p deltachat_ffi --features jsonrpc cp target/i686-linux-android/$RELEASE/libdeltachat.a $jnidir/x86 fi @@ -142,7 +142,7 @@ if test -z $1 || test $1 = x86_64; then TARGET_CC="$TOOLCHAIN/bin/x86_64-linux-android21-clang" \ TARGET_AR="$TOOLCHAIN/bin/llvm-ar" \ TARGET_RANLIB="$TOOLCHAIN/bin/llvm-ranlib" \ - cargo build $RELEASEFLAG --target x86_64-linux-android -p deltachat_ffi + cargo build $RELEASEFLAG --target x86_64-linux-android -p deltachat_ffi --features jsonrpc cp target/x86_64-linux-android/$RELEASE/libdeltachat.a $jnidir/x86_64 fi diff --git a/src/com/b44t/messenger/DcAccounts.java b/src/com/b44t/messenger/DcAccounts.java index 4ac4014e85..671bb6caf2 100644 --- a/src/com/b44t/messenger/DcAccounts.java +++ b/src/com/b44t/messenger/DcAccounts.java @@ -20,6 +20,7 @@ public void unref() { } public DcEventEmitter getEventEmitter () { return new DcEventEmitter(getEventEmitterCPtr()); } + public DcJsonrpcInstance getJsonrpcInstance () { return new DcJsonrpcInstance(getJsonrpcInstanceCPtr()); } public native void startIo (); public native void stopIo (); public native void maybeNetwork (); @@ -38,6 +39,7 @@ public void unref() { private native long createAccountsCPtr (String osName, String dir); private native void unrefAccountsCPtr (); private native long getEventEmitterCPtr (); + private native long getJsonrpcInstanceCPtr (); private native long getAccountCPtr (int accountId); private native long getSelectedAccountCPtr (); } diff --git a/src/com/b44t/messenger/DcJsonrpcInstance.java b/src/com/b44t/messenger/DcJsonrpcInstance.java new file mode 100644 index 0000000000..98424910df --- /dev/null +++ b/src/com/b44t/messenger/DcJsonrpcInstance.java @@ -0,0 +1,22 @@ +package com.b44t.messenger; + +public class DcJsonrpcInstance { + + public DcJsonrpcInstance(long jsonrpcInstanceCPtr) { + this.jsonrpcInstanceCPtr = jsonrpcInstanceCPtr; + } + + @Override protected void finalize() throws Throwable { + super.finalize(); + unrefJsonrpcInstanceCPtr(); + jsonrpcInstanceCPtr = 0; + } + + public native void request(String request); + public native String getNextResponse(); + + // working with raw c-data + private long jsonrpcInstanceCPtr; // CAVE: the name is referenced in the JNI + private native long getNextEventCPtr (); + private native void unrefJsonrpcInstanceCPtr(); +} From 1405ae0b655e3c74039e8b5578f57130d367e883 Mon Sep 17 00:00:00 2001 From: link2xt Date: Sat, 22 Apr 2023 15:51:05 +0000 Subject: [PATCH 02/25] Start using DcJsonrpcInstance --- src/org/thoughtcrime/securesms/ApplicationContext.java | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/src/org/thoughtcrime/securesms/ApplicationContext.java b/src/org/thoughtcrime/securesms/ApplicationContext.java index fa190cba6a..94790e695b 100644 --- a/src/org/thoughtcrime/securesms/ApplicationContext.java +++ b/src/org/thoughtcrime/securesms/ApplicationContext.java @@ -23,6 +23,7 @@ import com.b44t.messenger.DcContext; import com.b44t.messenger.DcEvent; import com.b44t.messenger.DcEventEmitter; +import com.b44t.messenger.DcJsonrpcInstance; import org.thoughtcrime.securesms.components.emoji.EmojiProvider; import org.thoughtcrime.securesms.connect.AccountManager; @@ -111,13 +112,14 @@ public void onCreate() { notificationCenter = new NotificationCenter(this); eventCenter = new DcEventCenter(this); new Thread(() -> { - DcEventEmitter emitter = dcAccounts.getEventEmitter(); + DcJsonrpcInstance emitter = dcAccounts.getJsonrpcInstance(); while (true) { - DcEvent event = emitter.getNextEvent(); - if (event==null) { + String response = emitter.getNextResponse(); + if (response==null) { break; } - eventCenter.handleEvent(event); + // TODO convert notification to event + //eventCenter.handleEvent(event); } Log.i("DeltaChat", "shutting down event handler"); }, "eventThread").start(); From 39800733c6d3578427d38271a86a71f228452144 Mon Sep 17 00:00:00 2001 From: link2xt Date: Sat, 22 Apr 2023 15:51:09 +0000 Subject: [PATCH 03/25] Revert "Start using DcJsonrpcInstance" This reverts commit 91ba9ae50c2db5279fddec76df9f6d3870ab737e. --- src/org/thoughtcrime/securesms/ApplicationContext.java | 10 ++++------ 1 file changed, 4 insertions(+), 6 deletions(-) diff --git a/src/org/thoughtcrime/securesms/ApplicationContext.java b/src/org/thoughtcrime/securesms/ApplicationContext.java index 94790e695b..fa190cba6a 100644 --- a/src/org/thoughtcrime/securesms/ApplicationContext.java +++ b/src/org/thoughtcrime/securesms/ApplicationContext.java @@ -23,7 +23,6 @@ import com.b44t.messenger.DcContext; import com.b44t.messenger.DcEvent; import com.b44t.messenger.DcEventEmitter; -import com.b44t.messenger.DcJsonrpcInstance; import org.thoughtcrime.securesms.components.emoji.EmojiProvider; import org.thoughtcrime.securesms.connect.AccountManager; @@ -112,14 +111,13 @@ public void onCreate() { notificationCenter = new NotificationCenter(this); eventCenter = new DcEventCenter(this); new Thread(() -> { - DcJsonrpcInstance emitter = dcAccounts.getJsonrpcInstance(); + DcEventEmitter emitter = dcAccounts.getEventEmitter(); while (true) { - String response = emitter.getNextResponse(); - if (response==null) { + DcEvent event = emitter.getNextEvent(); + if (event==null) { break; } - // TODO convert notification to event - //eventCenter.handleEvent(event); + eventCenter.handleEvent(event); } Log.i("DeltaChat", "shutting down event handler"); }, "eventThread").start(); From 00fd1a95bb2a72f76ecf2f3295a11da297859c9e Mon Sep 17 00:00:00 2001 From: link2xt Date: Sat, 22 Apr 2023 17:57:43 +0000 Subject: [PATCH 04/25] Add dcJsonrpcInstance to ApplicationContext --- src/org/thoughtcrime/securesms/ApplicationContext.java | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/org/thoughtcrime/securesms/ApplicationContext.java b/src/org/thoughtcrime/securesms/ApplicationContext.java index fa190cba6a..e3505e7591 100644 --- a/src/org/thoughtcrime/securesms/ApplicationContext.java +++ b/src/org/thoughtcrime/securesms/ApplicationContext.java @@ -23,6 +23,7 @@ import com.b44t.messenger.DcContext; import com.b44t.messenger.DcEvent; import com.b44t.messenger.DcEventEmitter; +import com.b44t.messenger.DcJsonrpcInstance; import org.thoughtcrime.securesms.components.emoji.EmojiProvider; import org.thoughtcrime.securesms.connect.AccountManager; @@ -52,6 +53,7 @@ public class ApplicationContext extends MultiDexApplication { private static final String TAG = ApplicationContext.class.getSimpleName(); public DcAccounts dcAccounts; + public DcJsonrpcInstance dcJsonrpcInstance; public DcContext dcContext; public DcLocationManager dcLocationManager; public DcEventCenter eventCenter; @@ -88,6 +90,7 @@ public void onCreate() { System.loadLibrary("native-utils"); dcAccounts = new DcAccounts("Android "+BuildConfig.VERSION_NAME, new File(getFilesDir(), "accounts").getAbsolutePath()); + dcJsonrpcInstance = dcAccounts.getJsonrpcInstance(); AccountManager.getInstance().migrateToDcAccounts(this); int[] allAccounts = dcAccounts.getAll(); for (int accountId : allAccounts) { From 5246ee77ade6c94ba19f4f27af3f2f0962b3edb7 Mon Sep 17 00:00:00 2001 From: link2xt Date: Sat, 22 Apr 2023 18:31:57 +0000 Subject: [PATCH 05/25] Remove getNextEventCPtr --- src/com/b44t/messenger/DcJsonrpcInstance.java | 1 - 1 file changed, 1 deletion(-) diff --git a/src/com/b44t/messenger/DcJsonrpcInstance.java b/src/com/b44t/messenger/DcJsonrpcInstance.java index 98424910df..57b353b440 100644 --- a/src/com/b44t/messenger/DcJsonrpcInstance.java +++ b/src/com/b44t/messenger/DcJsonrpcInstance.java @@ -17,6 +17,5 @@ public DcJsonrpcInstance(long jsonrpcInstanceCPtr) { // working with raw c-data private long jsonrpcInstanceCPtr; // CAVE: the name is referenced in the JNI - private native long getNextEventCPtr (); private native void unrefJsonrpcInstanceCPtr(); } From 39e9ab817eb4f067fbe58d2b02564eae77ed0c02 Mon Sep 17 00:00:00 2001 From: link2xt Date: Sat, 22 Apr 2023 20:09:11 +0000 Subject: [PATCH 06/25] Add JSON-RPC thread Printing JSON-RPC responses for now. --- src/org/thoughtcrime/securesms/ApplicationContext.java | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/src/org/thoughtcrime/securesms/ApplicationContext.java b/src/org/thoughtcrime/securesms/ApplicationContext.java index e3505e7591..51849a45fc 100644 --- a/src/org/thoughtcrime/securesms/ApplicationContext.java +++ b/src/org/thoughtcrime/securesms/ApplicationContext.java @@ -125,6 +125,13 @@ public void onCreate() { Log.i("DeltaChat", "shutting down event handler"); }, "eventThread").start(); + new Thread(() -> { + while (true) { + String response = dcJsonrpcInstance.getNextResponse(); + Log.i(TAG, "Got JSON-RPC response: " + response); + } + }, "jsonrpcThread").start(); + // set translations before starting I/O to avoid sending untranslated MDNs (issue #2288) DcHelper.setStockTranslations(this); From a7e6f4865f1425ce27a15cade63e40b2b25c8167 Mon Sep 17 00:00:00 2001 From: link2xt Date: Sat, 22 Apr 2023 20:59:31 +0000 Subject: [PATCH 07/25] Try to send JSON-RPC requests --- .../securesms/ApplicationContext.java | 21 +++++++++++++++++++ 1 file changed, 21 insertions(+) diff --git a/src/org/thoughtcrime/securesms/ApplicationContext.java b/src/org/thoughtcrime/securesms/ApplicationContext.java index 51849a45fc..989639dcb3 100644 --- a/src/org/thoughtcrime/securesms/ApplicationContext.java +++ b/src/org/thoughtcrime/securesms/ApplicationContext.java @@ -9,6 +9,7 @@ import android.net.NetworkCapabilities; import android.os.Build; import android.util.Log; +import android.util.JsonWriter; import androidx.annotation.NonNull; import androidx.appcompat.app.AppCompatDelegate; @@ -46,6 +47,7 @@ import org.thoughtcrime.securesms.util.SignalProtocolLoggerProvider; import java.io.File; +import java.io.CharArrayWriter; import java.util.concurrent.TimeUnit; //import com.squareup.leakcanary.LeakCanary; @@ -127,6 +129,25 @@ public void onCreate() { new Thread(() -> { while (true) { + try { + CharArrayWriter charWriter = new CharArrayWriter (); + JsonWriter writer = new JsonWriter(charWriter); + writer.beginObject(); + writer.name("jsonrpc").value("2.0"); + writer.name("method").value("sleep"); + writer.name("params"); + writer.beginArray(); + writer.value(5.0); + writer.endArray(); + writer.name("id").value(1); + writer.endObject(); + String request = charWriter.toString(); + Log.i(TAG, "Sending request: " + request); + dcJsonrpcInstance.request(request); + } catch (Exception e) { + e.printStackTrace(); + } + String response = dcJsonrpcInstance.getNextResponse(); Log.i(TAG, "Got JSON-RPC response: " + response); } From e27a901f42c01f85ce3a2e2988c2a0e7ac1236d3 Mon Sep 17 00:00:00 2001 From: link2xt Date: Sat, 22 Apr 2023 21:29:16 +0000 Subject: [PATCH 08/25] Generate request IDs --- src/org/thoughtcrime/securesms/ApplicationContext.java | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/org/thoughtcrime/securesms/ApplicationContext.java b/src/org/thoughtcrime/securesms/ApplicationContext.java index 989639dcb3..f37c4d8f45 100644 --- a/src/org/thoughtcrime/securesms/ApplicationContext.java +++ b/src/org/thoughtcrime/securesms/ApplicationContext.java @@ -128,8 +128,10 @@ public void onCreate() { }, "eventThread").start(); new Thread(() -> { + int requestId = 0; while (true) { try { + requestId++; CharArrayWriter charWriter = new CharArrayWriter (); JsonWriter writer = new JsonWriter(charWriter); writer.beginObject(); @@ -139,7 +141,7 @@ public void onCreate() { writer.beginArray(); writer.value(5.0); writer.endArray(); - writer.name("id").value(1); + writer.name("id").value(requestId); writer.endObject(); String request = charWriter.toString(); Log.i(TAG, "Sending request: " + request); From 070f2841cd6de1dc01547719ee85c27798f68ea2 Mon Sep 17 00:00:00 2001 From: link2xt Date: Sat, 22 Apr 2023 22:10:57 +0000 Subject: [PATCH 09/25] Sending request works --- jni/dc_wrapper.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/jni/dc_wrapper.c b/jni/dc_wrapper.c index 08fd01986f..84b8981c39 100644 --- a/jni/dc_wrapper.c +++ b/jni/dc_wrapper.c @@ -2169,7 +2169,8 @@ JNIEXPORT void Java_com_b44t_messenger_DcJsonrpcInstance_unrefJsonrpcInstanceCPt JNIEXPORT void Java_com_b44t_messenger_DcJsonrpcInstance_request(JNIEnv *env, jobject obj, jstring request) { CHAR_REF(request); - dc_jsonrpc_request(get_dc_jsonrpc_instance(env, obj), request); + dc_jsonrpc_request(get_dc_jsonrpc_instance(env, obj), "{\"jsonrpc\":\"2.0\",\"method\":\"sleep\",\"params\":[5.0],\"id\":1}"); + //dc_jsonrpc_request(get_dc_jsonrpc_instance(env, obj), request); CHAR_UNREF(request); } From df1acac1a6c9f75576efa9905214644f4469f2d3 Mon Sep 17 00:00:00 2001 From: link2xt Date: Sat, 22 Apr 2023 22:14:21 +0000 Subject: [PATCH 10/25] Trying to use StringWriter --- src/org/thoughtcrime/securesms/ApplicationContext.java | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/org/thoughtcrime/securesms/ApplicationContext.java b/src/org/thoughtcrime/securesms/ApplicationContext.java index f37c4d8f45..a3db40dd10 100644 --- a/src/org/thoughtcrime/securesms/ApplicationContext.java +++ b/src/org/thoughtcrime/securesms/ApplicationContext.java @@ -47,7 +47,7 @@ import org.thoughtcrime.securesms.util.SignalProtocolLoggerProvider; import java.io.File; -import java.io.CharArrayWriter; +import java.io.StringWriter; import java.util.concurrent.TimeUnit; //import com.squareup.leakcanary.LeakCanary; @@ -132,8 +132,8 @@ public void onCreate() { while (true) { try { requestId++; - CharArrayWriter charWriter = new CharArrayWriter (); - JsonWriter writer = new JsonWriter(charWriter); + StringWriter stringWriter = new StringWriter (); + JsonWriter writer = new JsonWriter(stringWriter); writer.beginObject(); writer.name("jsonrpc").value("2.0"); writer.name("method").value("sleep"); @@ -143,7 +143,7 @@ public void onCreate() { writer.endArray(); writer.name("id").value(requestId); writer.endObject(); - String request = charWriter.toString(); + String request = stringWriter.toString(); Log.i(TAG, "Sending request: " + request); dcJsonrpcInstance.request(request); } catch (Exception e) { From 72f2f8979e7295ea0532466335bf7838f2bf9b25 Mon Sep 17 00:00:00 2001 From: link2xt Date: Sat, 22 Apr 2023 22:53:57 +0000 Subject: [PATCH 11/25] requestPtr --- jni/dc_wrapper.c | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/jni/dc_wrapper.c b/jni/dc_wrapper.c index 84b8981c39..9d25ef6873 100644 --- a/jni/dc_wrapper.c +++ b/jni/dc_wrapper.c @@ -2169,8 +2169,7 @@ JNIEXPORT void Java_com_b44t_messenger_DcJsonrpcInstance_unrefJsonrpcInstanceCPt JNIEXPORT void Java_com_b44t_messenger_DcJsonrpcInstance_request(JNIEnv *env, jobject obj, jstring request) { CHAR_REF(request); - dc_jsonrpc_request(get_dc_jsonrpc_instance(env, obj), "{\"jsonrpc\":\"2.0\",\"method\":\"sleep\",\"params\":[5.0],\"id\":1}"); - //dc_jsonrpc_request(get_dc_jsonrpc_instance(env, obj), request); + dc_jsonrpc_request(get_dc_jsonrpc_instance(env, obj), requestPtr); CHAR_UNREF(request); } From 53dc77ec2d7a07f2e81614878fdc4f8c9fa31066 Mon Sep 17 00:00:00 2001 From: link2xt Date: Sat, 22 Apr 2023 23:06:40 +0000 Subject: [PATCH 12/25] Disable requests for now --- src/org/thoughtcrime/securesms/ApplicationContext.java | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/org/thoughtcrime/securesms/ApplicationContext.java b/src/org/thoughtcrime/securesms/ApplicationContext.java index a3db40dd10..fef5b7ec38 100644 --- a/src/org/thoughtcrime/securesms/ApplicationContext.java +++ b/src/org/thoughtcrime/securesms/ApplicationContext.java @@ -130,6 +130,7 @@ public void onCreate() { new Thread(() -> { int requestId = 0; while (true) { + if (false) { try { requestId++; StringWriter stringWriter = new StringWriter (); @@ -149,6 +150,7 @@ public void onCreate() { } catch (Exception e) { e.printStackTrace(); } + } String response = dcJsonrpcInstance.getNextResponse(); Log.i(TAG, "Got JSON-RPC response: " + response); From 7d6ff619cf9827fec1bdb3f79e586850d8d00b26 Mon Sep 17 00:00:00 2001 From: link2xt Date: Sun, 23 Apr 2023 13:14:27 +0000 Subject: [PATCH 13/25] Start JSON-RPC parsing --- .../securesms/ApplicationContext.java | 19 ++++++++++++++++--- 1 file changed, 16 insertions(+), 3 deletions(-) diff --git a/src/org/thoughtcrime/securesms/ApplicationContext.java b/src/org/thoughtcrime/securesms/ApplicationContext.java index fef5b7ec38..4360ddc9e5 100644 --- a/src/org/thoughtcrime/securesms/ApplicationContext.java +++ b/src/org/thoughtcrime/securesms/ApplicationContext.java @@ -130,7 +130,6 @@ public void onCreate() { new Thread(() -> { int requestId = 0; while (true) { - if (false) { try { requestId++; StringWriter stringWriter = new StringWriter (); @@ -150,10 +149,24 @@ public void onCreate() { } catch (Exception e) { e.printStackTrace(); } + + String response = JSONObject(dcJsonrpcInstance.getNextResponse()); + + int response_id = response.getInt("id"); + if (response_id == null) { + Log.i(TAG, "Got JSON-RPC notification: " + response.toString()); + continue; } - String response = dcJsonrpcInstance.getNextResponse(); - Log.i(TAG, "Got JSON-RPC response: " + response); + Object error = response.get("error"); + Object result = response.get("result"); + if (error != null) { + Log.i(TAG, "Got JSON-RPC error: " + error.toString()); + } else if (result != null) { + Log.i(TAG, "Got JSON-RPC response: " + response.toString()); + } else { + Log.e(TAG, "Got JSON-RPC response witout result or error: " + response.toString()); + } } }, "jsonrpcThread").start(); From 5a5d27a3e7ffe724d0884a8f7aec4ca2aa8565cd Mon Sep 17 00:00:00 2001 From: adbenitez Date: Sun, 23 Apr 2023 14:46:37 -0400 Subject: [PATCH 14/25] add DcRpc class --- .../securesms/ApplicationContext.java | 71 ++++++---------- .../thoughtcrime/securesms/connect/DcRpc.java | 81 +++++++++++++++++++ 2 files changed, 105 insertions(+), 47 deletions(-) create mode 100644 src/org/thoughtcrime/securesms/connect/DcRpc.java diff --git a/src/org/thoughtcrime/securesms/ApplicationContext.java b/src/org/thoughtcrime/securesms/ApplicationContext.java index 4360ddc9e5..cdb0968e16 100644 --- a/src/org/thoughtcrime/securesms/ApplicationContext.java +++ b/src/org/thoughtcrime/securesms/ApplicationContext.java @@ -9,7 +9,6 @@ import android.net.NetworkCapabilities; import android.os.Build; import android.util.Log; -import android.util.JsonWriter; import androidx.annotation.NonNull; import androidx.appcompat.app.AppCompatDelegate; @@ -24,7 +23,6 @@ import com.b44t.messenger.DcContext; import com.b44t.messenger.DcEvent; import com.b44t.messenger.DcEventEmitter; -import com.b44t.messenger.DcJsonrpcInstance; import org.thoughtcrime.securesms.components.emoji.EmojiProvider; import org.thoughtcrime.securesms.connect.AccountManager; @@ -34,6 +32,7 @@ import org.thoughtcrime.securesms.connect.ForegroundDetector; import org.thoughtcrime.securesms.connect.KeepAliveService; import org.thoughtcrime.securesms.connect.NetworkStateReceiver; +import org.thoughtcrime.securesms.connect.DcRpc; import org.thoughtcrime.securesms.crypto.DatabaseSecret; import org.thoughtcrime.securesms.crypto.DatabaseSecretProvider; import org.thoughtcrime.securesms.crypto.PRNGFixes; @@ -44,18 +43,21 @@ import org.thoughtcrime.securesms.util.AndroidSignalProtocolLogger; import org.thoughtcrime.securesms.util.DynamicLanguage; import org.thoughtcrime.securesms.util.DynamicTheme; +import org.thoughtcrime.securesms.util.JsonUtils; import org.thoughtcrime.securesms.util.SignalProtocolLoggerProvider; +import org.thoughtcrime.securesms.util.concurrent.ListenableFuture; import java.io.File; -import java.io.StringWriter; +import java.io.IOException; import java.util.concurrent.TimeUnit; +import java.util.concurrent.ExecutionException; //import com.squareup.leakcanary.LeakCanary; public class ApplicationContext extends MultiDexApplication { private static final String TAG = ApplicationContext.class.getSimpleName(); public DcAccounts dcAccounts; - public DcJsonrpcInstance dcJsonrpcInstance; + public DcRpc dcRpc; public DcContext dcContext; public DcLocationManager dcLocationManager; public DcEventCenter eventCenter; @@ -92,7 +94,7 @@ public void onCreate() { System.loadLibrary("native-utils"); dcAccounts = new DcAccounts("Android "+BuildConfig.VERSION_NAME, new File(getFilesDir(), "accounts").getAbsolutePath()); - dcJsonrpcInstance = dcAccounts.getJsonrpcInstance(); + dcRpc = new DcRpc(dcAccounts.getJsonrpcInstance()); AccountManager.getInstance().migrateToDcAccounts(this); int[] allAccounts = dcAccounts.getAll(); for (int accountId : allAccounts) { @@ -127,48 +129,23 @@ public void onCreate() { Log.i("DeltaChat", "shutting down event handler"); }, "eventThread").start(); - new Thread(() -> { - int requestId = 0; - while (true) { - try { - requestId++; - StringWriter stringWriter = new StringWriter (); - JsonWriter writer = new JsonWriter(stringWriter); - writer.beginObject(); - writer.name("jsonrpc").value("2.0"); - writer.name("method").value("sleep"); - writer.name("params"); - writer.beginArray(); - writer.value(5.0); - writer.endArray(); - writer.name("id").value(requestId); - writer.endObject(); - String request = stringWriter.toString(); - Log.i(TAG, "Sending request: " + request); - dcJsonrpcInstance.request(request); - } catch (Exception e) { - e.printStackTrace(); - } - - String response = JSONObject(dcJsonrpcInstance.getNextResponse()); - - int response_id = response.getInt("id"); - if (response_id == null) { - Log.i(TAG, "Got JSON-RPC notification: " + response.toString()); - continue; - } - - Object error = response.get("error"); - Object result = response.get("result"); - if (error != null) { - Log.i(TAG, "Got JSON-RPC error: " + error.toString()); - } else if (result != null) { - Log.i(TAG, "Got JSON-RPC response: " + response.toString()); - } else { - Log.e(TAG, "Got JSON-RPC response witout result or error: " + response.toString()); - } - } - }, "jsonrpcThread").start(); + dcRpc.start(); + // TODO: example usage, remove + ListenableFuture.Listener listener = new ListenableFuture.Listener() { + @Override + public void onSuccess(Object result) { + try { + Log.i(TAG, "Got JSON-RPC response: " + JsonUtils.toJson(result)); + } catch (IOException e) { + } + } + + @Override + public void onFailure(ExecutionException e) { + Log.e(TAG, "Got JSON-RPC error: " + e.getCause().toString()); + } + }; + dcRpc.call("sleep", 5.0).addListener(listener); // set translations before starting I/O to avoid sending untranslated MDNs (issue #2288) DcHelper.setStockTranslations(this); diff --git a/src/org/thoughtcrime/securesms/connect/DcRpc.java b/src/org/thoughtcrime/securesms/connect/DcRpc.java new file mode 100644 index 0000000000..36d37347ff --- /dev/null +++ b/src/org/thoughtcrime/securesms/connect/DcRpc.java @@ -0,0 +1,81 @@ +package org.thoughtcrime.securesms.connect; + +import android.util.Log; +import android.util.JsonWriter; + +import com.b44t.messenger.DcJsonrpcInstance; + +import org.json.JSONObject; +import org.json.JSONException; +import org.thoughtcrime.securesms.util.concurrent.SettableFuture; +import org.thoughtcrime.securesms.util.JsonUtils; + +import java.io.IOException; +import java.io.StringWriter; +import java.util.HashMap; +import java.util.Map; + +public class DcRpc { + private static final String TAG = DcRpc.class.getSimpleName(); + + private Map> requestFutures = new HashMap<>(); + private DcJsonrpcInstance dcJsonrpcInstance; + private int requestId = 0; + + public DcRpc(DcJsonrpcInstance dcJsonrpcInstance) { + this.dcJsonrpcInstance = dcJsonrpcInstance; + } + + private void processResponse() throws JSONException { + JSONObject response = new JSONObject(dcJsonrpcInstance.getNextResponse()); + int responseId = response.optInt("id", 0); + + if (responseId == 0) { + Log.i(TAG, "Got JSON-RPC notification: " + response.toString()); + return; + } + + SettableFuture future = requestFutures.remove(responseId); + Object error = response.opt("error"); + Object result = response.opt("result"); + if (error != null) { + future.setException(new Throwable(error.toString())); + } else if (result != null) { + future.set(result); + } else { + future.setException(new Throwable("Got JSON-RPC response witout result or error: " + response.toString())); + } + } + + public void start() { + new Thread(() -> { + while (true) { + try { + processResponse(); + } catch (JSONException e) { + e.printStackTrace(); + } + } + }, "jsonrpcThread").start(); + } + + public SettableFuture call(String method, Object... params) { + requestId++; + Map request = new HashMap<>(); + request.put("jsonrpc", "2.0"); + request.put("method", method); + request.put("params", params); + request.put("id", requestId); + SettableFuture future = new SettableFuture<>(); + try { + String requestStr = JsonUtils.toJson(request); + Log.i(TAG, "Sending request: " + requestStr); + requestFutures.put(requestId, future); + dcJsonrpcInstance.request(requestStr); + } catch (IOException e) { + e.printStackTrace(); + future.setException(e); + } + return future; + } +} From 1d6d148c7e86be9ecccb1e418434b1541105f13b Mon Sep 17 00:00:00 2001 From: adbenitez Date: Sun, 23 Apr 2023 15:00:08 -0400 Subject: [PATCH 15/25] fix bug --- src/org/thoughtcrime/securesms/ApplicationContext.java | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-) diff --git a/src/org/thoughtcrime/securesms/ApplicationContext.java b/src/org/thoughtcrime/securesms/ApplicationContext.java index cdb0968e16..e435cfbc65 100644 --- a/src/org/thoughtcrime/securesms/ApplicationContext.java +++ b/src/org/thoughtcrime/securesms/ApplicationContext.java @@ -48,7 +48,6 @@ import org.thoughtcrime.securesms.util.concurrent.ListenableFuture; import java.io.File; -import java.io.IOException; import java.util.concurrent.TimeUnit; import java.util.concurrent.ExecutionException; //import com.squareup.leakcanary.LeakCanary; @@ -134,10 +133,7 @@ public void onCreate() { ListenableFuture.Listener listener = new ListenableFuture.Listener() { @Override public void onSuccess(Object result) { - try { - Log.i(TAG, "Got JSON-RPC response: " + JsonUtils.toJson(result)); - } catch (IOException e) { - } + Log.i(TAG, "Got JSON-RPC response: " + (result!=null? result.toString() : "null")); } @Override From d977d1f3a58a410fb48f4b1dca3dde4a9666a612 Mon Sep 17 00:00:00 2001 From: adbenitez Date: Sun, 23 Apr 2023 15:27:39 -0400 Subject: [PATCH 16/25] use get() --- .../securesms/ApplicationContext.java | 21 +++++++------------ 1 file changed, 7 insertions(+), 14 deletions(-) diff --git a/src/org/thoughtcrime/securesms/ApplicationContext.java b/src/org/thoughtcrime/securesms/ApplicationContext.java index e435cfbc65..0cd112af79 100644 --- a/src/org/thoughtcrime/securesms/ApplicationContext.java +++ b/src/org/thoughtcrime/securesms/ApplicationContext.java @@ -45,11 +45,9 @@ import org.thoughtcrime.securesms.util.DynamicTheme; import org.thoughtcrime.securesms.util.JsonUtils; import org.thoughtcrime.securesms.util.SignalProtocolLoggerProvider; -import org.thoughtcrime.securesms.util.concurrent.ListenableFuture; import java.io.File; import java.util.concurrent.TimeUnit; -import java.util.concurrent.ExecutionException; //import com.squareup.leakcanary.LeakCanary; public class ApplicationContext extends MultiDexApplication { @@ -129,19 +127,14 @@ public void onCreate() { }, "eventThread").start(); dcRpc.start(); + // TODO: example usage, remove - ListenableFuture.Listener listener = new ListenableFuture.Listener() { - @Override - public void onSuccess(Object result) { - Log.i(TAG, "Got JSON-RPC response: " + (result!=null? result.toString() : "null")); - } - - @Override - public void onFailure(ExecutionException e) { - Log.e(TAG, "Got JSON-RPC error: " + e.getCause().toString()); - } - }; - dcRpc.call("sleep", 5.0).addListener(listener); + try { + Object result = dcRpc.call("get_system_info").get(); + Log.i(TAG, "Got JSON-RPC response: " + (result!=null? result.toString() : "null")); + } catch (Exception e) { + Log.e(TAG, "Got JSON-RPC error: ", e); + } // set translations before starting I/O to avoid sending untranslated MDNs (issue #2288) DcHelper.setStockTranslations(this); From aa1a602d3668ca731040a60b2358ff359b6e6bcd Mon Sep 17 00:00:00 2001 From: adbenitez Date: Sun, 23 Apr 2023 15:59:04 -0400 Subject: [PATCH 17/25] add DcHelp.getRpc() --- src/org/thoughtcrime/securesms/ApplicationContext.java | 2 +- src/org/thoughtcrime/securesms/connect/DcHelper.java | 5 +++++ 2 files changed, 6 insertions(+), 1 deletion(-) diff --git a/src/org/thoughtcrime/securesms/ApplicationContext.java b/src/org/thoughtcrime/securesms/ApplicationContext.java index 0cd112af79..3577cc66bd 100644 --- a/src/org/thoughtcrime/securesms/ApplicationContext.java +++ b/src/org/thoughtcrime/securesms/ApplicationContext.java @@ -133,7 +133,7 @@ public void onCreate() { Object result = dcRpc.call("get_system_info").get(); Log.i(TAG, "Got JSON-RPC response: " + (result!=null? result.toString() : "null")); } catch (Exception e) { - Log.e(TAG, "Got JSON-RPC error: ", e); + Log.e(TAG, "Got JSON-RPC error", e); } // set translations before starting I/O to avoid sending untranslated MDNs (issue #2288) diff --git a/src/org/thoughtcrime/securesms/connect/DcHelper.java b/src/org/thoughtcrime/securesms/connect/DcHelper.java index 4817f1e6de..21aa3a1000 100644 --- a/src/org/thoughtcrime/securesms/connect/DcHelper.java +++ b/src/org/thoughtcrime/securesms/connect/DcHelper.java @@ -25,6 +25,7 @@ import org.thoughtcrime.securesms.ApplicationContext; import org.thoughtcrime.securesms.BuildConfig; import org.thoughtcrime.securesms.R; +import org.thoughtcrime.securesms.connect.DcRpc; import org.thoughtcrime.securesms.database.model.ThreadRecord; import org.thoughtcrime.securesms.notifications.NotificationCenter; import org.thoughtcrime.securesms.recipients.Recipient; @@ -75,6 +76,10 @@ public static DcContext getContext(@NonNull Context context) { return ApplicationContext.getInstance(context).dcContext; } + public static DcRpc getRpc(@NonNull Context context) { + return ApplicationContext.getInstance(context).dcRpc; + } + public static DcAccounts getAccounts(@NonNull Context context) { return ApplicationContext.getInstance(context).dcAccounts; } From 941627db6e7c21e11e5485704ef514c69e63108f Mon Sep 17 00:00:00 2001 From: adbenitez Date: Tue, 25 Apr 2023 20:09:59 -0400 Subject: [PATCH 18/25] move Rpc class to com.b44t.messenger.rpc package --- build.gradle | 1 + src/com/b44t/messenger/rpc/Rpc.java | 121 ++++++++++++++++++ src/com/b44t/messenger/rpc/RpcError.java | 11 ++ .../securesms/ApplicationContext.java | 17 +-- .../securesms/connect/DcHelper.java | 6 +- .../thoughtcrime/securesms/connect/DcRpc.java | 81 ------------ 6 files changed, 140 insertions(+), 97 deletions(-) create mode 100644 src/com/b44t/messenger/rpc/Rpc.java create mode 100644 src/com/b44t/messenger/rpc/RpcError.java delete mode 100644 src/org/thoughtcrime/securesms/connect/DcRpc.java diff --git a/build.gradle b/build.gradle index 59670134f5..d5cdfaba49 100644 --- a/build.gradle +++ b/build.gradle @@ -36,6 +36,7 @@ dependencies { implementation 'androidx.constraintlayout:constraintlayout:2.1.4' implementation 'com.journeyapps:zxing-android-embedded:3.4.0' // QR Code scanner implementation 'com.fasterxml.jackson.core:jackson-databind:2.11.1' // used as JSON library + implementation 'com.google.code.gson:gson:2.10.1' // used as JSON library implementation "me.leolin:ShortcutBadger:1.1.16" // display messagecount on the home screen icon. implementation 'com.jpardogo.materialtabstrip:library:1.0.9' // used in the emoji selector for the tab selection. implementation 'com.github.chrisbanes:PhotoView:2.1.3' // does the zooming on photos / media diff --git a/src/com/b44t/messenger/rpc/Rpc.java b/src/com/b44t/messenger/rpc/Rpc.java new file mode 100644 index 0000000000..eedda7b527 --- /dev/null +++ b/src/com/b44t/messenger/rpc/Rpc.java @@ -0,0 +1,121 @@ +package com.b44t.messenger.rpc; + +import com.b44t.messenger.DcJsonrpcInstance; +import com.google.gson.Gson; +import com.google.gson.GsonBuilder; +import com.google.gson.JsonElement; +import com.google.gson.JsonSyntaxException; +import com.google.gson.reflect.TypeToken; + +import java.util.HashMap; +import java.util.Map; +import java.util.concurrent.CompletableFuture; +import java.util.concurrent.ConcurrentHashMap; +import java.util.concurrent.ExecutionException; + +public class Rpc { + private Map> requestFutures = new ConcurrentHashMap<>(); + private DcJsonrpcInstance dcJsonrpcInstance; + private int requestId = 0; + private Gson gson = new GsonBuilder().serializeNulls().create(); + + public Rpc(DcJsonrpcInstance dcJsonrpcInstance) { + this.dcJsonrpcInstance = dcJsonrpcInstance; + } + + private void processResponse() throws JsonSyntaxException { + String jsonResponse = dcJsonrpcInstance.getNextResponse(); + Response response = gson.fromJson(jsonResponse, Response.class); + + if (response.id == 0) { // Got JSON-RPC notification, ignore + return; + } + + CompletableFuture future = requestFutures.remove(response.id); + if (response.error != null) { + future.completeExceptionally(new RpcError(response.error.toString())); + } else if (response.result != null) { + future.complete(response.result); + } else { + future.completeExceptionally(new RpcError("Got JSON-RPC response witout result or error: " + jsonResponse)); + } + } + + public void start() { + new Thread(() -> { + while (true) { + try { + processResponse(); + } catch (JsonSyntaxException e) { + e.printStackTrace(); + } + } + }, "jsonrpcThread").start(); + } + + public CompletableFuture call(String method, Object... params) { + int id; + synchronized (this) { + id = ++requestId; + } + String jsonRequest = gson.toJson(new Request(method, params, id)); + CompletableFuture future = new CompletableFuture<>(); + requestFutures.put(id, future); + dcJsonrpcInstance.request(jsonRequest); + return future; + } + + public JsonElement getResult(String method, Object... params) throws RpcError { + try { + return call(method, params).get(); + } catch (ExecutionException e) { + throw (RpcError)e.getCause(); + } catch (InterruptedException e) { + throw new RpcError(e.getMessage()); + } + } + + public int addAccount() throws RpcError { + return gson.fromJson(getResult("add_account"), int.class); + } + + public void startIO() throws RpcError { + getResult("start_io_for_all_accounts"); + } + + public void stopIO() throws RpcError { + getResult("stop_io_for_all_accounts"); + } + + public Map getSystemInfo() throws RpcError { + TypeToken> mapType = new TypeToken>(){}; + return gson.fromJson(getResult("get_system_info"), mapType); + } + + + private class Request { + public String jsonrpc = "2.0"; + public String method; + public Object[] params; + public int id; + + public Request(String method, Object[] params, int id) { + this.method = method; + this.params = params; + this.id = id; + } + } + + private class Response { + public int id = 0; + public int id2 = 0; + public JsonElement result; + public JsonElement error; + + public Response(int id, JsonElement result, JsonElement error) { + this.id = id; + this.result = result; + this.error = error; + } + } +} diff --git a/src/com/b44t/messenger/rpc/RpcError.java b/src/com/b44t/messenger/rpc/RpcError.java new file mode 100644 index 0000000000..836e4f9019 --- /dev/null +++ b/src/com/b44t/messenger/rpc/RpcError.java @@ -0,0 +1,11 @@ +package com.b44t.messenger.rpc; + +/** + * An exception occurred while processing a request. + **/ +public class RpcError extends Throwable { + + public RpcError(String message) { + super(message); + } +} diff --git a/src/org/thoughtcrime/securesms/ApplicationContext.java b/src/org/thoughtcrime/securesms/ApplicationContext.java index 3577cc66bd..da89d35a4f 100644 --- a/src/org/thoughtcrime/securesms/ApplicationContext.java +++ b/src/org/thoughtcrime/securesms/ApplicationContext.java @@ -23,6 +23,7 @@ import com.b44t.messenger.DcContext; import com.b44t.messenger.DcEvent; import com.b44t.messenger.DcEventEmitter; +import com.b44t.messenger.rpc.Rpc; import org.thoughtcrime.securesms.components.emoji.EmojiProvider; import org.thoughtcrime.securesms.connect.AccountManager; @@ -32,7 +33,6 @@ import org.thoughtcrime.securesms.connect.ForegroundDetector; import org.thoughtcrime.securesms.connect.KeepAliveService; import org.thoughtcrime.securesms.connect.NetworkStateReceiver; -import org.thoughtcrime.securesms.connect.DcRpc; import org.thoughtcrime.securesms.crypto.DatabaseSecret; import org.thoughtcrime.securesms.crypto.DatabaseSecretProvider; import org.thoughtcrime.securesms.crypto.PRNGFixes; @@ -43,7 +43,6 @@ import org.thoughtcrime.securesms.util.AndroidSignalProtocolLogger; import org.thoughtcrime.securesms.util.DynamicLanguage; import org.thoughtcrime.securesms.util.DynamicTheme; -import org.thoughtcrime.securesms.util.JsonUtils; import org.thoughtcrime.securesms.util.SignalProtocolLoggerProvider; import java.io.File; @@ -54,7 +53,7 @@ public class ApplicationContext extends MultiDexApplication { private static final String TAG = ApplicationContext.class.getSimpleName(); public DcAccounts dcAccounts; - public DcRpc dcRpc; + public Rpc rpc; public DcContext dcContext; public DcLocationManager dcLocationManager; public DcEventCenter eventCenter; @@ -91,7 +90,7 @@ public void onCreate() { System.loadLibrary("native-utils"); dcAccounts = new DcAccounts("Android "+BuildConfig.VERSION_NAME, new File(getFilesDir(), "accounts").getAbsolutePath()); - dcRpc = new DcRpc(dcAccounts.getJsonrpcInstance()); + rpc = new Rpc(dcAccounts.getJsonrpcInstance()); AccountManager.getInstance().migrateToDcAccounts(this); int[] allAccounts = dcAccounts.getAll(); for (int accountId : allAccounts) { @@ -126,15 +125,7 @@ public void onCreate() { Log.i("DeltaChat", "shutting down event handler"); }, "eventThread").start(); - dcRpc.start(); - - // TODO: example usage, remove - try { - Object result = dcRpc.call("get_system_info").get(); - Log.i(TAG, "Got JSON-RPC response: " + (result!=null? result.toString() : "null")); - } catch (Exception e) { - Log.e(TAG, "Got JSON-RPC error", e); - } + rpc.start(); // set translations before starting I/O to avoid sending untranslated MDNs (issue #2288) DcHelper.setStockTranslations(this); diff --git a/src/org/thoughtcrime/securesms/connect/DcHelper.java b/src/org/thoughtcrime/securesms/connect/DcHelper.java index 21aa3a1000..a355b85f35 100644 --- a/src/org/thoughtcrime/securesms/connect/DcHelper.java +++ b/src/org/thoughtcrime/securesms/connect/DcHelper.java @@ -21,11 +21,11 @@ import com.b44t.messenger.DcContext; import com.b44t.messenger.DcLot; import com.b44t.messenger.DcMsg; +import com.b44t.messenger.rpc.Rpc; import org.thoughtcrime.securesms.ApplicationContext; import org.thoughtcrime.securesms.BuildConfig; import org.thoughtcrime.securesms.R; -import org.thoughtcrime.securesms.connect.DcRpc; import org.thoughtcrime.securesms.database.model.ThreadRecord; import org.thoughtcrime.securesms.notifications.NotificationCenter; import org.thoughtcrime.securesms.recipients.Recipient; @@ -76,8 +76,8 @@ public static DcContext getContext(@NonNull Context context) { return ApplicationContext.getInstance(context).dcContext; } - public static DcRpc getRpc(@NonNull Context context) { - return ApplicationContext.getInstance(context).dcRpc; + public static Rpc getRpc(@NonNull Context context) { + return ApplicationContext.getInstance(context).rpc; } public static DcAccounts getAccounts(@NonNull Context context) { diff --git a/src/org/thoughtcrime/securesms/connect/DcRpc.java b/src/org/thoughtcrime/securesms/connect/DcRpc.java deleted file mode 100644 index 36d37347ff..0000000000 --- a/src/org/thoughtcrime/securesms/connect/DcRpc.java +++ /dev/null @@ -1,81 +0,0 @@ -package org.thoughtcrime.securesms.connect; - -import android.util.Log; -import android.util.JsonWriter; - -import com.b44t.messenger.DcJsonrpcInstance; - -import org.json.JSONObject; -import org.json.JSONException; -import org.thoughtcrime.securesms.util.concurrent.SettableFuture; -import org.thoughtcrime.securesms.util.JsonUtils; - -import java.io.IOException; -import java.io.StringWriter; -import java.util.HashMap; -import java.util.Map; - -public class DcRpc { - private static final String TAG = DcRpc.class.getSimpleName(); - - private Map> requestFutures = new HashMap<>(); - private DcJsonrpcInstance dcJsonrpcInstance; - private int requestId = 0; - - public DcRpc(DcJsonrpcInstance dcJsonrpcInstance) { - this.dcJsonrpcInstance = dcJsonrpcInstance; - } - - private void processResponse() throws JSONException { - JSONObject response = new JSONObject(dcJsonrpcInstance.getNextResponse()); - int responseId = response.optInt("id", 0); - - if (responseId == 0) { - Log.i(TAG, "Got JSON-RPC notification: " + response.toString()); - return; - } - - SettableFuture future = requestFutures.remove(responseId); - Object error = response.opt("error"); - Object result = response.opt("result"); - if (error != null) { - future.setException(new Throwable(error.toString())); - } else if (result != null) { - future.set(result); - } else { - future.setException(new Throwable("Got JSON-RPC response witout result or error: " + response.toString())); - } - } - - public void start() { - new Thread(() -> { - while (true) { - try { - processResponse(); - } catch (JSONException e) { - e.printStackTrace(); - } - } - }, "jsonrpcThread").start(); - } - - public SettableFuture call(String method, Object... params) { - requestId++; - Map request = new HashMap<>(); - request.put("jsonrpc", "2.0"); - request.put("method", method); - request.put("params", params); - request.put("id", requestId); - SettableFuture future = new SettableFuture<>(); - try { - String requestStr = JsonUtils.toJson(request); - Log.i(TAG, "Sending request: " + requestStr); - requestFutures.put(requestId, future); - dcJsonrpcInstance.request(requestStr); - } catch (IOException e) { - e.printStackTrace(); - future.setException(e); - } - return future; - } -} From b5fc9ab945dadcac9d84857963603b22bfeefc1b Mon Sep 17 00:00:00 2001 From: adbenitez Date: Thu, 27 Apr 2023 07:10:08 -0400 Subject: [PATCH 19/25] remove field added while testing --- src/com/b44t/messenger/rpc/Rpc.java | 1 - 1 file changed, 1 deletion(-) diff --git a/src/com/b44t/messenger/rpc/Rpc.java b/src/com/b44t/messenger/rpc/Rpc.java index eedda7b527..6e783f719c 100644 --- a/src/com/b44t/messenger/rpc/Rpc.java +++ b/src/com/b44t/messenger/rpc/Rpc.java @@ -108,7 +108,6 @@ public Request(String method, Object[] params, int id) { private class Response { public int id = 0; - public int id2 = 0; public JsonElement result; public JsonElement error; From e1d071248b193959597b3b6b2db3c382ac776923 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Asiel=20D=C3=ADaz=20Ben=C3=ADtez?= Date: Thu, 27 Apr 2023 13:19:51 -0400 Subject: [PATCH 20/25] Apply suggestions from code review Co-authored-by: Hocuri --- src/com/b44t/messenger/rpc/Rpc.java | 22 +++++++++++----------- 1 file changed, 11 insertions(+), 11 deletions(-) diff --git a/src/com/b44t/messenger/rpc/Rpc.java b/src/com/b44t/messenger/rpc/Rpc.java index 6e783f719c..0980fa4c8e 100644 --- a/src/com/b44t/messenger/rpc/Rpc.java +++ b/src/com/b44t/messenger/rpc/Rpc.java @@ -14,10 +14,10 @@ import java.util.concurrent.ExecutionException; public class Rpc { - private Map> requestFutures = new ConcurrentHashMap<>(); - private DcJsonrpcInstance dcJsonrpcInstance; + private final Map> requestFutures = new ConcurrentHashMap<>(); + private final DcJsonrpcInstance dcJsonrpcInstance; private int requestId = 0; - private Gson gson = new GsonBuilder().serializeNulls().create(); + private final Gson gson = new GsonBuilder().serializeNulls().create(); public Rpc(DcJsonrpcInstance dcJsonrpcInstance) { this.dcJsonrpcInstance = dcJsonrpcInstance; @@ -43,13 +43,13 @@ private void processResponse() throws JsonSyntaxException { public void start() { new Thread(() -> { - while (true) { - try { - processResponse(); - } catch (JsonSyntaxException e) { - e.printStackTrace(); - } + while (true) { + try { + processResponse(); + } catch (JsonSyntaxException e) { + e.printStackTrace(); } + } }, "jsonrpcThread").start(); } @@ -93,7 +93,7 @@ public Map getSystemInfo() throws RpcError { } - private class Request { + private static class Request { public String jsonrpc = "2.0"; public String method; public Object[] params; @@ -106,7 +106,7 @@ public Request(String method, Object[] params, int id) { } } - private class Response { + private static class Response { public int id = 0; public JsonElement result; public JsonElement error; From e4beb061919fcf3e57667ab98514d4aa7fc4d332 Mon Sep 17 00:00:00 2001 From: adbenitez Date: Thu, 27 Apr 2023 13:23:03 -0400 Subject: [PATCH 21/25] check if future is null --- src/com/b44t/messenger/rpc/Rpc.java | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/com/b44t/messenger/rpc/Rpc.java b/src/com/b44t/messenger/rpc/Rpc.java index 0980fa4c8e..fbcde72094 100644 --- a/src/com/b44t/messenger/rpc/Rpc.java +++ b/src/com/b44t/messenger/rpc/Rpc.java @@ -32,6 +32,10 @@ private void processResponse() throws JsonSyntaxException { } CompletableFuture future = requestFutures.remove(response.id); + if (future == null) { // Got a response with unknown ID, ignore + return; + } + if (response.error != null) { future.completeExceptionally(new RpcError(response.error.toString())); } else if (response.result != null) { From 79355138258e37d17fac55f9ab0c1e80a19169fa Mon Sep 17 00:00:00 2001 From: adbenitez Date: Thu, 27 Apr 2023 14:25:24 -0400 Subject: [PATCH 22/25] move SettableFuture to core package --- src/com/b44t/messenger/rpc/Rpc.java | 16 ++++++++-------- .../util/concurrent/ListenableFuture.java | 2 +- .../util/concurrent/SettableFuture.java | 2 +- .../securesms/ConversationActivity.java | 4 ++-- .../securesms/RegistrationActivity.java | 4 ++-- .../securesms/audio/AudioRecorder.java | 5 +++-- .../components/ConversationItemThumbnail.java | 3 ++- .../components/GlideDrawableListeningTarget.java | 3 +-- .../securesms/components/InputPanel.java | 4 ++-- .../securesms/components/ThumbnailView.java | 4 ++-- .../securesms/mms/AttachmentManager.java | 6 +++--- .../thoughtcrime/securesms/util/ViewUtil.java | 5 +++-- .../util/concurrent/AssertedSuccessListener.java | 2 +- 13 files changed, 31 insertions(+), 29 deletions(-) rename src/{org/thoughtcrime/securesms => com/b44t/messenger}/util/concurrent/ListenableFuture.java (85%) rename src/{org/thoughtcrime/securesms => com/b44t/messenger}/util/concurrent/SettableFuture.java (98%) diff --git a/src/com/b44t/messenger/rpc/Rpc.java b/src/com/b44t/messenger/rpc/Rpc.java index fbcde72094..8c4cd6b631 100644 --- a/src/com/b44t/messenger/rpc/Rpc.java +++ b/src/com/b44t/messenger/rpc/Rpc.java @@ -1,6 +1,7 @@ package com.b44t.messenger.rpc; import com.b44t.messenger.DcJsonrpcInstance; +import com.b44t.messenger.util.concurrent.SettableFuture; import com.google.gson.Gson; import com.google.gson.GsonBuilder; import com.google.gson.JsonElement; @@ -9,12 +10,11 @@ import java.util.HashMap; import java.util.Map; -import java.util.concurrent.CompletableFuture; import java.util.concurrent.ConcurrentHashMap; import java.util.concurrent.ExecutionException; public class Rpc { - private final Map> requestFutures = new ConcurrentHashMap<>(); + private final Map> requestFutures = new ConcurrentHashMap<>(); private final DcJsonrpcInstance dcJsonrpcInstance; private int requestId = 0; private final Gson gson = new GsonBuilder().serializeNulls().create(); @@ -31,17 +31,17 @@ private void processResponse() throws JsonSyntaxException { return; } - CompletableFuture future = requestFutures.remove(response.id); + SettableFuture future = requestFutures.remove(response.id); if (future == null) { // Got a response with unknown ID, ignore return; } if (response.error != null) { - future.completeExceptionally(new RpcError(response.error.toString())); + future.setException(new RpcError(response.error.toString())); } else if (response.result != null) { - future.complete(response.result); + future.set(response.result); } else { - future.completeExceptionally(new RpcError("Got JSON-RPC response witout result or error: " + jsonResponse)); + future.setException(new RpcError("Got JSON-RPC response witout result or error: " + jsonResponse)); } } @@ -57,13 +57,13 @@ public void start() { }, "jsonrpcThread").start(); } - public CompletableFuture call(String method, Object... params) { + public SettableFuture call(String method, Object... params) { int id; synchronized (this) { id = ++requestId; } String jsonRequest = gson.toJson(new Request(method, params, id)); - CompletableFuture future = new CompletableFuture<>(); + SettableFuture future = new SettableFuture<>(); requestFutures.put(id, future); dcJsonrpcInstance.request(jsonRequest); return future; diff --git a/src/org/thoughtcrime/securesms/util/concurrent/ListenableFuture.java b/src/com/b44t/messenger/util/concurrent/ListenableFuture.java similarity index 85% rename from src/org/thoughtcrime/securesms/util/concurrent/ListenableFuture.java rename to src/com/b44t/messenger/util/concurrent/ListenableFuture.java index b943a26fb9..9b5f252c19 100644 --- a/src/org/thoughtcrime/securesms/util/concurrent/ListenableFuture.java +++ b/src/com/b44t/messenger/util/concurrent/ListenableFuture.java @@ -1,4 +1,4 @@ -package org.thoughtcrime.securesms.util.concurrent; +package com.b44t.messenger.util.concurrent; import java.util.concurrent.ExecutionException; import java.util.concurrent.Future; diff --git a/src/org/thoughtcrime/securesms/util/concurrent/SettableFuture.java b/src/com/b44t/messenger/util/concurrent/SettableFuture.java similarity index 98% rename from src/org/thoughtcrime/securesms/util/concurrent/SettableFuture.java rename to src/com/b44t/messenger/util/concurrent/SettableFuture.java index 80fd166c4b..1255b907bc 100644 --- a/src/org/thoughtcrime/securesms/util/concurrent/SettableFuture.java +++ b/src/com/b44t/messenger/util/concurrent/SettableFuture.java @@ -1,4 +1,4 @@ -package org.thoughtcrime.securesms.util.concurrent; +package com.b44t.messenger.util.concurrent; import java.util.LinkedList; import java.util.List; diff --git a/src/org/thoughtcrime/securesms/ConversationActivity.java b/src/org/thoughtcrime/securesms/ConversationActivity.java index b1e3021559..4beff478af 100644 --- a/src/org/thoughtcrime/securesms/ConversationActivity.java +++ b/src/org/thoughtcrime/securesms/ConversationActivity.java @@ -66,6 +66,8 @@ import com.b44t.messenger.DcContext; import com.b44t.messenger.DcEvent; import com.b44t.messenger.DcMsg; +import com.b44t.messenger.util.concurrent.ListenableFuture; +import com.b44t.messenger.util.concurrent.SettableFuture; import org.thoughtcrime.securesms.attachments.Attachment; import org.thoughtcrime.securesms.attachments.UriAttachment; @@ -114,8 +116,6 @@ import org.thoughtcrime.securesms.util.Util; import org.thoughtcrime.securesms.util.ViewUtil; import org.thoughtcrime.securesms.util.concurrent.AssertedSuccessListener; -import org.thoughtcrime.securesms.util.concurrent.ListenableFuture; -import org.thoughtcrime.securesms.util.concurrent.SettableFuture; import org.thoughtcrime.securesms.util.guava.Optional; import org.thoughtcrime.securesms.util.views.Stub; import org.thoughtcrime.securesms.video.recode.VideoRecoder; diff --git a/src/org/thoughtcrime/securesms/RegistrationActivity.java b/src/org/thoughtcrime/securesms/RegistrationActivity.java index 9ef4a1e9d1..cedd4a8636 100644 --- a/src/org/thoughtcrime/securesms/RegistrationActivity.java +++ b/src/org/thoughtcrime/securesms/RegistrationActivity.java @@ -51,6 +51,8 @@ import com.b44t.messenger.DcContext; import com.b44t.messenger.DcEvent; import com.b44t.messenger.DcProvider; +import com.b44t.messenger.util.concurrent.ListenableFuture; +import com.b44t.messenger.util.concurrent.SettableFuture; import com.google.android.material.textfield.TextInputEditText; import com.google.android.material.textfield.TextInputLayout; @@ -61,8 +63,6 @@ import org.thoughtcrime.securesms.util.DynamicTheme; import org.thoughtcrime.securesms.util.IntentUtils; import org.thoughtcrime.securesms.util.Util; -import org.thoughtcrime.securesms.util.concurrent.ListenableFuture; -import org.thoughtcrime.securesms.util.concurrent.SettableFuture; import org.thoughtcrime.securesms.util.task.ProgressDialogAsyncTask; import org.thoughtcrime.securesms.util.views.ProgressDialog; diff --git a/src/org/thoughtcrime/securesms/audio/AudioRecorder.java b/src/org/thoughtcrime/securesms/audio/AudioRecorder.java index 737dbfb51f..776888bfb9 100644 --- a/src/org/thoughtcrime/securesms/audio/AudioRecorder.java +++ b/src/org/thoughtcrime/securesms/audio/AudioRecorder.java @@ -9,12 +9,13 @@ import android.util.Log; import android.util.Pair; +import com.b44t.messenger.util.concurrent.ListenableFuture; +import com.b44t.messenger.util.concurrent.SettableFuture; + import org.thoughtcrime.securesms.providers.PersistentBlobProvider; import org.thoughtcrime.securesms.util.MediaUtil; import org.thoughtcrime.securesms.util.ThreadUtil; import org.thoughtcrime.securesms.util.Util; -import org.thoughtcrime.securesms.util.concurrent.ListenableFuture; -import org.thoughtcrime.securesms.util.concurrent.SettableFuture; import java.io.IOException; import java.util.concurrent.ExecutorService; diff --git a/src/org/thoughtcrime/securesms/components/ConversationItemThumbnail.java b/src/org/thoughtcrime/securesms/components/ConversationItemThumbnail.java index 3e84299e7e..8837ab6f63 100644 --- a/src/org/thoughtcrime/securesms/components/ConversationItemThumbnail.java +++ b/src/org/thoughtcrime/securesms/components/ConversationItemThumbnail.java @@ -15,6 +15,8 @@ import androidx.annotation.Nullable; import androidx.annotation.UiThread; +import com.b44t.messenger.util.concurrent.ListenableFuture; + import org.thoughtcrime.securesms.R; import org.thoughtcrime.securesms.database.AttachmentDatabase; import org.thoughtcrime.securesms.mms.GlideRequests; @@ -22,7 +24,6 @@ import org.thoughtcrime.securesms.mms.SlideClickListener; import org.thoughtcrime.securesms.util.ThemeUtil; import org.thoughtcrime.securesms.util.Util; -import org.thoughtcrime.securesms.util.concurrent.ListenableFuture; import java.util.concurrent.ExecutionException; diff --git a/src/org/thoughtcrime/securesms/components/GlideDrawableListeningTarget.java b/src/org/thoughtcrime/securesms/components/GlideDrawableListeningTarget.java index f6ede07f7e..c7b7f61fc6 100644 --- a/src/org/thoughtcrime/securesms/components/GlideDrawableListeningTarget.java +++ b/src/org/thoughtcrime/securesms/components/GlideDrawableListeningTarget.java @@ -5,10 +5,9 @@ import androidx.annotation.Nullable; import android.widget.ImageView; +import com.b44t.messenger.util.concurrent.SettableFuture; import com.bumptech.glide.request.target.DrawableImageViewTarget; -import org.thoughtcrime.securesms.util.concurrent.SettableFuture; - public class GlideDrawableListeningTarget extends DrawableImageViewTarget { private final SettableFuture loaded; diff --git a/src/org/thoughtcrime/securesms/components/InputPanel.java b/src/org/thoughtcrime/securesms/components/InputPanel.java index 58518fb055..99f9076bdd 100644 --- a/src/org/thoughtcrime/securesms/components/InputPanel.java +++ b/src/org/thoughtcrime/securesms/components/InputPanel.java @@ -25,6 +25,8 @@ import androidx.core.view.ViewCompat; import com.b44t.messenger.DcMsg; +import com.b44t.messenger.util.concurrent.ListenableFuture; +import com.b44t.messenger.util.concurrent.SettableFuture; import org.thoughtcrime.securesms.R; import org.thoughtcrime.securesms.animation.AnimationCompleteListener; @@ -39,8 +41,6 @@ import org.thoughtcrime.securesms.util.Util; import org.thoughtcrime.securesms.util.ViewUtil; import org.thoughtcrime.securesms.util.concurrent.AssertedSuccessListener; -import org.thoughtcrime.securesms.util.concurrent.ListenableFuture; -import org.thoughtcrime.securesms.util.concurrent.SettableFuture; import org.thoughtcrime.securesms.util.guava.Optional; import java.util.concurrent.TimeUnit; diff --git a/src/org/thoughtcrime/securesms/components/ThumbnailView.java b/src/org/thoughtcrime/securesms/components/ThumbnailView.java index 17c31d6e9a..41403f96f9 100644 --- a/src/org/thoughtcrime/securesms/components/ThumbnailView.java +++ b/src/org/thoughtcrime/securesms/components/ThumbnailView.java @@ -14,6 +14,8 @@ import androidx.annotation.NonNull; import androidx.annotation.UiThread; +import com.b44t.messenger.util.concurrent.ListenableFuture; +import com.b44t.messenger.util.concurrent.SettableFuture; import com.bumptech.glide.load.engine.DiskCacheStrategy; import org.thoughtcrime.securesms.R; @@ -25,8 +27,6 @@ import org.thoughtcrime.securesms.mms.SlideClickListener; import org.thoughtcrime.securesms.util.MediaUtil; import org.thoughtcrime.securesms.util.Util; -import org.thoughtcrime.securesms.util.concurrent.ListenableFuture; -import org.thoughtcrime.securesms.util.concurrent.SettableFuture; import java.util.Locale; diff --git a/src/org/thoughtcrime/securesms/mms/AttachmentManager.java b/src/org/thoughtcrime/securesms/mms/AttachmentManager.java index 9f35ef2cd5..e68530b937 100644 --- a/src/org/thoughtcrime/securesms/mms/AttachmentManager.java +++ b/src/org/thoughtcrime/securesms/mms/AttachmentManager.java @@ -40,6 +40,9 @@ import com.b44t.messenger.DcContext; import com.b44t.messenger.DcMsg; +import com.b44t.messenger.util.concurrent.ListenableFuture; +import com.b44t.messenger.util.concurrent.ListenableFuture.Listener; +import com.b44t.messenger.util.concurrent.SettableFuture; import org.thoughtcrime.securesms.ApplicationContext; import org.thoughtcrime.securesms.ConversationActivity; @@ -65,9 +68,6 @@ import org.thoughtcrime.securesms.util.StorageUtil; import org.thoughtcrime.securesms.util.ThemeUtil; import org.thoughtcrime.securesms.util.ViewUtil; -import org.thoughtcrime.securesms.util.concurrent.ListenableFuture; -import org.thoughtcrime.securesms.util.concurrent.ListenableFuture.Listener; -import org.thoughtcrime.securesms.util.concurrent.SettableFuture; import org.thoughtcrime.securesms.util.guava.Optional; import org.thoughtcrime.securesms.util.views.Stub; diff --git a/src/org/thoughtcrime/securesms/util/ViewUtil.java b/src/org/thoughtcrime/securesms/util/ViewUtil.java index 852586d5d2..22383668dc 100644 --- a/src/org/thoughtcrime/securesms/util/ViewUtil.java +++ b/src/org/thoughtcrime/securesms/util/ViewUtil.java @@ -39,8 +39,9 @@ import android.widget.LinearLayout.LayoutParams; import android.widget.TextView; -import org.thoughtcrime.securesms.util.concurrent.ListenableFuture; -import org.thoughtcrime.securesms.util.concurrent.SettableFuture; +import com.b44t.messenger.util.concurrent.ListenableFuture; +import com.b44t.messenger.util.concurrent.SettableFuture; + import org.thoughtcrime.securesms.util.views.Stub; public class ViewUtil { diff --git a/src/org/thoughtcrime/securesms/util/concurrent/AssertedSuccessListener.java b/src/org/thoughtcrime/securesms/util/concurrent/AssertedSuccessListener.java index 1bd4e81248..d4550883a8 100644 --- a/src/org/thoughtcrime/securesms/util/concurrent/AssertedSuccessListener.java +++ b/src/org/thoughtcrime/securesms/util/concurrent/AssertedSuccessListener.java @@ -1,6 +1,6 @@ package org.thoughtcrime.securesms.util.concurrent; -import org.thoughtcrime.securesms.util.concurrent.ListenableFuture.Listener; +import com.b44t.messenger.util.concurrent.ListenableFuture.Listener; import java.util.concurrent.ExecutionException; From a5b1528b3101e616135bc912d8ed6b34ed3fc53e Mon Sep 17 00:00:00 2001 From: adbenitez Date: Thu, 27 Apr 2023 14:33:36 -0400 Subject: [PATCH 23/25] tweak comment --- src/com/b44t/messenger/rpc/Rpc.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/com/b44t/messenger/rpc/Rpc.java b/src/com/b44t/messenger/rpc/Rpc.java index 8c4cd6b631..28ded4a498 100644 --- a/src/com/b44t/messenger/rpc/Rpc.java +++ b/src/com/b44t/messenger/rpc/Rpc.java @@ -27,7 +27,7 @@ private void processResponse() throws JsonSyntaxException { String jsonResponse = dcJsonrpcInstance.getNextResponse(); Response response = gson.fromJson(jsonResponse, Response.class); - if (response.id == 0) { // Got JSON-RPC notification, ignore + if (response.id == 0) { // Got JSON-RPC notification/event, ignore return; } From cbec5499188f75642c4fadb76029d399913508c6 Mon Sep 17 00:00:00 2001 From: adbenitez Date: Thu, 27 Apr 2023 14:41:50 -0400 Subject: [PATCH 24/25] rename RpcError to RpcException --- src/com/b44t/messenger/rpc/Rpc.java | 18 +++++++++--------- src/com/b44t/messenger/rpc/RpcError.java | 11 ----------- src/com/b44t/messenger/rpc/RpcException.java | 11 +++++++++++ 3 files changed, 20 insertions(+), 20 deletions(-) delete mode 100644 src/com/b44t/messenger/rpc/RpcError.java create mode 100644 src/com/b44t/messenger/rpc/RpcException.java diff --git a/src/com/b44t/messenger/rpc/Rpc.java b/src/com/b44t/messenger/rpc/Rpc.java index 28ded4a498..c0619262e4 100644 --- a/src/com/b44t/messenger/rpc/Rpc.java +++ b/src/com/b44t/messenger/rpc/Rpc.java @@ -37,11 +37,11 @@ private void processResponse() throws JsonSyntaxException { } if (response.error != null) { - future.setException(new RpcError(response.error.toString())); + future.setException(new RpcException(response.error.toString())); } else if (response.result != null) { future.set(response.result); } else { - future.setException(new RpcError("Got JSON-RPC response witout result or error: " + jsonResponse)); + future.setException(new RpcException("Got JSON-RPC response witout result or error: " + jsonResponse)); } } @@ -69,29 +69,29 @@ public SettableFuture call(String method, Object... params) { return future; } - public JsonElement getResult(String method, Object... params) throws RpcError { + public JsonElement getResult(String method, Object... params) throws RpcException { try { return call(method, params).get(); } catch (ExecutionException e) { - throw (RpcError)e.getCause(); + throw (RpcException)e.getCause(); } catch (InterruptedException e) { - throw new RpcError(e.getMessage()); + throw new RpcException(e.getMessage()); } } - public int addAccount() throws RpcError { + public int addAccount() throws RpcException { return gson.fromJson(getResult("add_account"), int.class); } - public void startIO() throws RpcError { + public void startIO() throws RpcException { getResult("start_io_for_all_accounts"); } - public void stopIO() throws RpcError { + public void stopIO() throws RpcException { getResult("stop_io_for_all_accounts"); } - public Map getSystemInfo() throws RpcError { + public Map getSystemInfo() throws RpcException { TypeToken> mapType = new TypeToken>(){}; return gson.fromJson(getResult("get_system_info"), mapType); } diff --git a/src/com/b44t/messenger/rpc/RpcError.java b/src/com/b44t/messenger/rpc/RpcError.java deleted file mode 100644 index 836e4f9019..0000000000 --- a/src/com/b44t/messenger/rpc/RpcError.java +++ /dev/null @@ -1,11 +0,0 @@ -package com.b44t.messenger.rpc; - -/** - * An exception occurred while processing a request. - **/ -public class RpcError extends Throwable { - - public RpcError(String message) { - super(message); - } -} diff --git a/src/com/b44t/messenger/rpc/RpcException.java b/src/com/b44t/messenger/rpc/RpcException.java new file mode 100644 index 0000000000..ade1abed37 --- /dev/null +++ b/src/com/b44t/messenger/rpc/RpcException.java @@ -0,0 +1,11 @@ +package com.b44t.messenger.rpc; + +/** + * An exception occurred while processing a request in Delta Chat core. + **/ +public class RpcException extends Exception { + + public RpcException(String message) { + super(message); + } +} From 0b85cd2b9edbe2cdf870b594d88dd7f3d89ca611 Mon Sep 17 00:00:00 2001 From: adbenitez Date: Mon, 1 May 2023 14:22:39 -0400 Subject: [PATCH 25/25] add getHttpResponse to Rpc --- src/com/b44t/messenger/rpc/HttpResponse.java | 33 +++++++++++++++++++ src/com/b44t/messenger/rpc/Rpc.java | 4 +++ .../securesms/FullMsgActivity.java | 10 +++--- 3 files changed, 42 insertions(+), 5 deletions(-) create mode 100644 src/com/b44t/messenger/rpc/HttpResponse.java diff --git a/src/com/b44t/messenger/rpc/HttpResponse.java b/src/com/b44t/messenger/rpc/HttpResponse.java new file mode 100644 index 0000000000..bd07a1bb55 --- /dev/null +++ b/src/com/b44t/messenger/rpc/HttpResponse.java @@ -0,0 +1,33 @@ +package com.b44t.messenger.rpc; + +import android.util.Base64; + +public class HttpResponse { + // base64-encoded response body. + private String blob; + // MIME type, e.g. "text/plain" or "text/html". + private String mimetype; + // Encoding, e.g. "utf-8". + private String encoding; + + public HttpResponse(String blob, String mimetype, String encoding) { + this.blob = blob; + this.mimetype = mimetype; + this.encoding = encoding; + } + + public byte[] getBlob() { + if (blob == null) { + return null; + } + return Base64.decode(blob, Base64.NO_WRAP | Base64.NO_PADDING); + } + + public String getMimetype() { + return mimetype; + } + + public String getEncoding() { + return encoding; + } +} diff --git a/src/com/b44t/messenger/rpc/Rpc.java b/src/com/b44t/messenger/rpc/Rpc.java index c0619262e4..fcc862161f 100644 --- a/src/com/b44t/messenger/rpc/Rpc.java +++ b/src/com/b44t/messenger/rpc/Rpc.java @@ -96,6 +96,10 @@ public Map getSystemInfo() throws RpcException { return gson.fromJson(getResult("get_system_info"), mapType); } + public HttpResponse getHttpResponse(int accountId, String url) throws RpcException { + return gson.fromJson(getResult("get_http_response", accountId, url), HttpResponse.class); + } + private static class Request { public String jsonrpc = "2.0"; diff --git a/src/org/thoughtcrime/securesms/FullMsgActivity.java b/src/org/thoughtcrime/securesms/FullMsgActivity.java index 6fd1b5e898..edd84f6eba 100644 --- a/src/org/thoughtcrime/securesms/FullMsgActivity.java +++ b/src/org/thoughtcrime/securesms/FullMsgActivity.java @@ -9,7 +9,8 @@ import androidx.appcompat.app.AlertDialog; import com.b44t.messenger.DcContext; -import com.b44t.messenger.DcHttpResponse; +import com.b44t.messenger.rpc.HttpResponse; +import com.b44t.messenger.rpc.Rpc; import org.thoughtcrime.securesms.connect.DcHelper; import org.thoughtcrime.securesms.util.DynamicTheme; @@ -25,6 +26,7 @@ public class FullMsgActivity extends WebViewActivity public static final String IS_CONTACT_REQUEST = "is_contact_request"; private int msgId; private DcContext dcContext; + private Rpc rpc; private boolean loadRemoteContent = false; private boolean isContactRequest; @@ -60,6 +62,7 @@ protected void onCreate(Bundle state, boolean ready) { webView.getSettings().setAllowFileAccess(false); dcContext = DcHelper.getContext(this); + rpc = DcHelper.getRpc(this); msgId = getIntent().getIntExtra(MSG_ID_EXTRA, 0); String title = dcContext.getMsg(msgId).getSubject(); if (title.isEmpty()) title = getString(R.string.chat_input_placeholder); @@ -178,10 +181,7 @@ protected WebResourceResponse interceptRequest(String url) { if (url == null) { throw new Exception("no url specified"); } - DcHttpResponse httpResponse = dcContext.getHttpResponse(url); - if (httpResponse == null) { - throw new Exception(dcContext.getLastError()); - } + HttpResponse httpResponse = rpc.getHttpResponse(dcContext.getAccountId(), url); String mimeType = httpResponse.getMimetype(); if (mimeType == null) { mimeType = "application/octet-stream";