From 87e170bac45a7b08094a1220b481ebee061a2f11 Mon Sep 17 00:00:00 2001 From: Doominika Date: Wed, 29 Oct 2025 13:55:31 +0100 Subject: [PATCH 01/30] feat: add Stream class --- .../main/cpp/model_native_initializers.cpp | 24 +++++++++++++++++++ .../src/main/cpp/model_native_initializers.h | 3 +++ .../privmx_endpoint/model/streams/Stream.java | 11 +++++++++ 3 files changed, 38 insertions(+) create mode 100644 privmx-endpoint/src/main/java/com/simplito/java/privmx_endpoint/model/streams/Stream.java diff --git a/privmx-endpoint/src/main/cpp/model_native_initializers.cpp b/privmx-endpoint/src/main/cpp/model_native_initializers.cpp index 2577819f..1df287ec 100644 --- a/privmx-endpoint/src/main/cpp/model_native_initializers.cpp +++ b/privmx-endpoint/src/main/cpp/model_native_initializers.cpp @@ -1394,5 +1394,29 @@ namespace privmx { ); } + //Stream + jobject stream2Java( + JniContextUtils &ctx, + privmx::endpoint::stream::Stream stream_c + ) { + jclass itemCls = ctx->FindClass( + "com/simplito/java/privmx_endpoint/model/Stream"); + + jmethodID initItemMID = ctx->GetMethodID( + itemCls, + "", + "(" + "Ljava/lang/Long;" // streamId + "Ljava/lang/String;" // userId + ")V" + ); + + return ctx->NewObject( + itemCls, + initItemMID, + ctx.long2jLong(stream_c.streamId), + ctx->NewStringUTF(stream_c.userId.c_str()) + ); + } } // wrapper } // privmx \ No newline at end of file diff --git a/privmx-endpoint/src/main/cpp/model_native_initializers.h b/privmx-endpoint/src/main/cpp/model_native_initializers.h index f83c7959..3567017d 100644 --- a/privmx-endpoint/src/main/cpp/model_native_initializers.h +++ b/privmx-endpoint/src/main/cpp/model_native_initializers.h @@ -34,6 +34,7 @@ #include "privmx/endpoint/crypto/ExtKey.hpp" #include "privmx/endpoint/kvdb/KvdbApi.hpp" #include "privmx/endpoint/kvdb/Types.hpp" +#include "privmx/endpoint/stream/Types.hpp" namespace privmx { namespace wrapper { @@ -161,6 +162,8 @@ namespace privmx { jobject kvdbEntry2Java(JniContextUtils &ctx, privmx::endpoint::kvdb::KvdbEntry entry_c); + //Stream + jobject stream2Java(JniContextUtils &ctx, privmx::endpoint::stream::Stream stream_c); } // wrapper } // privmx diff --git a/privmx-endpoint/src/main/java/com/simplito/java/privmx_endpoint/model/streams/Stream.java b/privmx-endpoint/src/main/java/com/simplito/java/privmx_endpoint/model/streams/Stream.java new file mode 100644 index 00000000..1e579369 --- /dev/null +++ b/privmx-endpoint/src/main/java/com/simplito/java/privmx_endpoint/model/streams/Stream.java @@ -0,0 +1,11 @@ +package com.simplito.java.privmx_endpoint.model.streams; + +public class Stream { + public Long streamId; + public String userId; + + public Stream(Long streamId, String userId) { + this.streamId = streamId; + this.userId = userId; + } +} From 1603262f19e91925e65b40d11b098e9af149edb6 Mon Sep 17 00:00:00 2001 From: Doominika Date: Wed, 29 Oct 2025 13:56:22 +0100 Subject: [PATCH 02/30] feat: implement listStreams method --- .../src/main/cpp/modules/StreamApi.cpp | 31 +++++++++++++++++++ .../modules/stream/StreamApi.java | 5 +++ 2 files changed, 36 insertions(+) diff --git a/privmx-endpoint/src/main/cpp/modules/StreamApi.cpp b/privmx-endpoint/src/main/cpp/modules/StreamApi.cpp index 6cc1fbce..dcc4544c 100644 --- a/privmx-endpoint/src/main/cpp/modules/StreamApi.cpp +++ b/privmx-endpoint/src/main/cpp/modules/StreamApi.cpp @@ -56,4 +56,35 @@ Java_com_simplito_java_privmx_1endpoint_modules_stream_StreamApi_deinit( e.what() ); } +} + +extern "C" +JNIEXPORT jobject JNICALL +Java_com_simplito_java_privmx_1endpoint_modules_stream_StreamApi_listStreams( + JNIEnv *env, + jobject thiz, + jstring stream_room_id +) { + JniContextUtils ctx(env); + if (ctx.nullCheck(stream_room_id, "Stream Room ID")) { + return nullptr; + } + + jobject result; + ctx.callResultEndpointApi( + &result, + [&ctx, &thiz, &stream_room_id]() { + std::vector streams_c = getStreamApi( + ctx, thiz)->listStreams( + ctx.jString2string(stream_room_id) + ); + + return vectorTojArray(ctx, streams_c, privmx::wrapper::stream2Java); + } + ); + + if (ctx->ExceptionCheck()) { + return nullptr; + } + return result; } \ No newline at end of file diff --git a/privmx-endpoint/src/main/java/com/simplito/java/privmx_endpoint/modules/stream/StreamApi.java b/privmx-endpoint/src/main/java/com/simplito/java/privmx_endpoint/modules/stream/StreamApi.java index 6f7b512f..4d1cfb35 100644 --- a/privmx-endpoint/src/main/java/com/simplito/java/privmx_endpoint/modules/stream/StreamApi.java +++ b/privmx-endpoint/src/main/java/com/simplito/java/privmx_endpoint/modules/stream/StreamApi.java @@ -1,15 +1,18 @@ package com.simplito.java.privmx_endpoint.modules.stream; import com.simplito.java.privmx_endpoint.LibLoader; +import com.simplito.java.privmx_endpoint.model.streams.Stream; import com.simplito.java.privmx_endpoint.modules.core.Connection; import com.simplito.java.privmx_endpoint.modules.event.EventApi; +import java.util.List; import java.util.Objects; public class StreamApi implements AutoCloseable { static { LibLoader.loadPrivmxLibraries(); } + @SuppressWarnings("FieldCanBeLocal") private final Long api; @@ -23,6 +26,8 @@ public StreamApi(Connection connection, EventApi eventApi) throws IllegalStateEx this.api = init(connection, eventApi); } + public native List listStreams(String streamRoomId); + @Override public void close() throws Exception { deinit(); From 30c624fbc08f7704cd61b7ca5c7bb5a858851c91 Mon Sep 17 00:00:00 2001 From: Doominika Date: Wed, 29 Oct 2025 14:18:25 +0100 Subject: [PATCH 03/30] feat: add StreamHandle class --- .../main/cpp/model_native_initializers.cpp | 23 +++++++++++++++++++ .../src/main/cpp/model_native_initializers.h | 2 ++ .../model/streams/StreamHandle.java | 13 +++++++++++ 3 files changed, 38 insertions(+) create mode 100644 privmx-endpoint/src/main/java/com/simplito/java/privmx_endpoint/model/streams/StreamHandle.java diff --git a/privmx-endpoint/src/main/cpp/model_native_initializers.cpp b/privmx-endpoint/src/main/cpp/model_native_initializers.cpp index 1df287ec..bcd8c86c 100644 --- a/privmx-endpoint/src/main/cpp/model_native_initializers.cpp +++ b/privmx-endpoint/src/main/cpp/model_native_initializers.cpp @@ -1418,5 +1418,28 @@ namespace privmx { ctx->NewStringUTF(stream_c.userId.c_str()) ); } + + jobject streamHandle2Java( + JniContextUtils &ctx, + privmx::endpoint::stream::StreamHandle streamHandle_c + ) { + jclass itemCls = ctx->FindClass( + "com/simplito/java/privmx_endpoint/model/streams/StreamHandle"); + + jmethodID initItemMID = ctx->GetMethodID( + itemCls, + "", + "(" + "Ljava/lang/Long;" // value + ")V" + ); + + return ctx->NewObject( + itemCls, + initItemMID, + ctx.long2jLong(streamHandle_c) + ); + } + } // wrapper } // privmx \ No newline at end of file diff --git a/privmx-endpoint/src/main/cpp/model_native_initializers.h b/privmx-endpoint/src/main/cpp/model_native_initializers.h index 3567017d..08065fa2 100644 --- a/privmx-endpoint/src/main/cpp/model_native_initializers.h +++ b/privmx-endpoint/src/main/cpp/model_native_initializers.h @@ -165,6 +165,8 @@ namespace privmx { //Stream jobject stream2Java(JniContextUtils &ctx, privmx::endpoint::stream::Stream stream_c); + jobject streamHandle2Java(JniContextUtils &ctx, privmx::endpoint::stream::StreamHandle streamHandle_c); + } // wrapper } // privmx diff --git a/privmx-endpoint/src/main/java/com/simplito/java/privmx_endpoint/model/streams/StreamHandle.java b/privmx-endpoint/src/main/java/com/simplito/java/privmx_endpoint/model/streams/StreamHandle.java new file mode 100644 index 00000000..97047b31 --- /dev/null +++ b/privmx-endpoint/src/main/java/com/simplito/java/privmx_endpoint/model/streams/StreamHandle.java @@ -0,0 +1,13 @@ +package com.simplito.java.privmx_endpoint.model.streams; + +public class StreamHandle { + private final long value; + + public StreamHandle(Long value) { + this.value = value; + } + + public long getValue() { + return value; + } +} \ No newline at end of file From 63b00dad3ad2ecd50ed7d981302c1af2f6437942 Mon Sep 17 00:00:00 2001 From: Doominika Date: Wed, 29 Oct 2025 14:19:14 +0100 Subject: [PATCH 04/30] feat: implement createStream method --- .../src/main/cpp/modules/StreamApi.cpp | 28 +++++++++++++++++++ .../src/main/cpp/modules/StreamApi.h | 1 + .../modules/stream/StreamApi.java | 3 ++ 3 files changed, 32 insertions(+) diff --git a/privmx-endpoint/src/main/cpp/modules/StreamApi.cpp b/privmx-endpoint/src/main/cpp/modules/StreamApi.cpp index dcc4544c..268f99e3 100644 --- a/privmx-endpoint/src/main/cpp/modules/StreamApi.cpp +++ b/privmx-endpoint/src/main/cpp/modules/StreamApi.cpp @@ -83,6 +83,34 @@ Java_com_simplito_java_privmx_1endpoint_modules_stream_StreamApi_listStreams( } ); + if (ctx->ExceptionCheck()) { + return nullptr; + } + return result; +} +extern "C" +JNIEXPORT jobject JNICALL +Java_com_simplito_java_privmx_1endpoint_modules_stream_StreamApi_createStream( + JNIEnv *env, + jobject thiz, + jstring stream_room_id +) { + JniContextUtils ctx(env); + if (ctx.nullCheck(stream_room_id, "Stream Room ID")) { + return nullptr; + } + jobject result; + ctx.callResultEndpointApi( + &result, + [&ctx, &thiz, &stream_room_id]() { + auto stream_c( + getStreamApi(ctx, thiz)->createStream( + ctx.jString2string(stream_room_id) + ) + ); + return privmx::wrapper::streamHandle2Java(ctx, stream_c); + } + ); if (ctx->ExceptionCheck()) { return nullptr; } diff --git a/privmx-endpoint/src/main/cpp/modules/StreamApi.h b/privmx-endpoint/src/main/cpp/modules/StreamApi.h index 1fccf8e1..d388fdb6 100644 --- a/privmx-endpoint/src/main/cpp/modules/StreamApi.h +++ b/privmx-endpoint/src/main/cpp/modules/StreamApi.h @@ -1,6 +1,7 @@ #include #include #include "../utils.hpp" +#include "../model_native_initializers.h" #include "Connection.h" #include "EventApi.h" diff --git a/privmx-endpoint/src/main/java/com/simplito/java/privmx_endpoint/modules/stream/StreamApi.java b/privmx-endpoint/src/main/java/com/simplito/java/privmx_endpoint/modules/stream/StreamApi.java index 4d1cfb35..6c4d1971 100644 --- a/privmx-endpoint/src/main/java/com/simplito/java/privmx_endpoint/modules/stream/StreamApi.java +++ b/privmx-endpoint/src/main/java/com/simplito/java/privmx_endpoint/modules/stream/StreamApi.java @@ -2,6 +2,7 @@ import com.simplito.java.privmx_endpoint.LibLoader; import com.simplito.java.privmx_endpoint.model.streams.Stream; +import com.simplito.java.privmx_endpoint.model.streams.StreamHandle; import com.simplito.java.privmx_endpoint.modules.core.Connection; import com.simplito.java.privmx_endpoint.modules.event.EventApi; @@ -28,6 +29,8 @@ public StreamApi(Connection connection, EventApi eventApi) throws IllegalStateEx public native List listStreams(String streamRoomId); + public native StreamHandle createStream(String streamRoomId); + @Override public void close() throws Exception { deinit(); From 2e34cd11343978d7993d9465fff4a3176946e755 Mon Sep 17 00:00:00 2001 From: Doominika Date: Wed, 29 Oct 2025 14:32:37 +0100 Subject: [PATCH 05/30] feat: add DeviceType enum --- .../src/main/cpp/model_native_initializers.cpp | 16 ++++++++++++++++ .../src/main/cpp/model_native_initializers.h | 4 ++++ .../model/streams/DeviceType.java | 7 +++++++ 3 files changed, 27 insertions(+) create mode 100644 privmx-endpoint/src/main/java/com/simplito/java/privmx_endpoint/model/streams/DeviceType.java diff --git a/privmx-endpoint/src/main/cpp/model_native_initializers.cpp b/privmx-endpoint/src/main/cpp/model_native_initializers.cpp index bcd8c86c..b1165371 100644 --- a/privmx-endpoint/src/main/cpp/model_native_initializers.cpp +++ b/privmx-endpoint/src/main/cpp/model_native_initializers.cpp @@ -1419,6 +1419,22 @@ namespace privmx { ); } + jobject deviceType2Java( + JniContextUtils &ctx, + privmx::endpoint::stream::DeviceType deviceType_c + ) { + jclass itemCls = ctx->FindClass( + "com/simplito/java/privmx_endpoint/model/streams/DeviceType"); + + jmethodID valuesMID = ctx->GetStaticMethodID(itemCls, "values", + "()[Lcom/simplito/java/privmx_endpoint/model/streams/DeviceType;"); + + jobjectArray enumValues = (jobjectArray) ctx->CallStaticObjectMethod(itemCls, + valuesMID); + + return (jobject) ctx->GetObjectArrayElement(enumValues, (int) deviceType_c); + } + jobject streamHandle2Java( JniContextUtils &ctx, privmx::endpoint::stream::StreamHandle streamHandle_c diff --git a/privmx-endpoint/src/main/cpp/model_native_initializers.h b/privmx-endpoint/src/main/cpp/model_native_initializers.h index 08065fa2..ec2e4cf6 100644 --- a/privmx-endpoint/src/main/cpp/model_native_initializers.h +++ b/privmx-endpoint/src/main/cpp/model_native_initializers.h @@ -35,6 +35,7 @@ #include "privmx/endpoint/kvdb/KvdbApi.hpp" #include "privmx/endpoint/kvdb/Types.hpp" #include "privmx/endpoint/stream/Types.hpp" +#include "privmx/endpoint/stream/webrtc/Types.hpp" namespace privmx { namespace wrapper { @@ -165,6 +166,9 @@ namespace privmx { //Stream jobject stream2Java(JniContextUtils &ctx, privmx::endpoint::stream::Stream stream_c); + jobject deviceType2Java(JniContextUtils &ctx,privmx::endpoint::stream::DeviceType deviceType_c); + + jobject streamHandle2Java(JniContextUtils &ctx, privmx::endpoint::stream::StreamHandle streamHandle_c); } // wrapper diff --git a/privmx-endpoint/src/main/java/com/simplito/java/privmx_endpoint/model/streams/DeviceType.java b/privmx-endpoint/src/main/java/com/simplito/java/privmx_endpoint/model/streams/DeviceType.java new file mode 100644 index 00000000..9167e570 --- /dev/null +++ b/privmx-endpoint/src/main/java/com/simplito/java/privmx_endpoint/model/streams/DeviceType.java @@ -0,0 +1,7 @@ +package com.simplito.java.privmx_endpoint.model.streams; + +public enum DeviceType { + Audio, + Video, + Desktop +} \ No newline at end of file From 945428711807742745af2da34370131a045f6d04 Mon Sep 17 00:00:00 2001 From: Doominika Date: Wed, 29 Oct 2025 14:33:19 +0100 Subject: [PATCH 06/30] feat: add MediaDevice class --- .../main/cpp/model_native_initializers.cpp | 28 +++++++++++++++++++ .../src/main/cpp/model_native_initializers.h | 1 + .../model/streams/MediaDevice.java | 13 +++++++++ 3 files changed, 42 insertions(+) create mode 100644 privmx-endpoint/src/main/java/com/simplito/java/privmx_endpoint/model/streams/MediaDevice.java diff --git a/privmx-endpoint/src/main/cpp/model_native_initializers.cpp b/privmx-endpoint/src/main/cpp/model_native_initializers.cpp index b1165371..d990498c 100644 --- a/privmx-endpoint/src/main/cpp/model_native_initializers.cpp +++ b/privmx-endpoint/src/main/cpp/model_native_initializers.cpp @@ -1435,6 +1435,34 @@ namespace privmx { return (jobject) ctx->GetObjectArrayElement(enumValues, (int) deviceType_c); } + + jobject mediaDevice2Java( + JniContextUtils &ctx, + privmx::endpoint::stream::MediaDevice mediaDevice_c + ) { + jclass itemCls = ctx->FindClass( + "com/simplito/java/privmx_endpoint/model/streams/MediaDevice"); + + jmethodID initItemMID = ctx->GetMethodID( + itemCls, + "", + "(" + "Ljava/lang/String;" // name + "Ljava/lang/String;" // id + "Lcom/simplito/java/privmx_endpoint/model/streams/DeviceType;" // type + ")V" + ); + + return ctx->NewObject( + itemCls, + initItemMID, + ctx->NewStringUTF(mediaDevice_c.name.c_str()), + ctx->NewStringUTF(mediaDevice_c.id.c_str()), + deviceType2Java(ctx, mediaDevice_c.type) + + ); + } + jobject streamHandle2Java( JniContextUtils &ctx, privmx::endpoint::stream::StreamHandle streamHandle_c diff --git a/privmx-endpoint/src/main/cpp/model_native_initializers.h b/privmx-endpoint/src/main/cpp/model_native_initializers.h index ec2e4cf6..405fabf9 100644 --- a/privmx-endpoint/src/main/cpp/model_native_initializers.h +++ b/privmx-endpoint/src/main/cpp/model_native_initializers.h @@ -168,6 +168,7 @@ namespace privmx { jobject deviceType2Java(JniContextUtils &ctx,privmx::endpoint::stream::DeviceType deviceType_c); + jobject mediaDevice2Java(JniContextUtils &ctx, privmx::endpoint::stream::MediaDevice mediaDevice_c); jobject streamHandle2Java(JniContextUtils &ctx, privmx::endpoint::stream::StreamHandle streamHandle_c); diff --git a/privmx-endpoint/src/main/java/com/simplito/java/privmx_endpoint/model/streams/MediaDevice.java b/privmx-endpoint/src/main/java/com/simplito/java/privmx_endpoint/model/streams/MediaDevice.java new file mode 100644 index 00000000..ee5fc0d4 --- /dev/null +++ b/privmx-endpoint/src/main/java/com/simplito/java/privmx_endpoint/model/streams/MediaDevice.java @@ -0,0 +1,13 @@ +package com.simplito.java.privmx_endpoint.model.streams; + +public class MediaDevice { + public String name; + public String id; + public DeviceType type; + + public MediaDevice(String name, String id, DeviceType type) { + this.name = name; + this.id = id; + this.type = type; + } +} \ No newline at end of file From 3044b63321a2a7c12a34f331ae46c083a9fa65f2 Mon Sep 17 00:00:00 2001 From: Doominika Date: Wed, 29 Oct 2025 14:34:01 +0100 Subject: [PATCH 07/30] feat: implement getMediaDevices method --- .../src/main/cpp/modules/StreamApi.cpp | 23 +++++++++++++++++++ .../modules/stream/StreamApi.java | 2 ++ 2 files changed, 25 insertions(+) diff --git a/privmx-endpoint/src/main/cpp/modules/StreamApi.cpp b/privmx-endpoint/src/main/cpp/modules/StreamApi.cpp index 268f99e3..abed2720 100644 --- a/privmx-endpoint/src/main/cpp/modules/StreamApi.cpp +++ b/privmx-endpoint/src/main/cpp/modules/StreamApi.cpp @@ -115,4 +115,27 @@ Java_com_simplito_java_privmx_1endpoint_modules_stream_StreamApi_createStream( return nullptr; } return result; +} + +extern "C" +JNIEXPORT jobject JNICALL +Java_com_simplito_java_privmx_1endpoint_modules_stream_StreamApi_getMediaDevices( + JNIEnv *env, + jobject thiz +) { + JniContextUtils ctx(env); + jobject result; + ctx.callResultEndpointApi( + &result, + [&ctx, &thiz]() { + auto media_devices_c( + getStreamApi(ctx, thiz)->getMediaDevices() + ); + return vectorTojArray(ctx, media_devices_c, privmx::wrapper::mediaDevice2Java); + } + ); + if (ctx->ExceptionCheck()) { + return nullptr; + } + return result; } \ No newline at end of file diff --git a/privmx-endpoint/src/main/java/com/simplito/java/privmx_endpoint/modules/stream/StreamApi.java b/privmx-endpoint/src/main/java/com/simplito/java/privmx_endpoint/modules/stream/StreamApi.java index 6c4d1971..f6bb100f 100644 --- a/privmx-endpoint/src/main/java/com/simplito/java/privmx_endpoint/modules/stream/StreamApi.java +++ b/privmx-endpoint/src/main/java/com/simplito/java/privmx_endpoint/modules/stream/StreamApi.java @@ -31,6 +31,8 @@ public StreamApi(Connection connection, EventApi eventApi) throws IllegalStateEx public native StreamHandle createStream(String streamRoomId); + public native List getMediaDevices(); + @Override public void close() throws Exception { deinit(); From fe01e34f89ce6c303af56386a68a7bcb0824abf9 Mon Sep 17 00:00:00 2001 From: Doominika Date: Wed, 29 Oct 2025 15:02:42 +0100 Subject: [PATCH 08/30] feat:add parser for DeviceType --- privmx-endpoint/src/main/cpp/parser.cpp | 13 +++++++++++++ privmx-endpoint/src/main/cpp/parser.h | 3 +++ 2 files changed, 16 insertions(+) diff --git a/privmx-endpoint/src/main/cpp/parser.cpp b/privmx-endpoint/src/main/cpp/parser.cpp index 72bc667a..4764a73e 100644 --- a/privmx-endpoint/src/main/cpp/parser.cpp +++ b/privmx-endpoint/src/main/cpp/parser.cpp @@ -573,6 +573,19 @@ parsePagingQuery(JniContextUtils &ctx, jobject pagingQuery) { return result; } +// streams +privmx::endpoint::stream::DeviceType parseDeviceType(JniContextUtils &ctx, jobject type) { + jclass itemClass = ctx->FindClass( + "com/simplito/java/privmx_endpoint/model/streams/DeviceType)"); + jmethodID ordinalMethod = ctx->GetMethodID(itemClass, "ordinal", "()I"); + jint ordinalMID = ctx->CallIntMethod(type, ordinalMethod); + + privmx::endpoint::stream::DeviceType type_c = static_cast(ordinalMID); + + return type_c; +} + + // java -> c++ template std::vector jArrayToVector( diff --git a/privmx-endpoint/src/main/cpp/parser.h b/privmx-endpoint/src/main/cpp/parser.h index b8a435e1..5dc1a6e0 100644 --- a/privmx-endpoint/src/main/cpp/parser.h +++ b/privmx-endpoint/src/main/cpp/parser.h @@ -37,6 +37,9 @@ jobject parseEvent(JniContextUtils &ctx, std::shared_ptr c++ template std::vector jArrayToVector(JniContextUtils &ctx, jobjectArray jArray, From 9cfc30fe3e3954a7ee0e9443bee02062dbae3a55 Mon Sep 17 00:00:00 2001 From: Doominika Date: Wed, 29 Oct 2025 15:04:17 +0100 Subject: [PATCH 09/30] feat:add parser for MediaDevice --- privmx-endpoint/src/main/cpp/parser.cpp | 18 ++++++++++++++++++ privmx-endpoint/src/main/cpp/parser.h | 2 ++ 2 files changed, 20 insertions(+) diff --git a/privmx-endpoint/src/main/cpp/parser.cpp b/privmx-endpoint/src/main/cpp/parser.cpp index 4764a73e..01d423c0 100644 --- a/privmx-endpoint/src/main/cpp/parser.cpp +++ b/privmx-endpoint/src/main/cpp/parser.cpp @@ -585,6 +585,24 @@ privmx::endpoint::stream::DeviceType parseDeviceType(JniContextUtils &ctx, jobje return type_c; } +privmx::endpoint::stream::MediaDevice parseMediaDevice(JniContextUtils &ctx, jobject mediaDevice) { + auto result = privmx::endpoint::stream::MediaDevice(); + + jclass mediaDeviceCls = ctx->GetObjectClass(mediaDevice); + jfieldID name = ctx->GetFieldID(mediaDeviceCls, "name", "Ljava/lang/String;"); + jfieldID id = ctx->GetFieldID(mediaDeviceCls, "id", "Ljava/lang/String;"); + jfieldID type = ctx->GetFieldID(mediaDeviceCls, "type", + "Lcom/simplito/java/privmx_endpoint/model/streams/DeviceType;"); + + result.name = ctx.jString2string( + (jstring) ctx->GetObjectField(mediaDevice, name)); + result.id = ctx.jString2string( + (jstring) ctx->GetObjectField(mediaDevice, id)); + result.type = parseDeviceType(ctx, ctx->GetObjectField(mediaDevice, type)); + + return result; +} + // java -> c++ template diff --git a/privmx-endpoint/src/main/cpp/parser.h b/privmx-endpoint/src/main/cpp/parser.h index 5dc1a6e0..aa74576a 100644 --- a/privmx-endpoint/src/main/cpp/parser.h +++ b/privmx-endpoint/src/main/cpp/parser.h @@ -40,6 +40,8 @@ privmx::endpoint::core::PagingQuery parsePagingQuery(JniContextUtils &ctx, jobje // streams privmx::endpoint::stream::DeviceType parseDeviceType(JniContextUtils &ctx, jobject type); +privmx::endpoint::stream::MediaDevice parseMediaDevice(JniContextUtils &ctx, jobject mediaDevice); + // java -> c++ template std::vector jArrayToVector(JniContextUtils &ctx, jobjectArray jArray, From ec6cbb27497dd378663f0ecebf14040813cb8c52 Mon Sep 17 00:00:00 2001 From: Doominika Date: Wed, 29 Oct 2025 15:04:46 +0100 Subject: [PATCH 10/30] feat:add parser for StreamHandle --- privmx-endpoint/src/main/cpp/parser.cpp | 9 +++++++++ privmx-endpoint/src/main/cpp/parser.h | 2 ++ 2 files changed, 11 insertions(+) diff --git a/privmx-endpoint/src/main/cpp/parser.cpp b/privmx-endpoint/src/main/cpp/parser.cpp index 01d423c0..0f5e02fb 100644 --- a/privmx-endpoint/src/main/cpp/parser.cpp +++ b/privmx-endpoint/src/main/cpp/parser.cpp @@ -603,6 +603,15 @@ privmx::endpoint::stream::MediaDevice parseMediaDevice(JniContextUtils &ctx, job return result; } +privmx::endpoint::stream::StreamHandle parseStreamHandle( + JniContextUtils &ctx, + jobject streamHandle +) { + jclass streamHandleCls = ctx->GetObjectClass(streamHandle); + jfieldID valueFID = ctx->GetFieldID(streamHandleCls, "value", "Ljava/lang/Long;"); + + return jobject2long(ctx, ctx->GetObjectField(streamHandle, valueFID)); +} // java -> c++ template diff --git a/privmx-endpoint/src/main/cpp/parser.h b/privmx-endpoint/src/main/cpp/parser.h index aa74576a..fc8d0c18 100644 --- a/privmx-endpoint/src/main/cpp/parser.h +++ b/privmx-endpoint/src/main/cpp/parser.h @@ -42,6 +42,8 @@ privmx::endpoint::stream::DeviceType parseDeviceType(JniContextUtils &ctx, jobje privmx::endpoint::stream::MediaDevice parseMediaDevice(JniContextUtils &ctx, jobject mediaDevice); +privmx::endpoint::stream::StreamHandle parseStreamHandle(JniContextUtils &ctx, jobject streamHandle); + // java -> c++ template std::vector jArrayToVector(JniContextUtils &ctx, jobjectArray jArray, From c9e9491faaa0826ae40d0d697791635ede9f0efb Mon Sep 17 00:00:00 2001 From: Doominika Date: Wed, 29 Oct 2025 15:05:36 +0100 Subject: [PATCH 11/30] feat: change value type in StreamHandle class --- .../java/privmx_endpoint/model/streams/StreamHandle.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/privmx-endpoint/src/main/java/com/simplito/java/privmx_endpoint/model/streams/StreamHandle.java b/privmx-endpoint/src/main/java/com/simplito/java/privmx_endpoint/model/streams/StreamHandle.java index 97047b31..cb642e25 100644 --- a/privmx-endpoint/src/main/java/com/simplito/java/privmx_endpoint/model/streams/StreamHandle.java +++ b/privmx-endpoint/src/main/java/com/simplito/java/privmx_endpoint/model/streams/StreamHandle.java @@ -1,13 +1,13 @@ package com.simplito.java.privmx_endpoint.model.streams; public class StreamHandle { - private final long value; + private final Long value; public StreamHandle(Long value) { this.value = value; } - public long getValue() { + public Long getValue() { return value; } } \ No newline at end of file From 341ca816e870e8360a0a0c5f0ca613529dc96d5a Mon Sep 17 00:00:00 2001 From: Doominika Date: Wed, 29 Oct 2025 15:06:39 +0100 Subject: [PATCH 12/30] feat: implement addTrack method --- .../src/main/cpp/modules/StreamApi.cpp | 18 ++++++++++++++++++ .../modules/stream/StreamApi.java | 3 +++ 2 files changed, 21 insertions(+) diff --git a/privmx-endpoint/src/main/cpp/modules/StreamApi.cpp b/privmx-endpoint/src/main/cpp/modules/StreamApi.cpp index abed2720..4beca269 100644 --- a/privmx-endpoint/src/main/cpp/modules/StreamApi.cpp +++ b/privmx-endpoint/src/main/cpp/modules/StreamApi.cpp @@ -138,4 +138,22 @@ Java_com_simplito_java_privmx_1endpoint_modules_stream_StreamApi_getMediaDevices return nullptr; } return result; +} +extern "C" +JNIEXPORT void JNICALL +Java_com_simplito_java_privmx_1endpoint_modules_stream_StreamApi_addTrack( + JNIEnv *env, jobject thiz, + jobject stream_handle, + jobject track +) { + JniContextUtils ctx(env); + if (ctx.nullCheck(track, "TrackParam")) { + return; + } + ctx.callVoidEndpointApi([&ctx, &thiz, &stream_handle, &track]() { + getStreamApi(ctx, thiz)->addTrack( + parseStreamHandle(ctx, stream_handle), + parseMediaDevice(ctx, track) + ); + }); } \ No newline at end of file diff --git a/privmx-endpoint/src/main/java/com/simplito/java/privmx_endpoint/modules/stream/StreamApi.java b/privmx-endpoint/src/main/java/com/simplito/java/privmx_endpoint/modules/stream/StreamApi.java index f6bb100f..40c81467 100644 --- a/privmx-endpoint/src/main/java/com/simplito/java/privmx_endpoint/modules/stream/StreamApi.java +++ b/privmx-endpoint/src/main/java/com/simplito/java/privmx_endpoint/modules/stream/StreamApi.java @@ -1,6 +1,7 @@ package com.simplito.java.privmx_endpoint.modules.stream; import com.simplito.java.privmx_endpoint.LibLoader; +import com.simplito.java.privmx_endpoint.model.streams.MediaDevice; import com.simplito.java.privmx_endpoint.model.streams.Stream; import com.simplito.java.privmx_endpoint.model.streams.StreamHandle; import com.simplito.java.privmx_endpoint.modules.core.Connection; @@ -33,6 +34,8 @@ public StreamApi(Connection connection, EventApi eventApi) throws IllegalStateEx public native List getMediaDevices(); + public native void addTrack(StreamHandle streamHandle, MediaDevice track); + @Override public void close() throws Exception { deinit(); From c6813e136b5740c2f3414b4fb0f608d8e42f627a Mon Sep 17 00:00:00 2001 From: Doominika Date: Wed, 29 Oct 2025 15:10:22 +0100 Subject: [PATCH 13/30] feat: add nullchecks to addTrack method in jni --- privmx-endpoint/src/main/cpp/modules/StreamApi.cpp | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/privmx-endpoint/src/main/cpp/modules/StreamApi.cpp b/privmx-endpoint/src/main/cpp/modules/StreamApi.cpp index 4beca269..1ba74e10 100644 --- a/privmx-endpoint/src/main/cpp/modules/StreamApi.cpp +++ b/privmx-endpoint/src/main/cpp/modules/StreamApi.cpp @@ -147,7 +147,8 @@ Java_com_simplito_java_privmx_1endpoint_modules_stream_StreamApi_addTrack( jobject track ) { JniContextUtils ctx(env); - if (ctx.nullCheck(track, "TrackParam")) { + if (ctx.nullCheck(stream_handle, "Stream Handle") || + ctx.nullCheck(track, "Media Device")) { return; } ctx.callVoidEndpointApi([&ctx, &thiz, &stream_handle, &track]() { From c1e4d545f3abfb50bc61e7f6e7b618c90dfa2217 Mon Sep 17 00:00:00 2001 From: Doominika Date: Wed, 29 Oct 2025 15:10:58 +0100 Subject: [PATCH 14/30] feat: implement removeTrack method --- .../src/main/cpp/modules/StreamApi.cpp | 20 +++++++++++++++++++ .../modules/stream/StreamApi.java | 2 ++ 2 files changed, 22 insertions(+) diff --git a/privmx-endpoint/src/main/cpp/modules/StreamApi.cpp b/privmx-endpoint/src/main/cpp/modules/StreamApi.cpp index 1ba74e10..aaa41002 100644 --- a/privmx-endpoint/src/main/cpp/modules/StreamApi.cpp +++ b/privmx-endpoint/src/main/cpp/modules/StreamApi.cpp @@ -157,4 +157,24 @@ Java_com_simplito_java_privmx_1endpoint_modules_stream_StreamApi_addTrack( parseMediaDevice(ctx, track) ); }); +} +extern "C" +JNIEXPORT void JNICALL +Java_com_simplito_java_privmx_1endpoint_modules_stream_StreamApi_removeTrack( + JNIEnv *env, + jobject thiz, + jobject stream_handle, + jobject track +) { + JniContextUtils ctx(env); + if (ctx.nullCheck(stream_handle, "Stream Handle") || + ctx.nullCheck(track, "Media Device")) { + return; + } + ctx.callVoidEndpointApi([&ctx, &thiz, &stream_handle, &track]() { + getStreamApi(ctx, thiz)->removeTrack( + parseStreamHandle(ctx, stream_handle), + parseMediaDevice(ctx, track) + ); + }); } \ No newline at end of file diff --git a/privmx-endpoint/src/main/java/com/simplito/java/privmx_endpoint/modules/stream/StreamApi.java b/privmx-endpoint/src/main/java/com/simplito/java/privmx_endpoint/modules/stream/StreamApi.java index 40c81467..95dbebef 100644 --- a/privmx-endpoint/src/main/java/com/simplito/java/privmx_endpoint/modules/stream/StreamApi.java +++ b/privmx-endpoint/src/main/java/com/simplito/java/privmx_endpoint/modules/stream/StreamApi.java @@ -36,6 +36,8 @@ public StreamApi(Connection connection, EventApi eventApi) throws IllegalStateEx public native void addTrack(StreamHandle streamHandle, MediaDevice track); + public native void removeTrack(StreamHandle streamHandle, MediaDevice track); + @Override public void close() throws Exception { deinit(); From a418de40553a67e9b0d74dbf862f64cac5fbc53c Mon Sep 17 00:00:00 2001 From: Doominika Date: Wed, 29 Oct 2025 15:22:41 +0100 Subject: [PATCH 15/30] feat: add remoteStreamId class --- .../main/cpp/model_native_initializers.cpp | 19 +++++++++++++++++++ .../src/main/cpp/model_native_initializers.h | 2 ++ .../model/streams/RemoteStreamId.java | 13 +++++++++++++ 3 files changed, 34 insertions(+) create mode 100644 privmx-endpoint/src/main/java/com/simplito/java/privmx_endpoint/model/streams/RemoteStreamId.java diff --git a/privmx-endpoint/src/main/cpp/model_native_initializers.cpp b/privmx-endpoint/src/main/cpp/model_native_initializers.cpp index d990498c..02dff529 100644 --- a/privmx-endpoint/src/main/cpp/model_native_initializers.cpp +++ b/privmx-endpoint/src/main/cpp/model_native_initializers.cpp @@ -1485,5 +1485,24 @@ namespace privmx { ); } + jobject remoteStreamId2Java(JniContextUtils &ctx, privmx::endpoint::stream::RemoteStreamId remoteStreamId_c){ + jclass itemCls = ctx->FindClass( + "com/simplito/java/privmx_endpoint/model/streams/RemoteStreamId"); + + jmethodID initItemMID = ctx->GetMethodID( + itemCls, + "", + "(" + "Ljava/lang/Long;" // value + ")V" + ); + + return ctx->NewObject( + itemCls, + initItemMID, + ctx.long2jLong(remoteStreamId_c) + ); + } + } // wrapper } // privmx \ No newline at end of file diff --git a/privmx-endpoint/src/main/cpp/model_native_initializers.h b/privmx-endpoint/src/main/cpp/model_native_initializers.h index 405fabf9..8b187de7 100644 --- a/privmx-endpoint/src/main/cpp/model_native_initializers.h +++ b/privmx-endpoint/src/main/cpp/model_native_initializers.h @@ -172,6 +172,8 @@ namespace privmx { jobject streamHandle2Java(JniContextUtils &ctx, privmx::endpoint::stream::StreamHandle streamHandle_c); + jobject remoteStreamId2Java(JniContextUtils &ctx, privmx::endpoint::stream::RemoteStreamId remoteStreamId_c); + } // wrapper } // privmx diff --git a/privmx-endpoint/src/main/java/com/simplito/java/privmx_endpoint/model/streams/RemoteStreamId.java b/privmx-endpoint/src/main/java/com/simplito/java/privmx_endpoint/model/streams/RemoteStreamId.java new file mode 100644 index 00000000..e9c9a8b3 --- /dev/null +++ b/privmx-endpoint/src/main/java/com/simplito/java/privmx_endpoint/model/streams/RemoteStreamId.java @@ -0,0 +1,13 @@ +package com.simplito.java.privmx_endpoint.model.streams; + +public class RemoteStreamId { + private final Long value; + + public RemoteStreamId(Long value) { + this.value = value; + } + + public Long getValue() { + return value; + } +} \ No newline at end of file From 16f99563d81faa72ca25d61495efb75bf5635c9d Mon Sep 17 00:00:00 2001 From: Doominika Date: Wed, 29 Oct 2025 15:23:13 +0100 Subject: [PATCH 16/30] feat: implement publishStream method --- .../src/main/cpp/modules/StreamApi.cpp | 28 +++++++++++++++++++ .../modules/stream/StreamApi.java | 3 ++ 2 files changed, 31 insertions(+) diff --git a/privmx-endpoint/src/main/cpp/modules/StreamApi.cpp b/privmx-endpoint/src/main/cpp/modules/StreamApi.cpp index aaa41002..05bad308 100644 --- a/privmx-endpoint/src/main/cpp/modules/StreamApi.cpp +++ b/privmx-endpoint/src/main/cpp/modules/StreamApi.cpp @@ -177,4 +177,32 @@ Java_com_simplito_java_privmx_1endpoint_modules_stream_StreamApi_removeTrack( parseMediaDevice(ctx, track) ); }); +} + +extern "C" +JNIEXPORT jobject JNICALL +Java_com_simplito_java_privmx_1endpoint_modules_stream_StreamApi_publishStream( + JNIEnv *env, + jobject thiz, + jobject stream_handle +) { + JniContextUtils ctx(env); + if (ctx.nullCheck(stream_handle, "Stream Handle")) { + return nullptr; + } + + jobject result; + ctx.callResultEndpointApi( + &result, + [&ctx, &env, &thiz, &stream_handle]() { + auto id = + getStreamApi(ctx, thiz)->publishStream( + parseStreamHandle(ctx, stream_handle)); + return privmx::wrapper::remoteStreamId2Java(ctx, id); + } + ); + if (ctx->ExceptionCheck()) { + return nullptr; + } + return result; } \ No newline at end of file diff --git a/privmx-endpoint/src/main/java/com/simplito/java/privmx_endpoint/modules/stream/StreamApi.java b/privmx-endpoint/src/main/java/com/simplito/java/privmx_endpoint/modules/stream/StreamApi.java index 95dbebef..124ca10c 100644 --- a/privmx-endpoint/src/main/java/com/simplito/java/privmx_endpoint/modules/stream/StreamApi.java +++ b/privmx-endpoint/src/main/java/com/simplito/java/privmx_endpoint/modules/stream/StreamApi.java @@ -2,6 +2,7 @@ import com.simplito.java.privmx_endpoint.LibLoader; import com.simplito.java.privmx_endpoint.model.streams.MediaDevice; +import com.simplito.java.privmx_endpoint.model.streams.RemoteStreamId; import com.simplito.java.privmx_endpoint.model.streams.Stream; import com.simplito.java.privmx_endpoint.model.streams.StreamHandle; import com.simplito.java.privmx_endpoint.modules.core.Connection; @@ -38,6 +39,8 @@ public StreamApi(Connection connection, EventApi eventApi) throws IllegalStateEx public native void removeTrack(StreamHandle streamHandle, MediaDevice track); + public native RemoteStreamId publishStream(StreamHandle streamHandle); + @Override public void close() throws Exception { deinit(); From 85d498c6494955ed84a5d7bb3fa89c86bc993b4e Mon Sep 17 00:00:00 2001 From: Doominika Date: Wed, 29 Oct 2025 15:25:42 +0100 Subject: [PATCH 17/30] feat: implement unpublishStream method --- .../src/main/cpp/modules/StreamApi.cpp | 15 +++++++++++++++ .../privmx_endpoint/modules/stream/StreamApi.java | 2 ++ 2 files changed, 17 insertions(+) diff --git a/privmx-endpoint/src/main/cpp/modules/StreamApi.cpp b/privmx-endpoint/src/main/cpp/modules/StreamApi.cpp index 05bad308..4b12768e 100644 --- a/privmx-endpoint/src/main/cpp/modules/StreamApi.cpp +++ b/privmx-endpoint/src/main/cpp/modules/StreamApi.cpp @@ -205,4 +205,19 @@ Java_com_simplito_java_privmx_1endpoint_modules_stream_StreamApi_publishStream( return nullptr; } return result; +} + +extern "C" +JNIEXPORT void JNICALL +Java_com_simplito_java_privmx_1endpoint_modules_stream_StreamApi_unpublishStream( + JNIEnv *env, + jobject thiz, + jobject stream_handle +) { + JniContextUtils ctx(env); + ctx.callVoidEndpointApi([&ctx, &thiz, &stream_handle]() { + getStreamApi(ctx, thiz)->unpublishStream( + parseStreamHandle(ctx, stream_handle) + ); + }); } \ No newline at end of file diff --git a/privmx-endpoint/src/main/java/com/simplito/java/privmx_endpoint/modules/stream/StreamApi.java b/privmx-endpoint/src/main/java/com/simplito/java/privmx_endpoint/modules/stream/StreamApi.java index 124ca10c..fc84a8ce 100644 --- a/privmx-endpoint/src/main/java/com/simplito/java/privmx_endpoint/modules/stream/StreamApi.java +++ b/privmx-endpoint/src/main/java/com/simplito/java/privmx_endpoint/modules/stream/StreamApi.java @@ -41,6 +41,8 @@ public StreamApi(Connection connection, EventApi eventApi) throws IllegalStateEx public native RemoteStreamId publishStream(StreamHandle streamHandle); + public native void unpublishStream(StreamHandle streamHandle); + @Override public void close() throws Exception { deinit(); From d48d8077dffd8d0811e514208c3216e0be45c2f0 Mon Sep 17 00:00:00 2001 From: Doominika Date: Mon, 3 Nov 2025 08:42:54 +0100 Subject: [PATCH 18/30] feat: implement subscribeToRemoteStreams method --- .../src/main/cpp/modules/StreamApi.cpp | 34 ++++++++++++++++++- .../modules/stream/StreamApi.java | 10 ++++++ 2 files changed, 43 insertions(+), 1 deletion(-) diff --git a/privmx-endpoint/src/main/cpp/modules/StreamApi.cpp b/privmx-endpoint/src/main/cpp/modules/StreamApi.cpp index 4b12768e..afea6482 100644 --- a/privmx-endpoint/src/main/cpp/modules/StreamApi.cpp +++ b/privmx-endpoint/src/main/cpp/modules/StreamApi.cpp @@ -220,4 +220,36 @@ Java_com_simplito_java_privmx_1endpoint_modules_stream_StreamApi_unpublishStream parseStreamHandle(ctx, stream_handle) ); }); -} \ No newline at end of file +} + +extern "C" +JNIEXPORT void JNICALL +Java_com_simplito_java_privmx_1endpoint_modules_stream_StreamApi_subscribeToRemoteStreams( + JNIEnv *env, + jobject thiz, + jstring stream_room_id, + jobject subscriptions, + jobject options +) { + JniContextUtils ctx(env); + if (ctx.nullCheck(stream_room_id, "Stream Room ID") || + ctx.nullCheck(options, "Options") || + ctx.nullCheck(subscriptions, "Subscriptions List")) { + return; + } + + ctx.callVoidEndpointApi([&ctx, &thiz, &stream_room_id, &subscriptions, &options, &env]() { + std::vector subscriptions_c = + jArrayToVector( + ctx, + ctx.jObject2jArray( + subscriptions), + parseStreamSubscription + ); + getStreamApi(ctx, thiz)->subscribeToRemoteStreams( + ctx.jString2string(stream_room_id), + subscriptions_c, + parseStreamSettings(env, options) + ); + }); +} diff --git a/privmx-endpoint/src/main/java/com/simplito/java/privmx_endpoint/modules/stream/StreamApi.java b/privmx-endpoint/src/main/java/com/simplito/java/privmx_endpoint/modules/stream/StreamApi.java index fc84a8ce..4dee82c8 100644 --- a/privmx-endpoint/src/main/java/com/simplito/java/privmx_endpoint/modules/stream/StreamApi.java +++ b/privmx-endpoint/src/main/java/com/simplito/java/privmx_endpoint/modules/stream/StreamApi.java @@ -5,6 +5,8 @@ import com.simplito.java.privmx_endpoint.model.streams.RemoteStreamId; import com.simplito.java.privmx_endpoint.model.streams.Stream; import com.simplito.java.privmx_endpoint.model.streams.StreamHandle; +import com.simplito.java.privmx_endpoint.model.streams.StreamSettings; +import com.simplito.java.privmx_endpoint.model.streams.StreamSubscription; import com.simplito.java.privmx_endpoint.modules.core.Connection; import com.simplito.java.privmx_endpoint.modules.event.EventApi; @@ -43,6 +45,14 @@ public StreamApi(Connection connection, EventApi eventApi) throws IllegalStateEx public native void unpublishStream(StreamHandle streamHandle); + public native void subscribeToRemoteStreams(String streamRoomId, List subscriptions, StreamSettings options); + + public native void modifyRemoteStreamsSubscriptions(String streamRoomId, List subscriptionsToAdd, List subscriptionsToRemove, StreamSettings options); + + public native void unsubscribeFromRemoteStreams(String streamRoomId, List subscriptionsToRemove); + + public native void dropBrokenFrames(String streamRoomId, boolean enable); + @Override public void close() throws Exception { deinit(); From f25d32d5aa389fc16c1d8979d8ea7b27dff8de93 Mon Sep 17 00:00:00 2001 From: Doominika Date: Mon, 3 Nov 2025 08:45:35 +0100 Subject: [PATCH 19/30] feat: add StreamSettings --- privmx-endpoint/src/main/cpp/parser.cpp | 22 +++++++++++ privmx-endpoint/src/main/cpp/parser.h | 2 + .../model/streams/StreamSettings.java | 37 +++++++++++++++++++ 3 files changed, 61 insertions(+) create mode 100644 privmx-endpoint/src/main/java/com/simplito/java/privmx_endpoint/model/streams/StreamSettings.java diff --git a/privmx-endpoint/src/main/cpp/parser.cpp b/privmx-endpoint/src/main/cpp/parser.cpp index 0f5e02fb..7a0502b0 100644 --- a/privmx-endpoint/src/main/cpp/parser.cpp +++ b/privmx-endpoint/src/main/cpp/parser.cpp @@ -613,6 +613,28 @@ privmx::endpoint::stream::StreamHandle parseStreamHandle( return jobject2long(ctx, ctx->GetObjectField(streamHandle, valueFID)); } +privmx::endpoint::stream::StreamSettings parseStreamSettings(JNIEnv *env,jobject streamSettings){ + privmx::endpoint::stream::StreamSettings result; + JniContextUtils ctx(env); + jclass cls = ctx->GetObjectClass(streamSettings); + StreamSettingsJNI streamSettingsJni (env, streamSettings); + + jfieldID settingsFID = env->GetFieldID( + env->GetObjectClass(streamSettings), + "settings", + "Lcom/simplito/java/privmx_endpoint/model/streams/Settings;" + ); + + jobject jsettings = ctx->GetObjectField(streamSettings, settingsFID); + + result.settings = parseSettings(ctx, jsettings); + result.OnFrame = streamSettingsJni.OnFrame; + result.OnVideo = streamSettingsJni.OnVideo; + result.OnVideoRemove = streamSettingsJni.OnVideoRemove; + + return result; +} + // java -> c++ template std::vector jArrayToVector( diff --git a/privmx-endpoint/src/main/cpp/parser.h b/privmx-endpoint/src/main/cpp/parser.h index fc8d0c18..9624bf08 100644 --- a/privmx-endpoint/src/main/cpp/parser.h +++ b/privmx-endpoint/src/main/cpp/parser.h @@ -44,6 +44,8 @@ privmx::endpoint::stream::MediaDevice parseMediaDevice(JniContextUtils &ctx, job privmx::endpoint::stream::StreamHandle parseStreamHandle(JniContextUtils &ctx, jobject streamHandle); +privmx::endpoint::stream::StreamSettings parseStreamSettings(JNIEnv *env, jobject streamSettings); + // java -> c++ template std::vector jArrayToVector(JniContextUtils &ctx, jobjectArray jArray, diff --git a/privmx-endpoint/src/main/java/com/simplito/java/privmx_endpoint/model/streams/StreamSettings.java b/privmx-endpoint/src/main/java/com/simplito/java/privmx_endpoint/model/streams/StreamSettings.java new file mode 100644 index 00000000..eca53e49 --- /dev/null +++ b/privmx-endpoint/src/main/java/com/simplito/java/privmx_endpoint/model/streams/StreamSettings.java @@ -0,0 +1,37 @@ +package com.simplito.java.privmx_endpoint.model.streams; + +import java.util.function.Consumer; + +public class StreamSettings { + public Settings settings; + public boolean dropCorruptedFrames = true; + public OnFrameCallback OnFrame = null; + public Consumer OnVideo = null; + public Consumer OnVideoRemove = null; + + public StreamSettings(Settings settings, boolean dropCorruptedFrames, OnFrameCallback onFrame, Consumer onVideo, Consumer onVideoRemove) { + this.settings = settings; + this.dropCorruptedFrames = dropCorruptedFrames; + OnFrame = onFrame; + OnVideo = onVideo; + OnVideoRemove = onVideoRemove; + } + + public StreamSettings(Settings settings, boolean dropCorruptedFrames, OnFrameCallback onFrame, Consumer onVideo) { + this(settings, dropCorruptedFrames, onFrame, onVideo, null); + } + + public StreamSettings(Settings settings, OnFrameCallback onFrame, boolean dropCorruptedFrames) { + this(settings, dropCorruptedFrames, onFrame, null, null); + + } + + public StreamSettings(Settings settings, boolean dropCorruptedFrames) { + this(settings, dropCorruptedFrames, null, null, null); + + } + + public StreamSettings(Settings settings) { + this(settings, true, null, null, null); + } +} \ No newline at end of file From 29889d02c6f2ef2afb00717a4db8cd8a47d70e61 Mon Sep 17 00:00:00 2001 From: Doominika Date: Mon, 3 Nov 2025 08:46:21 +0100 Subject: [PATCH 20/30] feat: add Settings --- privmx-endpoint/src/main/cpp/parser.cpp | 5 +++++ privmx-endpoint/src/main/cpp/parser.h | 4 +++- .../java/privmx_endpoint/model/streams/Settings.java | 6 ++++++ 3 files changed, 14 insertions(+), 1 deletion(-) create mode 100644 privmx-endpoint/src/main/java/com/simplito/java/privmx_endpoint/model/streams/Settings.java diff --git a/privmx-endpoint/src/main/cpp/parser.cpp b/privmx-endpoint/src/main/cpp/parser.cpp index 7a0502b0..d8f0b470 100644 --- a/privmx-endpoint/src/main/cpp/parser.cpp +++ b/privmx-endpoint/src/main/cpp/parser.cpp @@ -613,6 +613,11 @@ privmx::endpoint::stream::StreamHandle parseStreamHandle( return jobject2long(ctx, ctx->GetObjectField(streamHandle, valueFID)); } +privmx::endpoint::stream::Settings parseSettings(JniContextUtils &ctx, jobject settings){ + auto result = privmx::endpoint::stream::Settings(); + return result; +} + privmx::endpoint::stream::StreamSettings parseStreamSettings(JNIEnv *env,jobject streamSettings){ privmx::endpoint::stream::StreamSettings result; JniContextUtils ctx(env); diff --git a/privmx-endpoint/src/main/cpp/parser.h b/privmx-endpoint/src/main/cpp/parser.h index 9624bf08..b0a5befa 100644 --- a/privmx-endpoint/src/main/cpp/parser.h +++ b/privmx-endpoint/src/main/cpp/parser.h @@ -13,7 +13,7 @@ #define PRIVMX_POCKET_LIB_PARSER_H #include "utils.hpp" - +#include "modules/StreamSettingsJNI.h" #include #include "model_native_initializers.h" @@ -44,6 +44,8 @@ privmx::endpoint::stream::MediaDevice parseMediaDevice(JniContextUtils &ctx, job privmx::endpoint::stream::StreamHandle parseStreamHandle(JniContextUtils &ctx, jobject streamHandle); +privmx::endpoint::stream::Settings parseSettings(JniContextUtils &ctx, jobject settings); + privmx::endpoint::stream::StreamSettings parseStreamSettings(JNIEnv *env, jobject streamSettings); // java -> c++ diff --git a/privmx-endpoint/src/main/java/com/simplito/java/privmx_endpoint/model/streams/Settings.java b/privmx-endpoint/src/main/java/com/simplito/java/privmx_endpoint/model/streams/Settings.java new file mode 100644 index 00000000..05f7bf10 --- /dev/null +++ b/privmx-endpoint/src/main/java/com/simplito/java/privmx_endpoint/model/streams/Settings.java @@ -0,0 +1,6 @@ +package com.simplito.java.privmx_endpoint.model.streams; + +public class Settings { + public Settings() { + } +} \ No newline at end of file From 0d80b307cf5f7f891703eb384c43622cd9c96000 Mon Sep 17 00:00:00 2001 From: Doominika Date: Mon, 3 Nov 2025 08:48:33 +0100 Subject: [PATCH 21/30] feat: add OnFrameCallback --- .../java/privmx_endpoint/model/streams/OnFrameCallback.java | 6 ++++++ 1 file changed, 6 insertions(+) create mode 100644 privmx-endpoint/src/main/java/com/simplito/java/privmx_endpoint/model/streams/OnFrameCallback.java diff --git a/privmx-endpoint/src/main/java/com/simplito/java/privmx_endpoint/model/streams/OnFrameCallback.java b/privmx-endpoint/src/main/java/com/simplito/java/privmx_endpoint/model/streams/OnFrameCallback.java new file mode 100644 index 00000000..aa156855 --- /dev/null +++ b/privmx-endpoint/src/main/java/com/simplito/java/privmx_endpoint/model/streams/OnFrameCallback.java @@ -0,0 +1,6 @@ +package com.simplito.java.privmx_endpoint.model.streams; + +@FunctionalInterface +public interface OnFrameCallback { + void run(long a, long b, Frame c, String d); +} From e2e28d098cf4aa4ac0a52b6e2a8987ce6bfbd901 Mon Sep 17 00:00:00 2001 From: Doominika Date: Mon, 3 Nov 2025 08:50:56 +0100 Subject: [PATCH 22/30] feat: add StreamSubscription --- privmx-endpoint/src/main/cpp/parser.cpp | 24 +++++++++++++++++++ privmx-endpoint/src/main/cpp/parser.h | 2 ++ .../model/streams/StreamSubscription.java | 15 ++++++++++++ 3 files changed, 41 insertions(+) create mode 100644 privmx-endpoint/src/main/java/com/simplito/java/privmx_endpoint/model/streams/StreamSubscription.java diff --git a/privmx-endpoint/src/main/cpp/parser.cpp b/privmx-endpoint/src/main/cpp/parser.cpp index d8f0b470..d3fd541f 100644 --- a/privmx-endpoint/src/main/cpp/parser.cpp +++ b/privmx-endpoint/src/main/cpp/parser.cpp @@ -640,6 +640,30 @@ privmx::endpoint::stream::StreamSettings parseStreamSettings(JNIEnv *env,jobject return result; } +privmx::endpoint::stream::StreamSubscription parseStreamSubscription(JniContextUtils &ctx, jobject streamSubscription){ + privmx::endpoint::stream::StreamSubscription result; + jclass cls = ctx->GetObjectClass(streamSubscription); + jfieldID streamIdFID = ctx->GetFieldID( + ctx->GetObjectClass(streamSubscription), + "streamId", + "J" + ); + + jfieldID trackIdFID = ctx->GetFieldID( + ctx->GetObjectClass(streamSubscription), + "streamTrackId", + "Ljava/lang/String;" + ); + + jobject streamId = ctx->GetObjectField(streamSubscription, streamIdFID); + jobject streamTrackId = ctx->GetObjectField(streamSubscription, trackIdFID); + + result.streamId = jobject2long(ctx, streamId); + if(streamTrackId != nullptr) result.streamTrackId = jobject2string(ctx, streamTrackId); + + return result; +} + // java -> c++ template std::vector jArrayToVector( diff --git a/privmx-endpoint/src/main/cpp/parser.h b/privmx-endpoint/src/main/cpp/parser.h index b0a5befa..ffc68d38 100644 --- a/privmx-endpoint/src/main/cpp/parser.h +++ b/privmx-endpoint/src/main/cpp/parser.h @@ -48,6 +48,8 @@ privmx::endpoint::stream::Settings parseSettings(JniContextUtils &ctx, jobject s privmx::endpoint::stream::StreamSettings parseStreamSettings(JNIEnv *env, jobject streamSettings); +privmx::endpoint::stream::StreamSubscription parseStreamSubscription(JniContextUtils &ctx, jobject streamSubscription); + // java -> c++ template std::vector jArrayToVector(JniContextUtils &ctx, jobjectArray jArray, diff --git a/privmx-endpoint/src/main/java/com/simplito/java/privmx_endpoint/model/streams/StreamSubscription.java b/privmx-endpoint/src/main/java/com/simplito/java/privmx_endpoint/model/streams/StreamSubscription.java new file mode 100644 index 00000000..9a4b9197 --- /dev/null +++ b/privmx-endpoint/src/main/java/com/simplito/java/privmx_endpoint/model/streams/StreamSubscription.java @@ -0,0 +1,15 @@ +package com.simplito.java.privmx_endpoint.model.streams; + +public class StreamSubscription { + public long streamId; + public String streamTrackId; + + public StreamSubscription(long streamId, String streamTrackId) { + this.streamId = streamId; + this.streamTrackId = streamTrackId; + } + + public StreamSubscription(long streamId) { + this.streamId = streamId; + } +} \ No newline at end of file From aa31b24747c6fc289d4fbc249d87b3adc9313cb2 Mon Sep 17 00:00:00 2001 From: Doominika Date: Mon, 3 Nov 2025 08:53:20 +0100 Subject: [PATCH 23/30] feat: add Frame --- .../src/main/cpp/model_native_initializers.cpp | 15 +++++++++++++++ .../src/main/cpp/model_native_initializers.h | 2 ++ .../java/privmx_endpoint/model/streams/Frame.java | 8 ++++++++ 3 files changed, 25 insertions(+) create mode 100644 privmx-endpoint/src/main/java/com/simplito/java/privmx_endpoint/model/streams/Frame.java diff --git a/privmx-endpoint/src/main/cpp/model_native_initializers.cpp b/privmx-endpoint/src/main/cpp/model_native_initializers.cpp index 02dff529..2cf6c769 100644 --- a/privmx-endpoint/src/main/cpp/model_native_initializers.cpp +++ b/privmx-endpoint/src/main/cpp/model_native_initializers.cpp @@ -1504,5 +1504,20 @@ namespace privmx { ); } + jobject frame2Java(JniContextUtils &ctx, privmx::endpoint::stream::Frame &frame_c) { + jclass itemCls = ctx->FindClass( + "com/simplito/java/privmx_endpoint/model/streams/Frame"); + + jmethodID initItemMID = ctx->GetMethodID( + itemCls, + "", + "()V" + ); + + return ctx->NewObject( + itemCls, + initItemMID + ); + } } // wrapper } // privmx \ No newline at end of file diff --git a/privmx-endpoint/src/main/cpp/model_native_initializers.h b/privmx-endpoint/src/main/cpp/model_native_initializers.h index 8b187de7..bd73a07e 100644 --- a/privmx-endpoint/src/main/cpp/model_native_initializers.h +++ b/privmx-endpoint/src/main/cpp/model_native_initializers.h @@ -174,6 +174,8 @@ namespace privmx { jobject remoteStreamId2Java(JniContextUtils &ctx, privmx::endpoint::stream::RemoteStreamId remoteStreamId_c); + jobject frame2Java(JniContextUtils &ctx, privmx::endpoint::stream::Frame &frame_c); + } // wrapper } // privmx diff --git a/privmx-endpoint/src/main/java/com/simplito/java/privmx_endpoint/model/streams/Frame.java b/privmx-endpoint/src/main/java/com/simplito/java/privmx_endpoint/model/streams/Frame.java new file mode 100644 index 00000000..e8dc75d5 --- /dev/null +++ b/privmx-endpoint/src/main/java/com/simplito/java/privmx_endpoint/model/streams/Frame.java @@ -0,0 +1,8 @@ +package com.simplito.java.privmx_endpoint.model.streams; + +public abstract class Frame { + public Frame() {} + public int ConvertToRGBA(byte dst_argb, int dst_stride_argb, int dest_width, int dest_height){ + return 0; + }; +} \ No newline at end of file From 73d4b899ce3cdfbfcfd9a53f8b2412bcba6cd823 Mon Sep 17 00:00:00 2001 From: Doominika Date: Mon, 3 Nov 2025 08:55:52 +0100 Subject: [PATCH 24/30] feat: implement modifyRemoteStreamsSubscriptions --- .../src/main/cpp/modules/StreamApi.cpp | 43 +++++++++++++++++++ 1 file changed, 43 insertions(+) diff --git a/privmx-endpoint/src/main/cpp/modules/StreamApi.cpp b/privmx-endpoint/src/main/cpp/modules/StreamApi.cpp index afea6482..2ce0dc70 100644 --- a/privmx-endpoint/src/main/cpp/modules/StreamApi.cpp +++ b/privmx-endpoint/src/main/cpp/modules/StreamApi.cpp @@ -253,3 +253,46 @@ Java_com_simplito_java_privmx_1endpoint_modules_stream_StreamApi_subscribeToRemo ); }); } + +extern "C" +JNIEXPORT void JNICALL +Java_com_simplito_java_privmx_1endpoint_modules_stream_StreamApi_modifyRemoteStreamsSubscriptions( + JNIEnv *env, + jobject thiz, + jstring stream_room_id, + jobject subscriptions_to_add, + jobject subscriptions_to_remove, + jobject options +) { + JniContextUtils ctx(env); + if (ctx.nullCheck(stream_room_id, "Stream Room ID") || + ctx.nullCheck(options, "Options") || + ctx.nullCheck(subscriptions_to_add, "Subscriptions To Add List") || + ctx.nullCheck(subscriptions_to_remove, "Subscriptions To Remove List")) { + return; + } + + ctx.callVoidEndpointApi( + [&ctx, &thiz, &stream_room_id, &subscriptions_to_add, &subscriptions_to_remove, &options, &env]() { + std::vector subscriptions_to_add_c = + jArrayToVector( + ctx, + ctx.jObject2jArray( + subscriptions_to_add), + parseStreamSubscription + ); + std::vector subscriptions_to_remove_c = + jArrayToVector( + ctx, + ctx.jObject2jArray( + subscriptions_to_remove), + parseStreamSubscription + ); + getStreamApi(ctx, thiz)->modifyRemoteStreamsSubscriptions( + ctx.jString2string(stream_room_id), + subscriptions_to_add_c, + subscriptions_to_remove_c, + parseStreamSettings(env, options) + ); + }); +} \ No newline at end of file From 0fea22f8d89521bec8da38e1f96ba5fdf9fab813 Mon Sep 17 00:00:00 2001 From: Doominika Date: Mon, 3 Nov 2025 08:56:36 +0100 Subject: [PATCH 25/30] feat: implement unsubscribeFromRemoteStreams --- .../src/main/cpp/modules/StreamApi.cpp | 29 +++++++++++++++++++ 1 file changed, 29 insertions(+) diff --git a/privmx-endpoint/src/main/cpp/modules/StreamApi.cpp b/privmx-endpoint/src/main/cpp/modules/StreamApi.cpp index 2ce0dc70..f8d36128 100644 --- a/privmx-endpoint/src/main/cpp/modules/StreamApi.cpp +++ b/privmx-endpoint/src/main/cpp/modules/StreamApi.cpp @@ -295,4 +295,33 @@ Java_com_simplito_java_privmx_1endpoint_modules_stream_StreamApi_modifyRemoteStr parseStreamSettings(env, options) ); }); +} + +extern "C" +JNIEXPORT void JNICALL +Java_com_simplito_java_privmx_1endpoint_modules_stream_StreamApi_unsubscribeFromRemoteStreams( + JNIEnv *env, + jobject thiz, + jstring stream_room_id, + jobject subscriptions_to_remove +) { + JniContextUtils ctx(env); + if (ctx.nullCheck(stream_room_id, "Stream Room ID") || + ctx.nullCheck(subscriptions_to_remove, "Subscriptions To Remove List")) { + return; + } + + ctx.callVoidEndpointApi([&ctx, &thiz, &stream_room_id, &subscriptions_to_remove]() { + std::vector subscriptions_to_remove_c = + jArrayToVector( + ctx, + ctx.jObject2jArray( + subscriptions_to_remove), + parseStreamSubscription + ); + getStreamApi(ctx, thiz)->unsubscribeFromRemoteStreams( + ctx.jString2string(stream_room_id), + subscriptions_to_remove_c + ); + }); } \ No newline at end of file From c432217424baf57b0e4b80d8670e77af1cec8e7d Mon Sep 17 00:00:00 2001 From: Doominika Date: Mon, 3 Nov 2025 08:56:50 +0100 Subject: [PATCH 26/30] feat: implement dropBrokenFrames --- .../src/main/cpp/modules/StreamApi.cpp | 21 +++++++++++++++++++ 1 file changed, 21 insertions(+) diff --git a/privmx-endpoint/src/main/cpp/modules/StreamApi.cpp b/privmx-endpoint/src/main/cpp/modules/StreamApi.cpp index f8d36128..8a8f6cd0 100644 --- a/privmx-endpoint/src/main/cpp/modules/StreamApi.cpp +++ b/privmx-endpoint/src/main/cpp/modules/StreamApi.cpp @@ -324,4 +324,25 @@ Java_com_simplito_java_privmx_1endpoint_modules_stream_StreamApi_unsubscribeFrom subscriptions_to_remove_c ); }); +} + +extern "C" +JNIEXPORT void JNICALL +Java_com_simplito_java_privmx_1endpoint_modules_stream_StreamApi_dropBrokenFrames( + JNIEnv *env, + jobject thiz, + jstring stream_room_id, + jboolean enable +) { + JniContextUtils ctx(env); + if (ctx.nullCheck(stream_room_id, "Stream Room ID")) { + return; + } + + ctx.callVoidEndpointApi([&ctx, &thiz, &stream_room_id, &enable]() { + getStreamApi(ctx, thiz)->dropBrokenFrames( + ctx.jString2string(stream_room_id), + enable == JNI_TRUE + ); + }); } \ No newline at end of file From ccc65e153666c28e519ef7aa74779ff7c99ae0a4 Mon Sep 17 00:00:00 2001 From: Doominika Date: Mon, 1 Dec 2025 11:32:10 +0100 Subject: [PATCH 27/30] refactor: remove unnecessary getters --- .../java/privmx_endpoint/model/streams/RemoteStreamId.java | 6 +----- .../java/privmx_endpoint/model/streams/StreamHandle.java | 6 +----- 2 files changed, 2 insertions(+), 10 deletions(-) diff --git a/privmx-endpoint/src/main/java/com/simplito/java/privmx_endpoint/model/streams/RemoteStreamId.java b/privmx-endpoint/src/main/java/com/simplito/java/privmx_endpoint/model/streams/RemoteStreamId.java index e9c9a8b3..a1a6e876 100644 --- a/privmx-endpoint/src/main/java/com/simplito/java/privmx_endpoint/model/streams/RemoteStreamId.java +++ b/privmx-endpoint/src/main/java/com/simplito/java/privmx_endpoint/model/streams/RemoteStreamId.java @@ -1,13 +1,9 @@ package com.simplito.java.privmx_endpoint.model.streams; public class RemoteStreamId { - private final Long value; + public final Long value; public RemoteStreamId(Long value) { this.value = value; } - - public Long getValue() { - return value; - } } \ No newline at end of file diff --git a/privmx-endpoint/src/main/java/com/simplito/java/privmx_endpoint/model/streams/StreamHandle.java b/privmx-endpoint/src/main/java/com/simplito/java/privmx_endpoint/model/streams/StreamHandle.java index cb642e25..4f348efe 100644 --- a/privmx-endpoint/src/main/java/com/simplito/java/privmx_endpoint/model/streams/StreamHandle.java +++ b/privmx-endpoint/src/main/java/com/simplito/java/privmx_endpoint/model/streams/StreamHandle.java @@ -1,13 +1,9 @@ package com.simplito.java.privmx_endpoint.model.streams; public class StreamHandle { - private final Long value; + public final Long value; public StreamHandle(Long value) { this.value = value; } - - public Long getValue() { - return value; - } } \ No newline at end of file From b53b906aa496630c8ba614739a12ec5b2e7cddb4 Mon Sep 17 00:00:00 2001 From: Doominika Date: Mon, 1 Dec 2025 11:35:25 +0100 Subject: [PATCH 28/30] chore: fix contents of arguments passed to null-check function --- privmx-endpoint/src/main/cpp/modules/StreamApi.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/privmx-endpoint/src/main/cpp/modules/StreamApi.cpp b/privmx-endpoint/src/main/cpp/modules/StreamApi.cpp index 8a8f6cd0..bb3f4a82 100644 --- a/privmx-endpoint/src/main/cpp/modules/StreamApi.cpp +++ b/privmx-endpoint/src/main/cpp/modules/StreamApi.cpp @@ -148,7 +148,7 @@ Java_com_simplito_java_privmx_1endpoint_modules_stream_StreamApi_addTrack( ) { JniContextUtils ctx(env); if (ctx.nullCheck(stream_handle, "Stream Handle") || - ctx.nullCheck(track, "Media Device")) { + ctx.nullCheck(track, "Track")) { return; } ctx.callVoidEndpointApi([&ctx, &thiz, &stream_handle, &track]() { @@ -168,7 +168,7 @@ Java_com_simplito_java_privmx_1endpoint_modules_stream_StreamApi_removeTrack( ) { JniContextUtils ctx(env); if (ctx.nullCheck(stream_handle, "Stream Handle") || - ctx.nullCheck(track, "Media Device")) { + ctx.nullCheck(track, "Track")) { return; } ctx.callVoidEndpointApi([&ctx, &thiz, &stream_handle, &track]() { From 11a2c6e9f3624bd5dc27d758e1b07e8d8c9806bc Mon Sep 17 00:00:00 2001 From: Doominika Date: Mon, 1 Dec 2025 11:37:40 +0100 Subject: [PATCH 29/30] feat: add missing null-check --- privmx-endpoint/src/main/cpp/modules/StreamApi.cpp | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/privmx-endpoint/src/main/cpp/modules/StreamApi.cpp b/privmx-endpoint/src/main/cpp/modules/StreamApi.cpp index bb3f4a82..1851b1c6 100644 --- a/privmx-endpoint/src/main/cpp/modules/StreamApi.cpp +++ b/privmx-endpoint/src/main/cpp/modules/StreamApi.cpp @@ -215,6 +215,10 @@ Java_com_simplito_java_privmx_1endpoint_modules_stream_StreamApi_unpublishStream jobject stream_handle ) { JniContextUtils ctx(env); + if (ctx.nullCheck(stream_handle, "Stream Handle")){ + return; + } + ctx.callVoidEndpointApi([&ctx, &thiz, &stream_handle]() { getStreamApi(ctx, thiz)->unpublishStream( parseStreamHandle(ctx, stream_handle) From 8d9b1dce79f5e0b9e5f7f1567e6f35cf63786cf1 Mon Sep 17 00:00:00 2001 From: Doominika Date: Mon, 1 Dec 2025 11:53:01 +0100 Subject: [PATCH 30/30] chore: update OnFrameCallback params names --- .../java/privmx_endpoint/model/streams/OnFrameCallback.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/privmx-endpoint/src/main/java/com/simplito/java/privmx_endpoint/model/streams/OnFrameCallback.java b/privmx-endpoint/src/main/java/com/simplito/java/privmx_endpoint/model/streams/OnFrameCallback.java index aa156855..65f8ba75 100644 --- a/privmx-endpoint/src/main/java/com/simplito/java/privmx_endpoint/model/streams/OnFrameCallback.java +++ b/privmx-endpoint/src/main/java/com/simplito/java/privmx_endpoint/model/streams/OnFrameCallback.java @@ -2,5 +2,5 @@ @FunctionalInterface public interface OnFrameCallback { - void run(long a, long b, Frame c, String d); -} + void run(long width, long height, Frame frame, String id); +} \ No newline at end of file