diff --git a/build.gradle b/build.gradle index abaff405..8ce18ad2 100644 --- a/build.gradle +++ b/build.gradle @@ -11,5 +11,7 @@ buildscript { plugins { alias(libs.plugins.androidLibrary) apply false alias(libs.plugins.kotlin.jvm) apply false + alias(libs.plugins.kotlinMultiplatform) apply false + alias(libs.plugins.android.lint) apply false } diff --git a/examples/privmx-snippets/build.gradle b/examples/privmx-snippets/build.gradle deleted file mode 100644 index 1e5c68bf..00000000 --- a/examples/privmx-snippets/build.gradle +++ /dev/null @@ -1,22 +0,0 @@ -plugins { - alias(libs.plugins.kotlin.jvm) - alias(libs.plugins.kotlinPluginSerialization) - alias(libs.plugins.privmx.install.native) -} - -group = "com.simplito.privmx-endpoint-snippets" -version = "2.2.0" - -kotlin { - jvmToolchain(21) -} - -//privmxEndpointInstallJni { -// version = project.version -//} - -dependencies { - implementation(project(":privmx-endpoint-extra")) - implementation(libs.gson) - implementation(libs.kotlinx.serialization.json) -} \ No newline at end of file diff --git a/examples/privmx-snippets/build.gradle.kts b/examples/privmx-snippets/build.gradle.kts new file mode 100644 index 00000000..ef754007 --- /dev/null +++ b/examples/privmx-snippets/build.gradle.kts @@ -0,0 +1,42 @@ +plugins { + alias(libs.plugins.kotlinMultiplatform) + alias(libs.plugins.kotlinPluginSerialization) + alias(libs.plugins.androidLibrary) + alias(libs.plugins.privmx.install.native) +} + +group = "com.simplito.privmx-endpoint-snippets" +version = "2.2.0" + +android { + namespace = "com.simplito.privmx.endpoint.snippets" + compileSdk = 36 + + defaultConfig { + minSdk = 24 + } +} + +kotlin { + jvm() + androidTarget { + publishLibraryVariants("release", "debug") + } + + sourceSets { + commonMain { + dependencies { + implementation(project(":privmx-endpoint-extra")) + implementation(libs.kotlinx.serialization.json) + } + } + + androidMain { + dependencies { + implementation(project(":privmx-endpoint-streams:android")) + implementation(project(":privmx-endpoint-android")) + implementation(libs.privmx.endpoint.webrtc) + } + } + } +} diff --git a/examples/privmx-snippets/src/androidMain/AndroidManifest.xml b/examples/privmx-snippets/src/androidMain/AndroidManifest.xml new file mode 100644 index 00000000..a5918e68 --- /dev/null +++ b/examples/privmx-snippets/src/androidMain/AndroidManifest.xml @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/examples/privmx-snippets/src/androidMain/kotlin/com/example/shared/Platform.android.kt b/examples/privmx-snippets/src/androidMain/kotlin/com/example/shared/Platform.android.kt new file mode 100644 index 00000000..94195656 --- /dev/null +++ b/examples/privmx-snippets/src/androidMain/kotlin/com/example/shared/Platform.android.kt @@ -0,0 +1,3 @@ +package com.example.shared + +actual fun platform() = "Android" \ No newline at end of file diff --git a/examples/privmx-snippets/src/androidMain/kotlin/com/simplito/privmx/endpoint/snippets/Stacks/JavaKotlin/streams/Overview.kt b/examples/privmx-snippets/src/androidMain/kotlin/com/simplito/privmx/endpoint/snippets/Stacks/JavaKotlin/streams/Overview.kt new file mode 100644 index 00000000..6eacc15e --- /dev/null +++ b/examples/privmx-snippets/src/androidMain/kotlin/com/simplito/privmx/endpoint/snippets/Stacks/JavaKotlin/streams/Overview.kt @@ -0,0 +1,59 @@ +package com.simplito.privmx.endpoint.snippets.Stacks.JavaKotlin.streams + +import Stacks.JavaKotlin.endpointSession +import Stacks.JavaKotlin.stores.StorePublicMeta +import android.content.Context +import com.simplito.java.privmx_endpoint.model.stream.StreamRoom +import com.simplito.java.privmx_endpoint.modules.stream.StreamApi +import com.simplito.java.privmx_endpoint.modules.stream.StreamApiLow +import com.simplito.java.privmx_endpoint_extra.lib.PrivmxEndpoint +import com.simplito.java.privmx_endpoint_extra.lib.PrivmxEndpointContainer +import com.simplito.java.privmx_endpoint_extra.model.Modules +import org.webrtc.EglBase +import org.webrtc.PeerConnection + +lateinit var streamApiLow: StreamApiLow +lateinit var streamApi: StreamApi + +data class StreamRoomItem( + val streamRoom: StreamRoom, + val decodedPrivateMeta: String, + val decodedPublicMeta: StreamRoomPublicMeta +) + +fun initializeStreamApi(context: Context) { + // Create EGL context (required for video rendering) + val eglBase: EglBase = EglBase.create() + val appContext = context.applicationContext + + // Initialize low-level dependency + streamApiLow = endpointSession.initializeStreamApiLow() + + // Create commonMain streaming API + streamApi = StreamApi(appContext, eglBase, streamApiLow) +} + + +fun observingConnectionState() { + val streamRoomId = "STREAM_ROOM_ID" + + streamApi.setConnectionStateObserver(streamRoomId) { state -> + when (state) { + PeerConnection.IceConnectionState.CONNECTED -> { + // handle connected + } + + PeerConnection.IceConnectionState.DISCONNECTED -> { + // handle disconnected + } + + PeerConnection.IceConnectionState.FAILED -> { + // handle failed + } + + else -> { + // handle other WebRTC states + } + } + } +} \ No newline at end of file diff --git a/examples/privmx-snippets/src/androidMain/kotlin/com/simplito/privmx/endpoint/snippets/Stacks/JavaKotlin/streams/StreamRooms.kt b/examples/privmx-snippets/src/androidMain/kotlin/com/simplito/privmx/endpoint/snippets/Stacks/JavaKotlin/streams/StreamRooms.kt new file mode 100644 index 00000000..80ac8513 --- /dev/null +++ b/examples/privmx-snippets/src/androidMain/kotlin/com/simplito/privmx/endpoint/snippets/Stacks/JavaKotlin/streams/StreamRooms.kt @@ -0,0 +1,235 @@ +package com.simplito.privmx.endpoint.snippets.Stacks.JavaKotlin.streams + +import Stacks.JavaKotlin.contextId +import Stacks.JavaKotlin.user1Id +import Stacks.JavaKotlin.user1PublicKey +import Stacks.JavaKotlin.user2Id +import Stacks.JavaKotlin.user2PublicKey +import com.simplito.java.privmx_endpoint.model.PagingList +import com.simplito.java.privmx_endpoint.model.UserWithPubKey +import com.simplito.java.privmx_endpoint.model.stream.StreamRoom +import com.simplito.java.privmx_endpoint_extra.model.SortOrder +import kotlinx.serialization.Serializable +import kotlinx.serialization.encodeToString +import kotlinx.serialization.json.Json + + +// START: Creating Stream Rooms + +fun createStreamRoomBasic() { + val users = listOf( + UserWithPubKey(user1Id, user1PublicKey), + UserWithPubKey(user2Id, user2PublicKey) + ) + val managers = mutableListOf( + UserWithPubKey(user1Id, user1PublicKey) + ) + + val roomId = streamApi.createStreamRoom( + contextId, + users, + managers, + ByteArray(0), // publicMeta + ByteArray(0), // privateMeta, + null // policies + ) +} + +fun createStreamRoomWithName() { + val users: List = listOf( + UserWithPubKey(user1Id, user1PublicKey), + UserWithPubKey(user2Id, user2PublicKey) + ) + val managers: List = listOf( + UserWithPubKey(user1Id, user1PublicKey) + ) + val publicMeta = ByteArray(0) + val streamRoomNameAsPrivateMeta = "New stream room" + + val streamRoomId = streamApi.createStreamRoom( + contextId, + users, + managers, + publicMeta, + streamRoomNameAsPrivateMeta.encodeToByteArray(), + null + ) +} + +@Suppress("UnsafeOptInUsageError") +@Serializable +data class StreamRoomPublicMeta( + val title: String, + val type: String, + val scheduledAt: String +) + +fun createStreamRoomWithPublicMeta() { + val users: List = listOf( + UserWithPubKey(user1Id, user1PublicKey), + UserWithPubKey(user2Id, user2PublicKey) + ) + val managers: List = listOf( + UserWithPubKey(user1Id, user1PublicKey) + ) + val publicMeta = StreamRoomPublicMeta( + title = "Daily meeting #34", + type = "meeting", + scheduledAt = "2026-02-23T10:00:00Z", + ) + val privateMeta = ByteArray(0) + + val roomId: String = streamApi.createStreamRoom( + contextId, + users, + managers, + Json.encodeToString(publicMeta).encodeToByteArray(), + privateMeta, + null // policies + ) +} + +// END: Creating Stream Rooms + + +// START: Getting Stream Rooms + +fun getMostRecentStreamRooms() { + val startIndex = 0L + val pageSize = 100L + + val streamRoomsPagingList: PagingList = streamApi.listStreamRooms( + contextId, + startIndex, + pageSize, + SortOrder.DESC, + null, // lastId + null, // sortBy + null // queryAsJson + ) + + val streamRooms = streamRoomsPagingList.readItems.map { + StreamRoomItem( + it, + it.privateMeta.decodeToString(), + Json.decodeFromString(it.publicMeta.decodeToString()) + ) + } +} + +fun getMostOldestStreamRooms() { + val startIndex = 0L + val pageSize = 100L + + val streamRoomsPagingList: PagingList = streamApi.listStreamRooms( + contextId, + startIndex, + pageSize, + SortOrder.ASC, + null, // lastId + null, // sortBy + null // queryAsJson + ) + + val streamRooms = streamRoomsPagingList.readItems.map { + StreamRoomItem( + it, + it.privateMeta.decodeToString(), + Json.decodeFromString(it.publicMeta.decodeToString()) + ) + } +} + +fun getStreamRoomById() { + val streamRoomId = "STREAM_ROOM_ID" + + val streamRoomItem = streamApi.getStreamRoom(streamRoomId).let { + StreamRoomItem( + it, + it.privateMeta.decodeToString(), + Json.decodeFromString(it.publicMeta.decodeToString()) + ) + } +} + +// END: Getting Stream Rooms + + +// START: Managing Stream Rooms + +fun renamingStreamRoom() { + val streamRoomId = "STREAM_ROOM_ID" + val streamRoom: StreamRoom = streamApi.getStreamRoom(streamRoomId) + + val users = streamRoom.users.map { userId -> + // Your application must provide a way + // to get user's public key from their userId + UserWithPubKey(userId, "USER_PUBLIC_KEY") + } + + val managers = streamRoom.managers.map { userId -> + UserWithPubKey(userId, "USER_PUBLIC_KEY") + } + + val newStreamRoomNameAsPrivateMeta = "New stream room name" + + streamApi.updateStreamRoom( + streamRoomId, + users, + managers, + streamRoom.publicMeta, + newStreamRoomNameAsPrivateMeta.encodeToByteArray(), + streamRoom.version, + false, // force + false, // forceGenerateNewKey + null // policies + ) +} + +fun removingUserFromStreamRoom() { + val streamRoomId = "STREAM_ROOM_ID" + val streamRoom: StreamRoom = streamApi.getStreamRoom(streamRoomId) + val userToRemove = "USERID_TO_REMOVE" + val newUsers = streamRoom + .users + .filter { + it != userToRemove + }.map { userId -> + // Your application must provide a way, + // to get user's public key from their userId. + UserWithPubKey( + userId, + "USER_PUBLIC_KEY" + ) + } + val managers = streamRoom + .managers + .map { userId -> + // Your application must provide a way, + // to get user's public key from their userId. + UserWithPubKey( + userId, + "USER_PUBLIC_KEY" + ) + } + + streamApi.updateStreamRoom( + streamRoomId, + newUsers, + managers, + streamRoom.publicMeta, + streamRoom.privateMeta, + streamRoom.version, + false, // force + false, //forceGenerateNewKey + null // policies + ) +} + +fun deletingStreamRoom() { + val streamRoomId = "STREAM_ROOM_ID" + + streamApi.deleteStreamRoom(streamRoomId) +} + +// END: Managing Stream Rooms \ No newline at end of file diff --git a/examples/privmx-snippets/src/androidMain/kotlin/com/simplito/privmx/endpoint/snippets/Stacks/JavaKotlin/streams/Streams.kt b/examples/privmx-snippets/src/androidMain/kotlin/com/simplito/privmx/endpoint/snippets/Stacks/JavaKotlin/streams/Streams.kt new file mode 100644 index 00000000..8ca8e08f --- /dev/null +++ b/examples/privmx-snippets/src/androidMain/kotlin/com/simplito/privmx/endpoint/snippets/Stacks/JavaKotlin/streams/Streams.kt @@ -0,0 +1,221 @@ +package com.simplito.privmx.endpoint.snippets.Stacks.JavaKotlin.streams + +import com.simplito.java.privmx_endpoint.model.stream.StreamHandle +import com.simplito.java.privmx_endpoint.model.stream.StreamInfo +import com.simplito.java.privmx_endpoint.model.stream.StreamPublishResult +import com.simplito.java.privmx_endpoint.model.stream.StreamSubscription +import com.simplito.java.privmx_endpoint.modules.stream.TrackObserver +import org.webrtc.AudioTrack +import org.webrtc.MediaStreamTrack +import org.webrtc.VideoTrack + + +// START: Join and Leave Stream Room + +fun joiningStreamRoom() { + val streamRoomId = "STREAM_ROOM_ID" + + streamApi.joinStreamRoom(streamRoomId) +} + +fun leavingStreamRoom() { + val streamRoomId = "STREAM_ROOM_ID" + + streamApi.leaveStreamRoom(streamRoomId) +} + +// END: Join and Leave Stream Room + + +// START: Create Stream + +fun creatingStream(): StreamHandle { + val streamRoomId = "STREAM_ROOM_ID" + + // 1. Create tracks + // Create sources from device input + val videoSource = streamApi.trackFactory.createVideoSource(false /* isScreenCast */) + val audioSource = streamApi.trackFactory.createAudioSource() + + // Wrap in tracks + val videoTrack = streamApi.trackFactory.createVideoTrack("video0", videoSource) + val audioTrack = streamApi.trackFactory.createAudioTrack("audio0", audioSource) + + + // 2. Create stream and attach tracks + val streamHandle: StreamHandle = streamApi.createStream(streamRoomId) + + streamApi.addTrack(streamHandle, videoTrack) + streamApi.addTrack(streamHandle, audioTrack) + + return streamHandle +} +// END: Create Stream + + +// START: Publish Stream + +fun publishingStream(streamHandle: StreamHandle) { + val streamPublishResult: StreamPublishResult = streamApi.publishStream(streamHandle) +} + +// END: Publish Stream + + +// START: Modify Streams + +fun updatingStream(streamHandle: StreamHandle) { + val streamPublishResult: StreamPublishResult = streamApi.updateStream(streamHandle) +} + +// END: Modify Streams + + +// START: Unpublish Stream + +fun unpublishingStream(streamHandle: StreamHandle) { + streamApi.unpublishStream(streamHandle) +} + +// END: Unpublish Stream + + +// START: Manage Media Tracks + +fun createVideoTrack(): VideoTrack { + // Create source from device input + val videoSource = streamApi.trackFactory.createVideoSource(false /* isScreenCast */) + + // Wrap in track + return streamApi.trackFactory.createVideoTrack("video0", videoSource) +} + +fun createAudioTrack(): AudioTrack { + // Create source from device input + val audioSource = streamApi.trackFactory.createAudioSource() + + // Wrap in track + return streamApi.trackFactory.createAudioTrack("audio0", audioSource) +} + +fun removeAudioTrack(streamHandle: StreamHandle, audioTrack: MediaStreamTrack) { + streamApi.removeTrack(streamHandle, audioTrack) +} + +fun removeVideoTrack(streamHandle: StreamHandle, videoTrack: VideoTrack) { + streamApi.removeTrack(streamHandle, videoTrack) +} + +fun observingAllTracks() { + val streamRoomId = "STREAM_ROOM_ID" + + streamApi.setTrackObserver(streamRoomId, object : TrackObserver { + override fun OnRemoteTrack(streamId: String?, track: MediaStreamTrack?) { + // handle remote tracks + } + }) +} + +fun observingSpecificStreamTracks() { + val streamRoomId = "STREAM_ROOM_ID" + val streamId = "STREAM_ID" + + streamApi.setTrackObserver( + streamRoomId, object : TrackObserver { + override fun OnRemoteTrack(streamId: String?, track: MediaStreamTrack?) { + // handle remote tracks + } + }, + streamId + ) +} +// END: Manage Media Tracks + + +// START: List Streams + +fun listStreams() { + val streamRoomId = "STREAM_ROOM_ID" + + val streams: List = streamApi.listStreams(streamRoomId) +} + +// END: List Streams + + +// START: Manage Remote Streams Subscriptions + +fun subscribingToAllRemoteStreams() : List { + val streamRoomId = "STREAM_ROOM_ID" + + val subscriptions: List = streamApi.listStreams(streamRoomId) + .flatMap { stream -> + stream.tracks.map { track -> + StreamSubscription( + stream.id, + track.mid + ) + } + }.toList() + + streamApi.subscribeToRemoteStreams(streamRoomId, subscriptions) + + return subscriptions +} + +fun subscribingToUserRemoteStreams(): List { + val streamRoomId = "STREAM_ROOM_ID" + val userId = "USER_ID" + + val subscriptions: List = streamApi.listStreams(streamRoomId) + .filter { it.userId == userId } + .flatMap { stream -> + stream.tracks.map { track -> + StreamSubscription( + stream.id, + track.mid + ) + } + }.toList() + + streamApi.subscribeToRemoteStreams(streamRoomId, subscriptions) + + return subscriptions +} + +fun unsubscribingFromRemoteStreams(subscriptionsToRemove: List) { + val streamRoomId = "STREAM_ROOM_ID" + + // unsubscribe from previously tracked remote subscriptions + streamApi.unsubscribeFromRemoteStreams(streamRoomId, subscriptionsToRemove) +} + +fun modifySRemoteSubscriptions(previousSubscriptions: List) { + val streamRoomId = "STREAM_ROOM_ID" + + // Fetch the latest available streams and map them to subscriptions + val currentSubscriptions: List = streamApi.listStreams(streamRoomId) + .flatMap { stream -> + stream.tracks.map { track -> + StreamSubscription( + stream.id, + track.mid + ) + } + }.toList() + + // Calculate differences between previous and current subscriptions + // new tracks that were not subscribed before + val subscriptionsToAdd = currentSubscriptions - previousSubscriptions; + + // tracks that are no longer available + val subscriptionsToRemove = previousSubscriptions - currentSubscriptions; + + streamApi.modifyRemoteStreamsSubscriptions( + streamRoomId, + subscriptionsToAdd, + subscriptionsToRemove + ) +} + +// END: Manage Remote Streams Subscriptions diff --git a/examples/privmx-snippets/src/main/java/Stacks/JavaKotlin/PrivMXEndpointJava.java b/examples/privmx-snippets/src/commonMain/java/Stacks/JavaKotlin/PrivMXEndpointJava.java similarity index 100% rename from examples/privmx-snippets/src/main/java/Stacks/JavaKotlin/PrivMXEndpointJava.java rename to examples/privmx-snippets/src/commonMain/java/Stacks/JavaKotlin/PrivMXEndpointJava.java diff --git a/examples/privmx-snippets/src/main/java/Tools/Inboxes/UsingInboxes/InboxEntries.java b/examples/privmx-snippets/src/commonMain/java/Tools/Inboxes/UsingInboxes/InboxEntries.java similarity index 100% rename from examples/privmx-snippets/src/main/java/Tools/Inboxes/UsingInboxes/InboxEntries.java rename to examples/privmx-snippets/src/commonMain/java/Tools/Inboxes/UsingInboxes/InboxEntries.java diff --git a/examples/privmx-snippets/src/main/java/Tools/Inboxes/UsingInboxes/InboxUpdates.java b/examples/privmx-snippets/src/commonMain/java/Tools/Inboxes/UsingInboxes/InboxUpdates.java similarity index 95% rename from examples/privmx-snippets/src/main/java/Tools/Inboxes/UsingInboxes/InboxUpdates.java rename to examples/privmx-snippets/src/commonMain/java/Tools/Inboxes/UsingInboxes/InboxUpdates.java index cc0e9ca6..e37affef 100644 --- a/examples/privmx-snippets/src/main/java/Tools/Inboxes/UsingInboxes/InboxUpdates.java +++ b/examples/privmx-snippets/src/commonMain/java/Tools/Inboxes/UsingInboxes/InboxUpdates.java @@ -42,4 +42,8 @@ void handlingInboxEvents() { endpointSession.unregisterCallbacks(inboxCallbacksGroup, entryCallbacksGroup); } + + public static void main(String[] args){ + System.out.println("COS"); + } } \ No newline at end of file diff --git a/examples/privmx-snippets/src/main/java/Tools/Inboxes/UsingInboxes/WorkingWithInboxes.java b/examples/privmx-snippets/src/commonMain/java/Tools/Inboxes/UsingInboxes/WorkingWithInboxes.java similarity index 100% rename from examples/privmx-snippets/src/main/java/Tools/Inboxes/UsingInboxes/WorkingWithInboxes.java rename to examples/privmx-snippets/src/commonMain/java/Tools/Inboxes/UsingInboxes/WorkingWithInboxes.java diff --git a/examples/privmx-snippets/src/main/java/Tools/Kvdbs/UsingKvdbs/ListeningForChanges.java b/examples/privmx-snippets/src/commonMain/java/Tools/Kvdbs/UsingKvdbs/ListeningForChanges.java similarity index 100% rename from examples/privmx-snippets/src/main/java/Tools/Kvdbs/UsingKvdbs/ListeningForChanges.java rename to examples/privmx-snippets/src/commonMain/java/Tools/Kvdbs/UsingKvdbs/ListeningForChanges.java diff --git a/examples/privmx-snippets/src/main/java/Tools/Kvdbs/UsingKvdbs/ManagingEntries.java b/examples/privmx-snippets/src/commonMain/java/Tools/Kvdbs/UsingKvdbs/ManagingEntries.java similarity index 100% rename from examples/privmx-snippets/src/main/java/Tools/Kvdbs/UsingKvdbs/ManagingEntries.java rename to examples/privmx-snippets/src/commonMain/java/Tools/Kvdbs/UsingKvdbs/ManagingEntries.java diff --git a/examples/privmx-snippets/src/main/java/Tools/Kvdbs/UsingKvdbs/ManagingKvdbs.java b/examples/privmx-snippets/src/commonMain/java/Tools/Kvdbs/UsingKvdbs/ManagingKvdbs.java similarity index 100% rename from examples/privmx-snippets/src/main/java/Tools/Kvdbs/UsingKvdbs/ManagingKvdbs.java rename to examples/privmx-snippets/src/commonMain/java/Tools/Kvdbs/UsingKvdbs/ManagingKvdbs.java diff --git a/examples/privmx-snippets/src/main/java/Tools/Stores/UsingStores/DownloadingFiles.java b/examples/privmx-snippets/src/commonMain/java/Tools/Stores/UsingStores/DownloadingFiles.java similarity index 100% rename from examples/privmx-snippets/src/main/java/Tools/Stores/UsingStores/DownloadingFiles.java rename to examples/privmx-snippets/src/commonMain/java/Tools/Stores/UsingStores/DownloadingFiles.java diff --git a/examples/privmx-snippets/src/main/java/Tools/Stores/UsingStores/ManagingFiles.java b/examples/privmx-snippets/src/commonMain/java/Tools/Stores/UsingStores/ManagingFiles.java similarity index 100% rename from examples/privmx-snippets/src/main/java/Tools/Stores/UsingStores/ManagingFiles.java rename to examples/privmx-snippets/src/commonMain/java/Tools/Stores/UsingStores/ManagingFiles.java diff --git a/examples/privmx-snippets/src/main/java/Tools/Stores/UsingStores/ManagingStores.java b/examples/privmx-snippets/src/commonMain/java/Tools/Stores/UsingStores/ManagingStores.java similarity index 100% rename from examples/privmx-snippets/src/main/java/Tools/Stores/UsingStores/ManagingStores.java rename to examples/privmx-snippets/src/commonMain/java/Tools/Stores/UsingStores/ManagingStores.java diff --git a/examples/privmx-snippets/src/main/java/Tools/Stores/UsingStores/StoreEventsInRealTime.java b/examples/privmx-snippets/src/commonMain/java/Tools/Stores/UsingStores/StoreEventsInRealTime.java similarity index 100% rename from examples/privmx-snippets/src/main/java/Tools/Stores/UsingStores/StoreEventsInRealTime.java rename to examples/privmx-snippets/src/commonMain/java/Tools/Stores/UsingStores/StoreEventsInRealTime.java diff --git a/examples/privmx-snippets/src/main/java/Tools/Stores/UsingStores/UploadingFiles.java b/examples/privmx-snippets/src/commonMain/java/Tools/Stores/UsingStores/UploadingFiles.java similarity index 100% rename from examples/privmx-snippets/src/main/java/Tools/Stores/UsingStores/UploadingFiles.java rename to examples/privmx-snippets/src/commonMain/java/Tools/Stores/UsingStores/UploadingFiles.java diff --git a/examples/privmx-snippets/src/main/java/Tools/Threads/UsingThreads/ManagingMessages.java b/examples/privmx-snippets/src/commonMain/java/Tools/Threads/UsingThreads/ManagingMessages.java similarity index 100% rename from examples/privmx-snippets/src/main/java/Tools/Threads/UsingThreads/ManagingMessages.java rename to examples/privmx-snippets/src/commonMain/java/Tools/Threads/UsingThreads/ManagingMessages.java diff --git a/examples/privmx-snippets/src/main/java/Tools/Threads/UsingThreads/ManagingThreads.java b/examples/privmx-snippets/src/commonMain/java/Tools/Threads/UsingThreads/ManagingThreads.java similarity index 100% rename from examples/privmx-snippets/src/main/java/Tools/Threads/UsingThreads/ManagingThreads.java rename to examples/privmx-snippets/src/commonMain/java/Tools/Threads/UsingThreads/ManagingThreads.java diff --git a/examples/privmx-snippets/src/main/java/Tools/Threads/UsingThreads/RealTimeCommunication.java b/examples/privmx-snippets/src/commonMain/java/Tools/Threads/UsingThreads/RealTimeCommunication.java similarity index 100% rename from examples/privmx-snippets/src/main/java/Tools/Threads/UsingThreads/RealTimeCommunication.java rename to examples/privmx-snippets/src/commonMain/java/Tools/Threads/UsingThreads/RealTimeCommunication.java diff --git a/examples/privmx-snippets/src/main/java/Tools/Threads/UsingThreads/SendingMessages.java b/examples/privmx-snippets/src/commonMain/java/Tools/Threads/UsingThreads/SendingMessages.java similarity index 100% rename from examples/privmx-snippets/src/main/java/Tools/Threads/UsingThreads/SendingMessages.java rename to examples/privmx-snippets/src/commonMain/java/Tools/Threads/UsingThreads/SendingMessages.java diff --git a/examples/privmx-snippets/src/commonMain/jniLibs/arm64/libPocoCrypto.dylib b/examples/privmx-snippets/src/commonMain/jniLibs/arm64/libPocoCrypto.dylib new file mode 100755 index 00000000..51c1055c Binary files /dev/null and b/examples/privmx-snippets/src/commonMain/jniLibs/arm64/libPocoCrypto.dylib differ diff --git a/examples/privmx-snippets/src/commonMain/jniLibs/arm64/libPocoFoundation.dylib b/examples/privmx-snippets/src/commonMain/jniLibs/arm64/libPocoFoundation.dylib new file mode 100755 index 00000000..6ec6e878 Binary files /dev/null and b/examples/privmx-snippets/src/commonMain/jniLibs/arm64/libPocoFoundation.dylib differ diff --git a/examples/privmx-snippets/src/commonMain/jniLibs/arm64/libPocoJSON.dylib b/examples/privmx-snippets/src/commonMain/jniLibs/arm64/libPocoJSON.dylib new file mode 100755 index 00000000..86172e50 Binary files /dev/null and b/examples/privmx-snippets/src/commonMain/jniLibs/arm64/libPocoJSON.dylib differ diff --git a/examples/privmx-snippets/src/commonMain/jniLibs/arm64/libPocoNet.dylib b/examples/privmx-snippets/src/commonMain/jniLibs/arm64/libPocoNet.dylib new file mode 100755 index 00000000..33320918 Binary files /dev/null and b/examples/privmx-snippets/src/commonMain/jniLibs/arm64/libPocoNet.dylib differ diff --git a/examples/privmx-snippets/src/commonMain/jniLibs/arm64/libPocoNetSSL.dylib b/examples/privmx-snippets/src/commonMain/jniLibs/arm64/libPocoNetSSL.dylib new file mode 100755 index 00000000..0d1a4687 Binary files /dev/null and b/examples/privmx-snippets/src/commonMain/jniLibs/arm64/libPocoNetSSL.dylib differ diff --git a/examples/privmx-snippets/src/commonMain/jniLibs/arm64/libPocoUtil.dylib b/examples/privmx-snippets/src/commonMain/jniLibs/arm64/libPocoUtil.dylib new file mode 100755 index 00000000..01ea437c Binary files /dev/null and b/examples/privmx-snippets/src/commonMain/jniLibs/arm64/libPocoUtil.dylib differ diff --git a/examples/privmx-snippets/src/commonMain/jniLibs/arm64/libPocoXML.dylib b/examples/privmx-snippets/src/commonMain/jniLibs/arm64/libPocoXML.dylib new file mode 100755 index 00000000..9af6b892 Binary files /dev/null and b/examples/privmx-snippets/src/commonMain/jniLibs/arm64/libPocoXML.dylib differ diff --git a/examples/privmx-snippets/src/commonMain/jniLibs/arm64/libPson.dylib b/examples/privmx-snippets/src/commonMain/jniLibs/arm64/libPson.dylib new file mode 100755 index 00000000..fc3bee88 Binary files /dev/null and b/examples/privmx-snippets/src/commonMain/jniLibs/arm64/libPson.dylib differ diff --git a/examples/privmx-snippets/src/commonMain/jniLibs/arm64/libcrypto.dylib b/examples/privmx-snippets/src/commonMain/jniLibs/arm64/libcrypto.dylib new file mode 100755 index 00000000..23741ff1 Binary files /dev/null and b/examples/privmx-snippets/src/commonMain/jniLibs/arm64/libcrypto.dylib differ diff --git a/examples/privmx-snippets/src/commonMain/jniLibs/arm64/libgmp.dylib b/examples/privmx-snippets/src/commonMain/jniLibs/arm64/libgmp.dylib new file mode 100755 index 00000000..e5436a9b Binary files /dev/null and b/examples/privmx-snippets/src/commonMain/jniLibs/arm64/libgmp.dylib differ diff --git a/examples/privmx-snippets/src/commonMain/jniLibs/arm64/libprivmx-endpoint-java.dylib b/examples/privmx-snippets/src/commonMain/jniLibs/arm64/libprivmx-endpoint-java.dylib new file mode 100755 index 00000000..71eb177f Binary files /dev/null and b/examples/privmx-snippets/src/commonMain/jniLibs/arm64/libprivmx-endpoint-java.dylib differ diff --git a/examples/privmx-snippets/src/commonMain/jniLibs/arm64/libprivmx.dylib b/examples/privmx-snippets/src/commonMain/jniLibs/arm64/libprivmx.dylib new file mode 100755 index 00000000..633272d8 Binary files /dev/null and b/examples/privmx-snippets/src/commonMain/jniLibs/arm64/libprivmx.dylib differ diff --git a/examples/privmx-snippets/src/commonMain/jniLibs/arm64/libprivmxendpointcore.dylib b/examples/privmx-snippets/src/commonMain/jniLibs/arm64/libprivmxendpointcore.dylib new file mode 100755 index 00000000..9aa053b3 Binary files /dev/null and b/examples/privmx-snippets/src/commonMain/jniLibs/arm64/libprivmxendpointcore.dylib differ diff --git a/examples/privmx-snippets/src/commonMain/jniLibs/arm64/libprivmxendpointcrypto.dylib b/examples/privmx-snippets/src/commonMain/jniLibs/arm64/libprivmxendpointcrypto.dylib new file mode 100755 index 00000000..60e23628 Binary files /dev/null and b/examples/privmx-snippets/src/commonMain/jniLibs/arm64/libprivmxendpointcrypto.dylib differ diff --git a/examples/privmx-snippets/src/commonMain/jniLibs/arm64/libprivmxendpointevent.dylib b/examples/privmx-snippets/src/commonMain/jniLibs/arm64/libprivmxendpointevent.dylib new file mode 100755 index 00000000..2f83b93d Binary files /dev/null and b/examples/privmx-snippets/src/commonMain/jniLibs/arm64/libprivmxendpointevent.dylib differ diff --git a/examples/privmx-snippets/src/commonMain/jniLibs/arm64/libprivmxendpointinbox.dylib b/examples/privmx-snippets/src/commonMain/jniLibs/arm64/libprivmxendpointinbox.dylib new file mode 100755 index 00000000..ad3d401f Binary files /dev/null and b/examples/privmx-snippets/src/commonMain/jniLibs/arm64/libprivmxendpointinbox.dylib differ diff --git a/examples/privmx-snippets/src/commonMain/jniLibs/arm64/libprivmxendpointkvdb.dylib b/examples/privmx-snippets/src/commonMain/jniLibs/arm64/libprivmxendpointkvdb.dylib new file mode 100755 index 00000000..e70927b8 Binary files /dev/null and b/examples/privmx-snippets/src/commonMain/jniLibs/arm64/libprivmxendpointkvdb.dylib differ diff --git a/examples/privmx-snippets/src/commonMain/jniLibs/arm64/libprivmxendpointstore.dylib b/examples/privmx-snippets/src/commonMain/jniLibs/arm64/libprivmxendpointstore.dylib new file mode 100755 index 00000000..0b94aab1 Binary files /dev/null and b/examples/privmx-snippets/src/commonMain/jniLibs/arm64/libprivmxendpointstore.dylib differ diff --git a/examples/privmx-snippets/src/commonMain/jniLibs/arm64/libprivmxendpointthread.dylib b/examples/privmx-snippets/src/commonMain/jniLibs/arm64/libprivmxendpointthread.dylib new file mode 100755 index 00000000..1373ea3e Binary files /dev/null and b/examples/privmx-snippets/src/commonMain/jniLibs/arm64/libprivmxendpointthread.dylib differ diff --git a/examples/privmx-snippets/src/commonMain/jniLibs/arm64/libssl.dylib b/examples/privmx-snippets/src/commonMain/jniLibs/arm64/libssl.dylib new file mode 100755 index 00000000..2ffe5902 Binary files /dev/null and b/examples/privmx-snippets/src/commonMain/jniLibs/arm64/libssl.dylib differ diff --git a/examples/privmx-snippets/src/main/kotlin/Projects/PrivMXEndpoint/Certificates.kt b/examples/privmx-snippets/src/commonMain/kotlin/Projects/PrivMXEndpoint/Certificates.kt similarity index 100% rename from examples/privmx-snippets/src/main/kotlin/Projects/PrivMXEndpoint/Certificates.kt rename to examples/privmx-snippets/src/commonMain/kotlin/Projects/PrivMXEndpoint/Certificates.kt diff --git a/examples/privmx-snippets/src/main/kotlin/Stacks/JavaKotlin/CustomFieldsAndQueries.kt b/examples/privmx-snippets/src/commonMain/kotlin/Stacks/JavaKotlin/CustomFieldsAndQueries.kt similarity index 100% rename from examples/privmx-snippets/src/main/kotlin/Stacks/JavaKotlin/CustomFieldsAndQueries.kt rename to examples/privmx-snippets/src/commonMain/kotlin/Stacks/JavaKotlin/CustomFieldsAndQueries.kt diff --git a/examples/privmx-snippets/src/main/kotlin/Stacks/JavaKotlin/PolicyBuilders.kt b/examples/privmx-snippets/src/commonMain/kotlin/Stacks/JavaKotlin/PolicyBuilders.kt similarity index 100% rename from examples/privmx-snippets/src/main/kotlin/Stacks/JavaKotlin/PolicyBuilders.kt rename to examples/privmx-snippets/src/commonMain/kotlin/Stacks/JavaKotlin/PolicyBuilders.kt diff --git a/examples/privmx-snippets/src/main/kotlin/Stacks/JavaKotlin/PrivMXEndpointJava.kt b/examples/privmx-snippets/src/commonMain/kotlin/Stacks/JavaKotlin/PrivMXEndpointJava.kt similarity index 100% rename from examples/privmx-snippets/src/main/kotlin/Stacks/JavaKotlin/PrivMXEndpointJava.kt rename to examples/privmx-snippets/src/commonMain/kotlin/Stacks/JavaKotlin/PrivMXEndpointJava.kt diff --git a/examples/privmx-snippets/src/main/kotlin/Stacks/JavaKotlin/events/CustomEvents.kt b/examples/privmx-snippets/src/commonMain/kotlin/Stacks/JavaKotlin/events/CustomEvents.kt similarity index 100% rename from examples/privmx-snippets/src/main/kotlin/Stacks/JavaKotlin/events/CustomEvents.kt rename to examples/privmx-snippets/src/commonMain/kotlin/Stacks/JavaKotlin/events/CustomEvents.kt diff --git a/examples/privmx-snippets/src/main/kotlin/Stacks/JavaKotlin/events/HandlingEvents.kt b/examples/privmx-snippets/src/commonMain/kotlin/Stacks/JavaKotlin/events/HandlingEvents.kt similarity index 74% rename from examples/privmx-snippets/src/main/kotlin/Stacks/JavaKotlin/events/HandlingEvents.kt rename to examples/privmx-snippets/src/commonMain/kotlin/Stacks/JavaKotlin/events/HandlingEvents.kt index 6180238d..886b82b3 100644 --- a/examples/privmx-snippets/src/main/kotlin/Stacks/JavaKotlin/events/HandlingEvents.kt +++ b/examples/privmx-snippets/src/commonMain/kotlin/Stacks/JavaKotlin/events/HandlingEvents.kt @@ -6,6 +6,16 @@ import com.simplito.java.privmx_endpoint.model.events.eventSelectorTypes.InboxEv import com.simplito.java.privmx_endpoint.model.events.eventSelectorTypes.KvdbEventSelectorType import com.simplito.java.privmx_endpoint.model.events.eventSelectorTypes.StoreEventSelectorType import com.simplito.java.privmx_endpoint.model.events.eventSelectorTypes.ThreadEventSelectorType +import com.simplito.java.privmx_endpoint.model.stream.StreamRoom +import com.simplito.java.privmx_endpoint.model.stream.events.NewStreams +import com.simplito.java.privmx_endpoint.model.stream.events.StreamEventData +import com.simplito.java.privmx_endpoint.model.stream.events.StreamLeftEventData +import com.simplito.java.privmx_endpoint.model.stream.events.StreamPublishedEventData +import com.simplito.java.privmx_endpoint.model.stream.events.StreamRoomDeletedEventData +import com.simplito.java.privmx_endpoint.model.stream.events.StreamUnpublishedEventData +import com.simplito.java.privmx_endpoint.model.stream.events.StreamUpdatedEventData +import com.simplito.java.privmx_endpoint.model.stream.events.StreamsUpdatedData +import com.simplito.java.privmx_endpoint.model.stream.events.eventSelectorTypes.StreamEventSelectorType import com.simplito.java.privmx_endpoint_extra.events.CallbackRegistration import com.simplito.java.privmx_endpoint_extra.events.EventType @@ -437,3 +447,117 @@ fun handlingKvdbEntriesEvents() { ) } // END: KVDBs events snippets + + +fun handlingStreamRoomEvents() { + val callbacksGroup = "CALLBACKS_GROUP" + + endpointSession.registerManyCallbacks( + CallbackRegistration( + callbacksGroup, + EventType.StreamRoomCreatedEvent(contextId) + ) { newStreamRoom: StreamRoom -> + // some actions when a new stream room is created + }, + + CallbackRegistration( + callbacksGroup, + EventType.StreamRoomUpdatedEvent( + StreamEventSelectorType.CONTEXT_ID, + contextId + ) + ) { updatedStreamRoom: StreamRoom -> + // some actions when a stream room is updated + }, + + CallbackRegistration( + callbacksGroup, + EventType.StreamRoomDeletedEvent( + StreamEventSelectorType.CONTEXT_ID, + contextId + ) + ) { deletedStreamRoomData: StreamRoomDeletedEventData -> + // some actions when a stream room is deleted + } + ) +} + +fun handlingStreamEvents() { + val callbacksGroup = "CALLBACKS_GROUP" + val streamRoomId = "STREAM_ROOM_ID" + + endpointSession.registerManyCallbacks( + CallbackRegistration( + callbacksGroup, + EventType.StreamPublishedEvent( + StreamEventSelectorType.STREAMROOM_ID, + streamRoomId + ) + ) { publishedStreamData: StreamPublishedEventData -> + // some actions when stream is published in the specified room + }, + + CallbackRegistration( + callbacksGroup, + EventType.StreamUnpublishedEvent( + StreamEventSelectorType.STREAMROOM_ID, + streamRoomId + ) + ) { unpublishedStreamData: StreamUnpublishedEventData -> + // some actions when stream is unpublished from the specified room + }, + + CallbackRegistration( + callbacksGroup, + EventType.StreamUpdatedEvent( + StreamEventSelectorType.CONTEXT_ID, + contextId + ) + ) { updatedStreamData: StreamUpdatedEventData -> + // some actions when stream data is updated + }, + + CallbackRegistration( + callbacksGroup, + EventType.StreamJoinedEvent( + StreamEventSelectorType.CONTEXT_ID, + contextId + ) + ) { joinedEventData: StreamEventData -> + // some actions when user joins stream room + }, + + CallbackRegistration( + callbacksGroup, + EventType.StreamLeftEvent( + StreamEventSelectorType.CONTEXT_ID, + contextId + ) + ) { leftEventData: StreamLeftEventData -> + // some actions when user leaves stream room + // e.g. update remote subscriptions list + }, + + CallbackRegistration( + callbacksGroup, + EventType.RemoteStreamsChangedEvent( + StreamEventSelectorType.CONTEXT_ID, + contextId + ) + ) { remoteStreams: NewStreams -> + // some actions when remote streams change + // e.g. update remote subscriptions list + }, + + CallbackRegistration( + callbacksGroup, + EventType.StreamsUpdatedEvent( + StreamEventSelectorType.CONTEXT_ID, + contextId + ) + ) { streamsUpdated: StreamsUpdatedData -> + // some actions when multiple streams updated + // e.g. update remote subscriptions list + } + ) +} \ No newline at end of file diff --git a/examples/privmx-snippets/src/main/kotlin/Stacks/JavaKotlin/events/Overview.kt b/examples/privmx-snippets/src/commonMain/kotlin/Stacks/JavaKotlin/events/Overview.kt similarity index 100% rename from examples/privmx-snippets/src/main/kotlin/Stacks/JavaKotlin/events/Overview.kt rename to examples/privmx-snippets/src/commonMain/kotlin/Stacks/JavaKotlin/events/Overview.kt diff --git a/examples/privmx-snippets/src/main/kotlin/Stacks/JavaKotlin/inboxes/Entries.kt b/examples/privmx-snippets/src/commonMain/kotlin/Stacks/JavaKotlin/inboxes/Entries.kt similarity index 100% rename from examples/privmx-snippets/src/main/kotlin/Stacks/JavaKotlin/inboxes/Entries.kt rename to examples/privmx-snippets/src/commonMain/kotlin/Stacks/JavaKotlin/inboxes/Entries.kt diff --git a/examples/privmx-snippets/src/main/kotlin/Stacks/JavaKotlin/inboxes/Overview.kt b/examples/privmx-snippets/src/commonMain/kotlin/Stacks/JavaKotlin/inboxes/Overview.kt similarity index 72% rename from examples/privmx-snippets/src/main/kotlin/Stacks/JavaKotlin/inboxes/Overview.kt rename to examples/privmx-snippets/src/commonMain/kotlin/Stacks/JavaKotlin/inboxes/Overview.kt index 90beb53d..2b801b8d 100644 --- a/examples/privmx-snippets/src/main/kotlin/Stacks/JavaKotlin/inboxes/Overview.kt +++ b/examples/privmx-snippets/src/commonMain/kotlin/Stacks/JavaKotlin/inboxes/Overview.kt @@ -1,14 +1,16 @@ package Stacks.JavaKotlin.inboxes import Stacks.JavaKotlin.contextId -import com.simplito.java.privmx_endpoint.model.FilesConfig -import com.simplito.java.privmx_endpoint.model.UserWithPubKey import Stacks.JavaKotlin.endpointSession import Stacks.JavaKotlin.user1Id import Stacks.JavaKotlin.user1PublicKey import Stacks.JavaKotlin.user2Id import Stacks.JavaKotlin.user2PublicKey +import com.simplito.java.privmx_endpoint.model.ContainerPolicy +import com.simplito.java.privmx_endpoint.model.FilesConfig import com.simplito.java.privmx_endpoint.model.Inbox +import com.simplito.java.privmx_endpoint.model.ItemPolicy +import com.simplito.java.privmx_endpoint.model.UserWithPubKey import com.simplito.java.privmx_endpoint.modules.inbox.InboxApi import com.simplito.java.privmx_endpoint_extra.model.SortOrder import kotlinx.serialization.Serializable @@ -32,12 +34,12 @@ data class InboxItem( // START: Creating Inboxes snippets -fun createInboxBasic(){ - val users : List = listOf( +fun createInboxBasic() { + val users: List = listOf( UserWithPubKey(user1Id, user1PublicKey), UserWithPubKey(user2Id, user2PublicKey) ) - val managers : List = listOf( + val managers: List = listOf( UserWithPubKey(user1Id, user1PublicKey) ) val publicMeta = ByteArray(0) @@ -52,18 +54,18 @@ fun createInboxBasic(){ ) } -fun createInboxWithConfig(){ +fun createInboxWithConfig() { val filesConfig = FilesConfig( 0L, //minCount 10L, //maxCount 500L, //maxFileSize 2000L //maxWholeUploadSize ) - val users : List = listOf( + val users: List = listOf( UserWithPubKey(user1Id, user1PublicKey), UserWithPubKey(user2Id, user2PublicKey) ) - val managers : List = listOf( + val managers: List = listOf( UserWithPubKey(user1Id, user1PublicKey) ) val publicMeta = ByteArray(0) @@ -80,11 +82,11 @@ fun createInboxWithConfig(){ } fun createInboxWithName() { - val users : List = listOf( + val users: List = listOf( UserWithPubKey(user1Id, user1PublicKey), UserWithPubKey(user2Id, user2PublicKey) ) - val managers : List = listOf( + val managers: List = listOf( UserWithPubKey(user1Id, user1PublicKey) ) val publicMeta = ByteArray(0) @@ -99,12 +101,12 @@ fun createInboxWithName() { ) } -fun createInboxWithPublicMeta(){ - val users : List = listOf( +fun createInboxWithPublicMeta() { + val users: List = listOf( UserWithPubKey(user1Id, user1PublicKey), UserWithPubKey(user2Id, user2PublicKey) ) - val managers : List = listOf( + val managers: List = listOf( UserWithPubKey(user1Id, user1PublicKey) ) val publicMeta = InboxPublicMeta( @@ -126,7 +128,7 @@ fun createInboxWithPublicMeta(){ // START: Getting Inboxes snippets -fun getMostRecentInboxes(){ +fun getMostRecentInboxes() { val startIndex = 0L val pageSize = 100L @@ -146,7 +148,7 @@ fun getMostRecentInboxes(){ } } -fun getOldestInboxes(){ +fun getOldestInboxes() { val startIndex = 0L val pageSize = 100L @@ -166,7 +168,7 @@ fun getOldestInboxes(){ } } -fun getInboxById(){ +fun getInboxById() { val inboxID = "INBOX_ID" val inboxItem = inboxApi.getInbox(inboxID).let { @@ -278,4 +280,80 @@ fun deletingInbox() { inboxApi.deleteInbox(inboxID) } -// END: Managing Inboxes snippets \ No newline at end of file +// END: Managing Inboxes snippets + + +@Serializable +data class PublicMeta( + val name: String, + val date: String +) + +val streamApi = endpointSession.initializeStreamApiLow(); +//val streamApi = StreamApi(streamApiLow, ) + + +fun a() { + val users: List = listOf( + UserWithPubKey(user1Id, user1PublicKey), + UserWithPubKey(user2Id, user2PublicKey) + ) + val managers: List = listOf( + UserWithPubKey(user1Id, user1PublicKey) + ) + val publicMeta = PublicMeta( + "Daily meeting #34", + "23 February 2026" + ) + val privateMeta = ByteArray(0) + + val roomId: String = streamApi.createStreamRoom( + contextId, + users, + managers, + Json.encodeToString(publicMeta).encodeToByteArray(), + privateMeta, + ) +} + + +// todo +fun b() { + val users: List = listOf( + UserWithPubKey(user1Id, user1PublicKey), + UserWithPubKey(user2Id, user2PublicKey) + ) + + val managers: List = listOf( + UserWithPubKey(user1Id, user1PublicKey) + ) + + val itemPolicy = ItemPolicy( + "owner", // get + "owner", // update + "owner", // delete + "owner", // updatePolicy + "owner", // updatePolicy + "owner", // updatePolicy + ) + + val policy = ContainerPolicy( + "owner", // get + "owner", // update + "owner", // delete + "owner", // updatePolicy + "true", // updaterCanBeRemovedFromManagers + "true", // ownerCanBeRemovedFromManagers + itemPolicy + ) + + val roomId: String? = streamApi.createStreamRoom( + contextId, + users, + managers, + ByteArray(0), + ByteArray(0), + policy + ) +} + diff --git a/examples/privmx-snippets/src/main/kotlin/Stacks/JavaKotlin/kvdb/KvdbEntries.kt b/examples/privmx-snippets/src/commonMain/kotlin/Stacks/JavaKotlin/kvdb/KvdbEntries.kt similarity index 100% rename from examples/privmx-snippets/src/main/kotlin/Stacks/JavaKotlin/kvdb/KvdbEntries.kt rename to examples/privmx-snippets/src/commonMain/kotlin/Stacks/JavaKotlin/kvdb/KvdbEntries.kt diff --git a/examples/privmx-snippets/src/main/kotlin/Stacks/JavaKotlin/kvdb/Overview.kt b/examples/privmx-snippets/src/commonMain/kotlin/Stacks/JavaKotlin/kvdb/Overview.kt similarity index 100% rename from examples/privmx-snippets/src/main/kotlin/Stacks/JavaKotlin/kvdb/Overview.kt rename to examples/privmx-snippets/src/commonMain/kotlin/Stacks/JavaKotlin/kvdb/Overview.kt diff --git a/examples/privmx-snippets/src/main/kotlin/Stacks/JavaKotlin/stores/DownloadingFiles.kt b/examples/privmx-snippets/src/commonMain/kotlin/Stacks/JavaKotlin/stores/DownloadingFiles.kt similarity index 100% rename from examples/privmx-snippets/src/main/kotlin/Stacks/JavaKotlin/stores/DownloadingFiles.kt rename to examples/privmx-snippets/src/commonMain/kotlin/Stacks/JavaKotlin/stores/DownloadingFiles.kt diff --git a/examples/privmx-snippets/src/main/kotlin/Stacks/JavaKotlin/stores/Files.kt b/examples/privmx-snippets/src/commonMain/kotlin/Stacks/JavaKotlin/stores/Files.kt similarity index 100% rename from examples/privmx-snippets/src/main/kotlin/Stacks/JavaKotlin/stores/Files.kt rename to examples/privmx-snippets/src/commonMain/kotlin/Stacks/JavaKotlin/stores/Files.kt diff --git a/examples/privmx-snippets/src/main/kotlin/Stacks/JavaKotlin/stores/Overview.kt b/examples/privmx-snippets/src/commonMain/kotlin/Stacks/JavaKotlin/stores/Overview.kt similarity index 99% rename from examples/privmx-snippets/src/main/kotlin/Stacks/JavaKotlin/stores/Overview.kt rename to examples/privmx-snippets/src/commonMain/kotlin/Stacks/JavaKotlin/stores/Overview.kt index e7e7df74..704e2e52 100644 --- a/examples/privmx-snippets/src/main/kotlin/Stacks/JavaKotlin/stores/Overview.kt +++ b/examples/privmx-snippets/src/commonMain/kotlin/Stacks/JavaKotlin/stores/Overview.kt @@ -20,6 +20,7 @@ fun setStoreApi() { val storeApi = endpointSession.storeApi } +@Suppress("UnsafeOptInUsageError") @Serializable data class StorePublicMeta(val tags: List) diff --git a/examples/privmx-snippets/src/main/kotlin/Stacks/JavaKotlin/threads/Messages.kt b/examples/privmx-snippets/src/commonMain/kotlin/Stacks/JavaKotlin/threads/Messages.kt similarity index 100% rename from examples/privmx-snippets/src/main/kotlin/Stacks/JavaKotlin/threads/Messages.kt rename to examples/privmx-snippets/src/commonMain/kotlin/Stacks/JavaKotlin/threads/Messages.kt diff --git a/examples/privmx-snippets/src/main/kotlin/Stacks/JavaKotlin/threads/Overview.kt b/examples/privmx-snippets/src/commonMain/kotlin/Stacks/JavaKotlin/threads/Overview.kt similarity index 100% rename from examples/privmx-snippets/src/main/kotlin/Stacks/JavaKotlin/threads/Overview.kt rename to examples/privmx-snippets/src/commonMain/kotlin/Stacks/JavaKotlin/threads/Overview.kt diff --git a/examples/privmx-snippets/src/main/kotlin/Tools/Stores/UsingStores/DownloadingFiles.kt b/examples/privmx-snippets/src/commonMain/kotlin/Tools/Stores/UsingStores/DownloadingFiles.kt similarity index 100% rename from examples/privmx-snippets/src/main/kotlin/Tools/Stores/UsingStores/DownloadingFiles.kt rename to examples/privmx-snippets/src/commonMain/kotlin/Tools/Stores/UsingStores/DownloadingFiles.kt diff --git a/examples/privmx-snippets/src/main/kotlin/Tools/Stores/UsingStores/ManagingFiles.kt b/examples/privmx-snippets/src/commonMain/kotlin/Tools/Stores/UsingStores/ManagingFiles.kt similarity index 100% rename from examples/privmx-snippets/src/main/kotlin/Tools/Stores/UsingStores/ManagingFiles.kt rename to examples/privmx-snippets/src/commonMain/kotlin/Tools/Stores/UsingStores/ManagingFiles.kt diff --git a/examples/privmx-snippets/src/main/kotlin/Tools/Stores/UsingStores/ManagingStores.kt b/examples/privmx-snippets/src/commonMain/kotlin/Tools/Stores/UsingStores/ManagingStores.kt similarity index 100% rename from examples/privmx-snippets/src/main/kotlin/Tools/Stores/UsingStores/ManagingStores.kt rename to examples/privmx-snippets/src/commonMain/kotlin/Tools/Stores/UsingStores/ManagingStores.kt diff --git a/examples/privmx-snippets/src/commonMain/kotlin/Tools/Stores/UsingStores/StoreEventsInRealTime.kt b/examples/privmx-snippets/src/commonMain/kotlin/Tools/Stores/UsingStores/StoreEventsInRealTime.kt new file mode 100644 index 00000000..ca4a3572 --- /dev/null +++ b/examples/privmx-snippets/src/commonMain/kotlin/Tools/Stores/UsingStores/StoreEventsInRealTime.kt @@ -0,0 +1,27 @@ +package Tools.Stores.UsingStores + +import com.simplito.java.privmx_endpoint_extra.events.EventType + +//fun handlingStoreEvents() { +// val callbacksID = "CALLBACK_ID" +// val storeID = "STORE_ID" +// +// // Starting the Event Loop +// endpointContainer.startListening() +// +// // Handling Store Events +// endpointSession.registerCallback( +// callbacksID, +// EventType.StoreCreatedEvent +// ) { newStore -> +// println(newStore.storeId) +// } +// +// // Handling File Events +// endpointSession.registerCallback( +// callbacksID, +// EventType.StoreFileCreatedEvent(storeID) +// ) { newFile -> +// println(newFile.info.fileId) +// } +//} \ No newline at end of file diff --git a/examples/privmx-snippets/src/main/kotlin/Tools/Stores/UsingStores/UploadingFiles.kt b/examples/privmx-snippets/src/commonMain/kotlin/Tools/Stores/UsingStores/UploadingFiles.kt similarity index 100% rename from examples/privmx-snippets/src/main/kotlin/Tools/Stores/UsingStores/UploadingFiles.kt rename to examples/privmx-snippets/src/commonMain/kotlin/Tools/Stores/UsingStores/UploadingFiles.kt diff --git a/examples/privmx-snippets/src/main/kotlin/Tools/Threads/UsingThreads/ManagingThreads.kt b/examples/privmx-snippets/src/commonMain/kotlin/Tools/Threads/UsingThreads/ManagingThreads.kt similarity index 100% rename from examples/privmx-snippets/src/main/kotlin/Tools/Threads/UsingThreads/ManagingThreads.kt rename to examples/privmx-snippets/src/commonMain/kotlin/Tools/Threads/UsingThreads/ManagingThreads.kt diff --git a/examples/privmx-snippets/src/commonMain/kotlin/Tools/Threads/UsingThreads/RealTimeCommunication.kt b/examples/privmx-snippets/src/commonMain/kotlin/Tools/Threads/UsingThreads/RealTimeCommunication.kt new file mode 100644 index 00000000..9a6643fc --- /dev/null +++ b/examples/privmx-snippets/src/commonMain/kotlin/Tools/Threads/UsingThreads/RealTimeCommunication.kt @@ -0,0 +1,26 @@ +package Tools.Threads.UsingThreads + +import com.simplito.java.privmx_endpoint_extra.events.EventType +// +//fun handlingThreadAndMessageEvents() { +// val callbacksID = "CALLBACK_ID" +// val threadID = "THREAD_ID" +// // Starting the Event Loop +// endpointContainer.startListening() +// +// // Handling Thread events +// endpointSession.registerCallback( +// callbacksID, +// EventType.ThreadCreatedEvent +// ){ newThread -> +// println(newThread.threadId) +// } +// +// //Handling message Events +// endpointSession.registerCallback( +// callbacksID, +// EventType.ThreadNewMessageEvent(threadID) +// ){ newMessage -> +// println(newMessage.info?.messageId) +// } +//} \ No newline at end of file diff --git a/examples/privmx-snippets/src/main/kotlin/Tools/Threads/UsingThreads/SendingMessages.kt b/examples/privmx-snippets/src/commonMain/kotlin/Tools/Threads/UsingThreads/SendingMessages.kt similarity index 100% rename from examples/privmx-snippets/src/main/kotlin/Tools/Threads/UsingThreads/SendingMessages.kt rename to examples/privmx-snippets/src/commonMain/kotlin/Tools/Threads/UsingThreads/SendingMessages.kt diff --git a/examples/privmx-snippets/src/commonMain/kotlin/Tools/UsingInboxes/InboxEntries.kt b/examples/privmx-snippets/src/commonMain/kotlin/Tools/UsingInboxes/InboxEntries.kt new file mode 100644 index 00000000..25bb7442 --- /dev/null +++ b/examples/privmx-snippets/src/commonMain/kotlin/Tools/UsingInboxes/InboxEntries.kt @@ -0,0 +1,148 @@ +package Tools.UsingInboxes + +import com.google.gson.JsonParser +import com.simplito.java.privmx_endpoint.model.File +import com.simplito.java.privmx_endpoint.model.InboxEntry +import com.simplito.java.privmx_endpoint_extra.inboxFileStream.InboxFileStreamWriter +import com.simplito.java.privmx_endpoint_extra.model.SortOrder +import java.io.IOException +import java.util.List + +class InboxEntries : WorkingWithInboxes() { + fun sendingInboxEntryBasic() { + // 1. Preparing Entry + val inboxID = "INBOX_ID" + + val entryDataAnswer = "USER_PROVIDED_TEXT" + val entryDataVersion = 1L + val entryDataType = "TEXT_ANSWER" + + val entryData: ByteArray = """ + { + "content": { + "answer": "%s" + }, + "version": %d, + "type": "%s" + } + + """.trimIndent().format(entryDataAnswer, entryDataVersion, entryDataType) + .toByteArray() + + val entryHandle = endpointSession.inboxApi.prepareEntry( + inboxID, + entryData, + mutableListOf() + ) + + // 2. Sending Entry + endpointSession.inboxApi.sendEntry(entryHandle) + } + + @Throws(IOException::class) + fun attachingFiles(fileID: String?) { + val inboxID = "INBOX_ID" + val publicMeta = "My public data".toByteArray() + + val fileName = "FILE_NAME" + val fileType = "FILE_TYPE" + val fileContent = "FILE_CONTENT".toByteArray() + val fileSize = fileContent.size.toLong() + + val entryDataAnswer = "USER_PROVIDED_TEXT" + val entryDataVersion = 1L + val entryDataType = "TEXT_ANSWER" + + val entryData: ByteArray = """ + { + "content": { + "answer": "%s" + }, + "version": %d, + "type": "%s" + } + + """.trimIndent().format(entryDataAnswer, entryDataVersion, entryDataType) + .toByteArray() + + val filePrivateMeta: ByteArray = """ + { + "name": "%s", + "mimetype": "%s" + } + + """.trimIndent().format(fileName, fileType).toByteArray() + + val inboxFileStreamWriter = InboxFileStreamWriter.createFile( + endpointSession.inboxApi, + publicMeta, + filePrivateMeta, + fileSize + ) + + val fileHandle = inboxFileStreamWriter.getFileHandle() + + // 1. Preparing Entry & sending File Contents + val inboxHandle = endpointSession.inboxApi.prepareEntry( + inboxID, + entryData, + List.of(fileHandle) + ) + + // 2. Sending File Contents + inboxFileStreamWriter.write( + inboxHandle, + fileContent + ) + + // 3. Sending Entry + endpointSession.inboxApi.sendEntry(inboxHandle) + } + + fun fetchingEntriesBasic() { + val inboxID = "INBOX_ID" + val startIndex = 0L + val pageSize = 100L + + val entriesPagingList = endpointSession.inboxApi.listEntries( + inboxID, + startIndex, + pageSize, + SortOrder.DESC + ) + } + + fun fetchingEntriesWithFiles() { + val inboxID = "INBOX_ID" + val startIndex = 0L + val pageSize = 1L + + // getting last entry + val entriesPagingList = endpointSession.inboxApi.listEntries( + inboxID, + startIndex, + pageSize, + SortOrder.DESC + ) + + val entry: InboxEntry = entriesPagingList.readItems[0] + val entryFile: File = entry.files[0] + + // This example uses com.google.code.gson:gson + // dependency for handling JSON objects in Java + + // decoded privateMeta + val privateMeta = String(entryFile.privateMeta) + val privateMetaJson = JsonParser.parseString(privateMeta).getAsJsonObject() + val fileName = privateMetaJson.get("name").getAsString() + val fileType = privateMetaJson.get("mimetype").getAsString() + + // decoded data + val entryData = String(entry.data) + val entryDataJson = JsonParser.parseString(entryData).getAsJsonObject() + val answer = entryDataJson + .getAsJsonObject("content") + .get("answer") + .asString + } +} \ No newline at end of file diff --git a/examples/privmx-snippets/src/commonMain/kotlin/Tools/UsingInboxes/InboxUpdates.kt b/examples/privmx-snippets/src/commonMain/kotlin/Tools/UsingInboxes/InboxUpdates.kt new file mode 100644 index 00000000..2bee04c6 --- /dev/null +++ b/examples/privmx-snippets/src/commonMain/kotlin/Tools/UsingInboxes/InboxUpdates.kt @@ -0,0 +1,49 @@ +package Tools.UsingInboxes + +import com.simplito.java.privmx_endpoint.model.Inbox +import com.simplito.java.privmx_endpoint.model.InboxEntry +import com.simplito.java.privmx_endpoint.model.events.eventSelectorTypes.InboxEventSelectorType +import com.simplito.java.privmx_endpoint_extra.events.CallbackRegistration +import com.simplito.java.privmx_endpoint_extra.events.EventCallback +import com.simplito.java.privmx_endpoint_extra.events.EventType + +class InboxUpdates : WorkingWithInboxes() { + fun handlingInboxEvents() { + val InboxCallbackID = "INBOX_CALLBACK_ID" + val EntryCallbackID = "ENTRY_CALLBACK_ID" + val inboxID = "INBOX_ID" + + // Starting the Event Loop + endpointContainer.startListening() + + endpointSession.registerManyCallbacks( + + // Handling Inbox Events + CallbackRegistration( + InboxCallbackID, + EventType.InboxUpdatedEvent( + InboxEventSelectorType.CONTEXT_ID, + contextId + ), + EventCallback { updatedInbox: Inbox? -> + println(updatedInbox!!.lastModifier) + } + ), + + // Handling Inbox Entry Events + CallbackRegistration( + EntryCallbackID, + EventType.InboxEntryCreatedEvent( + InboxEventSelectorType.INBOX_ID, + inboxID + ), + EventCallback { newEntry: InboxEntry? -> + println(newEntry!!.inboxId) + } + ) + ) + + + endpointSession.unregisterCallbacks(EntryCallbackID) + } +} \ No newline at end of file diff --git a/examples/privmx-snippets/src/commonMain/kotlin/Tools/UsingInboxes/WorkingWithInboxes.kt b/examples/privmx-snippets/src/commonMain/kotlin/Tools/UsingInboxes/WorkingWithInboxes.kt new file mode 100644 index 00000000..9f4a3222 --- /dev/null +++ b/examples/privmx-snippets/src/commonMain/kotlin/Tools/UsingInboxes/WorkingWithInboxes.kt @@ -0,0 +1,103 @@ +package Tools.UsingInboxes + +import com.simplito.java.privmx_endpoint.model.UserWithPubKey +import com.simplito.java.privmx_endpoint_extra.lib.PrivmxEndpoint +import com.simplito.java.privmx_endpoint_extra.lib.PrivmxEndpointContainer +import com.simplito.java.privmx_endpoint_extra.model.Modules +import com.simplito.java.privmx_endpoint_extra.model.SortOrder +import java.nio.charset.StandardCharsets +import java.util.Set + +open class WorkingWithInboxes { + // START: Initial Assumptions Snippets + /* + All the values below like BRIDGE_URL, SOLUTION_ID, CONTEXT_ID + should be replaced by the ones corresponding to your Bridge Server instance. + + The private keys here are for demonstration purposes only. + Normally, they should be kept separately by each user and stored in a safe place, + or generated from a password (see the derivePrivateKey2() method in the Crypto API) + */ + var bridgeUrl: String = "YOUR_BRIDGE_URL" + var solutionId: String = "YOUR_SOLUTION_ID" + var contextId: String = "YOUR_CONTEXT_ID" + + var user1Id: String = "USER_ID_1" + var user1PublicKey: String = "PUBLIC_KEY_1" + var user1PrivateKey: String = "PRIVATE_KEY_1" + + var user2Id: String = "USER_ID_2" + var user2PublicKey: String = "PUBLIC_KEY_2" + + var user3Id: String = "USER_ID_3" + var user3PublicKey: String = "PUBLIC_KEY_3" + + var endpointContainer: PrivmxEndpointContainer = PrivmxEndpointContainer() + + var initModules = Set.of(Modules.INBOX) + var endpointSession: PrivmxEndpoint = endpointContainer.connect( + initModules, + user1PrivateKey, + solutionId, + bridgeUrl + ) + + // END: Initial Assumptions Snippets + fun creatingInboxes() { + val privateMeta = "My private data".toByteArray(StandardCharsets.UTF_8) + val publicMeta = "My public data".toByteArray(StandardCharsets.UTF_8) + val users = listOf( + UserWithPubKey(user1Id, user1PublicKey), + UserWithPubKey(user2Id, user2PublicKey) + ) + val managers = listOf( + UserWithPubKey(user1Id, user1PublicKey) + ) + + val inboxID = endpointSession.inboxApi.createInbox( + contextId, + users, + managers, + publicMeta, + privateMeta + ) + } + + fun listingInboxes() { + val limit = 30L + val skip = 0L + + val inboxes = endpointSession.inboxApi.listInboxes( + contextId, + skip, + limit, + SortOrder.DESC + ) + } + + fun modifyingInboxes() { + val inboxID = "INBOX_ID" + val inbox = endpointSession.inboxApi.getInbox(inboxID) + val newUsers = listOf( + UserWithPubKey(user1Id, user1PublicKey), + UserWithPubKey(user2Id, user2PublicKey), + UserWithPubKey(user3Id, user3PublicKey) + ) + val newManagers = listOf( + UserWithPubKey(user1Id, user1PublicKey), + UserWithPubKey(user2Id, user2PublicKey) + ) + val newPrivateMeta = "New inbox name".toByteArray(StandardCharsets.UTF_8) + + endpointSession.inboxApi.updateInbox( + inboxID, + newUsers, + newManagers, + inbox.publicMeta, + newPrivateMeta, + null, // filesConfig + inbox.version, + false // force + ) + } +} \ No newline at end of file diff --git a/examples/privmx-snippets/src/commonMain/kotlin/Tools/UsingKvdbs/ListeningForChanges.kt b/examples/privmx-snippets/src/commonMain/kotlin/Tools/UsingKvdbs/ListeningForChanges.kt new file mode 100644 index 00000000..30fd0a5e --- /dev/null +++ b/examples/privmx-snippets/src/commonMain/kotlin/Tools/UsingKvdbs/ListeningForChanges.kt @@ -0,0 +1,49 @@ +package Tools.UsingKvdbs + +import com.simplito.java.privmx_endpoint.model.KvdbEntry +import com.simplito.java.privmx_endpoint.model.events.KvdbStatsEventData +import com.simplito.java.privmx_endpoint.model.events.eventSelectorTypes.KvdbEventSelectorType +import com.simplito.java.privmx_endpoint_extra.events.CallbackRegistration +import com.simplito.java.privmx_endpoint_extra.events.EventType + +class ListeningForChanges : ManagingKvdbs() { + fun handlingKvdbEvents() { + val KvdbCallbackID = "KVDB_CALLBACK_ID" + val EntrycallbackID = "ENTRY_CALLBACK_ID" + val kvdbID = "KVDB_ID" + + // Starting the Event Loop + endpointContainer.startListening() + + endpointSession.registerManyCallbacks( + + // Handling KVDB Events + CallbackRegistration( + KvdbCallbackID, + EventType.KvdbStatsChangedEvent( + KvdbEventSelectorType.CONTEXT_ID, + contextId + ), + { kvdbStats: KvdbStatsEventData? -> + println(kvdbStats!!.lastEntryDate) + } + ), + + // Handling KVDB Entry Events + CallbackRegistration( + EntrycallbackID, + EventType.KvdbNewEntryEvent( + KvdbEventSelectorType.KVDB_ID, + kvdbID + ), + { newEntry: KvdbEntry? -> + println(newEntry!!.info.key) + } + ) + ) + + // Finish handling events + endpointSession.unregisterCallbacks(KvdbCallbackID) + endpointSession.unregisterCallbacks(EntrycallbackID) + } +} \ No newline at end of file diff --git a/examples/privmx-snippets/src/commonMain/kotlin/Tools/UsingKvdbs/ManagingEntries.kt b/examples/privmx-snippets/src/commonMain/kotlin/Tools/UsingKvdbs/ManagingEntries.kt new file mode 100644 index 00000000..9b15d635 --- /dev/null +++ b/examples/privmx-snippets/src/commonMain/kotlin/Tools/UsingKvdbs/ManagingEntries.kt @@ -0,0 +1,39 @@ +package Tools.UsingKvdbs + +import java.nio.charset.StandardCharsets + +class ManagingEntries : ManagingKvdbs() { + fun sendingEntries() { + val kvdbID = "KVDB_ID" + val kvdbEntryKey = "KVDB_ENTRY_KEY" + val privateMeta = "My private data".toByteArray(StandardCharsets.UTF_8) + val publicMeta = "My public data".toByteArray(StandardCharsets.UTF_8) + val entryData = "ENTRY_DATA".toByteArray() + val newEntryData = "New Entry Data".toByteArray() + + // creating entry + endpointSession.kvdbApi.setEntry( + kvdbID, + kvdbEntryKey, + publicMeta, + privateMeta, + entryData + ) + + // read created entry + val entry = endpointSession.kvdbApi.getEntry( + kvdbID, + kvdbEntryKey + ) + + // update created entry + endpointSession.kvdbApi.setEntry( + entry.info.kvdbId, + entry.info.key, + entry.publicMeta, + entry.privateMeta, + newEntryData, + entry.version + ) + } +} \ No newline at end of file diff --git a/examples/privmx-snippets/src/commonMain/kotlin/Tools/UsingKvdbs/ManagingKvdbs.kt b/examples/privmx-snippets/src/commonMain/kotlin/Tools/UsingKvdbs/ManagingKvdbs.kt new file mode 100644 index 00000000..b2750d68 --- /dev/null +++ b/examples/privmx-snippets/src/commonMain/kotlin/Tools/UsingKvdbs/ManagingKvdbs.kt @@ -0,0 +1,64 @@ +package Tools.UsingKvdbs + +import com.simplito.java.privmx_endpoint.model.UserWithPubKey +import com.simplito.java.privmx_endpoint_extra.lib.PrivmxEndpoint +import com.simplito.java.privmx_endpoint_extra.lib.PrivmxEndpointContainer +import com.simplito.java.privmx_endpoint_extra.model.Modules +import java.nio.charset.StandardCharsets +import java.util.Set + +open class ManagingKvdbs { + // START: Initial Assumptions Snippets + /* + All the values below like BRIDGE_URL, SOLUTION_ID, CONTEXT_ID + should be replaced by the ones corresponding to your Bridge Server instance. + + The private keys here are for demonstration purposes only. + Normally, they should be kept separately by each user and stored in a safe place, + or generated from a password (see the derivePrivateKey2() method in the Crypto API) + */ + var bridgeUrl: String = "YOUR_BRIDGE_URL" + var solutionId: String = "YOUR_SOLUTION_ID" + var contextId: String = "YOUR_CONTEXT_ID" + + var user1Id: String = "USER_ID_1" + var user1PublicKey: String = "PUBLIC_KEY_1" + var user1PrivateKey: String = "PRIVATE_KEY_1" + + var user2Id: String = "USER_ID_2" + var user2PublicKey: String = "PUBLIC_KEY_2" + + var user3Id: String = "USER_ID_3" + var user3PublicKey: String = "PUBLIC_KEY_3" + + var endpointContainer: PrivmxEndpointContainer = PrivmxEndpointContainer() + + var initModules: MutableSet = Set.of(Modules.KVDB) + var endpointSession: PrivmxEndpoint = endpointContainer.connect( + initModules, + user1PrivateKey, + solutionId, + bridgeUrl + ) + + // END: Initial Assumptions Snippets + fun creatingKvdbs() { + val privateMeta = "KVDB's private data".toByteArray(StandardCharsets.UTF_8) + val publicMeta = "KVDB's public data".toByteArray(StandardCharsets.UTF_8) + val users = listOf( + UserWithPubKey(user1Id, user1PublicKey), + UserWithPubKey(user2Id, user2PublicKey) + ) + val managers = listOf( + UserWithPubKey(user1Id, user1PublicKey) + ) + + endpointSession.kvdbApi.createKvdb( + contextId, + users, + managers, + publicMeta, + privateMeta + ) + } +} \ No newline at end of file diff --git a/examples/privmx-snippets/src/main/kotlin/Tools/Stores/UsingStores/StoreEventsInRealTime.kt b/examples/privmx-snippets/src/main/kotlin/Tools/Stores/UsingStores/StoreEventsInRealTime.kt deleted file mode 100644 index 2fb06edc..00000000 --- a/examples/privmx-snippets/src/main/kotlin/Tools/Stores/UsingStores/StoreEventsInRealTime.kt +++ /dev/null @@ -1,27 +0,0 @@ -package Tools.Stores.UsingStores - -import com.simplito.java.privmx_endpoint_extra.events.EventType - -fun handlingStoreEvents() { - val callbacksID = "CALLBACK_ID" - val storeID = "STORE_ID" - - // Starting the Event Loop - endpointContainer.startListening() - - // Handling Store Events - endpointSession.registerCallback( - callbacksID, - EventType.StoreCreatedEvent - ) { newStore -> - println(newStore.storeId) - } - - // Handling File Events - endpointSession.registerCallback( - callbacksID, - EventType.StoreFileCreatedEvent(storeID) - ) { newFile -> - println(newFile.info.fileId) - } -} \ No newline at end of file diff --git a/examples/privmx-snippets/src/main/kotlin/Tools/Threads/UsingThreads/RealTimeCommunication.kt b/examples/privmx-snippets/src/main/kotlin/Tools/Threads/UsingThreads/RealTimeCommunication.kt deleted file mode 100644 index 80049c10..00000000 --- a/examples/privmx-snippets/src/main/kotlin/Tools/Threads/UsingThreads/RealTimeCommunication.kt +++ /dev/null @@ -1,26 +0,0 @@ -package Tools.Threads.UsingThreads - -import com.simplito.java.privmx_endpoint_extra.events.EventType - -fun handlingThreadAndMessageEvents() { - val callbacksID = "CALLBACK_ID" - val threadID = "THREAD_ID" - // Starting the Event Loop - endpointContainer.startListening() - - // Handling Thread events - endpointSession.registerCallback( - callbacksID, - EventType.ThreadCreatedEvent - ){ newThread -> - println(newThread.threadId) - } - - //Handling message Events - endpointSession.registerCallback( - callbacksID, - EventType.ThreadNewMessageEvent(threadID) - ){ newMessage -> - println(newMessage.info?.messageId) - } -} \ No newline at end of file diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index ff106dd9..4445b609 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -1,5 +1,5 @@ [versions] -kotlinJVM = "2.1.10" +kotlin = "2.1.10" agp = "8.11.0" junit = "4.13.2" junitVersion = "1.1.5" @@ -8,7 +8,6 @@ appcompat = "1.7.1" privmxInstallNative = "2.0.0" proguardGradle = "7.7.0" serialization-json = "1.6.2" -kotlin-serialization = "1.9.21" gson = "2.11.0" material = "1.10.0" webrtc = "1.0.0" @@ -31,7 +30,9 @@ annotation-jvm = { group = "androidx.annotation", name = "annotation-jvm", versi #google-webrtc = { module = "org.webrtc:google-webrtc", version.ref = "googleWebrtc" } [plugins] -kotlin-jvm = { id = "org.jetbrains.kotlin.jvm", version.ref = "kotlinJVM" } +kotlin-jvm = { id = "org.jetbrains.kotlin.jvm", version.ref = "kotlin" } privmx-install-native = { id = "com.simplito.privmx-endpoint-install-native", version.ref = "privmxInstallNative" } -kotlinPluginSerialization = { id = "org.jetbrains.kotlin.plugin.serialization", version.ref = "kotlin-serialization" } -androidLibrary = { id = "com.android.library", version.ref = "agp" } \ No newline at end of file +kotlinPluginSerialization = { id = "org.jetbrains.kotlin.plugin.serialization", version.ref = "kotlin" } +androidLibrary = { id = "com.android.library", version.ref = "agp" } +kotlinMultiplatform = { id = "org.jetbrains.kotlin.multiplatform", version.ref = "kotlin" } +android-lint = { id = "com.android.lint", version.ref = "agp" } \ No newline at end of file