diff --git a/app/globals.css b/app/globals.css index 69dc52a147..5611aed3e9 100644 --- a/app/globals.css +++ b/app/globals.css @@ -2999,103 +2999,46 @@ html.dark .chat-landing { } .chat-hero-visual { - min-height: 400px; -} - -.visual-window { - position: absolute; - top: 34px; - right: 0; - left: 0; - overflow: hidden; - border: 1px solid color-mix(in srgb, var(--accent) 22%, var(--border)); - border-radius: 19px; - background: color-mix(in srgb, var(--surface) 96%, transparent); - box-shadow: var(--shadow-lg); - transform: perspective(1000px) rotateY(-6deg) rotateX(2deg); -} - -.visual-window-bar { display: flex; + min-height: 430px; align-items: center; - gap: 6px; - height: 39px; - padding: 0 14px; - border-bottom: 1px solid var(--border); - background: var(--surface-soft); -} - -.visual-window-bar i { - width: 7px; - height: 7px; - border-radius: 50%; - background: var(--border-strong); -} - -.visual-layout { - display: grid; - grid-template-columns: 112px 1fr; - min-height: 315px; -} - -.visual-sidebar { - display: grid; - align-content: start; - gap: 11px; - padding: 24px 16px; - border-right: 1px solid var(--border); - background: var(--surface-soft); -} - -.visual-sidebar span { - height: 8px; - border-radius: 4px; - background: var(--border-strong); -} - -.visual-sidebar span:nth-child(2) { - width: 70%; -} - -.visual-sidebar span:nth-child(3) { - width: 84%; - background: color-mix(in srgb, var(--accent) 45%, var(--border)); + justify-content: center; } -.visual-thread { - display: flex; - flex-direction: column; - gap: 14px; - padding: 34px 31px 25px; +.chat-hero-product-image { + display: block; + width: min(100%, 590px); + height: auto; + border-radius: 26px; + box-shadow: + 0 36px 90px rgb(52 57 125 / 0.18), + 0 12px 34px rgb(65 53 126 / 0.1); + transform: translateY(2px); + animation: hero-product-enter 700ms cubic-bezier(0.22, 1, 0.36, 1) both; } -.visual-message { - width: 78%; - height: 52px; - border: 1px solid var(--border); - border-radius: 5px 15px 15px 15px; - background: var(--surface-soft); +html.dark .chat-hero-product-image { + box-shadow: + 0 38px 100px rgb(0 0 0 / 0.36), + 0 12px 36px rgb(31 27 74 / 0.28); } -.visual-message.is-accent { - align-self: flex-end; - width: 65%; - border-color: color-mix(in srgb, var(--accent) 45%, var(--border)); - border-radius: 15px 5px 15px 15px; - background: var(--accent-soft); -} +@keyframes hero-product-enter { + from { + opacity: 0; + transform: translateY(20px) scale(0.985); + } -.visual-message.is-short { - width: 48%; - height: 43px; + to { + opacity: 1; + transform: translateY(2px) scale(1); + } } -.visual-composer { - height: 43px; - margin-top: auto; - border: 1px solid var(--border); - border-radius: 10px; - background: var(--surface); +@media (prefers-reduced-motion: reduce) { + .chat-hero-product-image { + animation: none; + } } .landing-section { @@ -4329,7 +4272,7 @@ html.dark .guide-markdown a { } .chat-hero-visual { - min-height: 350px; + min-height: 405px; } .docs-home-section { @@ -4494,16 +4437,11 @@ html.dark .guide-markdown a { } .chat-hero-visual { - min-height: 280px; - } - - .visual-layout { - grid-template-columns: 75px 1fr; - min-height: 245px; + min-height: 350px; } - .visual-thread { - padding: 22px 17px 17px; + .chat-hero-product-image { + width: min(100%, 560px); } .docs-home-section { @@ -4553,10 +4491,6 @@ html.dark .guide-markdown a { text-align: left; } - .visual-window { - top: 10px; - } - .landing-section { width: min(100% - 36px, 1180px); padding-top: 62px; @@ -4571,6 +4505,10 @@ html.dark .guide-markdown a { .primary-nav { display: none; } + + .chat-hero-visual { + min-height: 300px; + } } @media (prefers-reduced-motion: reduce) { diff --git a/content/docs/chat/sdk/android/calling/managing-calls/accept-call.mdx b/content/docs/chat/sdk/android/calling/managing-calls/accept-call.mdx new file mode 100644 index 0000000000..3c0b57557a --- /dev/null +++ b/content/docs/chat/sdk/android/calling/managing-calls/accept-call.mdx @@ -0,0 +1,39 @@ +--- +title: 'Accept a call' +description: 'Accept a call invitation with the Android SDK and retrieve room credentials.' +product: 'sdk' +context: 'chat/sdk/android' +template: 'guide' +status: 'published' +lastUpdated: '2026-08-10' +version: 'v4' +platform: 'android' +sourcePath: '/sdk/android/calling/managing-calls/accept-call' +--- + +After receiving the original `SignalingInfo` from `onReceiveNewInvitation`, pass it to `signalingAccept()`: + +```java +OpenIMClient.getInstance().signalingManager.signalingAccept( + new OnBase() { + @Override + public void onSuccess(SignalingCertificate credentials) { + joinMediaRoom( + credentials.getRoomID(), + credentials.getToken(), + credentials.getLiveURL() + ); + } + + @Override + public void onError(int code, String error) { + showAcceptError(code, error); + } + }, + receivedInfo +); +``` + +Preserve the original `roomID`, inviter, invitees, and session type in `receivedInfo`. Do not rebuild it as an object that contains only `roomID`. + +The success callback returns `SignalingCertificate`. Connect the media room only after receiving a valid `token` and `roomID`, then keep merging remote state through [Handle call events](/sdk/android/calling/managing-calls/handle-call-events). diff --git a/content/docs/chat/sdk/android/calling/managing-calls/cancel-call.mdx b/content/docs/chat/sdk/android/calling/managing-calls/cancel-call.mdx new file mode 100644 index 0000000000..c7bdb66974 --- /dev/null +++ b/content/docs/chat/sdk/android/calling/managing-calls/cancel-call.mdx @@ -0,0 +1,33 @@ +--- +title: 'Cancel a call invitation' +description: 'Cancel a call invitation before it is accepted with the Android SDK.' +product: 'sdk' +context: 'chat/sdk/android' +template: 'guide' +status: 'published' +lastUpdated: '2026-08-10' +version: 'v4' +platform: 'android' +sourcePath: '/sdk/android/calling/managing-calls/cancel-call' +--- + +Before an invitation is accepted, the inviter can call `signalingCancel()`: + +```java +OpenIMClient.getInstance().signalingManager.signalingCancel( + new OnBase() { + @Override + public void onSuccess(String result) { + stopWaitingForAnswer(activeInfo.getInvitation().getRoomID()); + } + + @Override + public void onError(int code, String error) { + showCancelError(code, error); + } + }, + activeInfo +); +``` + +Pass the complete `SignalingInfo` saved when the call was started, not a new object containing only `roomID`. A successful callback means that the cancel request completed. End the local waiting state and release unused media resources; remote clients update through `onInvitationCancelled`. diff --git a/content/docs/chat/sdk/android/calling/managing-calls/handle-call-events.mdx b/content/docs/chat/sdk/android/calling/managing-calls/handle-call-events.mdx new file mode 100644 index 0000000000..51eff77695 --- /dev/null +++ b/content/docs/chat/sdk/android/calling/managing-calls/handle-call-events.mdx @@ -0,0 +1,81 @@ +--- +title: 'Handle call events' +description: 'Register Android SDK invitation, participant, and media-stream callbacks in one call listener.' +product: 'sdk' +context: 'chat/sdk/android' +template: 'guide' +status: 'published' +lastUpdated: '2026-08-10' +version: 'v4' +platform: 'android' +sourcePath: '/sdk/android/calling/managing-calls/handle-call-events' +--- + +Register `OnSignalingListener` once in the call state layer. Merge invitation lifecycle, participant connection, and media stream changes by `roomID`. + +```java +OpenIMClient.getInstance().signalingManager.setSignalingListener( + new OnSignalingListener() { + @Override + public void onReceiveNewInvitation(SignalingInfo info) { + upsertCall(info, "ringing"); + } + + @Override + public void onInviteeAccepted(SignalingInfo info) { + mergeCallEvent("accepted", info); + } + + @Override + public void onInviteeRejected(SignalingInfo info) { + mergeCallEvent("rejected", info); + } + + @Override + public void onInvitationCancelled(SignalingInfo info) { + mergeCallEvent("cancelled", info); + } + + @Override + public void onInvitationTimeout(SignalingInfo info) { + mergeCallEvent("timeout", info); + } + + @Override + public void onInviteeAcceptedByOtherDevice(SignalingInfo info) { + mergeCallEvent("accepted-by-other-device", info); + } + + @Override + public void onInviteeRejectedByOtherDevice(SignalingInfo info) { + mergeCallEvent("rejected-by-other-device", info); + } + + @Override + public void onHangup(SignalingInfo info) { + finishCall(info.getInvitation().getRoomID()); + } + + @Override + public void onRoomParticipantConnected(RoomCallingInfo room) { + mergeConnectedParticipants(room.getRoomID(), room.getParticipant()); + } + + @Override + public void onRoomParticipantDisconnected(RoomCallingInfo room) { + mergeDisconnectedParticipants(room.getRoomID(), room.getParticipant()); + } + + @Override + public void onStreamChange(String streamInfo) { + mergeStreamChange(streamInfo); + } + } +); +``` + +This page owns the complete handling contract for the 11 call callbacks exposed by the Android adapter other than `onReceiveCustomSignal`. Custom signaling belongs to [Send a custom signal](/sdk/android/calling/sending-custom-signals/send-a-custom-signal). + +Merge invitation events with `SignalingInfo.invitation.roomID`. Merge participant state with `RoomCallingInfo.roomID` plus the participant user ID. Do not merge by event order, display name, or array position. `onStreamChange` currently carries a string payload; parse and validate it according to the actual server protocol used by your deployment. + +`SignalingManager` retains one listener. Setting another replaces the previous instance, and there is no public remove method. Combine custom signaling with these callbacks in the same application-level listener. When signing out or switching accounts, stop writing into old account state and replace the listener with the complete listener for the new account. diff --git a/content/docs/chat/sdk/android/calling/managing-calls/hang-up-call.mdx b/content/docs/chat/sdk/android/calling/managing-calls/hang-up-call.mdx new file mode 100644 index 0000000000..85e4b0d993 --- /dev/null +++ b/content/docs/chat/sdk/android/calling/managing-calls/hang-up-call.mdx @@ -0,0 +1,33 @@ +--- +title: 'Hang up a call' +description: 'Hang up an established call with the Android SDK.' +product: 'sdk' +context: 'chat/sdk/android' +template: 'guide' +status: 'published' +lastUpdated: '2026-08-10' +version: 'v4' +platform: 'android' +sourcePath: '/sdk/android/calling/managing-calls/hang-up-call' +--- + +After a call is established, a participant can call `signalingHungUp()`. The supplied `SignalingInfo` should preserve the complete invitation, and its `roomID` must match the active media room. + +```java +OpenIMClient.getInstance().signalingManager.signalingHungUp( + new OnBase() { + @Override + public void onSuccess(String result) { + releaseCallResources(activeInfo.getInvitation().getRoomID()); + } + + @Override + public void onError(int code, String error) { + showHangUpError(code, error); + } + }, + activeInfo +); +``` + +The success callback only means that the hang-up request completed. Stop local capture, disconnect the media room, and release the camera and microphone. Cancellation, rejection, timeout, and hang-up should all enter one idempotent cleanup flow keyed by `roomID`. diff --git a/content/docs/chat/sdk/android/calling/managing-calls/reject-call.mdx b/content/docs/chat/sdk/android/calling/managing-calls/reject-call.mdx new file mode 100644 index 0000000000..974b545897 --- /dev/null +++ b/content/docs/chat/sdk/android/calling/managing-calls/reject-call.mdx @@ -0,0 +1,33 @@ +--- +title: 'Reject a call' +description: 'Reject a call invitation with the Android SDK.' +product: 'sdk' +context: 'chat/sdk/android' +template: 'guide' +status: 'published' +lastUpdated: '2026-08-10' +version: 'v4' +platform: 'android' +sourcePath: '/sdk/android/calling/managing-calls/reject-call' +--- + +When the user declines an incoming call, pass the original `SignalingInfo` to `signalingReject()`: + +```java +OpenIMClient.getInstance().signalingManager.signalingReject( + new OnBase() { + @Override + public void onSuccess(String result) { + closeIncomingCallUI(); + } + + @Override + public void onError(int code, String error) { + showRejectError(code, error); + } + }, + receivedInfo +); +``` + +The success callback only means that the reject signaling request completed. The inviter later updates its interface through `onInviteeRejected`; see [Handle call events](/sdk/android/calling/managing-calls/handle-call-events). diff --git a/content/docs/chat/sdk/android/calling/managing-calls/start-group-call.mdx b/content/docs/chat/sdk/android/calling/managing-calls/start-group-call.mdx new file mode 100644 index 0000000000..44e5b0163d --- /dev/null +++ b/content/docs/chat/sdk/android/calling/managing-calls/start-group-call.mdx @@ -0,0 +1,51 @@ +--- +title: 'Start a group call' +description: 'Start a group audio or video call with the Android SDK.' +product: 'sdk' +context: 'chat/sdk/android' +template: 'guide' +status: 'published' +lastUpdated: '2026-08-10' +version: 'v4' +platform: 'android' +sourcePath: '/sdk/android/calling/managing-calls/start-group-call' +--- + +`signalingInviteInGroup()` starts a group call. It invites only the members explicitly listed in `inviteeUserIDList`; setting `groupID` does not automatically invite every group member. + +```java +SignalingInvitationInfo invitation = new SignalingInvitationInfo(); +invitation.setInviterUserID(currentUserID); +invitation.setInviteeUserIDList(selectedGroupMemberIDs); +invitation.setGroupID(groupID); +invitation.setRoomID(groupID); +invitation.setTimeout(30); +invitation.setMediaType("video"); +invitation.setSessionType(ConversationType.GROUP_CHAT); +invitation.setPlatformID(Platform.ANDROID); +invitation.setCustomData("{\"source\":\"group-call\"}"); + +SignalingInfo info = new SignalingInfo(); +info.setUserID(currentUserID); +info.setInvitation(invitation); +info.setOfflinePushInfo(offlinePushInfo); + +OpenIMClient.getInstance().signalingManager.signalingInviteInGroup( + new OnBase() { + @Override + public void onSuccess(SignalingCertificate credentials) { + startGroupCall(credentials); + } + + @Override + public void onError(int code, String error) { + showCallError(code, error); + } + }, + info +); +``` + +`groupID` must not be empty. Remove the current user, empty IDs, and duplicates from `inviteeUserIDList`. The example reuses the group ID as the room ID. If your application generates another `roomID`, every participant must use the same value. + +The success callback returns `SignalingCertificate`; see [Start a one-to-one call](/sdk/android/calling/managing-calls/start-single-call) for its fields. `busyLineUserIDList` only identifies some unavailable members and should not stop invitations to the others. Success does not mean that any member has accepted. diff --git a/content/docs/chat/sdk/android/calling/managing-calls/start-single-call.mdx b/content/docs/chat/sdk/android/calling/managing-calls/start-single-call.mdx new file mode 100644 index 0000000000..1c89908027 --- /dev/null +++ b/content/docs/chat/sdk/android/calling/managing-calls/start-single-call.mdx @@ -0,0 +1,71 @@ +--- +title: 'Start a one-to-one call' +description: 'Start a one-to-one audio or video call with the Android SDK.' +product: 'sdk' +context: 'chat/sdk/android' +template: 'guide' +status: 'published' +lastUpdated: '2026-08-10' +version: 'v4' +platform: 'android' +sourcePath: '/sdk/android/calling/managing-calls/start-single-call' +--- + +`signalingInvite()` starts a one-to-one call. The Android SDK handles call signaling; your application must connect a real-time audio/video engine with the returned room credentials. + +## Parameters + +| Field | Type | Required | Description | +| ------------------- | ----------------- | -------- | --------------------------------------------------------------------------- | +| `userID` | `String` | Yes | The current signed-in user performing the invite operation. | +| `inviterUserID` | `String` | Yes | The inviter, normally the current signed-in user. | +| `inviteeUserIDList` | `List` | Yes | The invitees; for a one-to-one call, include only the other user. | +| `groupID` | `String` | Yes | Use an empty string for a one-to-one call. | +| `roomID` | `String` | Yes | The call's unique room identifier and the primary key for subsequent state. | +| `timeout` | `long` | Yes | Invitation timeout in seconds. | +| `mediaType` | `String` | Yes | The application-defined media type, typically `audio` or `video`. | +| `sessionType` | `int` | Yes | Use `ConversationType.SINGLE_CHAT`. | +| `platformID` | `int` | Yes | Use `Platform.ANDROID` for an Android phone client. | +| `customData` | `String` | No | Application extra data carried with the invitation. | +| `offlinePushInfo` | `OfflinePushInfo` | No | Push content used when the invitee is offline. | + +```java +SignalingInvitationInfo invitation = new SignalingInvitationInfo(); +invitation.setInviterUserID(currentUserID); +invitation.setInviteeUserIDList(Collections.singletonList(peerUserID)); +invitation.setGroupID(""); +invitation.setRoomID(roomID); +invitation.setTimeout(30); +invitation.setMediaType("video"); +invitation.setSessionType(ConversationType.SINGLE_CHAT); +invitation.setPlatformID(Platform.ANDROID); +invitation.setCustomData("{\"source\":\"contact-card\"}"); + +SignalingInfo info = new SignalingInfo(); +info.setUserID(currentUserID); +info.setInvitation(invitation); +info.setOfflinePushInfo(offlinePushInfo); + +OpenIMClient.getInstance().signalingManager.signalingInvite( + new OnBase() { + @Override + public void onSuccess(SignalingCertificate credentials) { + joinMediaRoom( + credentials.getRoomID(), + credentials.getToken(), + credentials.getLiveURL() + ); + } + + @Override + public void onError(int code, String error) { + showCallError(code, error); + } + }, + info +); +``` + +The success callback returns `SignalingCertificate`. `roomID` identifies the media room, `token` is a short-lived join credential, `liveURL` is the media service address, and `busyLineUserIDList` contains busy users. + +Connect the media engine only after receiving a valid `token` and `roomID`. API success does not mean the invitee accepted; merge subsequent state through [Handle call events](/sdk/android/calling/managing-calls/handle-call-events). diff --git a/content/docs/chat/sdk/android/calling/overview-calling.mdx b/content/docs/chat/sdk/android/calling/overview-calling.mdx new file mode 100644 index 0000000000..e0dc94ef3f --- /dev/null +++ b/content/docs/chat/sdk/android/calling/overview-calling.mdx @@ -0,0 +1,53 @@ +--- +title: 'Audio and video calling overview' +description: 'Learn about Android SDK call signaling, room information, and event boundaries.' +product: 'sdk' +context: 'chat/sdk/android' +template: 'guide' +status: 'published' +lastUpdated: '2026-08-10' +version: 'v4' +platform: 'android' +sourcePath: '/sdk/android/calling/overview-calling' +--- + +The Android SDK `SignalingManager` provides the signaling APIs needed to invite, accept, reject, cancel, hang up, query rooms, and synchronize call state. It coordinates participants, room information, and the call lifecycle. It does not capture camera video, play remote media, or render a call interface. + +Pass the returned `roomID`, `token`, and `liveURL` to your chosen real-time audio/video engine. Your application remains responsible for Android permissions, devices, media tracks, poor-network behavior, and UI state. The signaling APIs are not a complete real-time media SDK. + +## Call flow + +1. Call `signalingInvite()` for a one-to-one call or `signalingInviteInGroup()` for a group call. +2. The invitee receives `SignalingInfo` through `onReceiveNewInvitation` and chooses to accept or reject. +3. The invitee calls `signalingAccept()`, and both parties connect their media engine with the returned room credentials. +4. During the call, update local state from participant, media stream, and custom signaling callbacks. +5. The inviter can cancel a pending invitation; any participant can hang up an established call. + +## Core data + +| Data | Description | +| ------------------------- | --------------------------------------------------------------------------------------------------------- | +| `SignalingInvitationInfo` | Inviter, invitees, group, room, media type, timeout, session type, and application extra data. | +| `SignalingInfo` | Current operation user, original invitation, participant profiles, and optional offline push information. | +| `SignalingCertificate` | The `roomID`, `token`, `liveURL`, and busy user list returned by OpenIMServer. | +| `RoomCallingInfo` | A snapshot of a group's room, invitation, participants, group, and join credentials. | + +Use `customData` and custom signaling only for application negotiation data. Do not place long-lived credentials, administrator secrets, or other sensitive data in these fields. + +## State updates and event ownership + +For invite, accept, reject, cancel, and hang-up operations, handle both the API callback and the call listener. The API success callback means that the current signaling request completed. The listener represents incremental state observed by inviters, invitees, other devices, or room participants. They are not the same completion signal. + +The complete invitation lifecycle, participant, hang-up, and stream listener belongs to [Handle call events](/sdk/android/calling/managing-calls/handle-call-events). Custom signaling belongs to [Send a custom signal](/sdk/android/calling/sending-custom-signals/send-a-custom-signal). Room, credential, and pending-invitation queries only return snapshots. + +This overview does not register a listener. Use `roomID` as the call-state key and combine it with user ID for participant state. Query again when the current room needs to be restored or reconciled. + +## Find a page by task + +| Task | Page | +| ------------------------------------ | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| Start a one-to-one or group call | [Start a one-to-one call](/sdk/android/calling/managing-calls/start-single-call), [Start a group call](/sdk/android/calling/managing-calls/start-group-call) | +| Accept or reject an invitation | [Accept a call](/sdk/android/calling/managing-calls/accept-call), [Reject a call](/sdk/android/calling/managing-calls/reject-call) | +| Cancel an invitation or hang up | [Cancel a call invitation](/sdk/android/calling/managing-calls/cancel-call), [Hang up a call](/sdk/android/calling/managing-calls/hang-up-call) | +| Restore a room or pending invitation | [Get a group call room](/sdk/android/calling/retrieving-call-information/get-room-by-group-id), [Get room credentials](/sdk/android/calling/retrieving-call-information/get-token-by-room-id), [Restore a pending invitation](/sdk/android/calling/retrieving-call-information/restore-pending-invitation) | +| Handle call events and negotiation | [Handle call events](/sdk/android/calling/managing-calls/handle-call-events), [Send a custom signal](/sdk/android/calling/sending-custom-signals/send-a-custom-signal) | diff --git a/content/docs/chat/sdk/android/calling/retrieving-call-information/get-room-by-group-id.mdx b/content/docs/chat/sdk/android/calling/retrieving-call-information/get-room-by-group-id.mdx new file mode 100644 index 0000000000..5beee147ca --- /dev/null +++ b/content/docs/chat/sdk/android/calling/retrieving-call-information/get-room-by-group-id.mdx @@ -0,0 +1,37 @@ +--- +title: 'Get a group call room' +description: 'Use the Android SDK to retrieve an active call room by group ID.' +product: 'sdk' +context: 'chat/sdk/android' +template: 'guide' +status: 'published' +lastUpdated: '2026-08-10' +version: 'v4' +platform: 'android' +sourcePath: '/sdk/android/calling/retrieving-call-information/get-room-by-group-id' +--- + +`signalingGetRoomByGroupID()` takes a group ID, not a custom `roomID`. + +```java +OpenIMClient.getInstance().signalingManager.signalingGetRoomByGroupID( + new OnBase() { + @Override + public void onSuccess(RoomCallingInfo room) { + if (room.getRoomID() != null && !room.getRoomID().isEmpty()) { + renderParticipants(room.getParticipant()); + } + } + + @Override + public void onError(int code, String error) { + showNoActiveGroupCall(); + } + }, + groupID +); +``` + +The success callback returns a `RoomCallingInfo` snapshot containing the room ID, original invitation, participants, group ID, token, and connection address. Account profiles, group member profiles, and group profiles inside participant data come from different sources and must not overwrite one another. + +If no group call is active, treat an error or empty room as “no call to restore” and discard old credentials. Even when your group call uses a custom room ID, this method still receives `groupID`. diff --git a/content/docs/chat/sdk/android/calling/retrieving-call-information/get-token-by-room-id.mdx b/content/docs/chat/sdk/android/calling/retrieving-call-information/get-token-by-room-id.mdx new file mode 100644 index 0000000000..655d317e4a --- /dev/null +++ b/content/docs/chat/sdk/android/calling/retrieving-call-information/get-token-by-room-id.mdx @@ -0,0 +1,42 @@ +--- +title: 'Get room credentials' +description: 'Use the Android SDK to retrieve fresh join credentials for a known room ID.' +product: 'sdk' +context: 'chat/sdk/android' +template: 'guide' +status: 'published' +lastUpdated: '2026-08-10' +version: 'v4' +platform: 'android' +sourcePath: '/sdk/android/calling/retrieving-call-information/get-token-by-room-id' +--- + +When you know the `roomID` but need new join credentials, call `signalingGetTokenByRoomID()`. + +```java +OpenIMClient.getInstance().signalingManager.signalingGetTokenByRoomID( + new OnBase() { + @Override + public void onSuccess(SignalingCertificate credentials) { + if (credentials.getToken() != null + && credentials.getRoomID() != null) { + joinMediaRoom( + credentials.getRoomID(), + credentials.getToken(), + credentials.getLiveURL() + ); + } + } + + @Override + public void onError(int code, String error) { + showCredentialError(code, error); + } + }, + roomID +); +``` + +The success callback returns `SignalingCertificate`; see [Start a one-to-one call](/sdk/android/calling/managing-calls/start-single-call) for its fields. Connect the media engine only after receiving a valid `token` and `roomID`. + +A room token is a short-lived sensitive credential. Keep it in memory and do not write it to logs, URLs, analytics events, or persistent storage. diff --git a/content/docs/chat/sdk/android/calling/retrieving-call-information/restore-pending-invitation.mdx b/content/docs/chat/sdk/android/calling/retrieving-call-information/restore-pending-invitation.mdx new file mode 100644 index 0000000000..f42fb5e22c --- /dev/null +++ b/content/docs/chat/sdk/android/calling/retrieving-call-information/restore-pending-invitation.mdx @@ -0,0 +1,37 @@ +--- +title: 'Restore a pending invitation' +description: 'Restore a call invitation that was received before the Android application started or resumed.' +product: 'sdk' +context: 'chat/sdk/android' +template: 'guide' +status: 'published' +lastUpdated: '2026-08-10' +version: 'v4' +platform: 'android' +sourcePath: '/sdk/android/calling/retrieving-call-information/restore-pending-invitation' +--- + +`getSignalingInvitationInfoStartApp()` takes no application parameters. It returns the invitation snapshot that should be handled when the application starts or resumes. + +```java +OpenIMClient.getInstance().signalingManager.getSignalingInvitationInfoStartApp( + new OnBase() { + @Override + public void onSuccess(SignalingInfo info) { + if (info != null + && info.getInvitation() != null + && info.getInvitation().getRoomID() != null + && !info.getInvitation().getRoomID().isEmpty()) { + restoreIncomingCall(info); + } + } + + @Override + public void onError(int code, String error) { + clearExpiredIncomingCall(); + } + } +); +``` + +Success only means that the current snapshot was retrieved; it does not replace the call listener. Restore the incoming-call interface only when both `invitation` and `roomID` are valid. Continue handling cancellation, timeout, acceptance, and hang-up through [Handle call events](/sdk/android/calling/managing-calls/handle-call-events). diff --git a/content/docs/chat/sdk/android/calling/sending-custom-signals/send-a-custom-signal.mdx b/content/docs/chat/sdk/android/calling/sending-custom-signals/send-a-custom-signal.mdx new file mode 100644 index 0000000000..6ba5f79847 --- /dev/null +++ b/content/docs/chat/sdk/android/calling/sending-custom-signals/send-a-custom-signal.mdx @@ -0,0 +1,71 @@ +--- +title: 'Send a custom signal' +description: 'Send and receive custom signaling data in an Android SDK call room.' +product: 'sdk' +context: 'chat/sdk/android' +template: 'guide' +status: 'published' +lastUpdated: '2026-08-10' +version: 'v4' +platform: 'android' +sourcePath: '/sdk/android/calling/sending-custom-signals/send-a-custom-signal' +--- + +`signalingSendCustomSignal()` sends lightweight application negotiation data to a call room, such as a raised-hand action, layout hint, or application state update. It is not a chat message API and does not replace the media engine's data channel. + +## Send a signal + +Both `roomID` and `customInfo` are required strings. Define a stable schema and serialize structured data as JSON. + +```java +JSONObject signal = new JSONObject(); +signal.put("version", 1); +signal.put("eventID", eventID); +signal.put("type", "hand-raised"); +signal.put("userID", currentUserID); +signal.put("sentAt", System.currentTimeMillis()); + +OpenIMClient.getInstance().signalingManager.signalingSendCustomSignal( + new OnBase() { + @Override + public void onSuccess(String result) { + markSignalSent(eventID); + } + + @Override + public void onError(int code, String error) { + showSignalError(code, error); + } + }, + roomID, + signal.toString() +); +``` + +The success callback means that the send request completed, not that other participants processed it. Keep custom signals small and include a protocol version and application idempotency ID. Do not place large files, chat history, long-lived state, or sensitive credentials in `customInfo`. + +## Receive a signal + +`OnSignalingListener.onReceiveCustomSignal` returns `CustomSignalingInfo`. Validate the room and your application protocol before updating the interface. + +```java +@Override +public void onReceiveCustomSignal(CustomSignalingInfo info) { + if (info == null || !activeRoomID.equals(info.getRoomID())) { + return; + } + + CallSignal signal = parseAndValidateCallSignal(info.getCustomInfo()); + String mergeID = info.getRoomID() + ":" + signal.getEventID(); + if (hasAppliedSignal(mergeID)) { + return; + } + applyCallSignal(signal); +} +``` + +This page owns the complete handling contract for `onReceiveCustomSignal`. `parseAndValidateCallSignal()` should check the JSON structure, protocol version, `eventID`, `type`, and application fields. Process signals idempotently by `roomID:eventID` and do not depend on event order. + +`SignalingManager` retains only one listener. Add the custom signal callback to the application-level listener shown in [Handle call events](/sdk/android/calling/managing-calls/handle-call-events). Registering another listener from this feature would replace all other call callbacks. + +Custom client signaling must not grant host, payment, or privacy permissions. Store and validate authoritative state on a trusted backend. After reconnecting, reconcile long-lived state through a room query or the application backend. diff --git a/content/docs/chat/sdk/android/conversation/managing-conversations/clear-conversation-messages.mdx b/content/docs/chat/sdk/android/conversation/managing-conversations/clear-conversation-messages.mdx new file mode 100644 index 0000000000..223229b3e4 --- /dev/null +++ b/content/docs/chat/sdk/android/conversation/managing-conversations/clear-conversation-messages.mdx @@ -0,0 +1,33 @@ +--- +title: 'Clear messages in a conversation' +description: 'Use messageManager.clearConversationAndDeleteAllMsg() to keep an Android conversation entry while clearing its messages.' +product: 'sdk' +context: 'chat/sdk/android' +template: 'guide' +status: 'published' +lastUpdated: '2026-08-07' +version: 'v4' +platform: 'android' +sourcePath: '/sdk/android/conversation/managing-conversations/clear-conversation-messages' +--- + +Use `messageManager.clearConversationAndDeleteAllMsg()` for a product action such as “clear chat history”. + +```java +OpenIMClient.getInstance().messageManager.clearConversationAndDeleteAllMsg( + conversationID, + new OnBase() { + @Override + public void onSuccess(String data) { + messageStore.clearConversation(conversationID); + } + + @Override + public void onError(int code, String error) { + recordConversationClearFailure(code, error); + } + } +); +``` + +The conversation entry remains while the current account's messages and summary state are cleared. Clear the visible message list immediately, then reconcile the latest message, summary, and unread state from `onConversationChanged` or a fresh query. diff --git a/content/docs/chat/sdk/android/conversation/managing-conversations/clear-group-mentions.mdx b/content/docs/chat/sdk/android/conversation/managing-conversations/clear-group-mentions.mdx new file mode 100644 index 0000000000..05d2285f71 --- /dev/null +++ b/content/docs/chat/sdk/android/conversation/managing-conversations/clear-group-mentions.mdx @@ -0,0 +1,33 @@ +--- +title: 'Reset group mention status' +description: 'Use resetConversationGroupAtType() to reset an Android conversation group mention state.' +product: 'sdk' +context: 'chat/sdk/android' +template: 'guide' +status: 'published' +lastUpdated: '2026-08-07' +version: 'v4' +platform: 'android' +sourcePath: '/sdk/android/conversation/managing-conversations/clear-group-mentions' +--- + +After handling group messages that mention the current user, call `resetConversationGroupAtType()` to reset `groupAtType` to the normal state. + +```java +OpenIMClient.getInstance().conversationManager.resetConversationGroupAtType( + new OnBase() { + @Override + public void onSuccess(String data) { + markGroupMentionStateReset(conversationID); + } + + @Override + public void onError(int code, String error) { + recordGroupMentionResetFailure(code, error); + } + }, + conversationID +); +``` + +This operation only resets the state and must not be used to set `atMe` or `atAll`. Group mention state is distinct from message read state. Reconcile the conversation through `onConversationChanged`. diff --git a/content/docs/chat/sdk/android/conversation/managing-conversations/delete-conversation-with-messages.mdx b/content/docs/chat/sdk/android/conversation/managing-conversations/delete-conversation-with-messages.mdx new file mode 100644 index 0000000000..ad542400b3 --- /dev/null +++ b/content/docs/chat/sdk/android/conversation/managing-conversations/delete-conversation-with-messages.mdx @@ -0,0 +1,34 @@ +--- +title: 'Delete a conversation and its messages' +description: 'Use deleteConversationAndDeleteAllMsg() to delete an Android conversation and its messages.' +product: 'sdk' +context: 'chat/sdk/android' +template: 'guide' +status: 'published' +lastUpdated: '2026-08-07' +version: 'v4' +platform: 'android' +sourcePath: '/sdk/android/conversation/managing-conversations/delete-conversation-with-messages' +--- + +Use `deleteConversationAndDeleteAllMsg()` for a product action such as “delete this chat”. + +```java +OpenIMClient.getInstance().conversationManager.deleteConversationAndDeleteAllMsg( + new OnBase() { + @Override + public void onSuccess(String data) { + messageStore.clearConversation(conversationID); + conversationStore.remove(conversationID); + } + + @Override + public void onError(int code, String error) { + recordConversationDeleteFailure(code, error); + } + }, + conversationID +); +``` + +After success, clear the current message list and conversation row. This does not delete a friend relationship or leave or dismiss a group. A conversation can be regenerated by a new message or synchronization while the chat target still exists; reconcile through `onConversationChanged` or a fresh query. diff --git a/content/docs/chat/sdk/android/conversation/managing-conversations/get-total-unread-count.mdx b/content/docs/chat/sdk/android/conversation/managing-conversations/get-total-unread-count.mdx new file mode 100644 index 0000000000..85aee970c4 --- /dev/null +++ b/content/docs/chat/sdk/android/conversation/managing-conversations/get-total-unread-count.mdx @@ -0,0 +1,33 @@ +--- +title: 'Track the total unread count' +description: 'Use getTotalUnreadMsgCount() to retrieve the total unread count for the current Android account.' +product: 'sdk' +context: 'chat/sdk/android' +template: 'guide' +status: 'published' +lastUpdated: '2026-08-07' +version: 'v4' +platform: 'android' +sourcePath: '/sdk/android/conversation/managing-conversations/get-total-unread-count' +--- + +`getTotalUnreadMsgCount()` returns the complete unread snapshot for the signed-in account. Do not sum `unreadCount` values from only the currently loaded conversation pages. + +```java +OpenIMClient.getInstance().conversationManager.getTotalUnreadMsgCount( + new OnBase() { + @Override + public void onSuccess(String value) { + int totalUnread = Integer.parseInt(value); + updateApplicationBadge(totalUnread); + } + + @Override + public void onError(int code, String error) { + recordTotalUnreadFailure(code, error); + } + } +); +``` + +The callback value is a `String`; handle parse failures as an application error rather than treating it as a partial list total. This page owns `OnConversationListener.onTotalUnreadMessageCountChanged(int count)`, which updates the application badge after the initial query. diff --git a/content/docs/chat/sdk/android/conversation/managing-conversations/hide-a-conversation.mdx b/content/docs/chat/sdk/android/conversation/managing-conversations/hide-a-conversation.mdx new file mode 100644 index 0000000000..6e105c864a --- /dev/null +++ b/content/docs/chat/sdk/android/conversation/managing-conversations/hide-a-conversation.mdx @@ -0,0 +1,33 @@ +--- +title: 'Hide a conversation' +description: 'Use hideConversation() to hide a conversation entry from the current Android account.' +product: 'sdk' +context: 'chat/sdk/android' +template: 'guide' +status: 'published' +lastUpdated: '2026-08-07' +version: 'v4' +platform: 'android' +sourcePath: '/sdk/android/conversation/managing-conversations/hide-a-conversation' +--- + +`hideConversation()` hides only the current account's conversation entry. It does not delete a one-to-one relationship, leave a group, or affect another account. + +```java +OpenIMClient.getInstance().conversationManager.hideConversation( + new OnBase() { + @Override + public void onSuccess(String data) { + conversationStore.remove(conversationID); + } + + @Override + public void onError(int code, String error) { + recordConversationHideFailure(code, error); + } + }, + conversationID +); +``` + +A hidden conversation can appear again after a new message or resynchronization. Remove it optimistically after success, then merge later `onConversationChanged` events idempotently by `conversationID`. diff --git a/content/docs/chat/sdk/android/conversation/managing-conversations/mark-conversation-read.mdx b/content/docs/chat/sdk/android/conversation/managing-conversations/mark-conversation-read.mdx new file mode 100644 index 0000000000..e73766fafb --- /dev/null +++ b/content/docs/chat/sdk/android/conversation/managing-conversations/mark-conversation-read.mdx @@ -0,0 +1,35 @@ +--- +title: 'Mark a conversation as read' +description: 'Use messageManager.markConversationMessageAsRead() to mark Android conversation messages as read.' +product: 'sdk' +context: 'chat/sdk/android' +template: 'guide' +status: 'published' +lastUpdated: '2026-08-07' +version: 'v4' +platform: 'android' +sourcePath: '/sdk/android/conversation/managing-conversations/mark-conversation-read' +--- + +Call `messageManager.markConversationMessageAsRead()` after the user has opened and read visible messages. Do not mark a conversation read merely because a notification was previewed or a message arrived in the background. + +```java +OpenIMClient.getInstance().messageManager.markConversationMessageAsRead( + conversationID, + new OnBase() { + @Override + public void onSuccess(String data) { + markConversationReadSubmitted(conversationID); + } + + @Override + public void onError(int code, String error) { + recordMarkReadFailure(code, error); + } + } +); +``` + +Request completion does not guarantee `onConversationChanged` has arrived. Merge the current `ConversationInfo` by `conversationID`, or re-query it when immediate confirmation is required. + +For one-to-one chats, the peer can receive `OnAdvanceMsgListener.onRecvC2CReadReceipt`. Validate `sessionType == ConversationType.SINGLE_CHAT` and a non-empty `userID`, then update message read state from `msgIDList`. `MessageManager` retains one advanced message listener and should be configured once in a shared message state layer. diff --git a/content/docs/chat/sdk/android/conversation/managing-conversations/pin-conversation.mdx b/content/docs/chat/sdk/android/conversation/managing-conversations/pin-conversation.mdx new file mode 100644 index 0000000000..169a69bdaa --- /dev/null +++ b/content/docs/chat/sdk/android/conversation/managing-conversations/pin-conversation.mdx @@ -0,0 +1,32 @@ +--- +title: 'Pin or unpin a conversation' +description: 'Use pinConversation() to set the pinned state of an Android conversation.' +product: 'sdk' +context: 'chat/sdk/android' +template: 'guide' +status: 'published' +lastUpdated: '2026-08-07' +version: 'v4' +platform: 'android' +sourcePath: '/sdk/android/conversation/managing-conversations/pin-conversation' +--- + +```java +OpenIMClient.getInstance().conversationManager.pinConversation( + new OnBase() { + @Override + public void onSuccess(String data) { + markPinRequestSubmitted(conversationID, true); + } + + @Override + public void onError(int code, String error) { + recordConversationPinFailure(code, error); + } + }, + conversationID, + true +); +``` + +Pass `true` to pin and `false` to unpin. The setting affects only the current account's conversation list. A successful callback does not mean `onConversationChanged` has arrived; merge the later conversation increment by `conversationID`. diff --git a/content/docs/chat/sdk/android/conversation/managing-conversations/set-burn-duration.mdx b/content/docs/chat/sdk/android/conversation/managing-conversations/set-burn-duration.mdx new file mode 100644 index 0000000000..e8a7398fb2 --- /dev/null +++ b/content/docs/chat/sdk/android/conversation/managing-conversations/set-burn-duration.mdx @@ -0,0 +1,32 @@ +--- +title: 'Set the burn duration' +description: 'Use setConversationBurnDuration() to set the Android burn-after-reading retention duration.' +product: 'sdk' +context: 'chat/sdk/android' +template: 'guide' +status: 'published' +lastUpdated: '2026-08-07' +version: 'v4' +platform: 'android' +sourcePath: '/sdk/android/conversation/managing-conversations/set-burn-duration' +--- + +```java +OpenIMClient.getInstance().conversationManager.setConversationBurnDuration( + new OnBase() { + @Override + public void onSuccess(String data) { + markBurnDurationSubmitted(conversationID, 30); + } + + @Override + public void onError(int code, String error) { + recordBurnDurationFailure(code, error); + } + }, + conversationID, + 30 +); +``` + +`burnDuration` is measured in seconds. Enable or disable burn after reading with `isPrivateChat`; do not confuse this value with the scheduled server deletion period `msgDestructTime`. Merge the updated duration from `onConversationChanged`. diff --git a/content/docs/chat/sdk/android/conversation/managing-conversations/set-conversation-draft.mdx b/content/docs/chat/sdk/android/conversation/managing-conversations/set-conversation-draft.mdx new file mode 100644 index 0000000000..82479d7b70 --- /dev/null +++ b/content/docs/chat/sdk/android/conversation/managing-conversations/set-conversation-draft.mdx @@ -0,0 +1,34 @@ +--- +title: 'Set a conversation draft' +description: 'Use setConversationDraft() to save an Android conversation draft.' +product: 'sdk' +context: 'chat/sdk/android' +template: 'guide' +status: 'published' +lastUpdated: '2026-08-07' +version: 'v4' +platform: 'android' +sourcePath: '/sdk/android/conversation/managing-conversations/set-conversation-draft' +--- + +Save the draft when a chat is left, the conversation changes, or editor content changes. Maintain editor state locally and debounce intermediate saves; submit the newest value before leaving the page. + +```java +OpenIMClient.getInstance().conversationManager.setConversationDraft( + new OnBase() { + @Override + public void onSuccess(String data) { + markDraftSubmitted(conversationID); + } + + @Override + public void onError(int code, String error) { + recordDraftSaveFailure(code, error); + } + }, + conversationID, + editorValue +); +``` + +Pass an empty string to clear the draft. Request completion and the later `onConversationChanged` update are separate; merge `draftText` and `draftTextTime` by `conversationID`, and clear in-memory editor state after logout or an account switch. diff --git a/content/docs/chat/sdk/android/conversation/managing-conversations/set-conversation-extension.mdx b/content/docs/chat/sdk/android/conversation/managing-conversations/set-conversation-extension.mdx new file mode 100644 index 0000000000..db34de0d69 --- /dev/null +++ b/content/docs/chat/sdk/android/conversation/managing-conversations/set-conversation-extension.mdx @@ -0,0 +1,34 @@ +--- +title: 'Set conversation extra data' +description: 'Use setConversationEx() to set an Android conversation extension string.' +product: 'sdk' +context: 'chat/sdk/android' +template: 'guide' +status: 'published' +lastUpdated: '2026-08-07' +version: 'v4' +platform: 'android' +sourcePath: '/sdk/android/conversation/managing-conversations/set-conversation-extension' +--- + +`ex` is a complete string. The SDK does not merge JSON, so read the prior value and retain namespaces owned by other application modules. + +```java +OpenIMClient.getInstance().conversationManager.setConversationEx( + new OnBase() { + @Override + public void onSuccess(String data) { + markConversationExtensionSubmitted(conversationID); + } + + @Override + public void onError(int code, String error) { + recordConversationExtensionFailure(code, error); + } + }, + conversationID, + mergedExtensionJSON +); +``` + +Reconcile the result through `onConversationChanged` by `conversationID`; listener ownership is documented in [Get the conversation list](/sdk/android/conversation/retrieving-conversations/retrieve-conversation-list). diff --git a/content/docs/chat/sdk/android/conversation/managing-conversations/set-message-destruct.mdx b/content/docs/chat/sdk/android/conversation/managing-conversations/set-message-destruct.mdx new file mode 100644 index 0000000000..80d1f51b7e --- /dev/null +++ b/content/docs/chat/sdk/android/conversation/managing-conversations/set-message-destruct.mdx @@ -0,0 +1,38 @@ +--- +title: 'Schedule server message deletion' +description: 'Use setConversation() to configure scheduled server message deletion for an Android conversation.' +product: 'sdk' +context: 'chat/sdk/android' +template: 'guide' +status: 'published' +lastUpdated: '2026-08-07' +version: 'v4' +platform: 'android' +sourcePath: '/sdk/android/conversation/managing-conversations/set-message-destruct' +--- + +`isMsgDestruct` and `msgDestructTime` together configure scheduled server message deletion and can be sent in one `ConversationReq`. + +```java +ConversationReq request = new ConversationReq(); +request.setMsgDestruct(true); +request.setMsgDestructTime(3600); + +OpenIMClient.getInstance().conversationManager.setConversation( + new OnBase() { + @Override + public void onSuccess(String data) { + markMessageDestructSubmitted(conversationID); + } + + @Override + public void onError(int code, String error) { + recordMessageDestructFailure(code, error); + } + }, + conversationID, + request +); +``` + +`msgDestructTime` is measured in seconds. Set `request.setMsgDestruct(false)` to disable the policy. This capability is distinct from burn after reading. Reconcile the latest switch and period through `onConversationChanged`. diff --git a/content/docs/chat/sdk/android/conversation/managing-conversations/set-message-receive-option.mdx b/content/docs/chat/sdk/android/conversation/managing-conversations/set-message-receive-option.mdx new file mode 100644 index 0000000000..2de3a73dd1 --- /dev/null +++ b/content/docs/chat/sdk/android/conversation/managing-conversations/set-message-receive-option.mdx @@ -0,0 +1,38 @@ +--- +title: 'Set conversation message reception' +description: 'Use setConversationRecvMessageOpt() to set message reception and notification behavior for one Android conversation.' +product: 'sdk' +context: 'chat/sdk/android' +template: 'guide' +status: 'published' +lastUpdated: '2026-08-07' +version: 'v4' +platform: 'android' +sourcePath: '/sdk/android/conversation/managing-conversations/set-message-receive-option' +--- + +```java +OpenIMClient.getInstance().conversationManager.setConversationRecvMessageOpt( + new OnBase() { + @Override + public void onSuccess(String data) { + markReceiveOptionSubmitted(conversationID); + } + + @Override + public void onError(int code, String error) { + recordReceiveOptionFailure(code, error); + } + }, + conversationID, + 2 +); +``` + +| Value | Meaning | +| ----- | ------------------------------------------------------------- | +| `0` | Receive messages and allow notifications. | +| `1` | Do not receive messages from this conversation or notify. | +| `2` | Receive messages from this conversation without notification. | + +The account default is documented in [Set global message reception](/sdk/android/user/user-profile/set-global-message-reception). Merge the later `onConversationChanged` result by `conversationID`. diff --git a/content/docs/chat/sdk/android/conversation/managing-conversations/set-private-chat.mdx b/content/docs/chat/sdk/android/conversation/managing-conversations/set-private-chat.mdx new file mode 100644 index 0000000000..899e5cb2b4 --- /dev/null +++ b/content/docs/chat/sdk/android/conversation/managing-conversations/set-private-chat.mdx @@ -0,0 +1,32 @@ +--- +title: 'Enable or disable burn after reading' +description: 'Use setOneConversationPrivateChat() to configure burn-after-reading mode for an Android conversation.' +product: 'sdk' +context: 'chat/sdk/android' +template: 'guide' +status: 'published' +lastUpdated: '2026-08-07' +version: 'v4' +platform: 'android' +sourcePath: '/sdk/android/conversation/managing-conversations/set-private-chat' +--- + +```java +OpenIMClient.getInstance().conversationManager.setOneConversationPrivateChat( + new OnBase() { + @Override + public void onSuccess(String data) { + markPrivateChatSubmitted(conversationID, true); + } + + @Override + public void onError(int code, String error) { + recordPrivateChatFailure(code, error); + } + }, + conversationID, + true +); +``` + +Pass `false` to disable burn after reading. Set the duration separately with `burnDuration`; see [Set the burn duration](/sdk/android/conversation/managing-conversations/set-burn-duration). This is distinct from scheduled server message deletion. Reconcile the final state through `onConversationChanged`. diff --git a/content/docs/chat/sdk/android/conversation/overview-conversation.mdx b/content/docs/chat/sdk/android/conversation/overview-conversation.mdx new file mode 100644 index 0000000000..c8dd673cd0 --- /dev/null +++ b/content/docs/chat/sdk/android/conversation/overview-conversation.mdx @@ -0,0 +1,50 @@ +--- +title: 'Conversation overview' +description: 'Learn about ConversationInfo, conversationID, conversation settings, and conversation events in the Android SDK.' +product: 'sdk' +context: 'chat/sdk/android' +template: 'guide' +status: 'published' +lastUpdated: '2026-08-07' +version: 'v4' +platform: 'android' +sourcePath: '/sdk/android/conversation/overview-conversation' +--- + +A conversation is the chat-list state maintained by the signed-in account for a one-to-one or group chat. A `ConversationInfo` record contains unread count, latest message, pinning, draft, message reception, and extension data. `conversationID` identifies the account's conversation state; the chat target is the peer `userID` for a one-to-one chat or the `groupID` for a group chat. + +Group profile, membership, and permissions belong to Group APIs. Use `groupID` for group operations and `conversationID` for conversation settings, unread state, drafts, and message cleanup. + +## Conversation identifiers + +| Identifier | Purpose | +| ---------------- | ------------------------------------------------------------------------------------------------------------ | +| `conversationID` | Conversation record ID for settings, unread state, and message history. | +| `userID` | Peer user ID in a one-to-one chat. | +| `groupID` | Group ID for a group chat and Group API target. | +| `sourceId` | Chat target passed to queries and ID resolution: `userID` for a one-to-one chat, `groupID` for a group chat. | + +Use `ConversationType.SINGLE_CHAT` for one-to-one chats. For a group chat, use `ConversationType.GROUP_CHAT` or `ConversationType.SUPER_GROUP_CHAT` according to the group type. Do not construct a `conversationID` in application code. + +## ConversationInfo + +| Field | Description | +| ------------------------------------- | -------------------------------------------------- | +| `conversationID` / `conversationType` | Conversation ID and type. | +| `userID` / `groupID` | Peer user or target group. | +| `showName` / `faceURL` | Conversation-list display name and avatar. | +| `unreadCount` | Unread count for the conversation. | +| `latestMsg` / `latestMsgSendTime` | Latest-message JSON and send time. | +| `recvMsgOpt` / `groupAtType` | Reception option and group mention state. | +| `draftText` / `draftTextTime` | Draft and draft update time. | +| `isPinned` | Whether the conversation is pinned. | +| `isPrivateChat` / `burnDuration` | Burn-after-reading setting and duration. | +| `isMsgDestruct` / `msgDestructTime` | Server message-destruction configuration. | +| `ex` | Application-defined conversation extension string. | + +## State updates + +- [Get the conversation list](/sdk/android/conversation/retrieving-conversations/retrieve-conversation-list) owns `onNewConversation` and `onConversationChanged`. +- [Track the total unread count](/sdk/android/conversation/managing-conversations/get-total-unread-count) owns `onTotalUnreadMessageCountChanged`. + +`ConversationManager` retains one `OnConversationListener`; `setOnConversationListener()` replaces it. Set a composed listener once in a shared state layer. Request completion, event arrival, and snapshot reconciliation are separate stages. diff --git a/content/docs/chat/sdk/android/conversation/retrieving-conversations/get-conversation-by-target.mdx b/content/docs/chat/sdk/android/conversation/retrieving-conversations/get-conversation-by-target.mdx new file mode 100644 index 0000000000..ebea8b814b --- /dev/null +++ b/content/docs/chat/sdk/android/conversation/retrieving-conversations/get-conversation-by-target.mdx @@ -0,0 +1,36 @@ +--- +title: 'Open a conversation' +description: 'Use getOneConversation() to retrieve one Android conversation by user or group.' +product: 'sdk' +context: 'chat/sdk/android' +template: 'guide' +status: 'published' +lastUpdated: '2026-08-07' +version: 'v4' +platform: 'android' +sourcePath: '/sdk/android/conversation/retrieving-conversations/get-conversation-by-target' +--- + +Use `getOneConversation()` when opening a chat from a contact, user profile, or group profile. Pass the peer user ID for a one-to-one chat and the group ID for a group chat; do not construct `ConversationInfo` locally when no messages exist yet. + +```java +OpenIMClient.getInstance().conversationManager.getOneConversation( + new OnBase() { + @Override + public void onSuccess(ConversationInfo conversation) { + openChatPage(conversation); + } + + @Override + public void onError(int code, String error) { + recordConversationOpenFailure(code, error); + } + }, + targetUserID, + ConversationType.SINGLE_CHAT +); +``` + +`sourceId` is the peer `userID` for a one-to-one chat and `groupID` for a group chat. Use `ConversationType.GROUP_CHAT` or `ConversationType.SUPER_GROUP_CHAT` for a group according to its type. + +The callback returns `ConversationInfo`. This query does not trigger a conversation listener; [Get the conversation list](/sdk/android/conversation/retrieving-conversations/retrieve-conversation-list) merges later changes by `conversationID`. diff --git a/content/docs/chat/sdk/android/conversation/retrieving-conversations/get-conversation-id.mdx b/content/docs/chat/sdk/android/conversation/retrieving-conversations/get-conversation-id.mdx new file mode 100644 index 0000000000..dc28debd0b --- /dev/null +++ b/content/docs/chat/sdk/android/conversation/retrieving-conversations/get-conversation-id.mdx @@ -0,0 +1,26 @@ +--- +title: 'Resolve a conversation ID' +description: 'Use getConversationIDBySessionType() to resolve an Android conversation ID from a chat target.' +product: 'sdk' +context: 'chat/sdk/android' +template: 'guide' +status: 'published' +lastUpdated: '2026-08-07' +version: 'v4' +platform: 'android' +sourcePath: '/sdk/android/conversation/retrieving-conversations/get-conversation-id' +--- + +When only the conversation ID is needed, call `getConversationIDBySessionType()` rather than constructing it in application code. + +```java +String conversationID = OpenIMClient.getInstance().conversationManager + .getConversationIDBySessionType( + targetUserID, + ConversationType.SINGLE_CHAT + ); +``` + +`sourceId` is the peer `userID` for a one-to-one chat and `groupID` for a group chat. Use the group conversation type that matches the target group. + +This Android API synchronously returns a `String` `conversationID`. It does not return `ConversationInfo` or trigger a conversation listener. Use [Open a conversation](/sdk/android/conversation/retrieving-conversations/get-conversation-by-target) when profile data is required. diff --git a/content/docs/chat/sdk/android/conversation/retrieving-conversations/get-conversations-by-id.mdx b/content/docs/chat/sdk/android/conversation/retrieving-conversations/get-conversations-by-id.mdx new file mode 100644 index 0000000000..2f522702e2 --- /dev/null +++ b/content/docs/chat/sdk/android/conversation/retrieving-conversations/get-conversations-by-id.mdx @@ -0,0 +1,35 @@ +--- +title: 'Get conversations by ID' +description: 'Use getMultipleConversation() to retrieve Android conversations by conversationID.' +product: 'sdk' +context: 'chat/sdk/android' +template: 'guide' +status: 'published' +lastUpdated: '2026-08-07' +version: 'v4' +platform: 'android' +sourcePath: '/sdk/android/conversation/retrieving-conversations/get-conversations-by-id' +--- + +Use `getMultipleConversation()` when a set of `conversationID` values is already available and the latest conversation snapshot is needed. + +```java +OpenIMClient.getInstance().conversationManager.getMultipleConversation( + new OnBase>() { + @Override + public void onSuccess(List conversations) { + for (ConversationInfo item : conversations) { + conversationStore.put(item.getConversationID(), item); + } + } + + @Override + public void onError(int code, String error) { + recordConversationQueryFailure(code, error); + } + }, + conversationIDs +); +``` + +Remove empty and duplicate IDs before calling. The callback returns `List`. Treat an ID with no returned item as missing; do not assume response order exactly matches request order. This query does not trigger a conversation listener. diff --git a/content/docs/chat/sdk/android/conversation/retrieving-conversations/retrieve-conversation-list.mdx b/content/docs/chat/sdk/android/conversation/retrieving-conversations/retrieve-conversation-list.mdx new file mode 100644 index 0000000000..78bd222c37 --- /dev/null +++ b/content/docs/chat/sdk/android/conversation/retrieving-conversations/retrieve-conversation-list.mdx @@ -0,0 +1,59 @@ +--- +title: 'Get the conversation list' +description: 'Use getConversationListSplit() to retrieve the current Android account conversation list by page.' +product: 'sdk' +context: 'chat/sdk/android' +template: 'guide' +status: 'published' +lastUpdated: '2026-08-07' +version: 'v4' +platform: 'android' +sourcePath: '/sdk/android/conversation/retrieving-conversations/retrieve-conversation-list' +--- + +The conversation list belongs to the signed-in account. Each `ConversationInfo` contains list state such as unread count, latest message, pinning, and draft. Use the paged API instead of the non-paged `getAllConversationList()`. + +## Retrieve a page + +```java +OpenIMClient.getInstance().conversationManager.getConversationListSplit( + new OnBase>() { + @Override + public void onSuccess(List conversations) { + mergeConversations(conversations); + } + + @Override + public void onError(int code, String error) { + recordConversationListFailure(code, error); + } + }, + 0, + 50 +); +``` + +| Parameter | Type | Description | +| --------- | ------ | ----------------------------------------------------- | +| `offset` | `long` | Zero-based paging offset; reset it to `0` on refresh. | +| `count` | `long` | Requested number of conversations. | + +The callback returns the current `List` page. Advance `offset` by the requested item count and deduplicate by `conversationID`. A page smaller than `count` normally indicates the end; clear paging state and reload from `0` on refresh. + +## Keep the list synchronized + +`getConversationListSplit()` only creates a snapshot. Combine these callbacks in the application's single `OnConversationListener`: + +```java +@Override +public void onNewConversation(List conversations) { + mergeConversations(conversations); +} + +@Override +public void onConversationChanged(List conversations) { + mergeConversations(conversations); +} +``` + +Both callbacks carry `List` and must merge idempotently by `conversationID`. A user can join a group without an existing conversation, and a historical conversation can remain after leaving a group, so do not substitute the joined-group list for the conversation list. diff --git a/content/docs/chat/sdk/android/events/overview-events.mdx b/content/docs/chat/sdk/android/events/overview-events.mdx new file mode 100644 index 0000000000..897d4e2c50 --- /dev/null +++ b/content/docs/chat/sdk/android/events/overview-events.mdx @@ -0,0 +1,128 @@ +--- +title: 'Events overview' +description: 'Register Android SDK listeners centrally and route connection, synchronization, and data events by domain.' +product: 'sdk' +context: 'chat/sdk/android' +template: 'guide' +status: 'published' +lastUpdated: '2026-08-10' +version: 'v4' +platform: 'android' +sourcePath: '/sdk/android/events/overview-events' +--- + +OpenIM Android SDK uses listeners to report connection, synchronization, user, friendship, conversation, group, message, and calling changes. Listener setters on each manager use replacement semantics: a later call replaces the previous instance. Combine all callbacks in an application-level event center and register them once before login. Do not register them repeatedly from an Activity, Fragment, Compose screen, or feature component. + +The connection listener is the exception. `OnConnListener` is passed to `initSDK()`; its complete handling contract is described in [Authenticate and manage a session](/sdk/android/getting-started/authenticate-and-manage-session). + +## Register listeners centrally + +The following entry point uses stable application-level listeners. Each listener should include all callbacks for its domain; detailed merge behavior remains on the page that owns each event. + +```java +public final class OpenIMEventCenter { + private final OpenIMClient client = OpenIMClient.getInstance(); + + private final OnUserListener userListener = buildUserListener(); + private final OnFriendshipListener friendshipListener = buildFriendshipListener(); + private final OnConversationListener conversationListener = buildConversationListener(); + private final OnGroupListener groupListener = buildGroupListener(); + private final OnAdvanceMsgListener messageListener = buildMessageListener(); + private final OnCustomBusinessListener businessListener = buildBusinessListener(); + private final OnSignalingListener signalingListener = buildSignalingListener(); + + public void registerBeforeLogin() { + client.userInfoManager.setOnUserListener(userListener); + client.friendshipManager.setOnFriendshipListener(friendshipListener); + client.conversationManager.setOnConversationListener(conversationListener); + client.groupManager.setOnGroupListener(groupListener); + client.messageManager.setAdvancedMsgListener(messageListener); + client.messageManager.setCustomBusinessListener(businessListener); + client.signalingManager.setSignalingListener(signalingListener); + } +} +``` + +The Android SDK does not expose remove or unset methods for these listeners. When signing out, switching accounts, or destroying the application state layer, stop dispatching into old account state and destroyed screens. Before the next login, replace each listener with the complete listener set for the new account. + +## Event ownership + +| Event scope | Listener | Corresponding page | +| --- | --- | --- | +| Connection, token, and forced logout | `OnConnListener` | [Authenticate and manage a session](/sdk/android/getting-started/authenticate-and-manage-session) | +| Current user profile | `OnUserListener` | [Update the current user profile](/sdk/android/user/user-profile/set-self-info) | +| Online status | `OnUserListener` | [Subscribe to user online status](/sdk/android/user/online-status/subscribe-users-online-status) | +| Friend relationships and profiles | `OnFriendshipListener` | [Get the friend list by page](/sdk/android/user/friends/get-friend-list-page) | +| Friend applications | `OnFriendshipListener` | [Get received friend requests](/sdk/android/user/friend-applications/get-recv-friend-application-list) | +| Blacklist | `OnFriendshipListener` | [Block a user](/sdk/android/user/blacklist/add-blacklist), [Remove a user from the blacklist](/sdk/android/user/blacklist/remove-blacklist) | +| Conversation list | `OnConversationListener` | [Retrieve the conversation list](/sdk/android/conversation/retrieving-conversations/retrieve-conversation-list) | +| Total unread count | `OnConversationListener` | [Get the total unread count](/sdk/android/conversation/managing-conversations/get-total-unread-count) | +| Typing state | `OnConversationListener` | [Update typing status](/sdk/android/message/composing-messages/update-typing-status) | +| Group profiles, members, and applications | `OnGroupListener` | [Group overview](/sdk/android/group/overview-group) | +| New, offline, and online-only messages | `OnAdvanceMsgListener` | [Receive messages](/sdk/android/message/receiving-messages/receive-messages) | +| Message revocation | `OnAdvanceMsgListener` | [Revoke a message](/sdk/android/message/managing-messages/revoke-a-message) | +| Message deletion | `OnAdvanceMsgListener` | [Delete messages in a batch](/sdk/android/message/managing-messages/delete-saved-messages) | +| Message modification | `OnAdvanceMsgListener` | [Modify a message](/sdk/android/message/managing-messages/modify-a-message) | +| Pinned messages | `OnAdvanceMsgListener` | [Pin or unpin a message](/sdk/android/message/managing-messages/set-message-pinned) | +| One-to-one read receipts | `OnAdvanceMsgListener` | [Mark a conversation as read](/sdk/android/conversation/managing-conversations/mark-conversation-read) | +| Custom business messages | `OnCustomBusinessListener` | [Receive custom business messages](/sdk/android/message/receiving-messages/receive-custom-business-messages) | +| Calls | `OnSignalingListener` | [Handle call events](/sdk/android/calling/managing-calls/handle-call-events) | +| Custom call signaling | `OnSignalingListener` | [Send a custom signal](/sdk/android/calling/sending-custom-signals/send-a-custom-signal) | +| SDK data synchronization | `OnConversationListener` | [Handle initial synchronization](#handle-initial-synchronization) | + +Query APIs establish snapshots, and listeners merge subsequent changes. Query results, successful API callbacks, and event delivery are three independent stages and cannot replace one another. + +## Handle initial synchronization + +The synchronization lifecycle belongs to the application-level `OnConversationListener`. That listener must also include conversation-list, unread-count, and typing-status callbacks. The following example only highlights synchronization logic owned by this page. + +```java +private OnConversationListener buildConversationListener() { + return new OnConversationListener() { + @Override + public void onNewConversation(List conversations) { + mergeNewConversations(conversations); + } + + @Override + public void onConversationChanged(List conversations) { + mergeChangedConversations(conversations); + } + + @Override + public void onTotalUnreadMessageCountChanged(int total) { + updateTotalUnreadCount(total); + } + + @Override + public void onConversationUserInputStatusChanged(String payload) { + handleInputStatus(payload); + } + + @Override + public void onSyncServerStart(boolean reinstall) { + setSyncState("syncing", 0, reinstall); + } + + @Override + public void onSyncServerProgress(long progress) { + setSyncProgress(progress); + } + + @Override + public void onSyncServerFinish(boolean reinstall) { + setSyncState("ready", 100, reinstall); + reloadVisibleSnapshots(); + } + + @Override + public void onSyncServerFailed(boolean reinstall) { + setSyncState("failed", 0, reinstall); + } + }; +} +``` + +When `reinstall` is `true`, treat local data as being rebuilt. Show a more complete synchronization state and avoid relying on old cache data until synchronization completes. `onSyncServerProgress` reports current progress. After completion, query the snapshots needed by visible screens again. On failure, record the error and wait for retry or connection recovery. + +This page owns the complete handling contract for `onSyncServerStart`, `onSyncServerProgress`, `onSyncServerFinish`, and `onSyncServerFailed`. Synchronization state has no business entity key; isolate it by the current `OpenIMClient` singleton and signed-in user. diff --git a/content/docs/chat/sdk/android/file-uploads/track-file-upload-progress.mdx b/content/docs/chat/sdk/android/file-uploads/track-file-upload-progress.mdx new file mode 100644 index 0000000000..79f9e2b579 --- /dev/null +++ b/content/docs/chat/sdk/android/file-uploads/track-file-upload-progress.mdx @@ -0,0 +1,51 @@ +--- +title: 'Track file upload progress' +description: 'Use OnPutFileListener to track an individual Android SDK file upload.' +product: 'sdk' +context: 'chat/sdk/android' +template: 'guide' +status: 'published' +lastUpdated: '2026-08-10' +version: 'v4' +platform: 'android' +sourcePath: '/sdk/android/file-uploads/track-file-upload-progress' +--- + +The Android SDK does not use a global file-upload listener. Pass an `OnPutFileListener` to each `uploadFile()` call. That listener receives progress, part completion, and final result callbacks for the current task. + +```java +OnPutFileListener uploadListener = new OnPutFileListener() { + @Override + public void open(long size) { + initializeUploadProgress(uploadTaskID, size); + } + + @Override + public void uploadID(String id) { + bindSdkUploadID(uploadTaskID, id); + } + + @Override + public void uploadComplete(long fileSize, long uploadedSize, long storageSize) { + updateUploadProgress(uploadTaskID, uploadedSize, fileSize); + } + + @Override + public void uploadPartComplete(long partNumber, long partSize, String partHash) { + markPartComplete(uploadTaskID, partNumber, partSize, partHash); + } + + @Override + public void complete(long size, String url, long type) { + completeUpload(uploadTaskID, size, url, type); + } +}; + +OpenIMClient.getInstance().uploadFile(resultCallback, uploadListener, putArgs); +``` + +Use `open()` to initialize the total size, `uploadID()` to receive the SDK upload identifier, `uploadComplete()` for in-progress byte counts, `uploadPartComplete()` when one part finishes, and `complete()` for the final size, remote URL, and resource type. Most progress bars only need the progress and completion callbacks; process part details only when the product exposes them. + +Generate a stable application-level `uploadTaskID` and capture it in the listener. Do not use the SDK upload ID, file name, or array position as the task's primary key. Give each task its own listener, and stop dispatching callbacks into destroyed page or account state. + +For complete argument construction and error handling, see [Upload a file](/sdk/android/file-uploads/upload-file). diff --git a/content/docs/chat/sdk/android/file-uploads/upload-file.mdx b/content/docs/chat/sdk/android/file-uploads/upload-file.mdx new file mode 100644 index 0000000000..2a71ae182a --- /dev/null +++ b/content/docs/chat/sdk/android/file-uploads/upload-file.mdx @@ -0,0 +1,61 @@ +--- +title: 'Upload a file' +description: 'Upload a standalone file with the Android SDK and retrieve its remote resource URL.' +product: 'sdk' +context: 'chat/sdk/android' +template: 'guide' +status: 'published' +lastUpdated: '2026-08-10' +version: 'v4' +platform: 'android' +sourcePath: '/sdk/android/file-uploads/upload-file' +--- + +`uploadFile()` uploads a standalone file for uses such as a user avatar, group avatar, profile attachment, or other application resource. The upload does not belong to a message and does not automatically create a message or update a profile. + +## Parameters + +| Parameter | Type | Required | Description | +| ------------------ | ------------------- | -------- | -------------------------------------------------------------------------------------------------------------------------- | +| `base` | `OnBase` | Yes | Receives the final success or failure result for the upload request. | +| `listener` | `OnPutFileListener` | Yes | Receives progress, part completion, and final file information for this task. | +| `putArgs.filepath` | `String` | Yes | A local file path readable by the Android application. | +| `putArgs.name` | `String` | Yes | The upload file name. `PutArgs` initially uses the supplied path; replace it with the original file name when appropriate. | +| `putArgs.cuase` | `String` | No | An application-defined upload reason. The spelling follows the Android SDK `PutArgs` declaration. | + +```java +File file = new File(localPath); +PutArgs args = new PutArgs(file.getAbsolutePath()); +args.name = file.getName(); +args.cuase = "user-avatar"; + +OpenIMClient.getInstance().uploadFile( + new OnBase() { + @Override + public void onSuccess(String result) { + finishUploadRequest(result); + } + + @Override + public void onError(int code, String error) { + showUploadError(code, error); + } + }, + new OnPutFileListener() { + @Override + public void uploadComplete(long fileSize, long uploadedSize, long storageSize) { + updateUploadProgress(uploadTaskID, uploadedSize, fileSize); + } + + @Override + public void complete(long size, String url, long type) { + completeUpload(uploadTaskID, size, url, type); + } + }, + args +); +``` + +Each call receives its own `OnPutFileListener`, so no global upload listener is required. For parallel uploads, generate a stable task ID and capture it in the callbacks. Do not use a file name or list position as the unique identifier. See [Track file upload progress](/sdk/android/file-uploads/track-file-upload-progress) for callback responsibilities. + +The URL returned by `complete()` can be used later to update an avatar, store an attachment address, or create a URL-based media message. Upload success only means that the resource was written remotely; profile updates, message creation, and message sending remain separate API calls. diff --git a/content/docs/chat/sdk/android/getting-started/authenticate-and-manage-session.mdx b/content/docs/chat/sdk/android/getting-started/authenticate-and-manage-session.mdx new file mode 100644 index 0000000000..29856453bf --- /dev/null +++ b/content/docs/chat/sdk/android/getting-started/authenticate-and-manage-session.mdx @@ -0,0 +1,195 @@ +--- +title: 'Authenticate and manage a session' +description: 'Initialize OpenIM Android SDK, log in, inspect login state, handle connection callbacks, and sign out the current account.' +product: 'sdk' +context: 'chat/sdk/android' +template: 'guide' +status: 'published' +lastUpdated: '2026-08-06' +version: 'v4' +platform: 'android' +sourcePath: '/sdk/android/getting-started/authenticate-and-manage-session' +--- + +OpenIM Android SDK uses `initSDK()` to initialize the local runtime and `login()` to establish the current user's session. Complete the service, user, and token preparation in [Before you start](/sdk/android/getting-started/before-you-start), then add dependencies and permissions as described in [Integrate for Android](/sdk/android/getting-started/environment-specific-implementation). + +The complete flow is: + +1. Create a stable `OnConnListener` in an application-level session component. +2. Call `initSDK()` and confirm that it returns `true`. +3. Register message, user, relationship, conversation, group, and call-signaling listeners before login. +4. Obtain the matching `userID` and token from a trusted backend, then call `login()`. +5. Wait separately for login success and `onConnectSuccess()` before enabling operations that require the persistent connection. +6. On sign-out or account switching, call `logout()` and then clear application state owned by the current account. + +The `apiAddr`, `wsAddr`, `userID`, and `token` used below are all provided by a trusted backend. + +## Initialize and handle the connection lifecycle + +During the `Application` lifecycle, create the data directory, initialize the SDK, and provide the connection listener. Store connection state without recording tokens or complete service credentials in callback logs. + +```java +import android.app.Application; + +import java.io.File; + +import io.openim.android.sdk.OpenIMClient; +import io.openim.android.sdk.enums.LogLevel; +import io.openim.android.sdk.listener.OnConnListener; +import io.openim.android.sdk.models.InitConfig; + +File dataDirectory = new File(application.getFilesDir(), "openim"); +if (!dataDirectory.exists() && !dataDirectory.mkdirs()) { + throw new IllegalStateException("Cannot create the OpenIM data directory."); +} + +InitConfig config = new InitConfig( + apiAddr, + wsAddr, + dataDirectory.getAbsolutePath() +); +config.logLevel = LogLevel.Info; +config.isLogStandardOutput = false; + +OnConnListener connectionListener = new OnConnListener() { + @Override + public void onConnecting() { + sessionState.setConnectionState("connecting"); + } + + @Override + public void onConnectSuccess() { + sessionState.setConnectionState("connected"); + sessionState.enableConnectedOperations(); + } + + @Override + public void onConnectFailed(long code, String error) { + sessionState.setConnectionState("failed"); + recordConnectionFailure(code, error); + } + + @Override + public void onKickedOffline() { + sessionState.clearCurrentAccount(); + showSignedInElsewhereScreen(); + } + + @Override + public void onUserTokenExpired() { + requestNewTokenAndRelogin(); + } + + @Override + public void onUserTokenInvalid(String reason) { + sessionState.clearCurrentAccount(); + showSignInScreen(reason); + } +}; + +boolean initialized = OpenIMClient.getInstance().initSDK( + application, + config, + connectionListener +); + +if (!initialized) { + throw new IllegalStateException("OpenIMClientSDK initialization failed."); +} +``` + +A `true` return value means that the local SDK runtime initialized successfully. `OnConnListener` starts reporting persistent-connection state after `login()` is called. + +| Field | Type | Description | +| --------------------- | ------------- | ------------------------------------------------------------------------- | +| `application` | `Application` | Application-level context that owns the SDK lifecycle. | +| `apiAddr` | `String` | OpenIMServer HTTP API endpoint. | +| `wsAddr` | `String` | OpenIMServer WebSocket endpoint. | +| `dataDirectory` | `File` | Application-private persistent directory for the SDK database and logs. | +| `config.logLevel` | `int` | A `LogLevel` constant; reduce the logging level explicitly in production. | +| `isLogStandardOutput` | `boolean` | Whether OpenIM Core logs are emitted to the standard log stream. | + +Initialize the SDK only once in `Application` or an application-level session component. The Java wrapper exposes `networkChanged()` to ask Core to re-evaluate network connectivity; call it only when the application already has one centralized system-network observer, not from multiple screens. + +## Register business listeners before login + +Listener registration uses set semantics, so a later call replaces the previous listener. Create stable listener instances in an application-level event dispatcher and forward events to screen state. See [Send your first message](/sdk/android/getting-started/send-first-message) for the complete message-listener registration and incremental merge example. User, relationship, conversation, group, and call-signaling listeners follow the same ownership rule. + +The SDK does not expose remove or unset methods. During sign-out or account switching, the application event dispatcher must stop delivering callbacks to state owned by the previous account and replace the complete listener set before the next login. + +## Log in the current user + +```java +OpenIMClient.getInstance().login(new OnBase() { + @Override + public void onError(int code, String error) { + sessionState.setLoginState("failed"); + recordLoginFailure(code, error); + } + + @Override + public void onSuccess(String data) { + sessionState.setLoginState("logged"); + sessionState.setCurrentUserID(userID); + } +}, userID, token); +``` + +The successful `login()` callback means that the current login call completed. `OnConnListener.onConnectSuccess()` means that the persistent connection is available. Handle these as separate stages. Do not call `login()` concurrently or infer both states from only one callback. + +## Inspect login state + +```java +int loginStatus = OpenIMClient.getInstance().getLoginStatus(); + +if (loginStatus == LoginStatus.Logged) { + String currentUserID = OpenIMClient.getInstance().getLoginUserID(); + restoreSessionFor(currentUserID); +} +``` + +| State | Description | +| --------------------- | ------------------------------------------------------------------------------------ | +| `LoginStatus.Logout` | The SDK is not logged in. | +| `LoginStatus.Logging` | Login is in progress; do not start another login concurrently. | +| `LoginStatus.Logged` | The SDK is logged in. Persistent-connection state still comes from `OnConnListener`. | + +`getLoginStatus()` and `getLoginUserID()` return local SDK snapshots and do not trigger connection callbacks. Sign out the previous account before logging in with a different account. + +## Handle token failure and forced logout + +After `onUserTokenExpired()` or `onUserTokenInvalid()`, obtain new credentials for the current user from a trusted backend, then reauthenticate or return to the sign-in flow according to product policy. After `onKickedOffline()`, clear conversations, message views, unread counts, and other state owned by the current account. Do not treat forced logout as an explicit user sign-out. + +These callbacks do not have a business-entity merge key. Isolate them by the current `OpenIMClient` singleton and logged-in user. Stop asynchronous work and screen subscriptions owned by the previous account before starting a new login. + +## Sign out and release the SDK + +```java +OpenIMClient.getInstance().logout(new OnBase() { + @Override + public void onError(int code, String error) { + recordLogoutFailure(code, error); + } + + @Override + public void onSuccess(String data) { + sessionState.clearCurrentAccount(); + } +}); +``` + +Successful completion means that the current SDK login session has signed out. Clear application state after the success callback. For account switching, wait for the previous logout before calling `login()` for the next account. + +When the application will no longer use the SDK, release the runtime with: + +```java +OpenIMClient.getInstance().unInit(); +``` + +`unInit()` is not a replacement for `logout()` and must not run when an ordinary screen is destroyed. + +## Next steps + +- [Before you start](/sdk/android/getting-started/before-you-start) +- [Integrate for Android](/sdk/android/getting-started/environment-specific-implementation) +- [Send your first message](/sdk/android/getting-started/send-first-message) diff --git a/content/docs/chat/sdk/android/getting-started/before-you-start.mdx b/content/docs/chat/sdk/android/getting-started/before-you-start.mdx new file mode 100644 index 0000000000..b792c4ae9e --- /dev/null +++ b/content/docs/chat/sdk/android/getting-started/before-you-start.mdx @@ -0,0 +1,64 @@ +--- +title: 'Before you start' +description: 'Prepare OpenIMServer, user credentials, and the Android project before initializing, authenticating, or sending messages.' +product: 'sdk' +context: 'chat/sdk/android' +template: 'guide' +status: 'published' +lastUpdated: '2026-08-06' +version: 'v4' +platform: 'android' +sourcePath: '/sdk/android/getting-started/before-you-start' +--- + +Before integrating OpenIMClientSDK into a native Android application, prepare an accessible OpenIMServer deployment, a trusted user-authentication flow, and an Android project that satisfies the SDK build requirements. These prerequisites apply to both [Authenticate and manage a session](/sdk/android/getting-started/authenticate-and-manage-session) and [Send your first message](/sdk/android/getting-started/send-first-message). + +## Prepare OpenIMServer + +If OpenIMServer is not yet available, follow the [Docker deployment guide](/docs/guides/quick-deployment/docker). Confirm that both physical devices and emulators can reach these endpoints: + +| Field | Description | +| --------- | ---------------------------------------------------------------------------------------- | +| `apiAddr` | OpenIMServer HTTP API endpoint used for login, synchronization, and resource requests. | +| `wsAddr` | OpenIMServer WebSocket endpoint used for the persistent connection and real-time events. | + +Do not validate the endpoints only from the development computer. `localhost` inside an Android emulator refers to the emulator itself, so it cannot directly access services running locally on the development computer. When OpenIMServer runs on the development computer, map the API and WebSocket ports to the emulator first: + +```bash +adb reverse tcp:10002 tcp:10002 +adb reverse tcp:10001 tcp:10001 +``` + +After mapping, the emulator can use `http://127.0.0.1:10002` as `apiAddr` and `ws://127.0.0.1:10001` as `wsAddr`. Replace the port numbers with the ports that the development computer actually listens on, and confirm that `adb` is connected to the target emulator before running the commands. Production applications should use HTTPS and WSS, with DNS, TLS certificates, firewalls, reverse proxies, and WebSocket upgrades verified from a physical device. + +## Prepare the user and token + +`userID` identifies an OpenIMSDK user, while the token authenticates that user. A trusted backend must create or associate users, issue tokens, and enforce application permissions. The Android application must never store an administrator token, secret, or other server-side credential. + +For the backend flow, see [Prepare to use the Platform API](/platform-api/prepare-to-use-api) and [Issue a session token](/platform-api/user/managing-session-tokens/issue-a-session-token). After authenticating the application account, the backend should return only the following data needed for SDK login: + +| Data | Description | +| --- | --- | +| `userID` | The current user's OpenIM user ID. | +| `token` | The login token associated with that user. | +| `apiAddr` | The OpenIMServer HTTP API endpoint. | +| `wsAddr` | The OpenIMServer WebSocket endpoint. | + +The `userID` must correspond to the token. The client must not accept an arbitrary user ID and then issue, assemble, or exchange an administrator token. + +## Prepare the Android project + +Before integration, verify that the Android project meets the following requirements: + +- The application uses `minSdk` 21 or later, Java 8 compiler options, and `compileSdk` 36 or later. +- The application manifest declares `android.permission.INTERNET` and permits the SDK to inspect network state. +- An application-private persistent data directory is available, such as a dedicated directory under `Application.getFilesDir()`. Do not store the SDK database in a temporary cache or shared storage. +- Physical devices can reach `apiAddr`, `wsAddr`, and message-media domains. +- The release package covers the target device ABI; verify the native ABIs included in the actual delivery package. +- Product behavior is defined for network recovery, foreground and background transitions, token failure, forced logout, and multi-device login. + +For dependencies and manifest entries, see [Integrate for Android](/sdk/android/getting-started/environment-specific-implementation). For SDK initialization and authentication, see [Authenticate and manage a session](/sdk/android/getting-started/authenticate-and-manage-session). + +## Continue the integration + +Complete [Authenticate and manage a session](/sdk/android/getting-started/authenticate-and-manage-session) first. After the login callback succeeds and `OnConnListener.onConnectSuccess()` arrives, verify the messaging path with [Send your first message](/sdk/android/getting-started/send-first-message). diff --git a/content/docs/chat/sdk/android/getting-started/environment-specific-implementation.mdx b/content/docs/chat/sdk/android/getting-started/environment-specific-implementation.mdx new file mode 100644 index 0000000000..aa6ac6db23 --- /dev/null +++ b/content/docs/chat/sdk/android/getting-started/environment-specific-implementation.mdx @@ -0,0 +1,40 @@ +--- +title: 'Integrate for Android' +description: 'Add OpenIM Android SDK dependencies and network permissions to an Android project.' +product: 'sdk' +context: 'chat/sdk/android' +template: 'guide' +status: 'published' +lastUpdated: '2026-08-06' +version: 'v4' +platform: 'android' +sourcePath: '/sdk/android/getting-started/environment-specific-implementation' +--- + +This page covers Android project dependencies and permissions only. For SDK initialization, connection listeners, and sign-in, see [Authenticate and manage a session](/sdk/android/getting-started/authenticate-and-manage-session). + +## Add SDK dependencies + +Add the dependencies to the application module's `build.gradle`: + +```groovy +dependencies { + implementation 'io.openim:android-sdk:latest@aar' + implementation 'io.openim:core-sdk:latest@aar' + implementation 'com.google.code.gson:gson:2.9.0' +} +``` + +## Configure the manifest + +The application needs network access: + +```xml + + +``` + +## Next steps + +- [Authenticate and manage a session](/sdk/android/getting-started/authenticate-and-manage-session) +- [Send your first message](/sdk/android/getting-started/send-first-message) diff --git a/content/docs/chat/sdk/android/getting-started/send-first-message.mdx b/content/docs/chat/sdk/android/getting-started/send-first-message.mdx index 5371214066..e0d5c79bea 100644 --- a/content/docs/chat/sdk/android/getting-started/send-first-message.mdx +++ b/content/docs/chat/sdk/android/getting-started/send-first-message.mdx @@ -1,18 +1,111 @@ --- title: 'Send your first message' -description: 'OpenIM · SDK · Android · v4 documentation scaffold for Send your first message. Replace this placeholder with OpenIM-specific guidance, examples, and assets.' +description: 'Send and verify the first one-to-one text message in an Android application.' product: 'sdk' context: 'chat/sdk/android' template: 'guide' -status: 'scaffold' -lastUpdated: '2026-06-24' +status: 'published' +lastUpdated: '2026-08-06' version: 'v4' platform: 'android' sourcePath: '/sdk/android/getting-started/send-first-message' --- - +Use one-to-one text messaging to confirm that OpenIM is integrated correctly. Before starting, complete SDK initialization and sign-in in [Authenticate and manage a session](/sdk/android/getting-started/authenticate-and-manage-session). + +## Before you start + +- Prepare a test account for the sender and another for the receiver. +- Initialize the SDK for both accounts as described in [Authenticate and manage a session](/sdk/android/getting-started/authenticate-and-manage-session). Register the following listener on the receiver before it signs in. +- Replace `user_b` in the example with the receiver's actual `userID`. + +## Step 1: Listen for incoming messages on the receiver + +Register the message listener on the receiver before sign-in. When a message arrives, add it to the chat list or refresh the UI. + +```java +OpenIMClient.getInstance() + .messageManager + .setAdvancedMsgListener(new OnAdvanceMsgListener() { + @Override + public void onRecvNewMessage(Message message) { + // Display message in the chat UI. + } + }); +``` + +## Step 2: Confirm that sending is available + +After both accounts sign in, the sender can send only after its login callback succeeds and `OnConnListener.onConnectSuccess()` arrives. Keep the receiver connected so it can receive the new message. If a connection is not ready, wait for it to recover instead of calling `login()` again. + +## Step 3: Send a text message + +### Send a one-to-one text message + +Create the message, then send it. Put the receiver's `userID` in the user destination and leave the group destination empty. + +```java +Message message = OpenIMClient.getInstance() + .messageManager + .createTextMessage("Hello, OpenIMSDK"); + +OnMsgSendCallback sendCallback = new OnMsgSendCallback() { + @Override + public void onProgress(long progress) { + // Text messages usually do not need progress handling. + } + + @Override + public void onError(int code, String error) { + // Tell the user that sending failed and allow a retry. + } + + @Override + public void onSuccess(Message sentMessage) { + // Update the sender's chat UI with sentMessage. + } +}; + +OpenIMClient.getInstance().messageManager.sendMessage( + sendCallback, + message, + "user_b", + "", + new OfflinePushInfo() +); +``` + +`OfflinePushInfo` configures offline-push content. For this first test, pass an empty object and add a title, summary, or extra data later if needed. + +`onSuccess()` means the sender has sent the message successfully. `onRecvNewMessage()` on the receiver means the other side received it. Both callbacks should arrive before considering this one-to-one test complete. + +### Send a group text message + +To send a group message, leave the receiver `userID` empty and provide the group's `groupID`: + +```java +Message groupMessage = OpenIMClient.getInstance() + .messageManager + .createTextMessage("Hello, OpenIMSDK"); + +OpenIMClient.getInstance().messageManager.sendMessage( + sendCallback, + groupMessage, + "", + "group_123", + new OfflinePushInfo() +); +``` + +Set either `userID` or `groupID` in a single call, never both. + +## Verify success + +- The sender enters `onSuccess()`. +- The receiver enters `onRecvNewMessage()` and sees the text message. +- A one-to-one message sets only the receiver's `userID`; a group message sets only `groupID`. + +## Next steps + +- [Authenticate and manage a session](/sdk/android/getting-started/authenticate-and-manage-session) +- [OpenIM Android SDK overview](/sdk/android/overview) diff --git a/content/docs/chat/sdk/android/group/change-group-mute.mdx b/content/docs/chat/sdk/android/group/change-group-mute.mdx new file mode 100644 index 0000000000..3e2048532f --- /dev/null +++ b/content/docs/chat/sdk/android/group/change-group-mute.mdx @@ -0,0 +1,23 @@ +--- +title: 'Change group mute status' +description: 'Use changeGroupMute to enable or disable mute-all mode for a group.' +product: 'sdk' +context: 'chat/sdk/android' +template: 'guide' +status: 'published' +lastUpdated: '2026-08-10' +version: 'v4' +platform: 'android' +sourcePath: '/sdk/android/group/change-group-mute' +--- + +Use `changeGroupMute()` to toggle mute-all mode. Pass `true` to enable it or `false` to disable it. To mute one member, see [Mute or unmute a group member](/sdk/android/group/managing-group-members/change-group-member-mute). + +```java +OpenIMClient.getInstance().groupManager.changeGroupMute(new OnBase() { + @Override public void onSuccess(String data) { markGroupMuteSubmitted(groupID, true); } + @Override public void onError(int code, String error) { showGroupMuteError(error); } +}, groupID, true); +``` + +The effective speaking permissions for the owner and administrators, as well as server-side permission checks, depend on the deployment policy. diff --git a/content/docs/chat/sdk/android/group/create-group.mdx b/content/docs/chat/sdk/android/group/create-group.mdx new file mode 100644 index 0000000000..464e171ce8 --- /dev/null +++ b/content/docs/chat/sdk/android/group/create-group.mdx @@ -0,0 +1,30 @@ +--- +title: 'Create a group' +description: 'Use createGroup to create a group profile and specify its initial members, administrators, and owner.' +product: 'sdk' +context: 'chat/sdk/android' +template: 'guide' +status: 'published' +lastUpdated: '2026-08-10' +version: 'v4' +platform: 'android' +sourcePath: '/sdk/android/group/create-group' +--- + +Use `createGroup()` to create a group. Set the group profile in `GroupInfo`, and pass the initial regular members, administrators, and owner as separate parameters. The success callback returns the complete `GroupInfo` created by the server. Store the server-assigned `groupID`. + +```java +GroupInfo info = new GroupInfo(); +info.setGroupName("Project discussion"); +info.setIntroduction("For project members only"); + +OpenIMClient.getInstance().groupManager.createGroup( + memberUserIDs, adminUserIDs, info, ownerUserID, + new OnBase() { + @Override public void onSuccess(GroupInfo group) { openGroup(group.getGroupID()); } + @Override public void onError(int code, String error) { showCreateError(error); } + } +); +``` + +Select the owner and administrators according to your application's permission rules. Do not infer the owner from a local user list. diff --git a/content/docs/chat/sdk/android/group/dismiss-group.mdx b/content/docs/chat/sdk/android/group/dismiss-group.mdx new file mode 100644 index 0000000000..cab2a028c0 --- /dev/null +++ b/content/docs/chat/sdk/android/group/dismiss-group.mdx @@ -0,0 +1,23 @@ +--- +title: 'Dismiss a group' +description: 'Use dismissGroup to dismiss a group that the current user is allowed to manage.' +product: 'sdk' +context: 'chat/sdk/android' +template: 'guide' +status: 'published' +lastUpdated: '2026-08-10' +version: 'v4' +platform: 'android' +sourcePath: '/sdk/android/group/dismiss-group' +--- + +`dismissGroup()` dismisses the specified group and is normally available only to its owner. Ask for explicit confirmation before calling it so that leaving a group is not accidentally implemented as dismissing it. + +```java +OpenIMClient.getInstance().groupManager.dismissGroup(new OnBase() { + @Override public void onSuccess(String data) { markDismissSubmitted(groupID); } + @Override public void onError(int code, String error) { showDismissError(error); } +}, groupID); +``` + +Merge the final state from `onGroupDismissed`. After receiving the event, remove cached group profile, member, and conversation-related data. diff --git a/content/docs/chat/sdk/android/group/group-applications/accept-group-application.mdx b/content/docs/chat/sdk/android/group/group-applications/accept-group-application.mdx new file mode 100644 index 0000000000..ee851a9f89 --- /dev/null +++ b/content/docs/chat/sdk/android/group/group-applications/accept-group-application.mdx @@ -0,0 +1,23 @@ +--- +title: 'Accept a group application' +description: 'Use acceptGroupApplication to accept a user’s application to join a group.' +product: 'sdk' +context: 'chat/sdk/android' +template: 'guide' +status: 'published' +lastUpdated: '2026-08-10' +version: 'v4' +platform: 'android' +sourcePath: '/sdk/android/group/group-applications/accept-group-application' +--- + +Pass the application's `groupID`, the applicant's `userID`, and a handling message. The server checks whether the current user has permission to approve the application. + +```java +OpenIMClient.getInstance().groupManager.acceptGroupApplication(new OnBase() { + @Override public void onSuccess(String data) { markApplicationHandled(groupID, applicantUserID); } + @Override public void onError(int code, String error) { showHandleError(error); } +}, groupID, applicantUserID, "Welcome to the group"); +``` + +After acceptance, update the application and member lists through the group application event and `onGroupMemberAdded`. diff --git a/content/docs/chat/sdk/android/group/group-applications/get-group-application-list-as-applicant.mdx b/content/docs/chat/sdk/android/group/group-applications/get-group-application-list-as-applicant.mdx new file mode 100644 index 0000000000..0a1acdbd6e --- /dev/null +++ b/content/docs/chat/sdk/android/group/group-applications/get-group-application-list-as-applicant.mdx @@ -0,0 +1,25 @@ +--- +title: 'Get sent group applications' +description: 'Use getSendGroupApplicationList to retrieve group applications sent by the current user.' +product: 'sdk' +context: 'chat/sdk/android' +template: 'guide' +status: 'published' +lastUpdated: '2026-08-10' +version: 'v4' +platform: 'android' +sourcePath: '/sdk/android/group/group-applications/get-group-application-list-as-applicant' +--- + +Configure pagination and filters in `GetGroupApplicationListAsApplicantReq`, then call `getSendGroupApplicationList()`. + +```java +GetGroupApplicationListAsApplicantReq request = new GetGroupApplicationListAsApplicantReq(0, 20); +OpenIMClient.getInstance().groupManager.getSendGroupApplicationList( + new OnBase>() { + @Override public void onSuccess(List items) { mergeSentApplications(items); } + @Override public void onError(int code, String error) { showApplicationError(error); } + }, request); +``` + +After an application is accepted, use `onJoinedGroupAdded` as the source of truth for the joined-group list. diff --git a/content/docs/chat/sdk/android/group/group-applications/get-group-application-list-as-recipient.mdx b/content/docs/chat/sdk/android/group/group-applications/get-group-application-list-as-recipient.mdx new file mode 100644 index 0000000000..1cfaefc554 --- /dev/null +++ b/content/docs/chat/sdk/android/group/group-applications/get-group-application-list-as-recipient.mdx @@ -0,0 +1,25 @@ +--- +title: 'Get received group applications' +description: 'Use getRecvGroupApplicationList to retrieve group applications that the current user can handle.' +product: 'sdk' +context: 'chat/sdk/android' +template: 'guide' +status: 'published' +lastUpdated: '2026-08-10' +version: 'v4' +platform: 'android' +sourcePath: '/sdk/android/group/group-applications/get-group-application-list-as-recipient' +--- + +Use the non-deprecated overload with `GetGroupApplicationListAsRecipientReq`. The request can filter by `offset`, `count`, `groupIDs`, and `handleResults`. + +```java +GetGroupApplicationListAsRecipientReq request = new GetGroupApplicationListAsRecipientReq(0, 20); +OpenIMClient.getInstance().groupManager.getRecvGroupApplicationList( + new OnBase>() { + @Override public void onSuccess(List items) { mergeReceivedApplications(items); } + @Override public void onError(int code, String error) { showApplicationError(error); } + }, request); +``` + +Merge application events by their `groupID` and `userID`. Do not use a list index as an application identifier. diff --git a/content/docs/chat/sdk/android/group/group-applications/overview-group-applications.mdx b/content/docs/chat/sdk/android/group/group-applications/overview-group-applications.mdx new file mode 100644 index 0000000000..48e09a40af --- /dev/null +++ b/content/docs/chat/sdk/android/group/group-applications/overview-group-applications.mdx @@ -0,0 +1,16 @@ +--- +title: 'Group applications overview' +description: 'Understand received and sent group applications, handling results, and state events in the Android SDK.' +product: 'sdk' +context: 'chat/sdk/android' +template: 'guide' +status: 'published' +lastUpdated: '2026-08-10' +version: 'v4' +platform: 'android' +sourcePath: '/sdk/android/group/group-applications/overview-group-applications' +--- + +Group applications are represented by `GroupApplicationInfo`. Received applications are intended for group administrators, while sent applications belong to the current user. Use `handleResult`, `reqMsg`, `handledMsg`, and the handling time to display application state. + +The Android SDK provides paginated queries for received and sent applications, as well as accept and reject operations. It does not provide the pending-application count API found in the Flutter menu. Merge application-added, accepted, rejected, and deleted events through the shared listener described in [Group overview](/sdk/android/group/overview-group). diff --git a/content/docs/chat/sdk/android/group/group-applications/refuse-group-application.mdx b/content/docs/chat/sdk/android/group/group-applications/refuse-group-application.mdx new file mode 100644 index 0000000000..40f3ddd672 --- /dev/null +++ b/content/docs/chat/sdk/android/group/group-applications/refuse-group-application.mdx @@ -0,0 +1,23 @@ +--- +title: 'Reject a group application' +description: 'Use refuseGroupApplication to reject a user’s application to join a group.' +product: 'sdk' +context: 'chat/sdk/android' +template: 'guide' +status: 'published' +lastUpdated: '2026-08-10' +version: 'v4' +platform: 'android' +sourcePath: '/sdk/android/group/group-applications/refuse-group-application' +--- + +The reject operation also takes the application's `groupID`, the applicant's `userID`, and a handling message. + +```java +OpenIMClient.getInstance().groupManager.refuseGroupApplication(new OnBase() { + @Override public void onSuccess(String data) { markApplicationRejected(groupID, applicantUserID); } + @Override public void onError(int code, String error) { showHandleError(error); } +}, groupID, applicantUserID, "The group is currently full"); +``` + +Do not delete the local record immediately after the success callback. Update it from `onGroupApplicationRejected` or a fresh query. diff --git a/content/docs/chat/sdk/android/group/join-group.mdx b/content/docs/chat/sdk/android/group/join-group.mdx new file mode 100644 index 0000000000..c86b7d4027 --- /dev/null +++ b/content/docs/chat/sdk/android/group/join-group.mdx @@ -0,0 +1,23 @@ +--- +title: 'Apply to join a group' +description: 'Use joinGroup to submit a group application or join request.' +product: 'sdk' +context: 'chat/sdk/android' +template: 'guide' +status: 'published' +lastUpdated: '2026-08-10' +version: 'v4' +platform: 'android' +sourcePath: '/sdk/android/group/join-group' +--- + +Use `joinGroup()` to submit a request to join a group. Set `joinSource` to the source of the request, such as an invitation, search result, or QR code. Use the five-parameter overload when attaching extra data. + +```java +OpenIMClient.getInstance().groupManager.joinGroup(new OnBase() { + @Override public void onSuccess(String data) { markJoinSubmitted(groupID); } + @Override public void onError(int code, String error) { showJoinError(error); } +}, groupID, "I would like to join the project discussion", 3, "{\"from\":\"search\"}"); +``` + +The verification mode determines whether the user joins immediately. Update local state later through `onJoinedGroupAdded` or the relevant group application event. diff --git a/content/docs/chat/sdk/android/group/managing-group-members/change-group-member-mute.mdx b/content/docs/chat/sdk/android/group/managing-group-members/change-group-member-mute.mdx new file mode 100644 index 0000000000..5f09604e8b --- /dev/null +++ b/content/docs/chat/sdk/android/group/managing-group-members/change-group-member-mute.mdx @@ -0,0 +1,23 @@ +--- +title: 'Mute or unmute a group member' +description: 'Use changeGroupMemberMute to set the mute duration for a specified group member.' +product: 'sdk' +context: 'chat/sdk/android' +template: 'guide' +status: 'published' +lastUpdated: '2026-08-10' +version: 'v4' +platform: 'android' +sourcePath: '/sdk/android/group/managing-group-members/change-group-member-mute' +--- + +`seconds` is the mute duration in seconds. Pass `0` to unmute the member. Member-level mute state is independent from the group's mute-all setting. + +```java +OpenIMClient.getInstance().groupManager.changeGroupMemberMute(new OnBase() { + @Override public void onSuccess(String data) { markMemberMuteSubmitted(groupID, userID); } + @Override public void onError(int code, String error) { showMemberMuteError(error); } +}, groupID, userID, 3600L); +``` + +Read `muteEndTime` from `onGroupMemberInfoChanged` to update the member state. Do not keep deriving the final mute state from local time and the submitted duration. diff --git a/content/docs/chat/sdk/android/group/managing-group-members/invite-user-to-group.mdx b/content/docs/chat/sdk/android/group/managing-group-members/invite-user-to-group.mdx new file mode 100644 index 0000000000..68c8355266 --- /dev/null +++ b/content/docs/chat/sdk/android/group/managing-group-members/invite-user-to-group.mdx @@ -0,0 +1,23 @@ +--- +title: 'Invite users to a group' +description: 'Use inviteUserToGroup to invite a list of users to a group.' +product: 'sdk' +context: 'chat/sdk/android' +template: 'guide' +status: 'published' +lastUpdated: '2026-08-10' +version: 'v4' +platform: 'android' +sourcePath: '/sdk/android/group/managing-group-members/invite-user-to-group' +--- + +Pass the group ID, the list of invited user IDs, and an invitation message. The server determines whether the users join immediately according to the group settings and the current user's permissions. + +```java +OpenIMClient.getInstance().groupManager.inviteUserToGroup(new OnBase() { + @Override public void onSuccess(String data) { markInviteSubmitted(groupID); } + @Override public void onError(int code, String error) { showInviteError(error); } +}, groupID, inviteeUserIDs, "Join the project discussion"); +``` + +Merge users into the member list only after `onGroupMemberAdded` confirms that they joined. A successful submission alone does not mean that they are already members. diff --git a/content/docs/chat/sdk/android/group/managing-group-members/kick-group-member.mdx b/content/docs/chat/sdk/android/group/managing-group-members/kick-group-member.mdx new file mode 100644 index 0000000000..461fae5b14 --- /dev/null +++ b/content/docs/chat/sdk/android/group/managing-group-members/kick-group-member.mdx @@ -0,0 +1,23 @@ +--- +title: 'Remove group members' +description: 'Use kickGroupMember to remove specified members from a group.' +product: 'sdk' +context: 'chat/sdk/android' +template: 'guide' +status: 'published' +lastUpdated: '2026-08-10' +version: 'v4' +platform: 'android' +sourcePath: '/sdk/android/group/managing-group-members/kick-group-member' +--- + +`kickGroupMember()` accepts a list of member IDs and a removal message. Prevent the current user from accidentally selecting themselves and respect the permission boundaries between owners and administrators. + +```java +OpenIMClient.getInstance().groupManager.kickGroupMember(new OnBase() { + @Override public void onSuccess(String data) { markRemovalSubmitted(groupID); } + @Override public void onError(int code, String error) { showRemovalError(error); } +}, groupID, memberUserIDs, "No longer participating in this project"); +``` + +Remove targets from the member cache after receiving `onGroupMemberDeleted`. diff --git a/content/docs/chat/sdk/android/group/managing-group-members/set-group-member-avatar.mdx b/content/docs/chat/sdk/android/group/managing-group-members/set-group-member-avatar.mdx new file mode 100644 index 0000000000..a741d1aa65 --- /dev/null +++ b/content/docs/chat/sdk/android/group/managing-group-members/set-group-member-avatar.mdx @@ -0,0 +1,28 @@ +--- +title: 'Update a group member avatar' +description: 'Use SetGroupMemberInfo.faceURL to update the avatar displayed for a member in a group.' +product: 'sdk' +context: 'chat/sdk/android' +template: 'guide' +status: 'published' +lastUpdated: '2026-08-10' +version: 'v4' +platform: 'android' +sourcePath: '/sdk/android/group/managing-group-members/set-group-member-avatar' +--- + +A group member avatar is a group-specific profile field and does not change the user's global avatar. Pass an avatar URL that group members can access. + +```java +SetGroupMemberInfo update = new SetGroupMemberInfo(); +update.setGroupID(groupID); +update.setUserID(userID); +update.setFaceURL(avatarURL); + +OpenIMClient.getInstance().groupManager.setGroupMemberInfo(update, new OnBase() { + @Override public void onSuccess(String data) { markAvatarSubmitted(groupID, userID); } + @Override public void onError(int code, String error) { showMemberUpdateError(error); } +}); +``` + +Keep the previous avatar or an optimistic local state until the event arrives, then reconcile it with the latest member profile. diff --git a/content/docs/chat/sdk/android/group/managing-group-members/set-group-member-extension.mdx b/content/docs/chat/sdk/android/group/managing-group-members/set-group-member-extension.mdx new file mode 100644 index 0000000000..b3c9e2b3f4 --- /dev/null +++ b/content/docs/chat/sdk/android/group/managing-group-members/set-group-member-extension.mdx @@ -0,0 +1,28 @@ +--- +title: 'Set group member extra data' +description: 'Store application-defined group member data in SetGroupMemberInfo.ex.' +product: 'sdk' +context: 'chat/sdk/android' +template: 'guide' +status: 'published' +lastUpdated: '2026-08-10' +version: 'v4' +platform: 'android' +sourcePath: '/sdk/android/group/managing-group-members/set-group-member-extension' +--- + +`SetGroupMemberInfo.ex` is a complete string; the SDK does not merge JSON values. If several application modules share the field, read and merge the existing value while preserving the other namespaces. + +```java +SetGroupMemberInfo update = new SetGroupMemberInfo(); +update.setGroupID(groupID); +update.setUserID(userID); +update.setEx("{\"duty\":\"reviewer\"}"); + +OpenIMClient.getInstance().groupManager.setGroupMemberInfo(update, new OnBase() { + @Override public void onSuccess(String data) { markMemberExtensionSubmitted(groupID, userID); } + @Override public void onError(int code, String error) { showMemberUpdateError(error); } +}); +``` + +Do not store credentials, tokens, or device-only display state in this field. diff --git a/content/docs/chat/sdk/android/group/managing-group-members/set-group-member-nickname.mdx b/content/docs/chat/sdk/android/group/managing-group-members/set-group-member-nickname.mdx new file mode 100644 index 0000000000..21e64a2c7b --- /dev/null +++ b/content/docs/chat/sdk/android/group/managing-group-members/set-group-member-nickname.mdx @@ -0,0 +1,28 @@ +--- +title: 'Update a group nickname' +description: 'Use SetGroupMemberInfo.nickname to update a member’s display name in a group.' +product: 'sdk' +context: 'chat/sdk/android' +template: 'guide' +status: 'published' +lastUpdated: '2026-08-10' +version: 'v4' +platform: 'android' +sourcePath: '/sdk/android/group/managing-group-members/set-group-member-nickname' +--- + +All group member profile changes use `setGroupMemberInfo()`. Set the `groupID`, `userID`, and `nickname` in the request. + +```java +SetGroupMemberInfo update = new SetGroupMemberInfo(); +update.setGroupID(groupID); +update.setUserID(userID); +update.setNickname("Lin"); + +OpenIMClient.getInstance().groupManager.setGroupMemberInfo(update, new OnBase() { + @Override public void onSuccess(String data) { markNicknameSubmitted(groupID, userID); } + @Override public void onError(int code, String error) { showMemberUpdateError(error); } +}); +``` + +Update the displayed name from `GroupMembersInfo.nickname` received by `onGroupMemberInfoChanged`. diff --git a/content/docs/chat/sdk/android/group/managing-group-members/set-group-member-role-level.mdx b/content/docs/chat/sdk/android/group/managing-group-members/set-group-member-role-level.mdx new file mode 100644 index 0000000000..07242afff6 --- /dev/null +++ b/content/docs/chat/sdk/android/group/managing-group-members/set-group-member-role-level.mdx @@ -0,0 +1,28 @@ +--- +title: 'Manage group administrators' +description: 'Use SetGroupMemberInfo.roleLevel to change a member’s role in a group.' +product: 'sdk' +context: 'chat/sdk/android' +template: 'guide' +status: 'published' +lastUpdated: '2026-08-10' +version: 'v4' +platform: 'android' +sourcePath: '/sdk/android/group/managing-group-members/set-group-member-role-level' +--- + +Set `roleLevel` with a `GroupRole` constant: `OWNER`, `ADMIN`, or `MEMBER`. Use the separate ownership-transfer API when changing the group owner; do not infer an ownership-transfer flow from this API. + +```java +SetGroupMemberInfo update = new SetGroupMemberInfo(); +update.setGroupID(groupID); +update.setUserID(userID); +update.setRoleLevel(GroupRole.ADMIN); + +OpenIMClient.getInstance().groupManager.setGroupMemberInfo(update, new OnBase() { + @Override public void onSuccess(String data) { markRoleSubmitted(groupID, userID); } + @Override public void onError(int code, String error) { showRoleError(error); } +}); +``` + +The server validates the role change and its permissions. Use the member profile change event as the source of truth. diff --git a/content/docs/chat/sdk/android/group/managing-group-members/transfer-group-owner.mdx b/content/docs/chat/sdk/android/group/managing-group-members/transfer-group-owner.mdx new file mode 100644 index 0000000000..f4cc863381 --- /dev/null +++ b/content/docs/chat/sdk/android/group/managing-group-members/transfer-group-owner.mdx @@ -0,0 +1,23 @@ +--- +title: 'Transfer group ownership' +description: 'Use transferGroupOwner to transfer group ownership to a specified member.' +product: 'sdk' +context: 'chat/sdk/android' +template: 'guide' +status: 'published' +lastUpdated: '2026-08-10' +version: 'v4' +platform: 'android' +sourcePath: '/sdk/android/group/managing-group-members/transfer-group-owner' +--- + +The target user must already be a group member. Require explicit confirmation before transferring ownership, then retrieve the owner and administrator profiles again after completion. + +```java +OpenIMClient.getInstance().groupManager.transferGroupOwner(new OnBase() { + @Override public void onSuccess(String data) { markOwnershipTransferSubmitted(groupID); } + @Override public void onError(int code, String error) { showTransferError(error); } +}, groupID, newOwnerUserID); +``` + +`onGroupMemberInfoChanged` and group profile changes can arrive asynchronously. Do not assume that local roles have already been updated inside the success callback. diff --git a/content/docs/chat/sdk/android/group/overview-group.mdx b/content/docs/chat/sdk/android/group/overview-group.mdx new file mode 100644 index 0000000000..0931a93b3f --- /dev/null +++ b/content/docs/chat/sdk/android/group/overview-group.mdx @@ -0,0 +1,40 @@ +--- +title: 'Group overview' +description: 'Learn how group profiles, members, applications, and group events are organized in the Android SDK.' +product: 'sdk' +context: 'chat/sdk/android' +template: 'guide' +status: 'published' +lastUpdated: '2026-08-10' +version: 'v4' +platform: 'android' +sourcePath: '/sdk/android/group/overview-group' +--- + +A group is represented by `GroupInfo`. Its `groupID` is the unique target identifier for profile, member, application, and permission operations. `GroupMembersInfo` represents a member's group-specific nickname, role, mute expiration time, and extra data. One-to-one relationships and conversation unread counts do not belong to the group APIs. + +`GroupManager` delivers group profile changes, member changes, application handling, and joined-group changes through one `OnGroupListener`. Set the listener once in a shared state layer and merge events by `groupID` or `userID`. + +```java +OpenIMClient.getInstance().groupManager.setOnGroupListener(new OnGroupListener() { + @Override public void onGroupInfoChanged(GroupInfo group) { + groupStore.put(group.getGroupID(), group); + } + + @Override public void onGroupMemberInfoChanged(GroupMembersInfo member) { + memberStore.put(member.getGroupID() + member.getUserID(), member); + } +}); +``` + +A successful callback from a group profile or member operation only means that the request completed. Use the corresponding group event or a fresh query as the source of truth. + +## Main capabilities + +- [Group profile and settings](/sdk/android/group/create-group) +- [Group permissions](/sdk/android/group/set-group-join-verification) +- [Joining and leaving groups](/sdk/android/group/join-group) +- [Retrieving groups](/sdk/android/group/retrieving-groups/get-specified-groups-info) +- [Group applications](/sdk/android/group/group-applications/overview-group-applications) +- [Retrieving group members](/sdk/android/group/retrieving-group-members/overview-retrieving-group-members) +- [Managing group members](/sdk/android/group/managing-group-members/invite-user-to-group) diff --git a/content/docs/chat/sdk/android/group/quit-group.mdx b/content/docs/chat/sdk/android/group/quit-group.mdx new file mode 100644 index 0000000000..cb62fc3059 --- /dev/null +++ b/content/docs/chat/sdk/android/group/quit-group.mdx @@ -0,0 +1,23 @@ +--- +title: 'Leave a group' +description: 'Use quitGroup to remove the current signed-in user from a group.' +product: 'sdk' +context: 'chat/sdk/android' +template: 'guide' +status: 'published' +lastUpdated: '2026-08-10' +version: 'v4' +platform: 'android' +sourcePath: '/sdk/android/group/quit-group' +--- + +`quitGroup()` only removes the current signed-in user. It does not dismiss the group or remove other members. + +```java +OpenIMClient.getInstance().groupManager.quitGroup(new OnBase() { + @Override public void onSuccess(String data) { removeJoinedGroup(groupID); } + @Override public void onError(int code, String error) { showQuitError(error); } +}, groupID); +``` + +Even after the request succeeds, handle `onJoinedGroupDeleted` and clear application caches for the group's member list, conversation entry, and related data. diff --git a/content/docs/chat/sdk/android/group/retrieving-group-members/get-group-member-list.mdx b/content/docs/chat/sdk/android/group/retrieving-group-members/get-group-member-list.mdx new file mode 100644 index 0000000000..957432832e --- /dev/null +++ b/content/docs/chat/sdk/android/group/retrieving-group-members/get-group-member-list.mdx @@ -0,0 +1,24 @@ +--- +title: 'Get group members' +description: 'Use getGroupMemberList to retrieve group members by role and page.' +product: 'sdk' +context: 'chat/sdk/android' +template: 'guide' +status: 'published' +lastUpdated: '2026-08-10' +version: 'v4' +platform: 'android' +sourcePath: '/sdk/android/group/retrieving-group-members/get-group-member-list' +--- + +Set `filter` to `0` for all members, `1` for regular members, `2` for the owner, or `3` for administrators. Use `offset` and `count` for pagination. + +```java +OpenIMClient.getInstance().groupManager.getGroupMemberList( + new OnBase>() { + @Override public void onSuccess(List members) { appendMembers(members); } + @Override public void onError(int code, String error) { showMemberQueryError(error); } + }, groupID, 0, offset, 50); +``` + +Continue accepting member events while paging. Use the combination of `groupID` and `userID` as the merge key. diff --git a/content/docs/chat/sdk/android/group/retrieving-group-members/get-group-member-owner-and-admin.mdx b/content/docs/chat/sdk/android/group/retrieving-group-members/get-group-member-owner-and-admin.mdx new file mode 100644 index 0000000000..966aeb38c7 --- /dev/null +++ b/content/docs/chat/sdk/android/group/retrieving-group-members/get-group-member-owner-and-admin.mdx @@ -0,0 +1,24 @@ +--- +title: 'Get group owners and admins' +description: 'Use getGroupMemberOwnerAndAdmin to retrieve the group owner and administrator profiles.' +product: 'sdk' +context: 'chat/sdk/android' +template: 'guide' +status: 'published' +lastUpdated: '2026-08-10' +version: 'v4' +platform: 'android' +sourcePath: '/sdk/android/group/retrieving-group-members/get-group-member-owner-and-admin' +--- + +Use `getGroupMemberOwnerAndAdmin()` when you need to display or check members with management roles. + +```java +OpenIMClient.getInstance().groupManager.getGroupMemberOwnerAndAdmin( + new OnBase>() { + @Override public void onSuccess(List members) { showModerators(members); } + @Override public void onError(int code, String error) { showMemberQueryError(error); } + }, groupID); +``` + +The owner, administrator, and regular-member `roleLevel` constants are defined in `GroupRole`. The server still determines whether a particular operation is permitted. diff --git a/content/docs/chat/sdk/android/group/retrieving-group-members/get-specified-group-members-info.mdx b/content/docs/chat/sdk/android/group/retrieving-group-members/get-specified-group-members-info.mdx new file mode 100644 index 0000000000..48353fdec3 --- /dev/null +++ b/content/docs/chat/sdk/android/group/retrieving-group-members/get-specified-group-members-info.mdx @@ -0,0 +1,24 @@ +--- +title: 'Get group member profiles' +description: 'Use getGroupMembersInfo to retrieve specified users’ profiles within a group.' +product: 'sdk' +context: 'chat/sdk/android' +template: 'guide' +status: 'published' +lastUpdated: '2026-08-10' +version: 'v4' +platform: 'android' +sourcePath: '/sdk/android/group/retrieving-group-members/get-specified-group-members-info' +--- + +`getGroupMembersInfo()` accepts one `groupID` and a list of target user IDs. It returns the users' `GroupMembersInfo` profiles within that group. + +```java +OpenIMClient.getInstance().groupManager.getGroupMembersInfo( + new OnBase>() { + @Override public void onSuccess(List members) { mergeMembers(members); } + @Override public void onError(int code, String error) { showMemberQueryError(error); } + }, groupID, userIDs); +``` + +An empty list can mean that the targets are not in the group or that the current user cannot read their profiles. Handle the result according to your product requirements. diff --git a/content/docs/chat/sdk/android/group/retrieving-group-members/get-users-in-group.mdx b/content/docs/chat/sdk/android/group/retrieving-group-members/get-users-in-group.mdx new file mode 100644 index 0000000000..9a97cecd0e --- /dev/null +++ b/content/docs/chat/sdk/android/group/retrieving-group-members/get-users-in-group.mdx @@ -0,0 +1,23 @@ +--- +title: 'Check users in a group' +description: 'Use getUsersInGroup to select the users who are currently members of a group.' +product: 'sdk' +context: 'chat/sdk/android' +template: 'guide' +status: 'published' +lastUpdated: '2026-08-10' +version: 'v4' +platform: 'android' +sourcePath: '/sdk/android/group/retrieving-group-members/get-users-in-group' +--- + +`getUsersInGroup()` returns the IDs among the supplied candidates that currently belong to the specified group. It does not return member profiles. + +```java +OpenIMClient.getInstance().groupManager.getUsersInGroup(new OnBase>() { + @Override public void onSuccess(List joinedUserIDs) { updateMembership(joinedUserIDs); } + @Override public void onError(int code, String error) { showMembershipError(error); } +}, groupID, candidateUserIDs); +``` + +To retrieve nicknames, roles, or mute state, call [Get group member profiles](/sdk/android/group/retrieving-group-members/get-specified-group-members-info) afterward. diff --git a/content/docs/chat/sdk/android/group/retrieving-group-members/overview-retrieving-group-members.mdx b/content/docs/chat/sdk/android/group/retrieving-group-members/overview-retrieving-group-members.mdx new file mode 100644 index 0000000000..e287f72d45 --- /dev/null +++ b/content/docs/chat/sdk/android/group/retrieving-group-members/overview-retrieving-group-members.mdx @@ -0,0 +1,16 @@ +--- +title: 'Group member queries overview' +description: 'Understand group member lists, specified member profiles, and membership queries in the Android SDK.' +product: 'sdk' +context: 'chat/sdk/android' +template: 'guide' +status: 'published' +lastUpdated: '2026-08-10' +version: 'v4' +platform: 'android' +sourcePath: '/sdk/android/group/retrieving-group-members/overview-retrieving-group-members' +--- + +Group member queries are scoped by `groupID` and return either `GroupMembersInfo` objects or user ID lists. The member list supports role filtering and offset pagination. Separate APIs retrieve specified member profiles, check membership, retrieve owners and administrators, and search by keyword. + +Merge member additions, removals, and profile changes through the `OnGroupListener` owned by [Group overview](/sdk/android/group/overview-group). A query provides a snapshot and does not replace event handling. diff --git a/content/docs/chat/sdk/android/group/retrieving-group-members/search-group-members.mdx b/content/docs/chat/sdk/android/group/retrieving-group-members/search-group-members.mdx new file mode 100644 index 0000000000..73a100ac9e --- /dev/null +++ b/content/docs/chat/sdk/android/group/retrieving-group-members/search-group-members.mdx @@ -0,0 +1,24 @@ +--- +title: 'Search group members' +description: 'Use searchGroupMembers to search group members by user ID or group nickname.' +product: 'sdk' +context: 'chat/sdk/android' +template: 'guide' +status: 'published' +lastUpdated: '2026-08-10' +version: 'v4' +platform: 'android' +sourcePath: '/sdk/android/group/retrieving-group-members/search-group-members' +--- + +Provide a keyword list, switches for user ID and group nickname matching, and pagination parameters. + +```java +OpenIMClient.getInstance().groupManager.searchGroupMembers( + new OnBase>() { + @Override public void onSuccess(List members) { showMemberSearch(members); } + @Override public void onError(int code, String error) { showSearchError(error); } + }, groupID, Collections.singletonList(keyword), true, true, 0, 20); +``` + +The search is limited to the target group. Do not make the request with an empty keyword or with both search switches disabled. diff --git a/content/docs/chat/sdk/android/group/retrieving-groups/get-joined-group-list-page.mdx b/content/docs/chat/sdk/android/group/retrieving-groups/get-joined-group-list-page.mdx new file mode 100644 index 0000000000..25c1aba8ff --- /dev/null +++ b/content/docs/chat/sdk/android/group/retrieving-groups/get-joined-group-list-page.mdx @@ -0,0 +1,23 @@ +--- +title: 'Get joined groups by page' +description: 'Use getJoinedGroupListPage to retrieve the current account’s joined groups by page.' +product: 'sdk' +context: 'chat/sdk/android' +template: 'guide' +status: 'published' +lastUpdated: '2026-08-10' +version: 'v4' +platform: 'android' +sourcePath: '/sdk/android/group/retrieving-groups/get-joined-group-list-page' +--- + +The Android SDK provides the paginated API. Start `offset` at `0`, then advance it by the number of items successfully merged from each page. Stop loading when the returned list is empty. + +```java +OpenIMClient.getInstance().groupManager.getJoinedGroupListPage(new OnBase>() { + @Override public void onSuccess(List groups) { appendJoinedGroups(groups); } + @Override public void onError(int code, String error) { showPageError(error); } +}, offset, 20); +``` + +Merge incremental changes from `onJoinedGroupAdded` and `onJoinedGroupDeleted`. Do not treat the pages loaded so far as the complete joined-group list. diff --git a/content/docs/chat/sdk/android/group/retrieving-groups/get-specified-groups-info.mdx b/content/docs/chat/sdk/android/group/retrieving-groups/get-specified-groups-info.mdx new file mode 100644 index 0000000000..9baaff97c0 --- /dev/null +++ b/content/docs/chat/sdk/android/group/retrieving-groups/get-specified-groups-info.mdx @@ -0,0 +1,23 @@ +--- +title: 'Get group information' +description: 'Use getGroupsInfo to retrieve the latest profiles for specified groups.' +product: 'sdk' +context: 'chat/sdk/android' +template: 'guide' +status: 'published' +lastUpdated: '2026-08-10' +version: 'v4' +platform: 'android' +sourcePath: '/sdk/android/group/retrieving-groups/get-specified-groups-info' +--- + +When you already have a set of `groupID` values, use `getGroupsInfo()` to retrieve their profiles. The result is a list of `GroupInfo` objects. Do not assume that its order exactly matches the request list. + +```java +OpenIMClient.getInstance().groupManager.getGroupsInfo(new OnBase>() { + @Override public void onSuccess(List groups) { mergeGroups(groups); } + @Override public void onError(int code, String error) { showGroupQueryError(error); } +}, groupIDs); +``` + +Remove empty and duplicate IDs before making the request. Treat groups that do not exist or cannot be accessed as missing results. diff --git a/content/docs/chat/sdk/android/group/retrieving-groups/is-join-group.mdx b/content/docs/chat/sdk/android/group/retrieving-groups/is-join-group.mdx new file mode 100644 index 0000000000..4e8903d73e --- /dev/null +++ b/content/docs/chat/sdk/android/group/retrieving-groups/is-join-group.mdx @@ -0,0 +1,23 @@ +--- +title: 'Check group membership' +description: 'Use isJoinGroup to determine whether the current signed-in user has joined a group.' +product: 'sdk' +context: 'chat/sdk/android' +template: 'guide' +status: 'published' +lastUpdated: '2026-08-10' +version: 'v4' +platform: 'android' +sourcePath: '/sdk/android/group/retrieving-groups/is-join-group' +--- + +`isJoinGroup()` only checks the membership relationship between the current signed-in user and the specified `groupID`. + +```java +OpenIMClient.getInstance().groupManager.isJoinGroup(groupID, new OnBase() { + @Override public void onSuccess(Boolean joined) { updateJoinAction(Boolean.TRUE.equals(joined)); } + @Override public void onError(int code, String error) { showMembershipError(error); } +}); +``` + +This result does not replace a group profile query and cannot determine whether another user is in the group. diff --git a/content/docs/chat/sdk/android/group/retrieving-groups/search-groups.mdx b/content/docs/chat/sdk/android/group/retrieving-groups/search-groups.mdx new file mode 100644 index 0000000000..da44d05239 --- /dev/null +++ b/content/docs/chat/sdk/android/group/retrieving-groups/search-groups.mdx @@ -0,0 +1,23 @@ +--- +title: 'Search groups' +description: 'Use searchGroups to search locally available groups by group ID or name.' +product: 'sdk' +context: 'chat/sdk/android' +template: 'guide' +status: 'published' +lastUpdated: '2026-08-10' +version: 'v4' +platform: 'android' +sourcePath: '/sdk/android/group/retrieving-groups/search-groups' +--- + +`searchGroups()` accepts a keyword list and separate switches for searching group IDs and group names. If both switches are disabled, there is no valid search scope. + +```java +OpenIMClient.getInstance().groupManager.searchGroups(new OnBase>() { + @Override public void onSuccess(List groups) { showSearchResults(groups); } + @Override public void onError(int code, String error) { showSearchError(error); } +}, Collections.singletonList(keyword), true, true); +``` + +A search result does not prove membership. Before opening the group, call [Check group membership](/sdk/android/group/retrieving-groups/is-join-group) when the current state matters. diff --git a/content/docs/chat/sdk/android/group/set-group-announcement.mdx b/content/docs/chat/sdk/android/group/set-group-announcement.mdx new file mode 100644 index 0000000000..d7f1e14f75 --- /dev/null +++ b/content/docs/chat/sdk/android/group/set-group-announcement.mdx @@ -0,0 +1,27 @@ +--- +title: 'Publish a group announcement' +description: 'Publish or update a group announcement through GroupInfo.notification.' +product: 'sdk' +context: 'chat/sdk/android' +template: 'guide' +status: 'published' +lastUpdated: '2026-08-10' +version: 'v4' +platform: 'android' +sourcePath: '/sdk/android/group/set-group-announcement' +--- + +The Android SDK does not provide a separate announcement method. Create a `GroupInfo` containing the `groupID` and `notification`, then call `setGroupInfo()`. + +```java +GroupInfo update = new GroupInfo(); +update.setGroupID(groupID); +update.setNotification("Release review starts at 20:00 tonight."); + +OpenIMClient.getInstance().groupManager.setGroupInfo(update, new OnBase() { + @Override public void onSuccess(String data) { refreshAnnouncement(groupID); } + @Override public void onError(int code, String error) { showAnnouncementError(error); } +}); +``` + +The returned `GroupInfo` exposes the update time and author through `notificationUpdateTime` and `notificationUserID`. The server validates whether the current user has permission to publish the announcement. diff --git a/content/docs/chat/sdk/android/group/set-group-extension.mdx b/content/docs/chat/sdk/android/group/set-group-extension.mdx new file mode 100644 index 0000000000..fe2d81c83d --- /dev/null +++ b/content/docs/chat/sdk/android/group/set-group-extension.mdx @@ -0,0 +1,27 @@ +--- +title: 'Set group extra data' +description: 'Store application-defined group data in GroupInfo.ex.' +product: 'sdk' +context: 'chat/sdk/android' +template: 'guide' +status: 'published' +lastUpdated: '2026-08-10' +version: 'v4' +platform: 'android' +sourcePath: '/sdk/android/group/set-group-extension' +--- + +`GroupInfo.ex` is a complete string; the SDK does not merge JSON values. If several application modules share the field, read the existing value and preserve the other namespaces when merging your changes. + +```java +GroupInfo update = new GroupInfo(); +update.setGroupID(groupID); +update.setEx("{\"projectCode\":\"mobile\",\"archived\":false}"); + +OpenIMClient.getInstance().groupManager.setGroupInfo(update, new OnBase() { + @Override public void onSuccess(String data) { markExtensionSubmitted(groupID); } + @Override public void onError(int code, String error) { showExtensionError(error); } +}); +``` + +Do not store access tokens, secrets, or device-only UI state in group extra data. diff --git a/content/docs/chat/sdk/android/group/set-group-join-verification.mdx b/content/docs/chat/sdk/android/group/set-group-join-verification.mdx new file mode 100644 index 0000000000..6a55069a17 --- /dev/null +++ b/content/docs/chat/sdk/android/group/set-group-join-verification.mdx @@ -0,0 +1,27 @@ +--- +title: 'Set group join verification' +description: 'Configure verification rules for group applications and invitations through GroupInfo.needVerification.' +product: 'sdk' +context: 'chat/sdk/android' +template: 'guide' +status: 'published' +lastUpdated: '2026-08-10' +version: 'v4' +platform: 'android' +sourcePath: '/sdk/android/group/set-group-join-verification' +--- + +Set the verification mode in `GroupInfo.needVerification`, then call `setGroupInfo()`. Use one of the `GroupVerification` constants: `APPLY_NEED_VERIFICATION_INVITE_DIRECTLY`, `ALL_NEED_VERIFICATION`, or `DIRECTLY`. + +```java +GroupInfo update = new GroupInfo(); +update.setGroupID(groupID); +update.setNeedVerification(GroupVerification.ALL_NEED_VERIFICATION); + +OpenIMClient.getInstance().groupManager.setGroupInfo(update, new OnBase() { + @Override public void onSuccess(String data) { markVerificationSubmitted(groupID); } + @Override public void onError(int code, String error) { showVerificationError(error); } +}); +``` + +This setting applies to subsequent join requests. It does not accept or reject existing applications. diff --git a/content/docs/chat/sdk/android/group/set-group-member-friend-permission.mdx b/content/docs/chat/sdk/android/group/set-group-member-friend-permission.mdx new file mode 100644 index 0000000000..81326ef42c --- /dev/null +++ b/content/docs/chat/sdk/android/group/set-group-member-friend-permission.mdx @@ -0,0 +1,27 @@ +--- +title: 'Set member friend request permission' +description: 'Use GroupInfo.applyMemberFriend to control whether users can send friend requests from the group member list.' +product: 'sdk' +context: 'chat/sdk/android' +template: 'guide' +status: 'published' +lastUpdated: '2026-08-10' +version: 'v4' +platform: 'android' +sourcePath: '/sdk/android/group/set-group-member-friend-permission' +--- + +`applyMemberFriend` is an integer switch: `0` disables friend requests and `1` enables them. This rule only affects requests initiated through the member relationship in this group. + +```java +GroupInfo update = new GroupInfo(); +update.setGroupID(groupID); +update.setApplyMemberFriend(0); + +OpenIMClient.getInstance().groupManager.setGroupInfo(update, new OnBase() { + @Override public void onSuccess(String data) { markFriendPermissionSubmitted(groupID); } + @Override public void onError(int code, String error) { showPermissionError(error); } +}); +``` + +After the update, use `onGroupInfoChanged` or a newly retrieved `GroupInfo` as the source of truth. diff --git a/content/docs/chat/sdk/android/group/set-group-member-profile-access.mdx b/content/docs/chat/sdk/android/group/set-group-member-profile-access.mdx new file mode 100644 index 0000000000..76fabb39e8 --- /dev/null +++ b/content/docs/chat/sdk/android/group/set-group-member-profile-access.mdx @@ -0,0 +1,27 @@ +--- +title: 'Set member profile access' +description: 'Use GroupInfo.lookMemberInfo to control whether users can view member profiles through the group.' +product: 'sdk' +context: 'chat/sdk/android' +template: 'guide' +status: 'published' +lastUpdated: '2026-08-10' +version: 'v4' +platform: 'android' +sourcePath: '/sdk/android/group/set-group-member-profile-access' +--- + +`lookMemberInfo` is an integer switch: `0` disables access and `1` enables it. Submit only the `groupID` and this permission field when changing the setting. + +```java +GroupInfo update = new GroupInfo(); +update.setGroupID(groupID); +update.setLookMemberInfo(1); + +OpenIMClient.getInstance().groupManager.setGroupInfo(update, new OnBase() { + @Override public void onSuccess(String data) { markMemberInfoAccessSubmitted(groupID); } + @Override public void onError(int code, String error) { showPermissionError(error); } +}); +``` + +This switch controls profile access through the group. It does not change user profile data that a member already possesses. diff --git a/content/docs/chat/sdk/android/group/update-group-profile.mdx b/content/docs/chat/sdk/android/group/update-group-profile.mdx new file mode 100644 index 0000000000..794b40d4c4 --- /dev/null +++ b/content/docs/chat/sdk/android/group/update-group-profile.mdx @@ -0,0 +1,28 @@ +--- +title: 'Update group profile' +description: 'Use setGroupInfo to update a group name, avatar, introduction, and other profile fields.' +product: 'sdk' +context: 'chat/sdk/android' +template: 'guide' +status: 'published' +lastUpdated: '2026-08-10' +version: 'v4' +platform: 'android' +sourcePath: '/sdk/android/group/update-group-profile' +--- + +Use `setGroupInfo()` to update a group profile. The request object should contain at least the `groupID` and the fields being changed. Do not use an incomplete local cache to overwrite fields that are not part of the current edit. + +```java +GroupInfo update = new GroupInfo(); +update.setGroupID(groupID); +update.setGroupName("Mobile project team"); +update.setIntroduction("Android and iOS collaboration group"); + +OpenIMClient.getInstance().groupManager.setGroupInfo(update, new OnBase() { + @Override public void onSuccess(String data) { markGroupUpdateSubmitted(groupID); } + @Override public void onError(int code, String error) { showGroupUpdateError(error); } +}); +``` + +Merge the latest profile from `onGroupInfoChanged`. Group announcements and extra data use the same API and are covered on their respective pages. diff --git a/content/docs/chat/sdk/android/logger.mdx b/content/docs/chat/sdk/android/logger.mdx index 71d8632250..467929c2d8 100644 --- a/content/docs/chat/sdk/android/logger.mdx +++ b/content/docs/chat/sdk/android/logger.mdx @@ -1,18 +1,119 @@ --- -title: 'Logger' -description: 'OpenIM · SDK · Android · v4 documentation scaffold for Logger. Replace this placeholder with OpenIM-specific guidance, examples, and assets.' +title: 'Logging' +description: 'Configure Android SDK logging, write application diagnostics, and upload logs.' product: 'sdk' context: 'chat/sdk/android' template: 'guide' -status: 'scaffold' -lastUpdated: '2026-06-24' +status: 'published' +lastUpdated: '2026-08-10' version: 'v4' platform: 'android' sourcePath: '/sdk/android/logger' --- - +OpenIM Android SDK logs help diagnose initialization, connection, and business API problems. Development and staging builds can use more detailed output. Production builds should reduce log volume and must avoid recording tokens, complete message bodies, raw file URLs, call room credentials, and private user fields. + +## Configure logging during initialization + +Logging options belong to `InitConfig` and must be set before `initSDK()`. + +```java +File dataDirectory = new File(application.getFilesDir(), "openim"); +File logDirectory = new File(application.getFilesDir(), "openim-logs"); + +InitConfig config = new InitConfig( + apiAddr, + wsAddr, + dataDirectory.getAbsolutePath() +); +config.logLevel = BuildConfig.DEBUG ? LogLevel.Debug : LogLevel.Warn; +config.isLogStandardOutput = BuildConfig.DEBUG; +config.logFilePath = logDirectory.getAbsolutePath(); + +boolean initialized = OpenIMClient.getInstance().initSDK( + application, + config, + connectionListener +); +``` + +| Field | Description | +| --------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------- | +| `logLevel` | Controls verbosity with a `LogLevel` constant. Available values include `DebugWithSQL`, `Debug`, `Info`, `Warn`, `Error`, `Panic`, and `Fatal`. | +| `isLogStandardOutput` | Writes SDK logs to Android standard output when enabled; use it for development diagnostics. | +| `logFilePath` | Optional log directory. Keep it within application-writable storage and manage its size and retention. | + +Use `Debug` for ordinary development diagnostics. Enable `DebugWithSQL` temporarily and only when diagnosing database problems. Production builds normally use `Warn` or `Error` and disable unnecessary standard output. + +## Write application diagnostic logs + +Use the non-deprecated `logs()` overload to add application context to SDK logs. + +```java +OpenIMClient.getInstance().logs( + LogLevel.Error, + ChatRepository.class.getSimpleName(), + 184, + "send_message_failed", + errorMessage, + "conversationID", conversationID, + "clientMsgID", clientMsgID +); +``` + +`currentClassName` and `currentLineNum` identify the call site. `msgStr` is a short action description, and `errStr` is the error information. `Warn`, `Error`, `Panic`, and `Fatal` require a non-empty error string. Pass trailing `extra` values as key-value pairs and include only non-sensitive identifiers needed for diagnosis. + +The older `logs()` overload with `OnBase` and `Map` parameters is deprecated and should not be used in new code. + +## Upload diagnostic logs + +Call `uploadLogs()` only after the user explicitly agrees to submit diagnostic information. The Android API retains the `params` argument; pass an empty list when no additional parameters are needed. `line` configures how many log lines are read for the upload. + +```java +String uploadID = UUID.randomUUID().toString(); + +OpenIMClient.getInstance().uploadLogs( + new OnBase() { + @Override + public void onSuccess(String data) { + showLogUploadCompleted(); + } + + @Override + public void onError(int code, String error) { + showLogUploadError(code, error); + } + }, + Collections.emptyList(), + 2000, + uploadID, + "support-ticket-42", + new UploadLogProgress() { + @Override + public void onProgress(long current, long total) { + updateLogUploadProgress(current, total); + } + } +); +``` + +| Parameter | Description | +| ------------------- | ---------------------------------------------------------------------------------------------------------------------- | +| `line` | Number of log lines configured for this upload. | +| `cancelID` | Stable identifier for this upload, such as an application-generated UUID. | +| `ex` | Diagnostic context attached to the task, such as a support ticket ID. It must not contain credentials or private data. | +| `UploadLogProgress` | Reports current progress and total work for the upload interface. | + +The success callback means that the log upload request completed. It does not change user, conversation, or message state and does not trigger a business-domain event. On failure, record the error code, current user, and application diagnostic ID without printing the complete logs again. + +## operationID and application tracing + +Public methods in the Android Java wrapper do not accept `operationID`. The wrapper generates one with `ParamsUtil.buildOperationID()` for each call and passes it to Core, so applications normally do not create or supply this value. + +Maintain a separate application trace ID in your own logs. Record the business action, error code, and only the required `conversationID`, `clientMsgID`, `groupID`, or `roomID`. The application trace ID links a multi-step business flow, while the SDK `operationID` links one SDK call. Neither is an identity credential or a business idempotency key. + +## Related pages + +- [Implement for the Android environment](/sdk/android/getting-started/environment-specific-implementation) +- [Authenticate and manage a session](/sdk/android/getting-started/authenticate-and-manage-session) +- [Send a message](/sdk/android/message/sending-messages/send-message) diff --git a/content/docs/chat/sdk/android/message/composing-messages/get-typing-status.mdx b/content/docs/chat/sdk/android/message/composing-messages/get-typing-status.mdx new file mode 100644 index 0000000000..531230a50c --- /dev/null +++ b/content/docs/chat/sdk/android/message/composing-messages/get-typing-status.mdx @@ -0,0 +1,35 @@ +--- +title: 'Retrieve typing status' +description: 'Use getInputState to retrieve a specified user’s current typing status in a conversation.' +product: 'sdk' +context: 'chat/sdk/android' +template: 'guide' +status: 'published' +lastUpdated: '2026-08-10' +version: 'v4' +platform: 'android' +sourcePath: '/sdk/android/message/composing-messages/get-typing-status' +--- + +When opening a conversation, restoring a connection, or reconciling state, query the platform IDs on which a specified user is currently typing. + +```java +OpenIMClient.getInstance().conversationManager.getInputState( + new OnBase>() { + @Override + public void onSuccess(List platformIDs) { + boolean typing = platformIDs != null && !platformIDs.isEmpty(); + updateTypingState(conversationID, userID, typing); + } + + @Override + public void onError(int code, String error) { + recordTypingStatusQueryFailure(code, error); + } + }, + conversationID, + userID +); +``` + +The callback returns a snapshot array of platform IDs. An empty array means that no platform was typing at query time. The query itself does not trigger a typing-status event. In a group chat, do not poll every member frequently. Query relevant members only when opening the screen, restoring a connection, or reconciling state, and maintain incremental updates through the listener owned by [Report typing status](/sdk/android/message/composing-messages/update-typing-status). diff --git a/content/docs/chat/sdk/android/message/composing-messages/update-typing-status.mdx b/content/docs/chat/sdk/android/message/composing-messages/update-typing-status.mdx new file mode 100644 index 0000000000..8499b1c100 --- /dev/null +++ b/content/docs/chat/sdk/android/message/composing-messages/update-typing-status.mdx @@ -0,0 +1,64 @@ +--- +title: 'Update typing status' +description: 'Report the current conversation typing state with the Android SDK.' +product: 'sdk' +context: 'chat/sdk/android' +template: 'guide' +status: 'published' +lastUpdated: '2026-08-10' +version: 'v4' +platform: 'android' +sourcePath: '/sdk/android/message/composing-messages/update-typing-status' +--- + +Set `focus` to `true` when typing starts. Set it to `false` when typing ends, the input field loses focus, or the conversation screen closes. + +```java +conversationManager.changeInputState( + new OnBase() { + @Override + public void onSuccess(String data) { + // The typing state has been reported + } + + @Override + public void onError(int code, String error) { + // Handle the failure + } + }, + conversationID, + true +); +``` + +Clear the state promptly when typing ends: + +```java +conversationManager.changeInputState(callback, conversationID, false); +``` + +Coalesce consecutive focus changes and attempt to report `false` before the screen closes or the connection is interrupted. A successful callback means only that the report request completed; it does not mean that other clients have updated their interfaces. + +Other clients receive typing-state changes through `OnConversationListener.onConversationUserInputStatusChanged`. The Android SDK returns the event payload as a string, so validate the JSON before parsing it: + +```java +@Override +public void onConversationUserInputStatusChanged(String payload) { + InputStatesChangedData state = JsonUtil.toObj( + payload, + InputStatesChangedData.class + ); + if (state == null || state.getConversationID() == null) { + return; + } + updateTypingState( + state.getConversationID(), + state.getUserID(), + state.getPlatformIDs() + ); +} +``` + +Merge typing states by `conversationID:userID` and clear them after an application-defined timeout. `ConversationManager` retains only one conversation listener, so combine this callback with conversation-list, total-unread, and synchronization events in one listener. + +When opening a conversation or restoring a connection, use [Get typing status](/sdk/android/message/composing-messages/get-typing-status) to retrieve the current snapshot. diff --git a/content/docs/chat/sdk/android/message/creating-messages/create-advanced-quote-message.mdx b/content/docs/chat/sdk/android/message/creating-messages/create-advanced-quote-message.mdx new file mode 100644 index 0000000000..83c301d6e4 --- /dev/null +++ b/content/docs/chat/sdk/android/message/creating-messages/create-advanced-quote-message.mdx @@ -0,0 +1,30 @@ +--- +title: 'Create a rich-text reply' +description: 'Use createAdvancedQuoteMessage to create a quoted reply with rich-text entities.' +product: 'sdk' +context: 'chat/sdk/android' +template: 'guide' +status: 'published' +lastUpdated: '2026-08-10' +version: 'v4' +platform: 'android' +sourcePath: '/sdk/android/message/creating-messages/create-advanced-quote-message' +--- + +A rich-text reply stores the reply text, the quoted message, and the `RichMessage` entity ranges in the reply text. + +```java +RichMessage mention = new RichMessage(); +mention.setType("mention"); +mention.setOffset(0); +mention.setLength(6); +mention.setInfo("{\"userID\":\"user_a\"}"); + +Message message = OpenIMClient.getInstance().messageManager.createAdvancedQuoteMessage( + "OpenIM agreed", + originalMessage, + Collections.singletonList(mention) +); +``` + +The quoted `originalMessage` should contain a stable `clientMsgID`, and every entity range must match the final reply text. Use the same application protocol for `type`, `url`, and `info` as described in [Create a rich-text message](/sdk/android/message/creating-messages/create-advanced-text-message). This method only creates an object waiting to be sent. diff --git a/content/docs/chat/sdk/android/message/creating-messages/create-advanced-text-message.mdx b/content/docs/chat/sdk/android/message/creating-messages/create-advanced-text-message.mdx new file mode 100644 index 0000000000..5123acfc35 --- /dev/null +++ b/content/docs/chat/sdk/android/message/creating-messages/create-advanced-text-message.mdx @@ -0,0 +1,30 @@ +--- +title: 'Create a rich-text message' +description: 'Use createAdvancedTextMessage to create a rich-text message with structured entity ranges.' +product: 'sdk' +context: 'chat/sdk/android' +template: 'guide' +status: 'published' +lastUpdated: '2026-08-10' +version: 'v4' +platform: 'android' +sourcePath: '/sdk/android/message/creating-messages/create-advanced-text-message' +--- + +`RichMessage` marks a range in the text with `offset` and `length`, while `type`, `url`, and `info` carry application-defined entity data. + +```java +RichMessage link = new RichMessage(); +link.setType("link"); +link.setOffset(0); +link.setLength(6); +link.setUrl("https://docs.openim.io"); +link.setInfo("{\"title\":\"OpenIM documentation\"}"); + +Message message = OpenIMClient.getInstance().messageManager.createAdvancedTextMessage( + "OpenIM docs", + Collections.singletonList(link) +); +``` + +Every entity range must match an actual range in the final text. Validate the ranges, URLs, and `info` values before sending, and make sure receiving clients use the same `type` and `info` protocol. This method only creates a `Message`; send it through [Send a message](/sdk/android/message/sending-messages/send-message). diff --git a/content/docs/chat/sdk/android/message/creating-messages/create-card-message.mdx b/content/docs/chat/sdk/android/message/creating-messages/create-card-message.mdx new file mode 100644 index 0000000000..6bbbf011e0 --- /dev/null +++ b/content/docs/chat/sdk/android/message/creating-messages/create-card-message.mdx @@ -0,0 +1,18 @@ +--- +title: 'Create a contact card message' +description: 'Use createCardMessage to create a contact card message.' +product: 'sdk' +context: 'chat/sdk/android' +template: 'guide' +status: 'published' +lastUpdated: '2026-08-10' +version: 'v4' +platform: 'android' +sourcePath: '/sdk/android/message/creating-messages/create-card-message' +--- + +`CardElem` stores the display profile for the user represented by the card. + +```java +Message message = OpenIMClient.getInstance().messageManager.createCardMessage(cardElem); +``` diff --git a/content/docs/chat/sdk/android/message/creating-messages/create-custom-message.mdx b/content/docs/chat/sdk/android/message/creating-messages/create-custom-message.mdx new file mode 100644 index 0000000000..a3e337a2e2 --- /dev/null +++ b/content/docs/chat/sdk/android/message/creating-messages/create-custom-message.mdx @@ -0,0 +1,19 @@ +--- +title: 'Create a custom message' +description: 'Use createCustomMessage to carry application-defined JSON content.' +product: 'sdk' +context: 'chat/sdk/android' +template: 'guide' +status: 'published' +lastUpdated: '2026-08-10' +version: 'v4' +platform: 'android' +sourcePath: '/sdk/android/message/creating-messages/create-custom-message' +--- + +Your application defines `data`, `extension`, and `description`. Receiving clients must parse them according to the same application protocol. + +```java +Message message = OpenIMClient.getInstance().messageManager.createCustomMessage( + dataJson, extensionJson, description); +``` diff --git a/content/docs/chat/sdk/android/message/creating-messages/create-face-message.mdx b/content/docs/chat/sdk/android/message/creating-messages/create-face-message.mdx new file mode 100644 index 0000000000..86147d2552 --- /dev/null +++ b/content/docs/chat/sdk/android/message/creating-messages/create-face-message.mdx @@ -0,0 +1,18 @@ +--- +title: 'Create an emoji message' +description: 'Use createFaceMessage to create a custom emoji message.' +product: 'sdk' +context: 'chat/sdk/android' +template: 'guide' +status: 'published' +lastUpdated: '2026-08-10' +version: 'v4' +platform: 'android' +sourcePath: '/sdk/android/message/creating-messages/create-face-message' +--- + +`index` identifies the emoji position, while `data` stores JSON such as an emoji URL. + +```java +Message message = OpenIMClient.getInstance().messageManager.createFaceMessage(index, dataJson); +``` diff --git a/content/docs/chat/sdk/android/message/creating-messages/create-file-message-by-file.mdx b/content/docs/chat/sdk/android/message/creating-messages/create-file-message-by-file.mdx new file mode 100644 index 0000000000..247642e42a --- /dev/null +++ b/content/docs/chat/sdk/android/message/creating-messages/create-file-message-by-file.mdx @@ -0,0 +1,19 @@ +--- +title: 'Create a file message from a local path' +description: 'Create a file message from an absolute path.' +product: 'sdk' +context: 'chat/sdk/android' +template: 'guide' +status: 'published' +lastUpdated: '2026-08-10' +version: 'v4' +platform: 'android' +sourcePath: '/sdk/android/message/creating-messages/create-file-message-by-file' +--- + +```java +Message message = OpenIMClient.getInstance().messageManager + .createFileMessageFromFullPath(absolutePath, fileName); +``` + +The absolute path must be readable. Pass the file name and path separately. This method only creates an object waiting to be sent. diff --git a/content/docs/chat/sdk/android/message/creating-messages/create-file-message-by-url.mdx b/content/docs/chat/sdk/android/message/creating-messages/create-file-message-by-url.mdx new file mode 100644 index 0000000000..0009ae6dc1 --- /dev/null +++ b/content/docs/chat/sdk/android/message/creating-messages/create-file-message-by-url.mdx @@ -0,0 +1,18 @@ +--- +title: 'Create a file message from a URL' +description: 'Use FileElem to create a file message for an uploaded resource.' +product: 'sdk' +context: 'chat/sdk/android' +template: 'guide' +status: 'published' +lastUpdated: '2026-08-10' +version: 'v4' +platform: 'android' +sourcePath: '/sdk/android/message/creating-messages/create-file-message-by-url' +--- + +`FileElem` should contain the remote URL, file name, and file size. + +```java +Message message = OpenIMClient.getInstance().messageManager.createFileMessageByURL(fileElem); +``` diff --git a/content/docs/chat/sdk/android/message/creating-messages/create-file-message.mdx b/content/docs/chat/sdk/android/message/creating-messages/create-file-message.mdx new file mode 100644 index 0000000000..90be38a522 --- /dev/null +++ b/content/docs/chat/sdk/android/message/creating-messages/create-file-message.mdx @@ -0,0 +1,19 @@ +--- +title: 'Create a file message' +description: 'Create a file message from a path relative to the SDK data directory.' +product: 'sdk' +context: 'chat/sdk/android' +template: 'guide' +status: 'published' +lastUpdated: '2026-08-10' +version: 'v4' +platform: 'android' +sourcePath: '/sdk/android/message/creating-messages/create-file-message' +--- + +```java +Message message = OpenIMClient.getInstance().messageManager + .createFileMessage(filePath, fileName); +``` + +The file must be stored under the data directory configured during SDK initialization. Pass its path relative to that directory; `fileName` is displayed to recipients. This method only creates an object waiting to be sent. diff --git a/content/docs/chat/sdk/android/message/creating-messages/create-forward-message.mdx b/content/docs/chat/sdk/android/message/creating-messages/create-forward-message.mdx new file mode 100644 index 0000000000..4f3094d8d8 --- /dev/null +++ b/content/docs/chat/sdk/android/message/creating-messages/create-forward-message.mdx @@ -0,0 +1,18 @@ +--- +title: 'Create a forwarded message' +description: 'Use createForwardMessage to create a forwarded copy of a message.' +product: 'sdk' +context: 'chat/sdk/android' +template: 'guide' +status: 'published' +lastUpdated: '2026-08-10' +version: 'v4' +platform: 'android' +sourcePath: '/sdk/android/message/creating-messages/create-forward-message' +--- + +Pass the source `Message`. The returned message must still be delivered to the target conversation through a send API. + +```java +Message message = OpenIMClient.getInstance().messageManager.createForwardMessage(sourceMessage); +``` diff --git a/content/docs/chat/sdk/android/message/creating-messages/create-image-message-by-file.mdx b/content/docs/chat/sdk/android/message/creating-messages/create-image-message-by-file.mdx new file mode 100644 index 0000000000..c7aef18986 --- /dev/null +++ b/content/docs/chat/sdk/android/message/creating-messages/create-image-message-by-file.mdx @@ -0,0 +1,19 @@ +--- +title: 'Create an image message from a local path' +description: 'Create an image message from an absolute path.' +product: 'sdk' +context: 'chat/sdk/android' +template: 'guide' +status: 'published' +lastUpdated: '2026-08-10' +version: 'v4' +platform: 'android' +sourcePath: '/sdk/android/message/creating-messages/create-image-message-by-file' +--- + +```java +Message message = OpenIMClient.getInstance().messageManager + .createImageMessageFromFullPath(absolutePath); +``` + +The absolute path must be readable. This method only creates an object waiting to be sent; the regular send flow uploads the image. diff --git a/content/docs/chat/sdk/android/message/creating-messages/create-image-message-by-url.mdx b/content/docs/chat/sdk/android/message/creating-messages/create-image-message-by-url.mdx new file mode 100644 index 0000000000..d021cddb3d --- /dev/null +++ b/content/docs/chat/sdk/android/message/creating-messages/create-image-message-by-url.mdx @@ -0,0 +1,19 @@ +--- +title: 'Create an image message from URLs' +description: 'Use createImageMessageByURL to create an image message for an uploaded resource.' +product: 'sdk' +context: 'chat/sdk/android' +template: 'guide' +status: 'published' +lastUpdated: '2026-08-10' +version: 'v4' +platform: 'android' +sourcePath: '/sdk/android/message/creating-messages/create-image-message-by-url' +--- + +Prepare the original, large, and thumbnail `PictureInfo` values before creating the message. + +```java +Message message = OpenIMClient.getInstance().messageManager.createImageMessageByURL( + sourceURL, sourcePicture, bigPicture, snapshotPicture); +``` diff --git a/content/docs/chat/sdk/android/message/creating-messages/create-image-message.mdx b/content/docs/chat/sdk/android/message/creating-messages/create-image-message.mdx new file mode 100644 index 0000000000..dd58ab9cf3 --- /dev/null +++ b/content/docs/chat/sdk/android/message/creating-messages/create-image-message.mdx @@ -0,0 +1,19 @@ +--- +title: 'Create an image message' +description: 'Create an image message from a path relative to the SDK data directory.' +product: 'sdk' +context: 'chat/sdk/android' +template: 'guide' +status: 'published' +lastUpdated: '2026-08-10' +version: 'v4' +platform: 'android' +sourcePath: '/sdk/android/message/creating-messages/create-image-message' +--- + +```java +Message message = OpenIMClient.getInstance().messageManager + .createImageMessage(imagePath); +``` + +The image file must be stored under the data directory configured during SDK initialization. Pass its path relative to that directory. This method only creates an object waiting to be sent; the regular send flow uploads the image. diff --git a/content/docs/chat/sdk/android/message/creating-messages/create-location-message.mdx b/content/docs/chat/sdk/android/message/creating-messages/create-location-message.mdx new file mode 100644 index 0000000000..91ecdcb675 --- /dev/null +++ b/content/docs/chat/sdk/android/message/creating-messages/create-location-message.mdx @@ -0,0 +1,19 @@ +--- +title: 'Create a location message' +description: 'Use createLocationMessage to create a message with coordinates and a location description.' +product: 'sdk' +context: 'chat/sdk/android' +template: 'guide' +status: 'published' +lastUpdated: '2026-08-10' +version: 'v4' +platform: 'android' +sourcePath: '/sdk/android/message/creating-messages/create-location-message' +--- + +Use decimal degrees for latitude and longitude. The description is displayed in a map view or message list. + +```java +Message message = OpenIMClient.getInstance().messageManager + .createLocationMessage(latitude, longitude, description); +``` diff --git a/content/docs/chat/sdk/android/message/creating-messages/create-merger-message.mdx b/content/docs/chat/sdk/android/message/creating-messages/create-merger-message.mdx new file mode 100644 index 0000000000..639286caf4 --- /dev/null +++ b/content/docs/chat/sdk/android/message/creating-messages/create-merger-message.mdx @@ -0,0 +1,19 @@ +--- +title: 'Create a merged message' +description: 'Use createMergerMessage to combine multiple messages into one summary message.' +product: 'sdk' +context: 'chat/sdk/android' +template: 'guide' +status: 'published' +lastUpdated: '2026-08-10' +version: 'v4' +platform: 'android' +sourcePath: '/sdk/android/message/creating-messages/create-merger-message' +--- + +Pass the message list, title, and summary list. Keep summary ordering consistent with the display protocol used by your clients. + +```java +Message message = OpenIMClient.getInstance().messageManager.createMergerMessage( + messages, title, summaries); +``` diff --git a/content/docs/chat/sdk/android/message/creating-messages/create-quote-message.mdx b/content/docs/chat/sdk/android/message/creating-messages/create-quote-message.mdx new file mode 100644 index 0000000000..331231460d --- /dev/null +++ b/content/docs/chat/sdk/android/message/creating-messages/create-quote-message.mdx @@ -0,0 +1,19 @@ +--- +title: 'Create a reply message' +description: 'Use createQuoteMessage to reply while quoting an existing message.' +product: 'sdk' +context: 'chat/sdk/android' +template: 'guide' +status: 'published' +lastUpdated: '2026-08-10' +version: 'v4' +platform: 'android' +sourcePath: '/sdk/android/message/creating-messages/create-quote-message' +--- + +A quote message stores the complete quoted `Message`. Before sending, make sure the quoted object has a stable `clientMsgID`. + +```java +Message message = OpenIMClient.getInstance().messageManager + .createQuoteMessage(replyText, quotedMessage); +``` diff --git a/content/docs/chat/sdk/android/message/creating-messages/create-sound-message-by-file.mdx b/content/docs/chat/sdk/android/message/creating-messages/create-sound-message-by-file.mdx new file mode 100644 index 0000000000..838d8707db --- /dev/null +++ b/content/docs/chat/sdk/android/message/creating-messages/create-sound-message-by-file.mdx @@ -0,0 +1,19 @@ +--- +title: 'Create an audio message from a local path' +description: 'Create an audio message from an absolute path.' +product: 'sdk' +context: 'chat/sdk/android' +template: 'guide' +status: 'published' +lastUpdated: '2026-08-10' +version: 'v4' +platform: 'android' +sourcePath: '/sdk/android/message/creating-messages/create-sound-message-by-file' +--- + +```java +Message message = OpenIMClient.getInstance().messageManager + .createSoundMessageFromFullPath(absolutePath, durationSeconds); +``` + +The absolute path must be readable, and the audio duration is measured in seconds. This method only creates an object waiting to be sent. diff --git a/content/docs/chat/sdk/android/message/creating-messages/create-sound-message-by-url.mdx b/content/docs/chat/sdk/android/message/creating-messages/create-sound-message-by-url.mdx new file mode 100644 index 0000000000..eec46a25b8 --- /dev/null +++ b/content/docs/chat/sdk/android/message/creating-messages/create-sound-message-by-url.mdx @@ -0,0 +1,18 @@ +--- +title: 'Create an audio message from a URL' +description: 'Use SoundElem to create an audio message for an uploaded resource.' +product: 'sdk' +context: 'chat/sdk/android' +template: 'guide' +status: 'published' +lastUpdated: '2026-08-10' +version: 'v4' +platform: 'android' +sourcePath: '/sdk/android/message/creating-messages/create-sound-message-by-url' +--- + +`createSoundMessageByURL()` accepts a `SoundElem` that already contains the remote URL, duration, and file size. + +```java +Message message = OpenIMClient.getInstance().messageManager.createSoundMessageByURL(soundElem); +``` diff --git a/content/docs/chat/sdk/android/message/creating-messages/create-sound-message.mdx b/content/docs/chat/sdk/android/message/creating-messages/create-sound-message.mdx new file mode 100644 index 0000000000..b633c83ef5 --- /dev/null +++ b/content/docs/chat/sdk/android/message/creating-messages/create-sound-message.mdx @@ -0,0 +1,19 @@ +--- +title: 'Create an audio message' +description: 'Create an audio message from a path relative to the SDK data directory.' +product: 'sdk' +context: 'chat/sdk/android' +template: 'guide' +status: 'published' +lastUpdated: '2026-08-10' +version: 'v4' +platform: 'android' +sourcePath: '/sdk/android/message/creating-messages/create-sound-message' +--- + +```java +Message message = OpenIMClient.getInstance().messageManager + .createSoundMessage(soundPath, durationSeconds); +``` + +The audio file must be stored under the data directory configured during SDK initialization. Pass its path relative to that directory, and specify the duration in seconds. This method only creates an object waiting to be sent. diff --git a/content/docs/chat/sdk/android/message/creating-messages/create-text-at-message.mdx b/content/docs/chat/sdk/android/message/creating-messages/create-text-at-message.mdx new file mode 100644 index 0000000000..0277086122 --- /dev/null +++ b/content/docs/chat/sdk/android/message/creating-messages/create-text-at-message.mdx @@ -0,0 +1,19 @@ +--- +title: 'Create a mention message' +description: 'Use createTextAtMessage to create a text message that mentions group members.' +product: 'sdk' +context: 'chat/sdk/android' +template: 'guide' +status: 'published' +lastUpdated: '2026-08-10' +version: 'v4' +platform: 'android' +sourcePath: '/sdk/android/message/creating-messages/create-text-at-message' +--- + +Pass the text, mentioned user IDs, the `AtUserInfo` list, and an optional quoted message. + +```java +Message message = OpenIMClient.getInstance().messageManager.createTextAtMessage( + text, userIDs, atUserInfos, quoteMessage); +``` diff --git a/content/docs/chat/sdk/android/message/creating-messages/create-text-message.mdx b/content/docs/chat/sdk/android/message/creating-messages/create-text-message.mdx new file mode 100644 index 0000000000..af34a3229f --- /dev/null +++ b/content/docs/chat/sdk/android/message/creating-messages/create-text-message.mdx @@ -0,0 +1,18 @@ +--- +title: 'Create a text message' +description: 'Use createTextMessage to create a text Message.' +product: 'sdk' +context: 'chat/sdk/android' +template: 'guide' +status: 'published' +lastUpdated: '2026-08-10' +version: 'v4' +platform: 'android' +sourcePath: '/sdk/android/message/creating-messages/create-text-message' +--- + +`createTextMessage()` only creates a local message object. It does not send the message. + +```java +Message message = OpenIMClient.getInstance().messageManager.createTextMessage(text); +``` diff --git a/content/docs/chat/sdk/android/message/creating-messages/create-video-message-by-file.mdx b/content/docs/chat/sdk/android/message/creating-messages/create-video-message-by-file.mdx new file mode 100644 index 0000000000..d75a82d83c --- /dev/null +++ b/content/docs/chat/sdk/android/message/creating-messages/create-video-message-by-file.mdx @@ -0,0 +1,23 @@ +--- +title: 'Create a video message from local paths' +description: 'Create a video message from absolute video and thumbnail paths.' +product: 'sdk' +context: 'chat/sdk/android' +template: 'guide' +status: 'published' +lastUpdated: '2026-08-10' +version: 'v4' +platform: 'android' +sourcePath: '/sdk/android/message/creating-messages/create-video-message-by-file' +--- + +```java +Message message = OpenIMClient.getInstance().messageManager.createVideoMessageFromFullPath( + absoluteVideoPath, + mimeType, + durationSeconds, + absoluteSnapshotPath +); +``` + +The absolute video and thumbnail paths must be readable, and the duration is measured in seconds. This method only creates an object waiting to be sent. diff --git a/content/docs/chat/sdk/android/message/creating-messages/create-video-message-by-url.mdx b/content/docs/chat/sdk/android/message/creating-messages/create-video-message-by-url.mdx new file mode 100644 index 0000000000..b3383c24e6 --- /dev/null +++ b/content/docs/chat/sdk/android/message/creating-messages/create-video-message-by-url.mdx @@ -0,0 +1,18 @@ +--- +title: 'Create a video message from URLs' +description: 'Use VideoElem to create a video message for an uploaded resource.' +product: 'sdk' +context: 'chat/sdk/android' +template: 'guide' +status: 'published' +lastUpdated: '2026-08-10' +version: 'v4' +platform: 'android' +sourcePath: '/sdk/android/message/creating-messages/create-video-message-by-url' +--- + +Populate `VideoElem` with the remote video and thumbnail information, then create the message. + +```java +Message message = OpenIMClient.getInstance().messageManager.createVideoMessageByURL(videoElem); +``` diff --git a/content/docs/chat/sdk/android/message/creating-messages/create-video-message.mdx b/content/docs/chat/sdk/android/message/creating-messages/create-video-message.mdx new file mode 100644 index 0000000000..d5152c2a0c --- /dev/null +++ b/content/docs/chat/sdk/android/message/creating-messages/create-video-message.mdx @@ -0,0 +1,23 @@ +--- +title: 'Create a video message' +description: 'Create a video message from paths relative to the SDK data directory.' +product: 'sdk' +context: 'chat/sdk/android' +template: 'guide' +status: 'published' +lastUpdated: '2026-08-10' +version: 'v4' +platform: 'android' +sourcePath: '/sdk/android/message/creating-messages/create-video-message' +--- + +```java +Message message = OpenIMClient.getInstance().messageManager.createVideoMessage( + videoPath, + mimeType, + durationSeconds, + snapshotPath +); +``` + +The video and snapshot files must be stored under the data directory configured during SDK initialization. Pass both paths relative to that directory, and specify the duration in seconds. This method only creates an object waiting to be sent. diff --git a/content/docs/chat/sdk/android/message/managing-messages/clear-all-local-messages.mdx b/content/docs/chat/sdk/android/message/managing-messages/clear-all-local-messages.mdx new file mode 100644 index 0000000000..8ba10115dd --- /dev/null +++ b/content/docs/chat/sdk/android/message/managing-messages/clear-all-local-messages.mdx @@ -0,0 +1,18 @@ +--- +title: 'Clear all local messages' +description: 'Use deleteAllMsgFromLocal to clear all messages stored on the current device.' +product: 'sdk' +context: 'chat/sdk/android' +template: 'guide' +status: 'published' +lastUpdated: '2026-08-10' +version: 'v4' +platform: 'android' +sourcePath: '/sdk/android/message/managing-messages/clear-all-local-messages' +--- + +This operation only clears the current device's local cache. It does not delete server records. + +```java +messageManager.deleteAllMsgFromLocal(callback); +``` diff --git a/content/docs/chat/sdk/android/message/managing-messages/clear-all-messages.mdx b/content/docs/chat/sdk/android/message/managing-messages/clear-all-messages.mdx new file mode 100644 index 0000000000..b9b3dff3e5 --- /dev/null +++ b/content/docs/chat/sdk/android/message/managing-messages/clear-all-messages.mdx @@ -0,0 +1,18 @@ +--- +title: 'Clear all saved messages' +description: 'Use deleteAllMsgFromLocalAndSvr to clear local and server-side messages.' +product: 'sdk' +context: 'chat/sdk/android' +template: 'guide' +status: 'published' +lastUpdated: '2026-08-10' +version: 'v4' +platform: 'android' +sourcePath: '/sdk/android/message/managing-messages/clear-all-messages' +--- + +This is a high-impact operation. Ask for confirmation before calling it, then clear the local conversation display after it completes. + +```java +messageManager.deleteAllMsgFromLocalAndSvr(callback); +``` diff --git a/content/docs/chat/sdk/android/message/managing-messages/delete-local-message.mdx b/content/docs/chat/sdk/android/message/managing-messages/delete-local-message.mdx new file mode 100644 index 0000000000..1056e39c5c --- /dev/null +++ b/content/docs/chat/sdk/android/message/managing-messages/delete-local-message.mdx @@ -0,0 +1,18 @@ +--- +title: 'Delete a local message' +description: 'Use deleteMessageFromLocalStorage to delete only the message copy on the current device.' +product: 'sdk' +context: 'chat/sdk/android' +template: 'guide' +status: 'published' +lastUpdated: '2026-08-10' +version: 'v4' +platform: 'android' +sourcePath: '/sdk/android/message/managing-messages/delete-local-message' +--- + +This operation does not affect message records on other devices or for other users. + +```java +messageManager.deleteMessageFromLocalStorage(conversationID, clientMsgID, callback); +``` diff --git a/content/docs/chat/sdk/android/message/managing-messages/delete-saved-messages.mdx b/content/docs/chat/sdk/android/message/managing-messages/delete-saved-messages.mdx new file mode 100644 index 0000000000..37bd744399 --- /dev/null +++ b/content/docs/chat/sdk/android/message/managing-messages/delete-saved-messages.mdx @@ -0,0 +1,55 @@ +--- +title: 'Delete messages in a batch' +description: 'Delete multiple messages from one conversation for the current account with the Android SDK.' +product: 'sdk' +context: 'chat/sdk/android' +template: 'guide' +status: 'published' +lastUpdated: '2026-08-10' +version: 'v4' +platform: 'android' +sourcePath: '/sdk/android/message/managing-messages/delete-saved-messages' +--- + +## Parameters + +| Parameter | Type | Required | Description | +| --- | --- | --- | --- | +| `conversationID` | `String` | Yes | ID of the conversation containing the messages to delete. | +| `clientMsgIDs` | `String[]` | Yes | IDs of the messages to delete. Every ID in one batch must belong to the same conversation. | +| `isSync` | `boolean` | Yes | Whether to synchronize the deletion to the current account's other clients. | + +```java +DeleteMessagesReq request = new DeleteMessagesReq( + true, + conversationID, + selectedClientMsgIDs.toArray(new String[0]) +); + +messageManager.deleteMessages(request, new OnBase() { + @Override + public void onSuccess(String data) { + // The deletion request has completed + } + + @Override + public void onError(int code, String error) { + // Handle the failure + } +}); +``` + +With `isSync` set to `false`, the operation deletes the current device's copy and the current account's server-side record. With `true`, it also requests deletion synchronization to the account's other clients. It does not delete copies held by other conversation members or display a revocation notice. + +The success callback means that the deletion request has completed. When synchronization is enabled, it does not mean that other clients have already received the event or updated their interfaces. + +This page owns `OnAdvanceMsgListener.onMsgDeleted`. Determine the conversation from the message routing fields, then remove the message idempotently by `clientMsgID`. + +```java +@Override +public void onMsgDeleted(Message message) { + removeMessage(resolveConversationID(message), message.getClientMsgID()); +} +``` + +To reconcile the current message snapshot, query the corresponding conversation history again. diff --git a/content/docs/chat/sdk/android/message/managing-messages/delete-user-messages.mdx b/content/docs/chat/sdk/android/message/managing-messages/delete-user-messages.mdx new file mode 100644 index 0000000000..1f99329d66 --- /dev/null +++ b/content/docs/chat/sdk/android/message/managing-messages/delete-user-messages.mdx @@ -0,0 +1,43 @@ +--- +title: 'Delete all messages from a user in a group chat' +description: 'Delete every message sent by a specified user in a group chat with the Android SDK.' +product: 'sdk' +context: 'chat/sdk/android' +template: 'guide' +status: 'published' +lastUpdated: '2026-08-10' +version: 'v4' +platform: 'android' +sourcePath: '/sdk/android/message/managing-messages/delete-user-messages' +--- + +```java +messageManager.deleteUserAllMessagesInConv( + conversationID, + targetUserID, + new OnBase() { + @Override + public void onSuccess(String data) { + // The deletion request has completed + } + + @Override + public void onError(int code, String error) { + // Handle the failure + } + } +); +``` + +This API is available only for group chats and deletes every message sent by the specified user in the target group conversation. It is a high-impact group moderation action and should not appear in an ordinary single-message menu. OpenIMServer validates the operator's permission. A successful callback does not mean that the event has already arrived. + +This page owns `OnAdvanceMsgListener.onDeleteUserAllMsgsInConv`. When the event arrives, use its `conversationID` and `userID` to remove messages from that sender in the cached conversation, or reload conversation history to reconcile the state. + +```java +@Override +public void onDeleteUserAllMsgsInConv(DeleteUserAllMsgsListenerMsg event) { + removeMessagesBySender(event.getConversationID(), event.getUserID()); +} +``` + +Callback completion, event arrival, and a new history query are three independent stages. diff --git a/content/docs/chat/sdk/android/message/managing-messages/get-pinned-messages.mdx b/content/docs/chat/sdk/android/message/managing-messages/get-pinned-messages.mdx new file mode 100644 index 0000000000..c9ba3d657c --- /dev/null +++ b/content/docs/chat/sdk/android/message/managing-messages/get-pinned-messages.mdx @@ -0,0 +1,21 @@ +--- +title: 'View pinned messages' +description: 'Use getConversationPinnedMsgs to retrieve pinned messages in a conversation.' +product: 'sdk' +context: 'chat/sdk/android' +template: 'guide' +status: 'published' +lastUpdated: '2026-08-10' +version: 'v4' +platform: 'android' +sourcePath: '/sdk/android/message/managing-messages/get-pinned-messages' +--- + +The result is a snapshot of the messages currently pinned in the specified conversation. + +```java +messageManager.getConversationPinnedMsgs(new OnBase>() { + @Override public void onSuccess(List messages) { showPinned(messages); } + @Override public void onError(int code, String error) { showPinnedError(error); } +}, conversationID); +``` diff --git a/content/docs/chat/sdk/android/message/managing-messages/insert-local-group-message.mdx b/content/docs/chat/sdk/android/message/managing-messages/insert-local-group-message.mdx new file mode 100644 index 0000000000..9a286488a3 --- /dev/null +++ b/content/docs/chat/sdk/android/message/managing-messages/insert-local-group-message.mdx @@ -0,0 +1,18 @@ +--- +title: 'Insert a local group message' +description: 'Use insertGroupMessageToLocalStorage to insert a group message visible only on the current device.' +product: 'sdk' +context: 'chat/sdk/android' +template: 'guide' +status: 'published' +lastUpdated: '2026-08-10' +version: 'v4' +platform: 'android' +sourcePath: '/sdk/android/message/managing-messages/insert-local-group-message' +--- + +Pass the group ID and sender ID. The message is not synchronized to other devices. + +```java +messageManager.insertGroupMessageToLocalStorage(callback, message, groupID, senderUserID); +``` diff --git a/content/docs/chat/sdk/android/message/managing-messages/insert-local-single-message.mdx b/content/docs/chat/sdk/android/message/managing-messages/insert-local-single-message.mdx new file mode 100644 index 0000000000..c776d12b79 --- /dev/null +++ b/content/docs/chat/sdk/android/message/managing-messages/insert-local-single-message.mdx @@ -0,0 +1,18 @@ +--- +title: 'Insert a local direct message' +description: 'Use insertSingleMessageToLocalStorage to insert a one-to-one message visible only on the current device.' +product: 'sdk' +context: 'chat/sdk/android' +template: 'guide' +status: 'published' +lastUpdated: '2026-08-10' +version: 'v4' +platform: 'android' +sourcePath: '/sdk/android/message/managing-messages/insert-local-single-message' +--- + +This method does not send the message to the server. `receiver` and `sender` determine how the local message is associated with the conversation. + +```java +messageManager.insertSingleMessageToLocalStorage(callback, message, receiverUserID, senderUserID); +``` diff --git a/content/docs/chat/sdk/android/message/managing-messages/modify-a-message.mdx b/content/docs/chat/sdk/android/message/managing-messages/modify-a-message.mdx new file mode 100644 index 0000000000..ebee0737f3 --- /dev/null +++ b/content/docs/chat/sdk/android/message/managing-messages/modify-a-message.mdx @@ -0,0 +1,35 @@ +--- +title: 'Modify a message' +description: 'Modify supported message content and handle modification events received by other clients.' +product: 'sdk' +context: 'chat/sdk/android' +template: 'guide' +status: 'published' +lastUpdated: '2026-08-10' +version: 'v4' +platform: 'android' +sourcePath: '/sdk/android/message/managing-messages/modify-a-message' +--- + +Use `modifyMessage` to change an existing message in a conversation. Preserve the original conversation ID, `clientMsgID`, routing fields, sender, and other message data in the request, and update only the supported content. + +```java +messageManager.modifyMessage(callback, modifyRequest); +``` + +The success callback means that the modification request completed; it does not mean that every client interface has updated. Other clients receive the complete modified `Message` through `OnAdvanceMsgListener.onMessageModified`. + +This page is the complete owner of `onMessageModified`. Resolve the `conversationID` from the message routing fields, then replace the original message by `conversationID:clientMsgID`. Do not match by array position or displayed text: + +```java +@Override +public void onMessageModified(Message message) { + String conversationID = resolveConversationID(message); + if (conversationID == null) { + return; + } + replaceMessage(conversationID, message.getClientMsgID(), message); +} +``` + +Add this callback to the application's single `OnAdvanceMsgListener`; see [Events](/sdk/android/events/overview-events) for centralized setup. Callback completion, event delivery, and a new history query are three independent stages. diff --git a/content/docs/chat/sdk/android/message/managing-messages/revoke-a-message.mdx b/content/docs/chat/sdk/android/message/managing-messages/revoke-a-message.mdx new file mode 100644 index 0000000000..eb3fb3e856 --- /dev/null +++ b/content/docs/chat/sdk/android/message/managing-messages/revoke-a-message.mdx @@ -0,0 +1,38 @@ +--- +title: 'Revoke a message' +description: 'Revoke a sent message and handle revocation notifications received by other clients.' +product: 'sdk' +context: 'chat/sdk/android' +template: 'guide' +status: 'published' +lastUpdated: '2026-08-10' +version: 'v4' +platform: 'android' +sourcePath: '/sdk/android/message/managing-messages/revoke-a-message' +--- + +Revoking a message causes other clients to display the original message in a revoked state. Before calling the API, confirm that the message was sent successfully and enforce the revocation time window in the application interface. The server makes the final authorization decision. + +```java +messageManager.revokeMessageV2(callback, conversationID, clientMsgID); +``` + +The success callback means that the server completed the revocation request; it does not mean that every client has received the event. Receiving clients merge the change through `OnAdvanceMsgListener.onRecvMessageRevokedV2`. + +This page is the complete owner of `onRecvMessageRevokedV2`. `RevokedInfo` contains the `clientMsgID`, revoker, and revocation time, but not the `conversationID`. Resolve the owning conversation from the current account's message index, then update by `conversationID:clientMsgID`: + +```java +@Override +public void onRecvMessageRevokedV2(RevokedInfo info) { + String clientMsgID = info.getClientMsgID(); + String conversationID = findConversationIDByClientMsgID(clientMsgID); + if (conversationID == null) { + return; + } + markMessageRevoked(conversationID, clientMsgID, info); +} +``` + +Update the matching message to a revoked state instead of deleting it from the list. Add this callback to the application's single `OnAdvanceMsgListener`; see [Events](/sdk/android/events/overview-events) for centralized setup. + +Callback completion, event delivery, and a new history query are three independent stages. Re-query the corresponding conversation history when reconciliation is required. diff --git a/content/docs/chat/sdk/android/message/managing-messages/set-message-local-ex.mdx b/content/docs/chat/sdk/android/message/managing-messages/set-message-local-ex.mdx new file mode 100644 index 0000000000..ddd254244d --- /dev/null +++ b/content/docs/chat/sdk/android/message/managing-messages/set-message-local-ex.mdx @@ -0,0 +1,18 @@ +--- +title: 'Set local message extensions' +description: 'Use setMessageLocalEx to store message data used only on the current device.' +product: 'sdk' +context: 'chat/sdk/android' +template: 'guide' +status: 'published' +lastUpdated: '2026-08-10' +version: 'v4' +platform: 'android' +sourcePath: '/sdk/android/message/managing-messages/set-message-local-ex' +--- + +`localEx` is suitable for local information such as a download path or playback state. It is not synchronized to other users. + +```java +messageManager.setMessageLocalEx(callback, conversationID, clientMsgID, localExJson); +``` diff --git a/content/docs/chat/sdk/android/message/managing-messages/set-message-pinned.mdx b/content/docs/chat/sdk/android/message/managing-messages/set-message-pinned.mdx new file mode 100644 index 0000000000..a7eef200b6 --- /dev/null +++ b/content/docs/chat/sdk/android/message/managing-messages/set-message-pinned.mdx @@ -0,0 +1,36 @@ +--- +title: 'Pin or unpin a message' +description: 'Change a conversation message’s pinned state and handle pinned-message change events.' +product: 'sdk' +context: 'chat/sdk/android' +template: 'guide' +status: 'published' +lastUpdated: '2026-08-10' +version: 'v4' +platform: 'android' +sourcePath: '/sdk/android/message/managing-messages/set-message-pinned' +--- + +Pass `true` as the final argument to pin the message or `false` to unpin it: + +```java +messageManager.setConversationPinnedMsg( + callback, + conversationID, + clientMsgID, + true +); +``` + +The success callback means that the request completed; it does not mean that the pinned-message event has arrived. + +This page owns `OnAdvanceMsgListener.onChangedPinnedMsg`. `ChangedPinnedMsg` contains the `conversationID` and current pinned-message collection. Replace the collection for that conversation, then deduplicate its messages by `clientMsgID`: + +```java +@Override +public void onChangedPinnedMsg(ChangedPinnedMsg event) { + replacePinnedMessages(event.getConversationID(), event.getMsgs()); +} +``` + +Add this callback to the application's single `OnAdvanceMsgListener`; see [Events](/sdk/android/events/overview-events) for centralized setup. Callback completion, event delivery, and the snapshot from [View pinned messages](/sdk/android/message/managing-messages/get-pinned-messages) are three independent stages. diff --git a/content/docs/chat/sdk/android/message/managing-read-status/get-group-message-readers.mdx b/content/docs/chat/sdk/android/message/managing-read-status/get-group-message-readers.mdx new file mode 100644 index 0000000000..91c5e8f5fc --- /dev/null +++ b/content/docs/chat/sdk/android/message/managing-read-status/get-group-message-readers.mdx @@ -0,0 +1,45 @@ +--- +title: 'Get members who read a group message' +description: 'Retrieve members who have or have not read a group message using pagination.' +product: 'sdk' +context: 'chat/sdk/android' +template: 'guide' +status: 'published' +lastUpdated: '2026-08-10' +version: 'v4' +platform: 'android' +sourcePath: '/sdk/android/message/managing-read-status/get-group-message-readers' +--- + +## Parameters + +| Parameter | Type | Required | Description | +| --- | --- | --- | --- | +| `conversationID` | `String` | Yes | ID of the group conversation. | +| `clientMsgID` | `String` | Yes | ID of the message whose reader list to query. | +| `filter` | `int` | Yes | Pass `0` for members who have read the message or `1` for members who have not read it. | +| `offset` | `int` | Yes | Pagination offset. Pass `0` for the first page. | +| `count` | `int` | Yes | Maximum number of members to retrieve. | + +```java +messageManager.getGroupMessageReaderList( + conversationID, + clientMsgID, + 0, + 0, + 50, + new OnBase>() { + @Override + public void onSuccess(List members) { + renderMembers(members); + } + + @Override + public void onError(int code, String error) { + // Handle the failure + } + } +); +``` + +The success callback returns the current page of `GroupMembersInfo` objects. For field descriptions, see [List group members](/sdk/android/group/retrieving-group-members/get-group-member-list). Deduplicate by `groupID:userID`. The query establishes a snapshot and does not trigger a receipt event. Continue paging when the complete list is required. diff --git a/content/docs/chat/sdk/android/message/managing-read-status/send-group-read-receipts.mdx b/content/docs/chat/sdk/android/message/managing-read-status/send-group-read-receipts.mdx new file mode 100644 index 0000000000..0ff04b682a --- /dev/null +++ b/content/docs/chat/sdk/android/message/managing-read-status/send-group-read-receipts.mdx @@ -0,0 +1,43 @@ +--- +title: 'Report group messages as read' +description: 'Report group-message read receipts with the Android SDK.' +product: 'sdk' +context: 'chat/sdk/android' +template: 'guide' +status: 'published' +lastUpdated: '2026-08-10' +version: 'v4' +platform: 'android' +sourcePath: '/sdk/android/message/managing-read-status/send-group-read-receipts' +--- + +```java +messageManager.sendGroupMessageReadReceipt( + conversationID, + visibleClientMsgIDs, + new OnBase() { + @Override + public void onSuccess(String data) { + // The read receipts have been reported + } + + @Override + public void onError(int code, String error) { + // Handle the failure + } + } +); +``` + +Every message in one batch must belong to the target group conversation. A successful callback means only that the server accepted the report; it does not mean that other client interfaces have already updated. The conversation unread count is maintained separately through `markConversationMessageAsRead`. + +Other clients receive member-level group read changes through `OnAdvanceMsgListener.onRecvGroupMessageReadReceipt`. This page is the canonical reference for that event. Merge read counts, unread counts, and member information using the receipt's `conversationID` and message IDs. + +```java +@Override +public void onRecvGroupMessageReadReceipt(GroupMessageReceipt receipt) { + mergeGroupReadReceipt(receipt); +} +``` + +The report callback, the group receipt event, and the member snapshot from [Get members who read a group message](/sdk/android/message/managing-read-status/get-group-message-readers) are three independent stages. diff --git a/content/docs/chat/sdk/android/message/overview-message.mdx b/content/docs/chat/sdk/android/message/overview-message.mdx index 66a452f77f..5173f3fd3b 100644 --- a/content/docs/chat/sdk/android/message/overview-message.mdx +++ b/content/docs/chat/sdk/android/message/overview-message.mdx @@ -1,18 +1,22 @@ --- -title: 'Overview' -description: 'OpenIM · SDK · Android · v4 documentation scaffold for Overview. Replace this placeholder with OpenIM-specific guidance, examples, and assets.' +title: 'Message overview' +description: 'Learn about the Android SDK Message model, message lifecycle, and message listener.' product: 'sdk' context: 'chat/sdk/android' template: 'guide' -status: 'scaffold' -lastUpdated: '2026-06-24' +status: 'published' +lastUpdated: '2026-08-10' version: 'v4' platform: 'android' sourcePath: '/sdk/android/message/overview-message' --- - +Android messages are represented by `Message`. Use `clientMsgID` for deduplication, and use `sessionType`, `recvID`, and `groupID` to distinguish one-to-one chats from group chats. Message content is stored in the corresponding element field. Sending, receiving, revoking, and deleting are separate state changes. + +```java +OpenIMClient.getInstance().messageManager.setAdvancedMsgListener(new OnAdvanceMsgListener() { + @Override public void onRecvNewMessage(Message message) { messageStore.merge(message); } +}); +``` + +Queries establish a snapshot, while `OnAdvanceMsgListener` merges incremental changes. Setting a listener on `MessageManager` replaces the current listener, so register it once in a shared state layer. diff --git a/content/docs/chat/sdk/android/message/receiving-messages/receive-custom-business-messages.mdx b/content/docs/chat/sdk/android/message/receiving-messages/receive-custom-business-messages.mdx new file mode 100644 index 0000000000..596a219233 --- /dev/null +++ b/content/docs/chat/sdk/android/message/receiving-messages/receive-custom-business-messages.mdx @@ -0,0 +1,24 @@ +--- +title: 'Receive custom business messages' +description: 'Use setCustomBusinessListener to receive business callbacks that are separate from regular chat messages.' +product: 'sdk' +context: 'chat/sdk/android' +template: 'guide' +status: 'published' +lastUpdated: '2026-08-10' +version: 'v4' +platform: 'android' +sourcePath: '/sdk/android/message/receiving-messages/receive-custom-business-messages' +--- + +The custom business callback carries a string payload. Validate its source and JSON structure according to your application protocol instead of rendering it directly as a `Message`. + +```java +messageManager.setCustomBusinessListener(new OnCustomBusinessListener() { + @Override public void onRecvCustomBusinessMessage(String payload) { handleBusiness(payload); } +}); +``` + +This page owns the complete handling contract for `onRecvCustomBusinessMessage`. Include a protocol version and stable idempotency ID in the payload, and deduplicate by that ID. Do not depend on callback order or use a custom business message to grant client-side permissions. + +`MessageManager` retains only one custom business listener; setting another replaces the previous one. Register it once in an application-level event center, and stop dispatching into the previous account's state when signing out or switching accounts. diff --git a/content/docs/chat/sdk/android/message/receiving-messages/receive-messages.mdx b/content/docs/chat/sdk/android/message/receiving-messages/receive-messages.mdx new file mode 100644 index 0000000000..309676bb92 --- /dev/null +++ b/content/docs/chat/sdk/android/message/receiving-messages/receive-messages.mdx @@ -0,0 +1,21 @@ +--- +title: 'Receive messages' +description: 'Use OnAdvanceMsgListener to receive new, offline, and online-only messages.' +product: 'sdk' +context: 'chat/sdk/android' +template: 'guide' +status: 'published' +lastUpdated: '2026-08-10' +version: 'v4' +platform: 'android' +sourcePath: '/sdk/android/message/receiving-messages/receive-messages' +--- + +After calling `setAdvancedMsgListener()`, `onRecvNewMessage` receives real-time messages, `onRecvOfflineNewMessage` receives offline batches, and `onRecvOnlineOnlyMessage` receives online-only message strings. Merge all messages idempotently by `clientMsgID`. + +```java +messageManager.setAdvancedMsgListener(new OnAdvanceMsgListener() { + @Override public void onRecvNewMessage(Message message) { messageStore.merge(message); } + @Override public void onRecvOfflineNewMessage(List messages) { messageStore.mergeAll(messages); } +}); +``` diff --git a/content/docs/chat/sdk/android/message/retrieving-messages/find-messages-by-id.mdx b/content/docs/chat/sdk/android/message/retrieving-messages/find-messages-by-id.mdx new file mode 100644 index 0000000000..f4cba4da2e --- /dev/null +++ b/content/docs/chat/sdk/android/message/retrieving-messages/find-messages-by-id.mdx @@ -0,0 +1,21 @@ +--- +title: 'Find messages by ID' +description: 'Use findMessageList to retrieve message records with SearchParams.' +product: 'sdk' +context: 'chat/sdk/android' +template: 'guide' +status: 'published' +lastUpdated: '2026-08-10' +version: 'v4' +platform: 'android' +sourcePath: '/sdk/android/message/retrieving-messages/find-messages-by-id' +--- + +Create a list of `SearchParams` for the messages you need. Merge returned records by message ID rather than treating their list positions as stable identifiers. + +```java +messageManager.findMessageList(new OnBase() { + @Override public void onSuccess(SearchResult result) { showFoundMessages(result); } + @Override public void onError(int code, String error) { showQueryError(error); } +}, searchParams); +``` diff --git a/content/docs/chat/sdk/android/message/retrieving-messages/load-message-context.mdx b/content/docs/chat/sdk/android/message/retrieving-messages/load-message-context.mdx new file mode 100644 index 0000000000..d9437e7ece --- /dev/null +++ b/content/docs/chat/sdk/android/message/retrieving-messages/load-message-context.mdx @@ -0,0 +1,50 @@ +--- +title: 'Load message context' +description: 'Retrieve messages before and after a specified message with the Android SDK.' +product: 'sdk' +context: 'chat/sdk/android' +template: 'guide' +status: 'published' +lastUpdated: '2026-08-10' +version: 'v4' +platform: 'android' +sourcePath: '/sdk/android/message/retrieving-messages/load-message-context' +--- + +When navigating from a search result or referenced message into its chat context, use the `Message` already retrieved as the anchor. + +## Parameters + +| Parameter | Type | Required | Description | +| --- | --- | --- | --- | +| `conversationID` | `String` | Yes | ID of the conversation containing the anchor message. | +| `startMsg` | `Message` | Yes | Previously retrieved anchor message. | +| `type` | `ViewType` | Yes | Context type. Use `ViewType.History` for a referenced message and `ViewType.Search` for a search result. | +| `before` | `int` | Yes | Maximum number of messages to retrieve before the anchor. | +| `after` | `int` | Yes | Maximum number of messages to retrieve after the anchor. | + +```java +messageManager.fetchSurroundingMessages( + new OnBase() { + @Override + public void onSuccess(Messages messages) { + List surrounding = messages.getData(); + renderMessages(surrounding); + } + + @Override + public void onError(int code, String error) { + // Handle the failure + } + }, + conversationID, + targetMessage, + ViewType.Search, + 20, + 20 +); +``` + +In the success callback, `messages.getData()` is the list retrieved before and after the anchor. For message fields, see [Message overview](/sdk/android/message/overview-message). + +`before` and `after` independently limit the number of messages on either side. The result can contain fewer messages than requested when the anchor is near a history boundary or some messages have been deleted. Merge by `conversationID:clientMsgID`; do not rely on fixed array positions. If the message must first be located, see [Find messages by ID](/sdk/android/message/retrieving-messages/find-messages-by-id). diff --git a/content/docs/chat/sdk/android/message/retrieving-messages/load-newer-messages.mdx b/content/docs/chat/sdk/android/message/retrieving-messages/load-newer-messages.mdx new file mode 100644 index 0000000000..a5825c8d54 --- /dev/null +++ b/content/docs/chat/sdk/android/message/retrieving-messages/load-newer-messages.mdx @@ -0,0 +1,18 @@ +--- +title: 'Load newer messages' +description: 'Use getAdvancedHistoryMessageListReverse to load messages after a starting point.' +product: 'sdk' +context: 'chat/sdk/android' +template: 'guide' +status: 'published' +lastUpdated: '2026-08-10' +version: 'v4' +platform: 'android' +sourcePath: '/sdk/android/message/retrieving-messages/load-newer-messages' +--- + +Use this method to read forward from a message anchor when loading the following page of history. Use `ViewType.History` for this directional history paging. + +```java +messageManager.getAdvancedHistoryMessageListReverse(callback, conversationID, startMessage, 20, ViewType.History); +``` diff --git a/content/docs/chat/sdk/android/message/retrieving-messages/load-older-messages.mdx b/content/docs/chat/sdk/android/message/retrieving-messages/load-older-messages.mdx new file mode 100644 index 0000000000..fbd73af2c6 --- /dev/null +++ b/content/docs/chat/sdk/android/message/retrieving-messages/load-older-messages.mdx @@ -0,0 +1,18 @@ +--- +title: 'Load older messages' +description: 'Use getAdvancedHistoryMessageList to load conversation history by page.' +product: 'sdk' +context: 'chat/sdk/android' +template: 'guide' +status: 'published' +lastUpdated: '2026-08-10' +version: 'v4' +platform: 'android' +sourcePath: '/sdk/android/message/retrieving-messages/load-older-messages' +--- + +Pass `null` for `startMsg` on the first query. For each subsequent page, use the boundary message from the previous page as the starting point. Use `ViewType.History` for ordinary history loading and deduplicate returned messages by `clientMsgID`. + +```java +messageManager.getAdvancedHistoryMessageList(callback, conversationID, startMessage, 20, ViewType.History); +``` diff --git a/content/docs/chat/sdk/android/message/searching-messages/search-messages.mdx b/content/docs/chat/sdk/android/message/searching-messages/search-messages.mdx new file mode 100644 index 0000000000..e781838770 --- /dev/null +++ b/content/docs/chat/sdk/android/message/searching-messages/search-messages.mdx @@ -0,0 +1,19 @@ +--- +title: 'Search messages' +description: 'Use searchLocalMessages to search messages synchronized to the current account’s local storage.' +product: 'sdk' +context: 'chat/sdk/android' +template: 'guide' +status: 'published' +lastUpdated: '2026-08-10' +version: 'v4' +platform: 'android' +sourcePath: '/sdk/android/message/searching-messages/search-messages' +--- + +Search by conversation, keywords, senders, message types, time range, and pagination parameters. Pass `null` for `conversationID` to search across all local conversations. + +```java +messageManager.searchLocalMessages(callback, conversationID, keywords, 1, + senderIDs, messageTypes, 0, 0, 0, 20); +``` diff --git a/content/docs/chat/sdk/android/message/sending-messages/send-message-not-oss.mdx b/content/docs/chat/sdk/android/message/sending-messages/send-message-not-oss.mdx new file mode 100644 index 0000000000..70819a9e5c --- /dev/null +++ b/content/docs/chat/sdk/android/message/sending-messages/send-message-not-oss.mdx @@ -0,0 +1,18 @@ +--- +title: 'Send a message without OSS' +description: 'Use sendMessageNotOss to send a media message whose resources were uploaded by your application.' +product: 'sdk' +context: 'chat/sdk/android' +template: 'guide' +status: 'published' +lastUpdated: '2026-08-10' +version: 'v4' +platform: 'android' +sourcePath: '/sdk/android/message/sending-messages/send-message-not-oss' +--- + +Use this method when the media URLs in the message are already available. It prevents the SDK from entering its built-in upload flow again. + +```java +messageManager.sendMessageNotOss(callback, message, peerUserID, null, offlinePushInfo); +``` diff --git a/content/docs/chat/sdk/android/message/sending-messages/send-message.mdx b/content/docs/chat/sdk/android/message/sending-messages/send-message.mdx new file mode 100644 index 0000000000..470ee3532e --- /dev/null +++ b/content/docs/chat/sdk/android/message/sending-messages/send-message.mdx @@ -0,0 +1,21 @@ +--- +title: 'Send a message' +description: 'Use sendMessage to send a Message to a one-to-one or group conversation.' +product: 'sdk' +context: 'chat/sdk/android' +template: 'guide' +status: 'published' +lastUpdated: '2026-08-10' +version: 'v4' +platform: 'android' +sourcePath: '/sdk/android/message/sending-messages/send-message' +--- + +For a one-to-one message, set `recvUid` and pass `null` for the group target. For a group message, set `recvGid` and pass `null` for the user target. `OnMsgSendCallback` reports success, failure, and media upload progress. + +```java +messageManager.sendMessage(new OnMsgSendCallback() { + @Override public void onSuccess(Message sentMessage) { mergeSentMessage(sentMessage); } + @Override public void onError(int code, String error) { showSendError(error); } +}, message, peerUserID, null, offlinePushInfo); +``` diff --git a/content/docs/chat/sdk/android/message/sending-messages/set-msg-send-progress-listener.mdx b/content/docs/chat/sdk/android/message/sending-messages/set-msg-send-progress-listener.mdx new file mode 100644 index 0000000000..a9048f9032 --- /dev/null +++ b/content/docs/chat/sdk/android/message/sending-messages/set-msg-send-progress-listener.mdx @@ -0,0 +1,22 @@ +--- +title: 'Track message sending progress' +description: 'Use the progress callback on OnMsgSendCallback to update media sending progress.' +product: 'sdk' +context: 'chat/sdk/android' +template: 'guide' +status: 'published' +lastUpdated: '2026-08-10' +version: 'v4' +platform: 'android' +sourcePath: '/sdk/android/message/sending-messages/set-msg-send-progress-listener' +--- + +Android does not provide a separate global send-progress listener. Each call to `sendMessage()` or `sendMessageNotOss()` reports progress through its own `OnMsgSendCallback`. + +```java +messageManager.sendMessage(new OnMsgSendCallback() { + @Override public void onProgress(long progress) { updateProgress(progress); } + @Override public void onSuccess(Message sentMessage) { finishProgress(); } + @Override public void onError(int code, String error) { failProgress(error); } +}, message, peerUserID, null, offlinePushInfo); +``` diff --git a/content/docs/chat/sdk/android/overview.mdx b/content/docs/chat/sdk/android/overview.mdx index 05c6cb1618..08072e5a4a 100644 --- a/content/docs/chat/sdk/android/overview.mdx +++ b/content/docs/chat/sdk/android/overview.mdx @@ -1,18 +1,28 @@ --- -title: 'OpenIM SDK for Android' -description: 'OpenIM · SDK · Android · v4 documentation scaffold for OpenIM SDK for Android. Replace this placeholder with OpenIM-specific guidance, examples, and assets.' +title: 'OpenIM Android SDK overview' +description: 'Integrate users, conversations, groups, messages, calling signals, and events into a native Android application with OpenIM Android SDK.' product: 'sdk' context: 'chat/sdk/android' template: 'overview' -status: 'scaffold' -lastUpdated: '2026-06-24' +status: 'published' +lastUpdated: '2026-08-06' version: 'v4' platform: 'android' sourcePath: '/sdk/android/overview' --- - +OpenIM Android SDK brings OpenIMSDK capabilities to native Android applications. Choose a domain below to open its documentation. + +## Documentation navigation + +| Domain | Content | +| --- | --- | +| [Getting started](/sdk/android/getting-started/environment-specific-implementation) | Integrate the SDK, configure the Android project, authenticate, manage the connection lifecycle, and send the first message. | +| [Users and relationships](/sdk/android/user/overview-user) | User profiles, online status, friends, friend applications, and blacklist. | +| [Conversations](/sdk/android/conversation/overview-conversation) | Conversation queries, drafts, unread counts, receive options, burn-after-reading settings, hiding, and deletion. | +| [Groups](/sdk/android/group/overview-group) | Group profiles, members, applications, permissions, mute settings, and group events. | +| [Messages](/sdk/android/message/overview-message) | Message creation, sending, receiving, history, search, deletion, revocation, and read receipts. | +| [File uploads](/sdk/android/file-uploads/upload-file) | Standalone file uploads and upload progress. | +| [Audio and video calls](/sdk/android/calling/overview-calling) | Invitations, acceptance, rejection, cancellation, hangup, room credentials, and custom signaling. | +| [Events](/sdk/android/events/overview-events) | Manager listeners, connection state, and data events. | +| [Logging](/sdk/android/logger) | SDK logging configuration and troubleshooting. | diff --git a/content/docs/chat/sdk/android/user/blacklist/add-blacklist.mdx b/content/docs/chat/sdk/android/user/blacklist/add-blacklist.mdx new file mode 100644 index 0000000000..251fc09ca4 --- /dev/null +++ b/content/docs/chat/sdk/android/user/blacklist/add-blacklist.mdx @@ -0,0 +1,43 @@ +--- +title: 'Block a user' +description: 'Use addBlacklist() to add a user to the current account blacklist.' +product: 'sdk' +context: 'chat/sdk/android' +template: 'guide' +status: 'published' +lastUpdated: '2026-08-06' +version: 'v4' +platform: 'android' +sourcePath: '/sdk/android/user/blacklist/add-blacklist' +--- + +```java +OpenIMClient.getInstance().friendshipManager.addBlacklist( + new OnBase() { + @Override + public void onSuccess(String data) { + markBlacklistRequestSubmitted(targetUserID); + } + + @Override + public void onError(int code, String error) { + recordBlacklistAddFailure(code, error); + } + }, + targetUserID, + "{\"source\":\"profile-menu\"}" +); +``` + +The second argument is the target `userID`, and the third argument is optional extension data. Use the overload without `ex` when no extension data is needed. A successful callback means the block request completed, not that the event has arrived. + +The blacklist is one-way: the blocked user cannot send messages to the current account. Whether the current account can continue to send messages is an application-level rule. `ex` is a complete string, so merge application-owned fields before updating it. + +This page owns `onBlacklistAdded`. Combine it into the application's single `OnFriendshipListener`: + +```java +@Override +public void onBlacklistAdded(BlacklistInfo user) { + blacklistStore.put(user.getUserID(), user); +} +``` diff --git a/content/docs/chat/sdk/android/user/blacklist/get-blacklist.mdx b/content/docs/chat/sdk/android/user/blacklist/get-blacklist.mdx new file mode 100644 index 0000000000..33ad0f2ff1 --- /dev/null +++ b/content/docs/chat/sdk/android/user/blacklist/get-blacklist.mdx @@ -0,0 +1,55 @@ +--- +title: 'Get the blacklist' +description: 'Use getBlacklist() to retrieve the current user blacklist.' +product: 'sdk' +context: 'chat/sdk/android' +template: 'guide' +status: 'published' +lastUpdated: '2026-08-06' +version: 'v4' +platform: 'android' +sourcePath: '/sdk/android/user/blacklist/get-blacklist' +--- + +The blacklist records users blocked by the current account. Use it for a blacklist settings screen, relationship state on a profile card, or to limit a chat entry point. Blacklist management and group member management are separate capabilities; use Group APIs to mute, remove, or change the role of a group member. + +## Get the blacklist + +After SDK initialization and login, call `getBlacklist()` to retrieve the full blacklist for the signed-in account. An empty list means no users are blocked. + +```java +OpenIMClient.getInstance().friendshipManager.getBlacklist( + new OnBase>() { + @Override + public void onSuccess(List users) { + blacklistStore.replace(users); + } + + @Override + public void onError(int code, String error) { + recordBlacklistFailure(code, error); + } + } +); +``` + +The callback returns `List`; call `UserInfo.getBlackInfo()` to retrieve the blacklist relationship object. + +## Blacklist record fields + +Common `BlacklistInfo` fields are: + +| Field | Description | +| ---------------- | ------------------------------------------------------------------- | +| `userID` | Target user ID blocked by the current user and the stable list key. | +| `nickname` | Target user nickname snapshot. | +| `faceURL` | Target user avatar URL. | +| `gender` | Target user gender value. | +| `operatorUserID` | User ID that performed the block operation. | +| `createTime` | Blacklist relationship creation time. | +| `addSource` | Source that added the blacklist relationship. | +| `ex` | Blacklist relationship extension string. | + +When the screen also needs friend remarks or the latest public profile, separately merge `FriendInfo` or `PublicUserInfo` by `userID`. Do not treat blacklist fields as friend profile data. + +Merge blacklist state by `userID`. This query does not trigger blacklist added or deleted callbacks. Replace the local snapshot on initial load, after reconnecting, or after an explicit refresh; incremental changes are owned by the [Block a user](/sdk/android/user/blacklist/add-blacklist) and [Unblock a user](/sdk/android/user/blacklist/remove-blacklist) listener pages. diff --git a/content/docs/chat/sdk/android/user/blacklist/remove-blacklist.mdx b/content/docs/chat/sdk/android/user/blacklist/remove-blacklist.mdx new file mode 100644 index 0000000000..fb9ed93480 --- /dev/null +++ b/content/docs/chat/sdk/android/user/blacklist/remove-blacklist.mdx @@ -0,0 +1,40 @@ +--- +title: 'Unblock a user' +description: 'Use removeBlacklist() to remove a user from the current account blacklist.' +product: 'sdk' +context: 'chat/sdk/android' +template: 'guide' +status: 'published' +lastUpdated: '2026-08-06' +version: 'v4' +platform: 'android' +sourcePath: '/sdk/android/user/blacklist/remove-blacklist' +--- + +```java +OpenIMClient.getInstance().friendshipManager.removeBlacklist( + new OnBase() { + @Override + public void onSuccess(String data) { + markBlacklistRemovalSubmitted(targetUserID); + } + + @Override + public void onError(int code, String error) { + recordBlacklistRemovalFailure(code, error); + } + }, + targetUserID +); +``` + +A successful callback means the remove request completed, not that the event has arrived. Remove the local entry after `onBlacklistDeleted`; if the event is missed, reconcile through [Get the blacklist](/sdk/android/user/blacklist/get-blacklist). + +This page owns `onBlacklistDeleted`; remove the local entry by `userID`: + +```java +@Override +public void onBlacklistDeleted(BlacklistInfo user) { + blacklistStore.remove(user.getUserID()); +} +``` diff --git a/content/docs/chat/sdk/android/user/friend-applications/accept-friend-application.mdx b/content/docs/chat/sdk/android/user/friend-applications/accept-friend-application.mdx new file mode 100644 index 0000000000..39b0d1a0e1 --- /dev/null +++ b/content/docs/chat/sdk/android/user/friend-applications/accept-friend-application.mdx @@ -0,0 +1,32 @@ +--- +title: 'Accept a friend request' +description: 'Use acceptFriendApplication() to accept a friend request.' +product: 'sdk' +context: 'chat/sdk/android' +template: 'guide' +status: 'published' +lastUpdated: '2026-08-06' +version: 'v4' +platform: 'android' +sourcePath: '/sdk/android/user/friend-applications/accept-friend-application' +--- + +```java +OpenIMClient.getInstance().friendshipManager.acceptFriendApplication( + new OnBase() { + @Override + public void onSuccess(String data) { + markApplicationAccepted(applicantUserID); + } + + @Override + public void onError(int code, String error) { + recordApplicationAcceptFailure(code, error); + } + }, + applicantUserID, + "Accepted" +); +``` + +`applicantUserID` identifies the applicant, and the final argument is the handling message. A successful callback means the accept request completed. The request state and new friendship can arrive through separate callbacks and should be merged independently: `onFriendApplicationAccepted` updates the application and `onFriendAdded` updates the friendship. diff --git a/content/docs/chat/sdk/android/user/friend-applications/add-friend.mdx b/content/docs/chat/sdk/android/user/friend-applications/add-friend.mdx new file mode 100644 index 0000000000..a4e3ec4000 --- /dev/null +++ b/content/docs/chat/sdk/android/user/friend-applications/add-friend.mdx @@ -0,0 +1,34 @@ +--- +title: 'Send a friend request' +description: 'Use addFriend() to send a friend request to a specified user.' +product: 'sdk' +context: 'chat/sdk/android' +template: 'guide' +status: 'published' +lastUpdated: '2026-08-06' +version: 'v4' +platform: 'android' +sourcePath: '/sdk/android/user/friend-applications/add-friend' +--- + +```java +OpenIMClient.getInstance().friendshipManager.addFriend( + new OnBase() { + @Override + public void onSuccess(String data) { + markFriendApplicationSubmitted(); + } + + @Override + public void onError(int code, String error) { + recordFriendApplicationFailure(code, error); + } + }, + "user_b", + "Hello, I am Alex" +); +``` + +The second argument is the recipient's `userID`, and the third argument is the request message. A successful callback means the server received the request, not that the recipient accepted it. The target ID cannot be empty. Let a trusted application backend handle lookup by nickname, phone number, or other private fields. + +Merge friend request changes through `OnFriendshipListener`, as documented in [Get received friend requests](/sdk/android/user/friend-applications/get-recv-friend-application-list). diff --git a/content/docs/chat/sdk/android/user/friend-applications/get-recv-friend-application-list.mdx b/content/docs/chat/sdk/android/user/friend-applications/get-recv-friend-application-list.mdx new file mode 100644 index 0000000000..b50f4bd867 --- /dev/null +++ b/content/docs/chat/sdk/android/user/friend-applications/get-recv-friend-application-list.mdx @@ -0,0 +1,75 @@ +--- +title: 'Get received friend requests' +description: 'Use getRecvFriendApplicationList() to query received friend requests by page.' +product: 'sdk' +context: 'chat/sdk/android' +template: 'guide' +status: 'published' +lastUpdated: '2026-08-06' +version: 'v4' +platform: 'android' +sourcePath: '/sdk/android/user/friend-applications/get-recv-friend-application-list' +--- + +```java +GetFriendApplicationListAsRecipientReq request = + new GetFriendApplicationListAsRecipientReq(0, 20); + +OpenIMClient.getInstance().friendshipManager.getRecvFriendApplicationList( + new OnBase>() { + @Override + public void onSuccess(List applications) { + replaceReceivedApplications(applications); + } + + @Override + public void onError(int code, String error) { + recordReceivedApplicationFailure(code, error); + } + }, + request +); +``` + +`offset` starts at `0`, and `count` is the page size. To filter by handling state, use `setHandleResults(int[])` with values defined by the server contract. The callback returns the current page as `List`. + +| Field | Description | +| --------------------------------------------- | ---------------------------------------------------------------- | +| `fromUserID` / `fromNickname` / `fromFaceURL` | Applicant ID, nickname, and avatar snapshot. | +| `toUserID` / `toNickname` / `toFaceURL` | Recipient ID, nickname, and avatar snapshot. | +| `reqMsg` | Friend request message. | +| `handleResult` | Handling result: `0` pending, `1` accepted, `2` rejected. | +| `handlerUserID` | User ID that handled the request; it can be empty while pending. | +| `handleMsg` | Handling message. | +| `handleTime` | Handling time; do not treat it as valid while pending. | +| `createTime` | Request creation time. | +| `ex` | Friend request extension string. | + +Use `fromUserID:toUserID` as the stable request key. This page owns the friend request added, accepted, rejected, and deleted callbacks. Combine them into the application's single `OnFriendshipListener`: + +```java +@Override +public void onFriendApplicationAdded(FriendApplicationInfo application) { + friendApplicationStore.merge(application); +} + +@Override +public void onFriendApplicationAccepted(FriendApplicationInfo application) { + friendApplicationStore.merge(application); +} + +@Override +public void onFriendApplicationRejected(FriendApplicationInfo application) { + friendApplicationStore.merge(application); +} + +@Override +public void onFriendApplicationDeleted(FriendApplicationInfo application) { + friendApplicationStore.remove( + application.getFromUserID(), + application.getToUserID() + ); +} +``` + +Use whether `toUserID` equals the signed-in user ID to route a record to the received or sent list. After an application is accepted, `onFriendAdded`, owned by [Get the friend list by page](/sdk/android/user/friends/get-friend-list-page), merges the new friendship. diff --git a/content/docs/chat/sdk/android/user/friend-applications/get-send-friend-application-list.mdx b/content/docs/chat/sdk/android/user/friend-applications/get-send-friend-application-list.mdx new file mode 100644 index 0000000000..1a9e8ee929 --- /dev/null +++ b/content/docs/chat/sdk/android/user/friend-applications/get-send-friend-application-list.mdx @@ -0,0 +1,36 @@ +--- +title: 'Get sent friend requests' +description: 'Use getSendFriendApplicationList() to query sent friend requests by page.' +product: 'sdk' +context: 'chat/sdk/android' +template: 'guide' +status: 'published' +lastUpdated: '2026-08-06' +version: 'v4' +platform: 'android' +sourcePath: '/sdk/android/user/friend-applications/get-send-friend-application-list' +--- + +```java +GetFriendApplicationListAsApplicantReq request = + new GetFriendApplicationListAsApplicantReq(0, 20); + +OpenIMClient.getInstance().friendshipManager.getSendFriendApplicationList( + new OnBase>() { + @Override + public void onSuccess(List applications) { + replaceSentApplications(applications); + } + + @Override + public void onError(int code, String error) { + recordSentApplicationFailure(code, error); + } + }, + request +); +``` + +`offset` starts at `0`, and `count` is the page size. The callback returns the current page as `List`. Merge items by `fromUserID:toUserID`. This query only establishes a snapshot and does not trigger friend request callbacks. + +For sent requests, the signed-in user is normally `fromUserID`. The record fields and handling semantics are the same as [Get received friend requests](/sdk/android/user/friend-applications/get-recv-friend-application-list): the Android server contract uses `0` for pending, `1` for accepted, and `2` for rejected. diff --git a/content/docs/chat/sdk/android/user/friend-applications/refuse-friend-application.mdx b/content/docs/chat/sdk/android/user/friend-applications/refuse-friend-application.mdx new file mode 100644 index 0000000000..ae72e17d21 --- /dev/null +++ b/content/docs/chat/sdk/android/user/friend-applications/refuse-friend-application.mdx @@ -0,0 +1,32 @@ +--- +title: 'Reject a friend request' +description: 'Use refuseFriendApplication() to reject a friend request.' +product: 'sdk' +context: 'chat/sdk/android' +template: 'guide' +status: 'published' +lastUpdated: '2026-08-06' +version: 'v4' +platform: 'android' +sourcePath: '/sdk/android/user/friend-applications/refuse-friend-application' +--- + +```java +OpenIMClient.getInstance().friendshipManager.refuseFriendApplication( + new OnBase() { + @Override + public void onSuccess(String data) { + markApplicationRejected(applicantUserID); + } + + @Override + public void onError(int code, String error) { + recordApplicationRejectFailure(code, error); + } + }, + applicantUserID, + "Not now" +); +``` + +`applicantUserID` identifies the applicant, and the final argument is the handling message. A successful callback means the reject request completed. Merge request state through the shared friend request listener; the final rejected state is `handleResult == 2`. diff --git a/content/docs/chat/sdk/android/user/friends/check-friend.mdx b/content/docs/chat/sdk/android/user/friends/check-friend.mdx new file mode 100644 index 0000000000..100488a665 --- /dev/null +++ b/content/docs/chat/sdk/android/user/friends/check-friend.mdx @@ -0,0 +1,33 @@ +--- +title: 'Check friendship' +description: 'Use checkFriend() to check whether specified users are friends of the current user.' +product: 'sdk' +context: 'chat/sdk/android' +template: 'guide' +status: 'published' +lastUpdated: '2026-08-06' +version: 'v4' +platform: 'android' +sourcePath: '/sdk/android/user/friends/check-friend' +--- + +```java +OpenIMClient.getInstance().friendshipManager.checkFriend( + new OnBase>() { + @Override + public void onSuccess(List relations) { + showFriendshipStates(relations); + } + + @Override + public void onError(int code, String error) { + recordFriendshipCheckFailure(code, error); + } + }, + Arrays.asList("user_a", "user_b") +); +``` + +The callback returns `List`. Each item's `userID` identifies the target user. `result == 1` means the user is a friend and is not in the blacklist. Interpret other result values only through the server contract; do not create additional client-side states. + +This method only establishes a relationship snapshot and does not trigger friendship callbacks. Use [`getFriendsInfo()`](/sdk/android/user/friends/get-friends-info) when nickname, avatar, or friend remark data is required. diff --git a/content/docs/chat/sdk/android/user/friends/delete-friend.mdx b/content/docs/chat/sdk/android/user/friends/delete-friend.mdx new file mode 100644 index 0000000000..4cab7ed68e --- /dev/null +++ b/content/docs/chat/sdk/android/user/friends/delete-friend.mdx @@ -0,0 +1,31 @@ +--- +title: 'Delete a friend' +description: 'Use deleteFriend() to remove one friendship from the current user.' +product: 'sdk' +context: 'chat/sdk/android' +template: 'guide' +status: 'published' +lastUpdated: '2026-08-06' +version: 'v4' +platform: 'android' +sourcePath: '/sdk/android/user/friends/delete-friend' +--- + +```java +OpenIMClient.getInstance().friendshipManager.deleteFriend( + new OnBase() { + @Override + public void onSuccess(String data) { + markFriendDeletionSubmitted(friendUserID); + } + + @Override + public void onError(int code, String error) { + recordFriendDeletionFailure(code, error); + } + }, + friendUserID +); +``` + +A successful callback means the delete request completed. Remove the local record by `userID` after `onFriendDeleted` arrives. Event handling is documented in [Get the friend list by page](/sdk/android/user/friends/get-friend-list-page). diff --git a/content/docs/chat/sdk/android/user/friends/get-friend-list-page.mdx b/content/docs/chat/sdk/android/user/friends/get-friend-list-page.mdx new file mode 100644 index 0000000000..f06689e125 --- /dev/null +++ b/content/docs/chat/sdk/android/user/friends/get-friend-list-page.mdx @@ -0,0 +1,73 @@ +--- +title: 'Get the friend list by page' +description: 'Use getFriendListPage() to retrieve the current user friend list by page.' +product: 'sdk' +context: 'chat/sdk/android' +template: 'guide' +status: 'published' +lastUpdated: '2026-08-06' +version: 'v4' +platform: 'android' +sourcePath: '/sdk/android/user/friends/get-friend-list-page' +--- + +```java +OpenIMClient.getInstance().friendshipManager.getFriendListPage( + new OnBase>() { + @Override + public void onSuccess(List friends) { + for (UserInfo friend : friends) { + friendStore.put(friend.getUserID(), friend); + } + } + + @Override + public void onError(int code, String error) { + recordFriendListFailure(code, error); + } + }, + 0, + 40, + true +); +``` + +The arguments after the callback are `offset`, `count`, and `filterBlack`. `offset` starts at `0`, `count` is the page size, and `filterBlack` removes blocked users when `true`. The callback returns the current page as `List`; call `getFriendInfo()` on each item for relationship details. Increase `offset` by the requested item count when loading another page; a page smaller than `count` normally marks the end. + +Use the paged API instead of `getFriendList()`. Merge snapshots and increments by `userID`. + +## Friend profile fields + +`UserInfo` is the Android wrapper object. `getFriendInfo()` returns `FriendInfo` for a friend list item. Common fields are: + +| Field | Description | +| ---------------- | ------------------------------------------------- | +| `userID` | Friend user ID and the stable friend-list key. | +| `nickname` | Account nickname of the friend. | +| `faceURL` | Account avatar URL of the friend. | +| `remark` | Friend remark set by the current account. | +| `ex` | Friendship extension string. | +| `addSource` | Source that created the friendship. | +| `operatorUserID` | User ID that created or updated the relationship. | +| `createTime` | Friendship creation time. | + +`nickname` and `faceURL` are account data, while `remark` and `ex` belong to the friendship. `UpdateFriendsReq` can submit `isPinned`, but the current Android `FriendInfo` model has no corresponding read field, so pinned state needs application-owned storage. Do not use a friend object to overwrite a stranger's `PublicUserInfo`, or write a friend remark back to the account nickname. + +This page owns the friend added, changed, and deleted callbacks. Combine them into the application's single `OnFriendshipListener`: + +```java +@Override +public void onFriendAdded(FriendInfo friend) { + friendStore.put(friend.getUserID(), friend); +} + +@Override +public void onFriendInfoChanged(FriendInfo friend) { + friendStore.put(friend.getUserID(), friend); +} + +@Override +public void onFriendDeleted(FriendInfo friend) { + friendStore.remove(friend.getUserID()); +} +``` diff --git a/content/docs/chat/sdk/android/user/friends/get-friends-info.mdx b/content/docs/chat/sdk/android/user/friends/get-friends-info.mdx new file mode 100644 index 0000000000..cbd885d042 --- /dev/null +++ b/content/docs/chat/sdk/android/user/friends/get-friends-info.mdx @@ -0,0 +1,38 @@ +--- +title: 'Get specified friend profiles' +description: 'Use getFriendsInfo() to query friendship profiles for specified users.' +product: 'sdk' +context: 'chat/sdk/android' +template: 'guide' +status: 'published' +lastUpdated: '2026-08-06' +version: 'v4' +platform: 'android' +sourcePath: '/sdk/android/user/friends/get-friends-info' +--- + +```java +OpenIMClient.getInstance().friendshipManager.getFriendsInfo( + new OnBase>() { + @Override + public void onSuccess(List friends) { + for (UserInfo friend : friends) { + friendStore.put(friend.getUserID(), friend); + } + } + + @Override + public void onError(int code, String error) { + recordFriendInfoFailure(code, error); + } + }, + Arrays.asList("user_a", "user_b"), + true +); +``` + +The second argument is the target user ID list. `filterBlack` controls whether blocked users are removed. Remove empty and duplicate IDs before calling. The callback returns `List`; use `getFriendInfo()` for friend remarks and relationship fields, then merge by `userID`. + +The result can omit a target that is not a friend or is excluded by `filterBlack == true`. When the UI also needs account-level public data, call [Get specified user profiles](/sdk/android/user/user-profile/get-users-info) and merge the two sources by `userID`. + +This query does not trigger friendship callbacks. Use [`checkFriend()`](/sdk/android/user/friends/check-friend) when only the relationship state is needed. diff --git a/content/docs/chat/sdk/android/user/friends/search-friends.mdx b/content/docs/chat/sdk/android/user/friends/search-friends.mdx new file mode 100644 index 0000000000..10d52db56a --- /dev/null +++ b/content/docs/chat/sdk/android/user/friends/search-friends.mdx @@ -0,0 +1,36 @@ +--- +title: 'Search friends' +description: 'Use searchFriends() to search the current user friend list.' +product: 'sdk' +context: 'chat/sdk/android' +template: 'guide' +status: 'published' +lastUpdated: '2026-08-06' +version: 'v4' +platform: 'android' +sourcePath: '/sdk/android/user/friends/search-friends' +--- + +```java +OpenIMClient.getInstance().friendshipManager.searchFriends( + new OnBase>() { + @Override + public void onSuccess(List results) { + showFriendSearchResults(results); + } + + @Override + public void onError(int code, String error) { + recordFriendSearchFailure(code, error); + } + }, + Collections.singletonList(keyword.trim()), + true, + true, + true +); +``` + +Pass one non-empty value in `keywordList`. The three Boolean arguments select matching by user ID, nickname, and friend remark. Enable at least one field. To search multiple fields, enable the corresponding flags; the API does not treat multiple keywords as independent search conditions. + +The callback returns `List`. Search results belong to the current search view and should not replace the full friend snapshot. This query does not trigger friendship callbacks. diff --git a/content/docs/chat/sdk/android/user/friends/update-friends.mdx b/content/docs/chat/sdk/android/user/friends/update-friends.mdx new file mode 100644 index 0000000000..624e158896 --- /dev/null +++ b/content/docs/chat/sdk/android/user/friends/update-friends.mdx @@ -0,0 +1,44 @@ +--- +title: 'Update friend profiles' +description: 'Use updateFriendsReq() to update friend remarks, pinned state, or extension data.' +product: 'sdk' +context: 'chat/sdk/android' +template: 'guide' +status: 'published' +lastUpdated: '2026-08-06' +version: 'v4' +platform: 'android' +sourcePath: '/sdk/android/user/friends/update-friends' +--- + +```java +UpdateFriendsReq request = new UpdateFriendsReq(); +request.setFriendUserIDs(new String[] { friendUserID }); +request.setRemark(remark.trim()); + +OpenIMClient.getInstance().friendshipManager.updateFriendsReq( + new OnBase() { + @Override + public void onSuccess(String data) { + markFriendUpdateSubmitted(); + } + + @Override + public void onError(int code, String error) { + recordFriendUpdateFailure(code, error); + } + }, + request +); +``` + +`UpdateFriendsReq` supports `friendUserIDs`, `remark`, `isPinned`, and `ex`. One call applies the same field value to every target friend. Use separate calls when friends need different values. `ex` is a complete string. + +| Field | Description | +| --------------- | ---------------------------------------------------------- | +| `friendUserIDs` | Friend ID array to update. | +| `remark` | Friend remark for the current account. | +| `isPinned` | Whether to pin the friend. | +| `ex` | Friendship extension string, replaced as a complete value. | + +A successful callback means the update request completed. Merge the friend increment through `onFriendInfoChanged`, as documented in [Get the friend list by page](/sdk/android/user/friends/get-friend-list-page). diff --git a/content/docs/chat/sdk/android/user/online-status/get-subscribe-online-users-status.mdx b/content/docs/chat/sdk/android/user/online-status/get-subscribe-online-users-status.mdx new file mode 100644 index 0000000000..4c61c8b9c7 --- /dev/null +++ b/content/docs/chat/sdk/android/user/online-status/get-subscribe-online-users-status.mdx @@ -0,0 +1,32 @@ +--- +title: 'Get subscribed user online status' +description: 'Use getSubscribeOnlineUsersStatus() to retrieve online status for subscribed users.' +product: 'sdk' +context: 'chat/sdk/android' +template: 'guide' +status: 'published' +lastUpdated: '2026-08-06' +version: 'v4' +platform: 'android' +sourcePath: '/sdk/android/user/online-status/get-subscribe-online-users-status' +--- + +```java +OpenIMClient.getInstance().userInfoManager.getSubscribeOnlineUsersStatus( + new OnBase>() { + @Override + public void onSuccess(List states) { + mergeOnlineStates(states); + } + + @Override + public void onError(int code, String error) { + recordStatusQueryFailure(code, error); + } + } +); +``` + +This method does not accept user IDs or modify the subscription set. The callback returns the current subscribed-user `List` snapshot, which can reconcile status by `userID` after reconnecting or reopening a screen. + +The query does not trigger `onUserStatusChanged`. Apply the snapshot only to presence state; retrieve names and avatars through the user profile APIs. diff --git a/content/docs/chat/sdk/android/user/online-status/subscribe-users-online-status.mdx b/content/docs/chat/sdk/android/user/online-status/subscribe-users-online-status.mdx new file mode 100644 index 0000000000..64258f4353 --- /dev/null +++ b/content/docs/chat/sdk/android/user/online-status/subscribe-users-online-status.mdx @@ -0,0 +1,52 @@ +--- +title: 'Subscribe to user online status' +description: 'Use subscribeUsersOnlineStatus() to subscribe to online status for specified users.' +product: 'sdk' +context: 'chat/sdk/android' +template: 'guide' +status: 'published' +lastUpdated: '2026-08-10' +version: 'v4' +platform: 'android' +sourcePath: '/sdk/android/user/online-status/subscribe-users-online-status' +--- + +```java +List userIDs = Arrays.asList("user_a", "user_b"); + +OpenIMClient.getInstance().userInfoManager.subscribeUsersOnlineStatus( + new OnBase>() { + @Override + public void onSuccess(List states) { + mergeOnlineStates(states); + } + + @Override + public void onError(int code, String error) { + recordStatusSubscriptionFailure(code, error); + } + }, + userIDs +); +``` + +Remove empty and duplicate IDs, and subscribe only to users whose status is needed. The callback returns the initial `List` snapshot. Each item contains `userID`, `status`, and `platformIDs`. Deduplicate repeated subscriptions in the application state layer. + +## Status fields + +| Field | Description | +| ------------- | --------------------------------------------------- | +| `userID` | Target user ID. | +| `status` | Online status value defined by the server contract. | +| `platformIDs` | Platforms on which the user is online. | + +This page owns `onUserStatusChanged`. Combine it into the application's single `OnUserListener` and merge by `userID`: + +```java +@Override +public void onUserStatusChanged(UsersOnlineStatus status) { + onlineStatusStore.put(status.getUserID(), status); +} +``` + +Subscription only creates or updates the subscription set; do not treat its callback as friend profile data. Manage the subscription set centrally when users leave the visible range or the account changes, and remove users that are no longer needed through [Unsubscribe from user status](/sdk/android/user/online-status/unsubscribe-users-online-status). diff --git a/content/docs/chat/sdk/android/user/online-status/unsubscribe-users-online-status.mdx b/content/docs/chat/sdk/android/user/online-status/unsubscribe-users-online-status.mdx new file mode 100644 index 0000000000..86256bcdd4 --- /dev/null +++ b/content/docs/chat/sdk/android/user/online-status/unsubscribe-users-online-status.mdx @@ -0,0 +1,39 @@ +--- +title: 'Unsubscribe from user status' +description: 'Use unsubscribeOnlineUsersStatus to cancel online-status subscriptions for specified users.' +product: 'sdk' +context: 'chat/sdk/android' +template: 'guide' +status: 'published' +lastUpdated: '2026-08-10' +version: 'v4' +platform: 'android' +sourcePath: '/sdk/android/user/online-status/unsubscribe-users-online-status' +--- + +Cancel online-status subscriptions when users leave the visible range, the screen closes, or the account changes. Remove empty and duplicate IDs before making the call. + +```java +List userIDs = Arrays.asList("user_a", "user_b"); + +OpenIMClient.getInstance().userInfoManager.unsubscribeOnlineUsersStatus( + new OnBase() { + @Override + public void onSuccess(String data) { + for (String userID : userIDs) { + presenceByUserID.remove(userID); + } + } + + @Override + public void onError(int code, String error) { + recordStatusUnsubscribeFailure(code, error); + } + }, + userIDs +); +``` + +A successful callback means that the unsubscribe request completed. Only then remove the IDs from the application's subscription set and presence cache. Retain the previous state after an error so the operation can be retried. This operation does not change user profiles or friend relationships. + +Call [Subscribe to user online status](/sdk/android/user/online-status/subscribe-users-online-status) when those users need to be tracked again. diff --git a/content/docs/chat/sdk/android/user/overview-user.mdx b/content/docs/chat/sdk/android/user/overview-user.mdx index 0cfecbbd0d..713b18a418 100644 --- a/content/docs/chat/sdk/android/user/overview-user.mdx +++ b/content/docs/chat/sdk/android/user/overview-user.mdx @@ -1,18 +1,60 @@ --- -title: 'Overview' -description: 'OpenIM · SDK · Android · v4 documentation scaffold for Overview. Replace this placeholder with OpenIM-specific guidance, examples, and assets.' +title: 'User overview' +description: 'Learn about user profiles, friendships, friend requests, blacklists, and online status in the Android SDK.' product: 'sdk' context: 'chat/sdk/android' template: 'guide' -status: 'scaffold' -lastUpdated: '2026-06-24' +status: 'published' +lastUpdated: '2026-08-10' version: 'v4' platform: 'android' sourcePath: '/sdk/android/user/overview-user' --- - +OpenIM Android SDK identifies each user by `userID`. When implementing profile cards, friend requests, contacts, or a blocklist, distinguish an application's public user profile from the current user's friend relationship and blocklist state. + +Group member lists, in-group nicknames, group roles, and member administration belong to the Groups domain. User APIs cover profiles, friendships, friend requests, blacklists, and online status. + +## User objects + +Android SDK returns different user objects for different scenarios: + +| Type | Use case | Main APIs | +| ----------------------- | ---------------------------------------------------------------------------------------------------- | ----------------------------------------------------------------- | +| `LocalUser` | The current user's local profile, settings page, avatar, nickname, and account-level receive setting | `getSelfLocalUserInfo()`, `setSelfInfo()` | +| `PublicUserInfo` | Application user lookup, friend candidates, and profiles for users who are not friends | `getUsersInfo()` | +| `UserInfo` | Combined Android wrapper object that can carry public, friend, or blacklist information | `getFriendListPage()`, `getFriendsInfo()`, `getBlacklist()` | +| `FriendInfo` | The current user's friend list, friend remarks, and relationship extension data | `searchFriends()`, `getFriendListPage()` | +| `FriendApplicationInfo` | The parties, handling state, and message for a friend request | Friend request queries and callbacks | +| `BlacklistInfo` | Users blocked by the current user and their blocklist relationship fields | `getBlacklist()`, `addBlacklist()`, `removeBlacklist()` | +| `UsersOnlineStatus` | User online status and connected platforms | `subscribeUsersOnlineStatus()`, `getSubscribeOnlineUsersStatus()`, `unsubscribeOnlineUsersStatus()` | + +The same `userID` can appear in public profile, friend, blocklist, and group member data. Prefer `UserInfo.getFriendInfo()` when displaying a contact, `PublicUserInfo` when only a public account profile is needed, and `UserInfo.getBlackInfo()` on a blocklist screen. Conversation list and chat page titles belong to conversation data and should use the conversation display name. + +Use `userID` as the stable key for user lists and events. A friend request contains both parties, so use `fromUserID:toUserID` to identify one request. + +## Feature entry points + +| Requirement | Recommended page | +| --------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------ | +| Retrieve public profiles by `userID` for friend candidates or profile cards | [Get specified user profiles](/sdk/android/user/user-profile/get-users-info) | +| Page through, search, or retrieve friend relationships by ID | [Get the friend list by page](/sdk/android/user/friends/get-friend-list-page) | +| Send, retrieve, accept, or reject friend requests | [Get received friend requests](/sdk/android/user/friend-applications/get-recv-friend-application-list) | +| Update friend data | [Update friend profiles](/sdk/android/user/friends/update-friends) | +| Delete a friend relationship | [Delete a friend](/sdk/android/user/friends/delete-friend) | +| View and maintain the current user's blocklist | [Get the blacklist](/sdk/android/user/blacklist/get-blacklist) | +| Read or update the current user's nickname, avatar, and extension data | [Update the current user profile](/sdk/android/user/user-profile/set-self-info) | +| Configure account-level message reception and notification behavior | [Set global message reception](/sdk/android/user/user-profile/set-global-message-reception) | +| Subscribe to, retrieve, and unsubscribe from online status | [Subscribe to user online status](/sdk/android/user/online-status/subscribe-users-online-status), [Unsubscribe from user status](/sdk/android/user/online-status/unsubscribe-users-online-status) | + +## State updates + +Each user-related capability page owns the listener and merge behavior for its events: + +- Current user profile changes: [Update the current user profile](/sdk/android/user/user-profile/set-self-info). +- Friend request changes: [Get received friend requests](/sdk/android/user/friend-applications/get-recv-friend-application-list). +- Friend relationship and profile changes: [Get the friend list by page](/sdk/android/user/friends/get-friend-list-page). +- Blocklist changes: [Block a user](/sdk/android/user/blacklist/add-blacklist). +- Online status changes: [Subscribe to user online status](/sdk/android/user/online-status/subscribe-users-online-status). + +`UserInfoManager` and `FriendshipManager` each retain one listener. `setOnUserListener()` and `setOnFriendshipListener()` replace the current listener. Combine the required callbacks in a shared state layer and set each listener once; multiple pages must not overwrite one another's listeners. diff --git a/content/docs/chat/sdk/android/user/user-profile/get-self-local-user-info.mdx b/content/docs/chat/sdk/android/user/user-profile/get-self-local-user-info.mdx new file mode 100644 index 0000000000..fab369eb88 --- /dev/null +++ b/content/docs/chat/sdk/android/user/user-profile/get-self-local-user-info.mdx @@ -0,0 +1,46 @@ +--- +title: 'Get the current user profile' +description: 'Use getSelfLocalUserInfo() to retrieve the local profile for the current user.' +product: 'sdk' +context: 'chat/sdk/android' +template: 'guide' +status: 'published' +lastUpdated: '2026-08-06' +version: 'v4' +platform: 'android' +sourcePath: '/sdk/android/user/user-profile/get-self-local-user-info' +--- + +```java +OpenIMClient.getInstance().userInfoManager.getSelfLocalUserInfo( + new OnBase() { + @Override + public void onSuccess(LocalUser user) { + currentUserStore.set(user); + } + + @Override + public void onError(int code, String error) { + recordSelfProfileFailure(code, error); + } + } +); +``` + +After initialization and login, call this method to retrieve the current account's local profile. Success returns `LocalUser` with fields such as `userID`, `nickname`, `faceURL`, `ex`, `attachedInfo`, `globalRecvMsgOpt`, and `addFriendPermission`. + +## Returned fields + +| Field | Description | +| --------------------- | -------------------------------------------------------------------------------------------- | +| `userID` | Signed-in user ID. | +| `nickname` | Current account nickname. | +| `faceURL` | Current account avatar URL. | +| `ex` | Current account extension string. | +| `attachedInfo` | SDK-attached data; parse only an application-defined format. | +| `globalRecvMsgOpt` | Global message reception: `0` receive, `1` do not receive, `2` receive without notification. | +| `addFriendPermission` | Add-friend permission value defined by the server contract. | + +The query does not trigger a profile callback. Clear the previous account snapshot when logging out or switching accounts so that the previous user's data is not rendered for the new account. + +`getSelfUserInfo()` is deprecated and is not the recommended API. diff --git a/content/docs/chat/sdk/android/user/user-profile/get-users-info.mdx b/content/docs/chat/sdk/android/user/user-profile/get-users-info.mdx new file mode 100644 index 0000000000..900d018e33 --- /dev/null +++ b/content/docs/chat/sdk/android/user/user-profile/get-users-info.mdx @@ -0,0 +1,55 @@ +--- +title: 'Get specified user profiles' +description: 'Use getUsersInfo() to query public profiles by userID.' +product: 'sdk' +context: 'chat/sdk/android' +template: 'guide' +status: 'published' +lastUpdated: '2026-08-06' +version: 'v4' +platform: 'android' +sourcePath: '/sdk/android/user/user-profile/get-users-info' +--- + +`getUsersInfo()` returns public profiles for a list of user IDs. It is suitable for friend candidates and profiles of users outside the current friend list. It does not return relationship fields such as the current user's friend remark. + +```java +List userIDs = Arrays.asList("user_a", "user_b"); + +OpenIMClient.getInstance().userInfoManager.getUsersInfo( + new OnBase>() { + @Override + public void onSuccess(List users) { + for (PublicUserInfo user : users) { + publicUserStore.put(user.getUserID(), user); + } + } + + @Override + public void onError(int code, String error) { + recordUserQueryFailure(code, error); + } + }, + userIDs +); +``` + +Remove empty and duplicate IDs before calling the API, and keep each request within the application's batch limit. The callback returns `List` with fields such as `userID`, `nickname`, `faceURL`, `ex`, and `createTime`. This query does not trigger `OnUserListener`; query again and merge by `userID` when the profile snapshot must be refreshed. + +## Returned fields + +| Field | Description | +| ------------ | ----------------------------------------------------------------- | +| `userID` | OpenIM user ID and the stable local cache key. | +| `nickname` | Account-level public nickname. | +| `faceURL` | Account-level public avatar URL. | +| `ex` | Account-level public extension string defined by the application. | +| `createTime` | User profile creation time. | + +Do not use `PublicUserInfo` to overwrite friend remarks, pinned state, or in-group nicknames. Use `FriendInfo` for friends and the group member model for group members. + +Searching by nickname, phone number, or email is an application backend capability. A trusted backend should perform the search and permission checks, then return candidate user IDs for this API. + +## Refreshing profiles + +Replace or merge the public profile snapshot after a successful query. Re-query when opening a profile card, when the user explicitly refreshes, after reconnecting, or after a trusted backend reports a profile change. `OnUserListener.onSelfInfoUpdated` only describes the signed-in user's profile and is not a change event for other users. diff --git a/content/docs/chat/sdk/android/user/user-profile/set-global-message-reception.mdx b/content/docs/chat/sdk/android/user/user-profile/set-global-message-reception.mdx new file mode 100644 index 0000000000..6a42e061ef --- /dev/null +++ b/content/docs/chat/sdk/android/user/user-profile/set-global-message-reception.mdx @@ -0,0 +1,44 @@ +--- +title: 'Set global message reception' +description: 'Use setSelfInfo() to set the account-wide message reception and notification policy.' +product: 'sdk' +context: 'chat/sdk/android' +template: 'guide' +status: 'published' +lastUpdated: '2026-08-06' +version: 'v4' +platform: 'android' +sourcePath: '/sdk/android/user/user-profile/set-global-message-reception' +--- + +Use a separate `UserInfoReq` for `globalRecvMsgOpt` so profile updates do not accidentally overwrite the account-wide message policy. + +```java +UserInfoReq request = new UserInfoReq(); +request.setGlobalRecvMsgOpt(2); + +OpenIMClient.getInstance().userInfoManager.setSelfInfo( + new OnBase() { + @Override + public void onSuccess(String data) { + markGlobalReceiveOptionSubmitted(); + } + + @Override + public void onError(int code, String error) { + recordGlobalReceiveOptionFailure(code, error); + } + }, + request +); +``` + +| Value | Meaning | +| ----- | ----------------------------------------- | +| `0` | Receive messages and allow notifications. | +| `1` | Do not receive messages. | +| `2` | Receive messages without notifications. | + +If the product exposes only a global do-not-disturb switch, it usually toggles between `0` and `2`; `1` stops message reception and should be presented as a separate option. Per-conversation reception is managed by conversation APIs and is not replaced by this setting. + +A successful callback means the request completed. Reconcile the final account snapshot through `onSelfInfoUpdated` or `getSelfLocalUserInfo()`. Event handling is documented in [Update the current user profile](/sdk/android/user/user-profile/set-self-info). diff --git a/content/docs/chat/sdk/android/user/user-profile/set-self-info.mdx b/content/docs/chat/sdk/android/user/user-profile/set-self-info.mdx new file mode 100644 index 0000000000..7a80357bd7 --- /dev/null +++ b/content/docs/chat/sdk/android/user/user-profile/set-self-info.mdx @@ -0,0 +1,60 @@ +--- +title: 'Update your profile' +description: 'Use setSelfInfo() to update the nickname, avatar, or extension data of the current user.' +product: 'sdk' +context: 'chat/sdk/android' +template: 'guide' +status: 'published' +lastUpdated: '2026-08-10' +version: 'v4' +platform: 'android' +sourcePath: '/sdk/android/user/user-profile/set-self-info' +--- + +Set only the fields that must change on `UserInfoReq`. The SDK omits `null` fields when serializing the request. + +```java +UserInfoReq request = new UserInfoReq(); +request.setNickname(displayName.trim()); +request.setFaceURL(avatarURL); +request.setEx(mergedExtra); + +OpenIMClient.getInstance().userInfoManager.setSelfInfo( + new OnBase() { + @Override + public void onSuccess(String data) { + markProfileUpdateSubmitted(); + } + + @Override + public void onError(int code, String error) { + recordProfileUpdateFailure(code, error); + } + }, + request +); +``` + +`UserInfoReq` supports fields such as `nickname`, `faceURL`, `ex`, and `addFriendPermission`. `ex` is a complete string; read, parse, and merge the application's namespace before updating it rather than overwriting the value with a partial JSON object. + +A successful callback means the update request completed. Merge the final profile increment from `onSelfInfoUpdated(UserInfo info)`, or query `getSelfLocalUserInfo()` again. + +## Updatable fields + +| Field | Description | +| --------------------- | ---------------------------- | +| `nickname` | New nickname. | +| `faceURL` | New avatar URL. | +| `ex` | Complete extension string. | +| `addFriendPermission` | Add-friend permission value. | + +Send only fields that should change. Although the global message reception setting is also written with `setSelfInfo()`, use the dedicated [Set global message reception](/sdk/android/user/user-profile/set-global-message-reception) entry point. + +This page owns `onSelfInfoUpdated`. Combine it into the application's single `OnUserListener`: + +```java +@Override +public void onSelfInfoUpdated(UserInfo info) { + currentUserStore.merge(info.getUserID(), info); +} +``` diff --git a/content/zh/docs/chat/sdk/android/calling/managing-calls/accept-call.mdx b/content/zh/docs/chat/sdk/android/calling/managing-calls/accept-call.mdx new file mode 100644 index 0000000000..8e6ab3dc0c --- /dev/null +++ b/content/zh/docs/chat/sdk/android/calling/managing-calls/accept-call.mdx @@ -0,0 +1,32 @@ +--- +title: '接受通话' +description: '使用 Android SDK 接受通话邀请并获取房间凭据。' +sourcePath: '/sdk/android/calling/managing-calls/accept-call' +--- + +从 `onReceiveNewInvitation` 取得原始 `SignalingInfo` 后,使用 `signalingAccept()` 接受邀请: + +```java +OpenIMClient.getInstance().signalingManager.signalingAccept( + new OnBase() { + @Override + public void onSuccess(SignalingCertificate credentials) { + joinMediaRoom( + credentials.getRoomID(), + credentials.getToken(), + credentials.getLiveURL() + ); + } + + @Override + public void onError(int code, String error) { + showAcceptError(code, error); + } + }, + receivedInfo +); +``` + +`receivedInfo` 必须保留收到的原始 `roomID`、邀请人、被邀请人和会话类型,不能重新构造为只包含 `roomID` 的对象。 + +成功回调返回 `SignalingCertificate`。取得有效的 `token` 和 `roomID` 后再连接媒体房间;远端状态由[处理通话事件](/sdk/android/calling/managing-calls/handle-call-events)继续合并。 diff --git a/content/zh/docs/chat/sdk/android/calling/managing-calls/cancel-call.mdx b/content/zh/docs/chat/sdk/android/calling/managing-calls/cancel-call.mdx new file mode 100644 index 0000000000..0c754c80b4 --- /dev/null +++ b/content/zh/docs/chat/sdk/android/calling/managing-calls/cancel-call.mdx @@ -0,0 +1,26 @@ +--- +title: '取消通话邀请' +description: '使用 Android SDK 取消尚未接通的通话邀请。' +sourcePath: '/sdk/android/calling/managing-calls/cancel-call' +--- + +邀请尚未接通时,发起方调用 `signalingCancel()`: + +```java +OpenIMClient.getInstance().signalingManager.signalingCancel( + new OnBase() { + @Override + public void onSuccess(String result) { + stopWaitingForAnswer(activeInfo.getInvitation().getRoomID()); + } + + @Override + public void onError(int code, String error) { + showCancelError(code, error); + } + }, + activeInfo +); +``` + +必须传入发起时保存的完整 `SignalingInfo`,不能只构造一个 `roomID`。成功回调表示取消信令请求完成;应用还应结束本地等待接听状态,并释放尚未使用的媒体资源。远端通过 `onInvitationCancelled` 更新。 diff --git a/content/zh/docs/chat/sdk/android/calling/managing-calls/handle-call-events.mdx b/content/zh/docs/chat/sdk/android/calling/managing-calls/handle-call-events.mdx new file mode 100644 index 0000000000..d3890e8447 --- /dev/null +++ b/content/zh/docs/chat/sdk/android/calling/managing-calls/handle-call-events.mdx @@ -0,0 +1,74 @@ +--- +title: '处理通话事件' +description: '集中设置 Android SDK 的通话邀请、参与者和媒体流 listener。' +sourcePath: '/sdk/android/calling/managing-calls/handle-call-events' +--- + +通话状态层应集中设置一次 `OnSignalingListener`,并按 `roomID` 合并邀请生命周期、参与者连接状态和媒体流变化。 + +```java +OpenIMClient.getInstance().signalingManager.setSignalingListener( + new OnSignalingListener() { + @Override + public void onReceiveNewInvitation(SignalingInfo info) { + upsertCall(info, "ringing"); + } + + @Override + public void onInviteeAccepted(SignalingInfo info) { + mergeCallEvent("accepted", info); + } + + @Override + public void onInviteeRejected(SignalingInfo info) { + mergeCallEvent("rejected", info); + } + + @Override + public void onInvitationCancelled(SignalingInfo info) { + mergeCallEvent("cancelled", info); + } + + @Override + public void onInvitationTimeout(SignalingInfo info) { + mergeCallEvent("timeout", info); + } + + @Override + public void onInviteeAcceptedByOtherDevice(SignalingInfo info) { + mergeCallEvent("accepted-by-other-device", info); + } + + @Override + public void onInviteeRejectedByOtherDevice(SignalingInfo info) { + mergeCallEvent("rejected-by-other-device", info); + } + + @Override + public void onHangup(SignalingInfo info) { + finishCall(info.getInvitation().getRoomID()); + } + + @Override + public void onRoomParticipantConnected(RoomCallingInfo room) { + mergeConnectedParticipants(room.getRoomID(), room.getParticipant()); + } + + @Override + public void onRoomParticipantDisconnected(RoomCallingInfo room) { + mergeDisconnectedParticipants(room.getRoomID(), room.getParticipant()); + } + + @Override + public void onStreamChange(String streamInfo) { + mergeStreamChange(streamInfo); + } + } +); +``` + +本页是除 `onReceiveCustomSignal` 外 11 个已接入 Android 适配层的通话回调的完整归属页。自定义信令的处理边界见[发送自定义信令](/sdk/android/calling/sending-custom-signals/send-a-custom-signal)。 + +邀请事件使用 `SignalingInfo.invitation.roomID` 合并。参与者状态使用 `RoomCallingInfo.roomID`,并结合参与者的用户 ID 更新;不要按事件顺序、展示名称或数组位置合并。`onStreamChange` 当前提供字符串载荷,应由接入层按服务端实际协议解析并校验。 + +`SignalingManager` 只设置一个 listener,后一次设置会替换先前实例,并且没有公开移除方法。自定义信令回调必须与本页的其他回调组合在同一个应用级 listener 中。退出登录或切换账号时,应停止向旧账号状态写入,并用新账号的完整 listener 覆盖。 diff --git a/content/zh/docs/chat/sdk/android/calling/managing-calls/hang-up-call.mdx b/content/zh/docs/chat/sdk/android/calling/managing-calls/hang-up-call.mdx new file mode 100644 index 0000000000..3301761f13 --- /dev/null +++ b/content/zh/docs/chat/sdk/android/calling/managing-calls/hang-up-call.mdx @@ -0,0 +1,26 @@ +--- +title: '挂断通话' +description: '使用 Android SDK 挂断已经建立的通话。' +sourcePath: '/sdk/android/calling/managing-calls/hang-up-call' +--- + +通话已经建立后,参与者调用 `signalingHungUp()`。传入的 `SignalingInfo` 应保留本次通话的完整邀请信息,其中 `roomID` 必须与当前媒体房间一致。 + +```java +OpenIMClient.getInstance().signalingManager.signalingHungUp( + new OnBase() { + @Override + public void onSuccess(String result) { + releaseCallResources(activeInfo.getInvitation().getRoomID()); + } + + @Override + public void onError(int code, String error) { + showHangUpError(code, error); + } + }, + activeInfo +); +``` + +成功回调只表示挂断信令请求完成。应用还需要停止本地采集、断开媒体房间,并释放摄像头和麦克风。取消、拒绝、超时和挂断应进入同一套按 `roomID` 幂等执行的清理流程。 diff --git a/content/zh/docs/chat/sdk/android/calling/managing-calls/reject-call.mdx b/content/zh/docs/chat/sdk/android/calling/managing-calls/reject-call.mdx new file mode 100644 index 0000000000..3b0240957a --- /dev/null +++ b/content/zh/docs/chat/sdk/android/calling/managing-calls/reject-call.mdx @@ -0,0 +1,26 @@ +--- +title: '拒绝通话' +description: '使用 Android SDK 拒绝通话邀请。' +sourcePath: '/sdk/android/calling/managing-calls/reject-call' +--- + +用户拒绝来电时,将收到的原始 `SignalingInfo` 交给 `signalingReject()`: + +```java +OpenIMClient.getInstance().signalingManager.signalingReject( + new OnBase() { + @Override + public void onSuccess(String result) { + closeIncomingCallUI(); + } + + @Override + public void onError(int code, String error) { + showRejectError(code, error); + } + }, + receivedInfo +); +``` + +成功回调只表示拒绝信令请求完成。发起端随后通过 `onInviteeRejected` 更新界面;完整处理见[处理通话事件](/sdk/android/calling/managing-calls/handle-call-events)。 diff --git a/content/zh/docs/chat/sdk/android/calling/managing-calls/start-group-call.mdx b/content/zh/docs/chat/sdk/android/calling/managing-calls/start-group-call.mdx new file mode 100644 index 0000000000..d88962deea --- /dev/null +++ b/content/zh/docs/chat/sdk/android/calling/managing-calls/start-group-call.mdx @@ -0,0 +1,44 @@ +--- +title: '发起群聊通话' +description: '使用 Android SDK 发起群聊音视频通话。' +sourcePath: '/sdk/android/calling/managing-calls/start-group-call' +--- + +`signalingInviteInGroup()` 发起群聊通话,只邀请 `inviteeUserIDList` 明确列出的群成员,不会因为填写 `groupID` 自动邀请全群。 + +```java +SignalingInvitationInfo invitation = new SignalingInvitationInfo(); +invitation.setInviterUserID(currentUserID); +invitation.setInviteeUserIDList(selectedGroupMemberIDs); +invitation.setGroupID(groupID); +invitation.setRoomID(groupID); +invitation.setTimeout(30); +invitation.setMediaType("video"); +invitation.setSessionType(ConversationType.GROUP_CHAT); +invitation.setPlatformID(Platform.ANDROID); +invitation.setCustomData("{\"source\":\"group-call\"}"); + +SignalingInfo info = new SignalingInfo(); +info.setUserID(currentUserID); +info.setInvitation(invitation); +info.setOfflinePushInfo(offlinePushInfo); + +OpenIMClient.getInstance().signalingManager.signalingInviteInGroup( + new OnBase() { + @Override + public void onSuccess(SignalingCertificate credentials) { + startGroupCall(credentials); + } + + @Override + public void onError(int code, String error) { + showCallError(code, error); + } + }, + info +); +``` + +`groupID` 不能为空,`inviteeUserIDList` 应排除当前用户、空值和重复成员。示例沿用群组 ID 作为房间 ID;若业务自行生成 `roomID`,所有参与端必须使用同一个值。 + +成功回调返回 `SignalingCertificate`,字段含义见[发起单聊通话](/sdk/android/calling/managing-calls/start-single-call)。`busyLineUserIDList` 只表示部分成员忙线,不应中止其他成员的邀请流程;成功也不表示其他成员已经接听。 diff --git a/content/zh/docs/chat/sdk/android/calling/managing-calls/start-single-call.mdx b/content/zh/docs/chat/sdk/android/calling/managing-calls/start-single-call.mdx new file mode 100644 index 0000000000..d983335caf --- /dev/null +++ b/content/zh/docs/chat/sdk/android/calling/managing-calls/start-single-call.mdx @@ -0,0 +1,64 @@ +--- +title: '发起单聊通话' +description: '使用 Android SDK 发起单聊音视频通话。' +sourcePath: '/sdk/android/calling/managing-calls/start-single-call' +--- + +`signalingInvite()` 发起单聊通话。Android SDK 负责通话信令,应用仍需使用返回的房间凭据接入实时音视频媒体引擎。 + +## 参数说明 + +| 字段 | 类型 | 是否必填 | 说明 | +| --- | --- | --- | --- | +| `userID` | `String` | 是 | 执行邀请操作的当前登录用户 ID。 | +| `inviterUserID` | `String` | 是 | 邀请方用户 ID,通常与当前登录用户一致。 | +| `inviteeUserIDList` | `List` | 是 | 被邀请用户列表;单聊只填写对方一个用户。 | +| `groupID` | `String` | 是 | 单聊固定传空字符串。 | +| `roomID` | `String` | 是 | 本次通话的唯一房间标识,后续状态按它合并。 | +| `timeout` | `long` | 是 | 邀请等待时长,单位为秒。 | +| `mediaType` | `String` | 是 | 媒体类型,业务通常约定为 `audio` 或 `video`。 | +| `sessionType` | `int` | 是 | 单聊使用 `ConversationType.SINGLE_CHAT`。 | +| `platformID` | `int` | 是 | Android 手机端使用 `Platform.ANDROID`。 | +| `customData` | `String` | 否 | 随邀请携带的业务扩展字符串。 | +| `offlinePushInfo` | `OfflinePushInfo` | 否 | 被邀请人离线时使用的推送内容。 | + +```java +SignalingInvitationInfo invitation = new SignalingInvitationInfo(); +invitation.setInviterUserID(currentUserID); +invitation.setInviteeUserIDList(Collections.singletonList(peerUserID)); +invitation.setGroupID(""); +invitation.setRoomID(roomID); +invitation.setTimeout(30); +invitation.setMediaType("video"); +invitation.setSessionType(ConversationType.SINGLE_CHAT); +invitation.setPlatformID(Platform.ANDROID); +invitation.setCustomData("{\"source\":\"contact-card\"}"); + +SignalingInfo info = new SignalingInfo(); +info.setUserID(currentUserID); +info.setInvitation(invitation); +info.setOfflinePushInfo(offlinePushInfo); + +OpenIMClient.getInstance().signalingManager.signalingInvite( + new OnBase() { + @Override + public void onSuccess(SignalingCertificate credentials) { + joinMediaRoom( + credentials.getRoomID(), + credentials.getToken(), + credentials.getLiveURL() + ); + } + + @Override + public void onError(int code, String error) { + showCallError(code, error); + } + }, + info +); +``` + +成功回调返回 `SignalingCertificate`。其中 `roomID` 是媒体房间 ID,`token` 是加入房间使用的短期凭据,`liveURL` 是媒体服务提供的连接地址,`busyLineUserIDList` 是忙线用户列表。 + +只有取得有效的 `token` 和 `roomID` 后才能连接媒体房间。API 成功不表示对方已经接听;后续状态由[处理通话事件](/sdk/android/calling/managing-calls/handle-call-events)合并。 diff --git a/content/zh/docs/chat/sdk/android/calling/overview-calling.mdx b/content/zh/docs/chat/sdk/android/calling/overview-calling.mdx new file mode 100644 index 0000000000..52cf8f4c9e --- /dev/null +++ b/content/zh/docs/chat/sdk/android/calling/overview-calling.mdx @@ -0,0 +1,46 @@ +--- +title: '音视频通话概览' +description: '了解 Android SDK 的音视频通话信令、房间信息和事件边界。' +sourcePath: '/sdk/android/calling/overview-calling' +--- + +Android SDK 的 `SignalingManager` 提供发起邀请、接受、拒绝、取消、挂断、查询房间和同步通话状态所需的信令 API。它负责协调通话参与者、房间信息和通话生命周期,不负责采集摄像头画面、播放远端媒体流或渲染通话界面。 + +应用需要把 SDK 返回的 `roomID`、`token` 和 `liveURL` 交给所选的实时音视频媒体引擎,并自行处理 Android 权限、音视频设备、媒体轨道、弱网策略和界面状态。信令 API 不是一套完整的实时音视频媒体 SDK。 + +## 通话流程 + +1. 调用 `signalingInvite()` 发起单聊通话,或调用 `signalingInviteInGroup()` 发起群聊通话。 +2. 被邀请方从 `onReceiveNewInvitation` 获取 `SignalingInfo`,选择接受或拒绝。 +3. 接受方调用 `signalingAccept()`,双方使用返回的房间凭据接入媒体引擎。 +4. 通话过程中根据参与者、媒体流和自定义信令回调更新本地状态。 +5. 发起方可以取消尚未接通的邀请;任一通话参与者都可以挂断已经建立的通话。 + +## 核心数据 + +| 数据 | 说明 | +| --- | --- | +| `SignalingInvitationInfo` | 邀请人、被邀请人、群组、房间、媒体类型、超时时间、会话类型和业务扩展数据。 | +| `SignalingInfo` | 当前操作用户、原始邀请、参与者资料和可选的离线推送信息。 | +| `SignalingCertificate` | OpenIMServer 返回的 `roomID`、`token`、`liveURL` 和忙线用户列表。 | +| `RoomCallingInfo` | 按群组查询到的房间、邀请、参与者、群组和入会凭据快照。 | + +`customData` 和自定义信令只适合传递业务协商信息。长期凭据、管理员密钥和其他敏感数据不应写入这些字段。 + +## 状态更新与事件归属 + +发起、接受、拒绝、取消和挂断等写操作需要分别处理 API 回调与通话 listener。API 成功回调表示当前信令请求已经完成;listener 反映邀请方、被邀请方、其他设备或房间参与者看到的增量状态,两者不是同一个完成信号。 + +邀请生命周期、参与者进出房间、挂断和媒体流变化的完整 listener 统一见[处理通话事件](/sdk/android/calling/managing-calls/handle-call-events);自定义信令见[发送自定义信令](/sdk/android/calling/sending-custom-signals/send-a-custom-signal)。房间、凭据和待处理邀请查询只返回调用时的状态快照。 + +概览页不设置 listener。通话状态以 `roomID` 为主键;参与者状态还需要结合用户 ID。需要恢复或校准当前房间状态时,再调用对应查询 API。 + +## 按任务查找页面 + +| 任务 | 页面 | +| --- | --- | +| 发起单聊或群聊通话 | [发起单聊通话](/sdk/android/calling/managing-calls/start-single-call)、[发起群聊通话](/sdk/android/calling/managing-calls/start-group-call) | +| 接受或拒绝邀请 | [接受通话](/sdk/android/calling/managing-calls/accept-call)、[拒绝通话](/sdk/android/calling/managing-calls/reject-call) | +| 取消邀请或挂断通话 | [取消通话邀请](/sdk/android/calling/managing-calls/cancel-call)、[挂断通话](/sdk/android/calling/managing-calls/hang-up-call) | +| 恢复房间或待处理邀请 | [查询群组通话房间](/sdk/android/calling/retrieving-call-information/get-room-by-group-id)、[获取通话房间 Token](/sdk/android/calling/retrieving-call-information/get-token-by-room-id)、[恢复启动前收到的通话邀请](/sdk/android/calling/retrieving-call-information/restore-pending-invitation) | +| 处理通话事件和业务协商 | [处理通话事件](/sdk/android/calling/managing-calls/handle-call-events)、[发送自定义信令](/sdk/android/calling/sending-custom-signals/send-a-custom-signal) | diff --git a/content/zh/docs/chat/sdk/android/calling/retrieving-call-information/get-room-by-group-id.mdx b/content/zh/docs/chat/sdk/android/calling/retrieving-call-information/get-room-by-group-id.mdx new file mode 100644 index 0000000000..dcfadafd97 --- /dev/null +++ b/content/zh/docs/chat/sdk/android/calling/retrieving-call-information/get-room-by-group-id.mdx @@ -0,0 +1,30 @@ +--- +title: '查询群组通话房间' +description: '使用 Android SDK 按群组 ID 查询进行中的通话房间。' +sourcePath: '/sdk/android/calling/retrieving-call-information/get-room-by-group-id' +--- + +`signalingGetRoomByGroupID()` 的参数是群组 ID,不是自定义 `roomID`: + +```java +OpenIMClient.getInstance().signalingManager.signalingGetRoomByGroupID( + new OnBase() { + @Override + public void onSuccess(RoomCallingInfo room) { + if (room.getRoomID() != null && !room.getRoomID().isEmpty()) { + renderParticipants(room.getParticipant()); + } + } + + @Override + public void onError(int code, String error) { + showNoActiveGroupCall(); + } + }, + groupID +); +``` + +成功回调返回 `RoomCallingInfo` 快照,其中包含房间 ID、原始邀请、参与者、群组 ID、Token 和连接地址。参与者资料中的账号资料、群内资料和群资料属于不同数据源,不应相互覆盖。 + +没有进行中的群通话时,应把错误或空房间视为“当前没有可恢复的通话”,不要继续使用旧凭据。即使业务为群通话使用自定义房间 ID,本方法仍然传入 `groupID`。 diff --git a/content/zh/docs/chat/sdk/android/calling/retrieving-call-information/get-token-by-room-id.mdx b/content/zh/docs/chat/sdk/android/calling/retrieving-call-information/get-token-by-room-id.mdx new file mode 100644 index 0000000000..f49f7a0827 --- /dev/null +++ b/content/zh/docs/chat/sdk/android/calling/retrieving-call-information/get-token-by-room-id.mdx @@ -0,0 +1,35 @@ +--- +title: '获取通话房间 Token' +description: '使用 Android SDK 按房间 ID 重新获取入会凭据。' +sourcePath: '/sdk/android/calling/retrieving-call-information/get-token-by-room-id' +--- + +已经知道 `roomID`、但需要重新获取入会凭据时,调用 `signalingGetTokenByRoomID()`: + +```java +OpenIMClient.getInstance().signalingManager.signalingGetTokenByRoomID( + new OnBase() { + @Override + public void onSuccess(SignalingCertificate credentials) { + if (credentials.getToken() != null + && credentials.getRoomID() != null) { + joinMediaRoom( + credentials.getRoomID(), + credentials.getToken(), + credentials.getLiveURL() + ); + } + } + + @Override + public void onError(int code, String error) { + showCredentialError(code, error); + } + }, + roomID +); +``` + +成功回调返回 `SignalingCertificate`,字段含义见[发起单聊通话](/sdk/android/calling/managing-calls/start-single-call)。只有取得有效的 `token` 和 `roomID` 后才能连接媒体引擎。 + +房间 Token 是短期敏感凭据,只在内存中使用,不要写入日志、URL、分析事件或持久化存储。 diff --git a/content/zh/docs/chat/sdk/android/calling/retrieving-call-information/restore-pending-invitation.mdx b/content/zh/docs/chat/sdk/android/calling/retrieving-call-information/restore-pending-invitation.mdx new file mode 100644 index 0000000000..c466e6033a --- /dev/null +++ b/content/zh/docs/chat/sdk/android/calling/retrieving-call-information/restore-pending-invitation.mdx @@ -0,0 +1,30 @@ +--- +title: '恢复启动前收到的通话邀请' +description: '使用 Android SDK 恢复应用启动时尚未处理的通话邀请。' +sourcePath: '/sdk/android/calling/retrieving-call-information/restore-pending-invitation' +--- + +`getSignalingInvitationInfoStartApp()` 不接收业务参数,返回应用启动或恢复时需要处理的邀请快照: + +```java +OpenIMClient.getInstance().signalingManager.getSignalingInvitationInfoStartApp( + new OnBase() { + @Override + public void onSuccess(SignalingInfo info) { + if (info != null + && info.getInvitation() != null + && info.getInvitation().getRoomID() != null + && !info.getInvitation().getRoomID().isEmpty()) { + restoreIncomingCall(info); + } + } + + @Override + public void onError(int code, String error) { + clearExpiredIncomingCall(); + } + } +); +``` + +成功回调只表示取得当前快照,不会替代通话 listener。仅在 `invitation` 和 `roomID` 有效时恢复来电界面;随后仍需处理取消、超时、接受和挂断,完整处理见[处理通话事件](/sdk/android/calling/managing-calls/handle-call-events)。 diff --git a/content/zh/docs/chat/sdk/android/calling/sending-custom-signals/send-a-custom-signal.mdx b/content/zh/docs/chat/sdk/android/calling/sending-custom-signals/send-a-custom-signal.mdx new file mode 100644 index 0000000000..27854c43a6 --- /dev/null +++ b/content/zh/docs/chat/sdk/android/calling/sending-custom-signals/send-a-custom-signal.mdx @@ -0,0 +1,64 @@ +--- +title: '发送自定义信令' +description: '使用 Android SDK 在通话房间中发送和接收自定义信令。' +sourcePath: '/sdk/android/calling/sending-custom-signals/send-a-custom-signal' +--- + +`signalingSendCustomSignal()` 用于向指定通话房间发送轻量级业务协商数据,例如举手、切换布局提示或业务侧状态同步。它不是聊天消息接口,也不能替代媒体引擎的数据通道。 + +## 发送信令 + +`roomID` 与 `customInfo` 都是必填字符串。需要传递结构化数据时,应定义稳定的数据格式并序列化为 JSON。 + +```java +JSONObject signal = new JSONObject(); +signal.put("version", 1); +signal.put("eventID", eventID); +signal.put("type", "hand-raised"); +signal.put("userID", currentUserID); +signal.put("sentAt", System.currentTimeMillis()); + +OpenIMClient.getInstance().signalingManager.signalingSendCustomSignal( + new OnBase() { + @Override + public void onSuccess(String result) { + markSignalSent(eventID); + } + + @Override + public void onError(int code, String error) { + showSignalError(code, error); + } + }, + roomID, + signal.toString() +); +``` + +成功回调表示本次自定义信令发送请求已经完成,不等于其他参与者已经处理。自定义信令应保持精简,并包含协议版本和业务幂等 ID。大文件、聊天记录、长期状态和敏感凭据不应放入 `customInfo`。 + +## 接收信令 + +`OnSignalingListener.onReceiveCustomSignal` 返回 `CustomSignalingInfo`。应用应先校验房间和自有业务协议,再更新界面: + +```java +@Override +public void onReceiveCustomSignal(CustomSignalingInfo info) { + if (info == null || !activeRoomID.equals(info.getRoomID())) { + return; + } + + CallSignal signal = parseAndValidateCallSignal(info.getCustomInfo()); + String mergeID = info.getRoomID() + ":" + signal.getEventID(); + if (hasAppliedSignal(mergeID)) { + return; + } + applyCallSignal(signal); +} +``` + +本页是 `onReceiveCustomSignal` 的完整处理归属页。`parseAndValidateCallSignal()` 应检查 JSON 结构、协议版本、`eventID`、`type` 和业务字段。按 `roomID:eventID` 幂等处理,不要依赖事件顺序。 + +`SignalingManager` 只设置一个 listener。接收自定义信令的回调应合并到[处理通话事件](/sdk/android/calling/managing-calls/handle-call-events)所示的应用级 listener 中,不能为本页单独设置一个新 listener,否则会覆盖其他通话回调。 + +客户端自定义信令不能用于授予主持人、付费或隐私权限。需要权威校验的状态应由可信后端保存和判断;连接恢复后,通过房间查询或业务后端校准长期状态。 diff --git a/content/zh/docs/chat/sdk/android/conversation/managing-conversations/clear-conversation-messages.mdx b/content/zh/docs/chat/sdk/android/conversation/managing-conversations/clear-conversation-messages.mdx new file mode 100644 index 0000000000..9d5b035e1f --- /dev/null +++ b/content/zh/docs/chat/sdk/android/conversation/managing-conversations/clear-conversation-messages.mdx @@ -0,0 +1,26 @@ +--- +title: '清空会话消息' +description: '使用 messageManager.clearConversationAndDeleteAllMsg() 保留 Android 会话入口并清空其消息。' +sourcePath: '/sdk/android/conversation/managing-conversations/clear-conversation-messages' +--- + +产品语义为“清空聊天记录”时,调用 `messageManager.clearConversationAndDeleteAllMsg()`。 + +```java +OpenIMClient.getInstance().messageManager.clearConversationAndDeleteAllMsg( + conversationID, + new OnBase() { + @Override + public void onSuccess(String data) { + messageStore.clearConversation(conversationID); + } + + @Override + public void onError(int code, String error) { + recordConversationClearFailure(code, error); + } + } +); +``` + +成功 callback 后保留会话入口,但清除当前账号下的消息和摘要状态。立即清理当前消息列表,再通过 `onConversationChanged` 或重新查询校准最后一条消息、摘要和未读状态。 diff --git a/content/zh/docs/chat/sdk/android/conversation/managing-conversations/clear-group-mentions.mdx b/content/zh/docs/chat/sdk/android/conversation/managing-conversations/clear-group-mentions.mdx new file mode 100644 index 0000000000..6989af75e3 --- /dev/null +++ b/content/zh/docs/chat/sdk/android/conversation/managing-conversations/clear-group-mentions.mdx @@ -0,0 +1,28 @@ +--- +title: '重置群聊 @ 状态' +description: '使用 resetConversationGroupAtType() 将 Android 指定会话的群聊 @ 状态重置为普通状态。' +sourcePath: '/sdk/android/conversation/managing-conversations/clear-group-mentions' +--- + +用户处理完群聊中的 @ 消息后,调用 `resetConversationGroupAtType()` 将 `groupAtType` 重置为普通状态。 + +```java +OpenIMClient.getInstance().conversationManager.resetConversationGroupAtType( + new OnBase() { + @Override + public void onSuccess(String data) { + markGroupMentionStateReset(conversationID); + } + + @Override + public void onError(int code, String error) { + recordGroupMentionResetFailure(code, error); + } + }, + conversationID +); +``` + +本操作只负责重置为普通状态,不应用于主动写入 `atMe`、`atAll` 等状态。群聊 @ 状态与消息已读状态不同。 + +成功 callback 后通过 `onConversationChanged` 按 `conversationID` 合并该会话;完整 listener 见[获取会话列表](/sdk/android/conversation/retrieving-conversations/retrieve-conversation-list)。 diff --git a/content/zh/docs/chat/sdk/android/conversation/managing-conversations/delete-conversation-with-messages.mdx b/content/zh/docs/chat/sdk/android/conversation/managing-conversations/delete-conversation-with-messages.mdx new file mode 100644 index 0000000000..9e9f3c5c36 --- /dev/null +++ b/content/zh/docs/chat/sdk/android/conversation/managing-conversations/delete-conversation-with-messages.mdx @@ -0,0 +1,29 @@ +--- +title: '删除会话及消息' +description: '使用 deleteConversationAndDeleteAllMsg() 删除 Android 指定会话及其全部消息。' +sourcePath: '/sdk/android/conversation/managing-conversations/delete-conversation-with-messages' +--- + +产品语义为“删除此聊天”时,调用 `deleteConversationAndDeleteAllMsg()`。 + +```java +OpenIMClient.getInstance().conversationManager.deleteConversationAndDeleteAllMsg( + new OnBase() { + @Override + public void onSuccess(String data) { + messageStore.clearConversation(conversationID); + conversationStore.remove(conversationID); + } + + @Override + public void onError(int code, String error) { + recordConversationDeleteFailure(code, error); + } + }, + conversationID +); +``` + +成功 callback 后清理当前消息列表和会话行。该操作不删除好友关系,也不退出或解散群组;聊天目标仍存在时,会话可能由新消息或同步重新生成。 + +后续通过 `onConversationChanged` 或重新查询校准会话列表,完整 listener 见[获取会话列表](/sdk/android/conversation/retrieving-conversations/retrieve-conversation-list)。 diff --git a/content/zh/docs/chat/sdk/android/conversation/managing-conversations/get-total-unread-count.mdx b/content/zh/docs/chat/sdk/android/conversation/managing-conversations/get-total-unread-count.mdx new file mode 100644 index 0000000000..c189d9265c --- /dev/null +++ b/content/zh/docs/chat/sdk/android/conversation/managing-conversations/get-total-unread-count.mdx @@ -0,0 +1,28 @@ +--- +title: '获取消息总未读数' +description: '使用 getTotalUnreadMsgCount() 获取 Android 当前账号的总未读数。' +sourcePath: '/sdk/android/conversation/managing-conversations/get-total-unread-count' +--- + +`getTotalUnreadMsgCount()` 返回当前账号所有会话的总未读快照,不要把当前已加载分页中的 `unreadCount` 简单相加。 + +```java +OpenIMClient.getInstance().conversationManager.getTotalUnreadMsgCount( + new OnBase() { + @Override + public void onSuccess(String value) { + int totalUnread = Integer.parseInt(value); + updateApplicationBadge(totalUnread); + } + + @Override + public void onError(int code, String error) { + recordTotalUnreadFailure(code, error); + } + } +); +``` + +回调值是 `String`,解析失败时应按业务错误处理,不能将其默认为会话列表分页的局部总数。查询本身不触发 callback。 + +本页归属 `OnConversationListener.onTotalUnreadMessageCountChanged(int count)`。在应用唯一的 `OnConversationListener` 中按该值更新应用角标;会话 listener 的集中设置方式见[获取会话列表](/sdk/android/conversation/retrieving-conversations/retrieve-conversation-list)。 diff --git a/content/zh/docs/chat/sdk/android/conversation/managing-conversations/hide-a-conversation.mdx b/content/zh/docs/chat/sdk/android/conversation/managing-conversations/hide-a-conversation.mdx new file mode 100644 index 0000000000..488aa5fad4 --- /dev/null +++ b/content/zh/docs/chat/sdk/android/conversation/managing-conversations/hide-a-conversation.mdx @@ -0,0 +1,28 @@ +--- +title: '隐藏会话' +description: '使用 hideConversation() 从 Android 当前账号的会话列表隐藏入口。' +sourcePath: '/sdk/android/conversation/managing-conversations/hide-a-conversation' +--- + +`hideConversation()` 只隐藏当前登录用户的会话入口,不会删除单聊关系、退出群组或影响其他用户。 + +```java +OpenIMClient.getInstance().conversationManager.hideConversation( + new OnBase() { + @Override + public void onSuccess(String data) { + conversationStore.remove(conversationID); + } + + @Override + public void onError(int code, String error) { + recordConversationHideFailure(code, error); + } + }, + conversationID +); +``` + +该方法适合临时从聊天列表移除入口。收到新消息或重新同步后,隐藏的会话可能再次出现。 + +成功 callback 表示隐藏请求已完成,调用端可以从当前列表移除该 `conversationID`。后续收到 `onConversationChanged` 时仍应按 `conversationID` 幂等合并;完整 listener 见[获取会话列表](/sdk/android/conversation/retrieving-conversations/retrieve-conversation-list)。 diff --git a/content/zh/docs/chat/sdk/android/conversation/managing-conversations/mark-conversation-read.mdx b/content/zh/docs/chat/sdk/android/conversation/managing-conversations/mark-conversation-read.mdx new file mode 100644 index 0000000000..a126331ecf --- /dev/null +++ b/content/zh/docs/chat/sdk/android/conversation/managing-conversations/mark-conversation-read.mdx @@ -0,0 +1,28 @@ +--- +title: '标记会话已读' +description: '使用 messageManager.markConversationMessageAsRead() 将 Android 指定会话的消息标记为已读。' +sourcePath: '/sdk/android/conversation/managing-conversations/mark-conversation-read' +--- + +用户打开会话并阅读完当前可见消息后,调用 `messageManager.markConversationMessageAsRead()`。不要在仅预览通知或后台收到消息时提前标记。 + +```java +OpenIMClient.getInstance().messageManager.markConversationMessageAsRead( + conversationID, + new OnBase() { + @Override + public void onSuccess(String data) { + markConversationReadSubmitted(conversationID); + } + + @Override + public void onError(int code, String error) { + recordMarkReadFailure(code, error); + } + } +); +``` + +成功 callback 表示请求完成,不等于 `onConversationChanged` 已到达。随后按 `conversationID` 合并最新 `ConversationInfo`;需要立即确认时重新查询该会话。 + +对于单聊,当前用户标记会话已读后,对端可通过 `OnAdvanceMsgListener.onRecvC2CReadReceipt` 收到已读回执。对每个 `C2CReadReceiptInfo` 先验证 `sessionType == ConversationType.SINGLE_CHAT` 和非空 `userID`,再按 `msgIDList` 更新对应消息的已读状态。`MessageManager` 同样只保存一个高级消息 listener,应在应用级消息状态层统一设置。 diff --git a/content/zh/docs/chat/sdk/android/conversation/managing-conversations/pin-conversation.mdx b/content/zh/docs/chat/sdk/android/conversation/managing-conversations/pin-conversation.mdx new file mode 100644 index 0000000000..310288bcfc --- /dev/null +++ b/content/zh/docs/chat/sdk/android/conversation/managing-conversations/pin-conversation.mdx @@ -0,0 +1,27 @@ +--- +title: '置顶或取消置顶会话' +description: '使用 pinConversation() 设置 Android 指定会话的置顶状态。' +sourcePath: '/sdk/android/conversation/managing-conversations/pin-conversation' +--- + +```java +OpenIMClient.getInstance().conversationManager.pinConversation( + new OnBase() { + @Override + public void onSuccess(String data) { + markPinRequestSubmitted(conversationID, true); + } + + @Override + public void onError(int code, String error) { + recordConversationPinFailure(code, error); + } + }, + conversationID, + true +); +``` + +最后一个参数为 `true` 时置顶,传 `false` 时取消置顶。该状态只影响当前账号的会话列表。 + +成功 callback 不等于 `onConversationChanged` 已经到达。后续按 `conversationID` 合并最新会话,完整 listener 见[获取会话列表](/sdk/android/conversation/retrieving-conversations/retrieve-conversation-list)。 diff --git a/content/zh/docs/chat/sdk/android/conversation/managing-conversations/set-burn-duration.mdx b/content/zh/docs/chat/sdk/android/conversation/managing-conversations/set-burn-duration.mdx new file mode 100644 index 0000000000..db690ccb80 --- /dev/null +++ b/content/zh/docs/chat/sdk/android/conversation/managing-conversations/set-burn-duration.mdx @@ -0,0 +1,27 @@ +--- +title: '设置阅后即焚时长' +description: '使用 setConversationBurnDuration() 设置 Android 阅后即焚模式的消息保留时长。' +sourcePath: '/sdk/android/conversation/managing-conversations/set-burn-duration' +--- + +```java +OpenIMClient.getInstance().conversationManager.setConversationBurnDuration( + new OnBase() { + @Override + public void onSuccess(String data) { + markBurnDurationSubmitted(conversationID, 30); + } + + @Override + public void onError(int code, String error) { + recordBurnDurationFailure(code, error); + } + }, + conversationID, + 30 +); +``` + +`burnDuration` 的单位为秒。启用或关闭阅后即焚需要设置 `isPrivateChat`,见[开启或关闭阅后即焚](/sdk/android/conversation/managing-conversations/set-private-chat)。不要把它与服务端消息定期删除周期 `msgDestructTime` 混用。 + +成功 callback 后,通过 `onConversationChanged` 合并最新 `burnDuration`;完整 listener 见[获取会话列表](/sdk/android/conversation/retrieving-conversations/retrieve-conversation-list)。 diff --git a/content/zh/docs/chat/sdk/android/conversation/managing-conversations/set-conversation-draft.mdx b/content/zh/docs/chat/sdk/android/conversation/managing-conversations/set-conversation-draft.mdx new file mode 100644 index 0000000000..29b1051927 --- /dev/null +++ b/content/zh/docs/chat/sdk/android/conversation/managing-conversations/set-conversation-draft.mdx @@ -0,0 +1,27 @@ +--- +title: '设置会话草稿' +description: '使用 setConversationDraft() 保存 Android 会话草稿。' +sourcePath: '/sdk/android/conversation/managing-conversations/set-conversation-draft' +--- + +用户离开聊天页、切换会话或输入框内容变化时,可以使用 `setConversationDraft()` 保存草稿。输入过程中先维护编辑器状态并对保存调用做防抖;离开页面前再提交一次最新文本。 + +```java +OpenIMClient.getInstance().conversationManager.setConversationDraft( + new OnBase() { + @Override + public void onSuccess(String data) { + markDraftSubmitted(conversationID); + } + + @Override + public void onError(int code, String error) { + recordDraftSaveFailure(code, error); + } + }, + conversationID, + editorValue +); +``` + +清空草稿时传空字符串。成功 callback 只表示保存请求已经完成,不等同于会话变化回调已经到达;SDK 后续通过 `onConversationChanged` 同步 `draftText` 和 `draftTextTime`,需要校准时重新查询会话。退出登录或切换账号时清理编辑器内存状态。 diff --git a/content/zh/docs/chat/sdk/android/conversation/managing-conversations/set-conversation-extension.mdx b/content/zh/docs/chat/sdk/android/conversation/managing-conversations/set-conversation-extension.mdx new file mode 100644 index 0000000000..a04da9cd63 --- /dev/null +++ b/content/zh/docs/chat/sdk/android/conversation/managing-conversations/set-conversation-extension.mdx @@ -0,0 +1,27 @@ +--- +title: '设置会话扩展字段' +description: '使用 setConversationEx() 设置 Android 指定会话的业务扩展字符串。' +sourcePath: '/sdk/android/conversation/managing-conversations/set-conversation-extension' +--- + +`ex` 是完整字符串,SDK 不会自动合并 JSON。更新前应读取旧值并保留其他业务模块的命名空间。 + +```java +OpenIMClient.getInstance().conversationManager.setConversationEx( + new OnBase() { + @Override + public void onSuccess(String data) { + markConversationExtensionSubmitted(conversationID); + } + + @Override + public void onError(int code, String error) { + recordConversationExtensionFailure(code, error); + } + }, + conversationID, + mergedExtensionJSON +); +``` + +成功 callback 表示设置请求完成。通过 `onConversationChanged` 按 `conversationID` 合并最新会话;完整 listener 见[获取会话列表](/sdk/android/conversation/retrieving-conversations/retrieve-conversation-list)。 diff --git a/content/zh/docs/chat/sdk/android/conversation/managing-conversations/set-message-destruct.mdx b/content/zh/docs/chat/sdk/android/conversation/managing-conversations/set-message-destruct.mdx new file mode 100644 index 0000000000..9b4cc1a3d4 --- /dev/null +++ b/content/zh/docs/chat/sdk/android/conversation/managing-conversations/set-message-destruct.mdx @@ -0,0 +1,33 @@ +--- +title: '定期删除服务端消息' +description: '使用 setConversation() 启用、关闭并配置 Android 会话的服务端消息定期删除策略。' +sourcePath: '/sdk/android/conversation/managing-conversations/set-message-destruct' +--- + +`isMsgDestruct` 与 `msgDestructTime` 共同构成服务端消息定期删除设置,可以在一次 `ConversationReq` 中提交。 + +```java +ConversationReq request = new ConversationReq(); +request.setMsgDestruct(true); +request.setMsgDestructTime(3600); + +OpenIMClient.getInstance().conversationManager.setConversation( + new OnBase() { + @Override + public void onSuccess(String data) { + markMessageDestructSubmitted(conversationID); + } + + @Override + public void onError(int code, String error) { + recordMessageDestructFailure(code, error); + } + }, + conversationID, + request +); +``` + +`msgDestructTime` 的单位为秒。关闭时只传 `request.setMsgDestruct(false)`;该能力用于定期删除服务端消息,不是阅后即焚。 + +成功 callback 表示设置请求完成。最新开关和周期通过 `onConversationChanged` 按 `conversationID` 合并,完整 listener 见[获取会话列表](/sdk/android/conversation/retrieving-conversations/retrieve-conversation-list)。 diff --git a/content/zh/docs/chat/sdk/android/conversation/managing-conversations/set-message-receive-option.mdx b/content/zh/docs/chat/sdk/android/conversation/managing-conversations/set-message-receive-option.mdx new file mode 100644 index 0000000000..df9fe47afe --- /dev/null +++ b/content/zh/docs/chat/sdk/android/conversation/managing-conversations/set-message-receive-option.mdx @@ -0,0 +1,31 @@ +--- +title: '设置会话消息接收方式' +description: '使用 setConversationRecvMessageOpt() 设置 Android 单个会话的消息接收与通知方式。' +sourcePath: '/sdk/android/conversation/managing-conversations/set-message-receive-option' +--- + +```java +OpenIMClient.getInstance().conversationManager.setConversationRecvMessageOpt( + new OnBase() { + @Override + public void onSuccess(String data) { + markReceiveOptionSubmitted(conversationID); + } + + @Override + public void onError(int code, String error) { + recordReceiveOptionFailure(code, error); + } + }, + conversationID, + 2 +); +``` + +| 数值 | 含义 | +| ---- | ---------------------------- | +| `0` | 正常接收消息并允许通知。 | +| `1` | 不接收该会话消息,也不通知。 | +| `2` | 接收该会话消息,但不通知。 | + +账号级默认策略见[设置全局消息接收方式](/sdk/android/user/user-profile/set-global-message-reception)。成功 callback 后通过 `onConversationChanged` 按 `conversationID` 合并最新会话。 diff --git a/content/zh/docs/chat/sdk/android/conversation/managing-conversations/set-private-chat.mdx b/content/zh/docs/chat/sdk/android/conversation/managing-conversations/set-private-chat.mdx new file mode 100644 index 0000000000..8e6096e451 --- /dev/null +++ b/content/zh/docs/chat/sdk/android/conversation/managing-conversations/set-private-chat.mdx @@ -0,0 +1,27 @@ +--- +title: '开启或关闭阅后即焚' +description: '使用 setOneConversationPrivateChat() 设置 Android 会话的阅后即焚模式。' +sourcePath: '/sdk/android/conversation/managing-conversations/set-private-chat' +--- + +```java +OpenIMClient.getInstance().conversationManager.setOneConversationPrivateChat( + new OnBase() { + @Override + public void onSuccess(String data) { + markPrivateChatSubmitted(conversationID, true); + } + + @Override + public void onError(int code, String error) { + recordPrivateChatFailure(code, error); + } + }, + conversationID, + true +); +``` + +传入 `false` 关闭阅后即焚。具体保留时长由 `burnDuration` 单独设置,见[设置阅后即焚时长](/sdk/android/conversation/managing-conversations/set-burn-duration)。该能力与定期删除服务端消息不同。 + +成功 callback 只表示设置请求完成;最新状态通过 `onConversationChanged` 按 `conversationID` 合并,完整 listener 见[获取会话列表](/sdk/android/conversation/retrieving-conversations/retrieve-conversation-list)。 diff --git a/content/zh/docs/chat/sdk/android/conversation/overview-conversation.mdx b/content/zh/docs/chat/sdk/android/conversation/overview-conversation.mdx new file mode 100644 index 0000000000..ab61713832 --- /dev/null +++ b/content/zh/docs/chat/sdk/android/conversation/overview-conversation.mdx @@ -0,0 +1,63 @@ +--- +title: '会话概览' +description: '了解 Android SDK 中 ConversationInfo、conversationID、会话设置和会话事件的职责。' +sourcePath: '/sdk/android/conversation/overview-conversation' +--- + +会话是当前登录用户围绕一次单聊或群聊维护的聊天列表状态,由一条 `ConversationInfo` 记录表示。它保存未读数、最后一条消息、置顶、草稿、消息接收方式和扩展字段。`conversationID` 用于定位当前账号的会话状态;单聊目标使用对方 `userID`,群聊目标使用 `groupID`。 + +群资料、成员关系和群权限属于群组能力。群聊页面使用 `groupID` 调用群组 API,使用 `conversationID` 处理会话设置、未读数、草稿和消息清理。 + +## 会话标识 + +| 标识 | 用途 | +| ---------------- | ----------------------------------------------------------------------------- | +| `conversationID` | 当前账号的会话记录 ID,用于会话设置、未读状态和消息历史。 | +| `userID` | 单聊对方的用户 ID。 | +| `groupID` | 群聊对应的群组 ID,也是群组 API 的目标标识。 | +| `sourceId` | 按会话类型查询或生成 ID 时传入的聊天目标:单聊为 `userID`,群聊为 `groupID`。 | + +单聊使用 `ConversationType.SINGLE_CHAT`。群聊根据群类型使用 `ConversationType.GROUP_CHAT` 或 `ConversationType.SUPER_GROUP_CHAT`;不要在应用层自行拼接 `conversationID`。 + +## ConversationInfo + +| 字段 | 说明 | +| ----------------------------------- | ------------------------------------ | +| `conversationID` | 会话 ID。 | +| `conversationType` | 会话类型。 | +| `userID` / `groupID` | 单聊目标用户或群聊目标群组。 | +| `showName` / `faceURL` | 会话列表显示名称和头像。 | +| `unreadCount` | 当前会话未读数。 | +| `latestMsg` / `latestMsgSendTime` | 最后一条消息 JSON 字符串及发送时间。 | +| `recvMsgOpt` | 当前会话消息接收方式。 | +| `groupAtType` | 群聊 @ 提醒状态。 | +| `draftText` / `draftTextTime` | 会话草稿及更新时间。 | +| `isPinned` | 是否置顶。 | +| `isPrivateChat` / `burnDuration` | 阅后即焚开关和保留时长。 | +| `isMsgDestruct` / `msgDestructTime` | 服务端消息定期删除设置。 | +| `ex` | 业务约定的会话扩展字符串。 | + +## 查询和设置 + +- [查询指定会话](/sdk/android/conversation/retrieving-conversations/get-conversation-by-target) +- [生成会话 ID](/sdk/android/conversation/retrieving-conversations/get-conversation-id) +- [按 ID 批量获取会话](/sdk/android/conversation/retrieving-conversations/get-conversations-by-id) +- [获取会话列表](/sdk/android/conversation/retrieving-conversations/retrieve-conversation-list) +- [置顶或取消置顶会话](/sdk/android/conversation/managing-conversations/pin-conversation) +- [设置会话扩展字段](/sdk/android/conversation/managing-conversations/set-conversation-extension) +- [设置会话草稿](/sdk/android/conversation/managing-conversations/set-conversation-draft) +- [设置会话消息接收方式](/sdk/android/conversation/managing-conversations/set-message-receive-option) +- [重置群聊 @ 状态](/sdk/android/conversation/managing-conversations/clear-group-mentions) +- [标记会话已读](/sdk/android/conversation/managing-conversations/mark-conversation-read) +- [获取消息总未读数](/sdk/android/conversation/managing-conversations/get-total-unread-count) +- [开启或关闭阅后即焚](/sdk/android/conversation/managing-conversations/set-private-chat) +- [定期删除服务端消息](/sdk/android/conversation/managing-conversations/set-message-destruct) + +## 状态更新 + +查询方法建立会话快照,事件负责合并后续增量: + +- 新会话和会话属性变化由[获取会话列表](/sdk/android/conversation/retrieving-conversations/retrieve-conversation-list)归属的 `onNewConversation` 与 `onConversationChanged` 处理。 +- 当前账号总未读数由[获取消息总未读数](/sdk/android/conversation/managing-conversations/get-total-unread-count)归属的 `onTotalUnreadMessageCountChanged` 处理。 + +`ConversationManager` 只保存一个 `OnConversationListener`,`setOnConversationListener()` 会替换当前 listener。应用应在统一状态层组合所有 callback 并设置一次;请求成功、事件到达和重新查询校准是三个独立阶段。 diff --git a/content/zh/docs/chat/sdk/android/conversation/retrieving-conversations/get-conversation-by-target.mdx b/content/zh/docs/chat/sdk/android/conversation/retrieving-conversations/get-conversation-by-target.mdx new file mode 100644 index 0000000000..dc69577130 --- /dev/null +++ b/content/zh/docs/chat/sdk/android/conversation/retrieving-conversations/get-conversation-by-target.mdx @@ -0,0 +1,29 @@ +--- +title: '查询指定会话' +description: '使用 getOneConversation() 按用户或群组获取一个 Android 会话。' +sourcePath: '/sdk/android/conversation/retrieving-conversations/get-conversation-by-target' +--- + +从通讯录、用户资料或群资料进入聊天页时,使用 `getOneConversation()`。单聊传对方用户 ID,群聊传群组 ID;即使还没有消息,也不要自行构造 `ConversationInfo`。 + +```java +OpenIMClient.getInstance().conversationManager.getOneConversation( + new OnBase() { + @Override + public void onSuccess(ConversationInfo conversation) { + openChatPage(conversation); + } + + @Override + public void onError(int code, String error) { + recordConversationOpenFailure(code, error); + } + }, + targetUserID, + ConversationType.SINGLE_CHAT +); +``` + +参数 `sourceId` 在单聊中是对方 `userID`,在群聊中是 `groupID`。群聊根据群类型使用 `ConversationType.GROUP_CHAT` 或 `ConversationType.SUPER_GROUP_CHAT`。 + +成功 callback 返回 `ConversationInfo`。查询本身不触发会话 listener;后续变化由[获取会话列表](/sdk/android/conversation/retrieving-conversations/retrieve-conversation-list)统一按 `conversationID` 合并。 diff --git a/content/zh/docs/chat/sdk/android/conversation/retrieving-conversations/get-conversation-id.mdx b/content/zh/docs/chat/sdk/android/conversation/retrieving-conversations/get-conversation-id.mdx new file mode 100644 index 0000000000..d71b5e879e --- /dev/null +++ b/content/zh/docs/chat/sdk/android/conversation/retrieving-conversations/get-conversation-id.mdx @@ -0,0 +1,19 @@ +--- +title: '生成会话 ID' +description: '使用 getConversationIDBySessionType() 按聊天目标计算 Android 会话 ID。' +sourcePath: '/sdk/android/conversation/retrieving-conversations/get-conversation-id' +--- + +只需要会话 ID 时,调用 `getConversationIDBySessionType()`,不要在应用层自行拼接。 + +```java +String conversationID = OpenIMClient.getInstance().conversationManager + .getConversationIDBySessionType( + targetUserID, + ConversationType.SINGLE_CHAT + ); +``` + +`sourceId` 在单聊中是对方 `userID`,在群聊中是 `groupID`。群聊根据群类型使用 `ConversationType.GROUP_CHAT` 或 `ConversationType.SUPER_GROUP_CHAT`。 + +该方法同步返回 `String` 类型的 `conversationID`,不返回完整 `ConversationInfo`,也不触发会话 listener。需要会话资料时调用[查询指定会话](/sdk/android/conversation/retrieving-conversations/get-conversation-by-target)。 diff --git a/content/zh/docs/chat/sdk/android/conversation/retrieving-conversations/get-conversations-by-id.mdx b/content/zh/docs/chat/sdk/android/conversation/retrieving-conversations/get-conversations-by-id.mdx new file mode 100644 index 0000000000..c5230cbe99 --- /dev/null +++ b/content/zh/docs/chat/sdk/android/conversation/retrieving-conversations/get-conversations-by-id.mdx @@ -0,0 +1,30 @@ +--- +title: '按 ID 批量获取会话' +description: '使用 getMultipleConversation() 按 conversationID 批量获取 Android 会话。' +sourcePath: '/sdk/android/conversation/retrieving-conversations/get-conversations-by-id' +--- + +已经持有一组 `conversationID` 时,使用 `getMultipleConversation()` 读取最新会话快照。 + +```java +OpenIMClient.getInstance().conversationManager.getMultipleConversation( + new OnBase>() { + @Override + public void onSuccess(List conversations) { + for (ConversationInfo item : conversations) { + conversationStore.put(item.getConversationID(), item); + } + } + + @Override + public void onError(int code, String error) { + recordConversationQueryFailure(code, error); + } + }, + conversationIDs +); +``` + +调用前去除空值和重复 ID。成功 callback 返回 `List`;某个 ID 没有结果时按缺失记录处理,不要依赖响应与请求列表的位置完全一一对应。 + +查询本身不触发会话 listener。会话列表的持续同步见[获取会话列表](/sdk/android/conversation/retrieving-conversations/retrieve-conversation-list)。 diff --git a/content/zh/docs/chat/sdk/android/conversation/retrieving-conversations/retrieve-conversation-list.mdx b/content/zh/docs/chat/sdk/android/conversation/retrieving-conversations/retrieve-conversation-list.mdx new file mode 100644 index 0000000000..1bc528f9b7 --- /dev/null +++ b/content/zh/docs/chat/sdk/android/conversation/retrieving-conversations/retrieve-conversation-list.mdx @@ -0,0 +1,52 @@ +--- +title: '获取会话列表' +description: '使用 getConversationListSplit() 分页获取当前 Android 账号的会话列表。' +sourcePath: '/sdk/android/conversation/retrieving-conversations/retrieve-conversation-list' +--- + +会话列表属于当前登录用户。每条 `ConversationInfo` 包含会话标识、未读数、最后一条消息、置顶和草稿等状态。使用分页接口读取会话,不使用一次加载完整列表的 `getAllConversationList()`。 + +## 分页获取会话 + +```java +OpenIMClient.getInstance().conversationManager.getConversationListSplit( + new OnBase>() { + @Override + public void onSuccess(List conversations) { + mergeConversations(conversations); + } + + @Override + public void onError(int code, String error) { + recordConversationListFailure(code, error); + } + }, + 0, + 50 +); +``` + +| 参数 | 类型 | 说明 | +| -------- | ------ | ------------------------------------------- | +| `offset` | `long` | 从 `0` 开始的分页偏移量;刷新时重置为 `0`。 | +| `count` | `long` | 本页期望返回的会话数量。 | + +成功 callback 返回当前页 `List`。继续加载时按已经请求的条目数量推进 `offset`,并按 `conversationID` 去重;返回数量小于 `count` 时通常表示到达末页。主动刷新时清空分页状态后从 `0` 重载。 + +## 保持列表同步 + +`getConversationListSplit()` 只建立快照,不触发会话 callback。以下 callback 应组合进应用唯一的 `OnConversationListener`: + +```java +@Override +public void onNewConversation(List conversations) { + mergeConversations(conversations); +} + +@Override +public void onConversationChanged(List conversations) { + mergeConversations(conversations); +} +``` + +两个事件都携带 `List`,按 `conversationID` 幂等合并。`setOnConversationListener()` 采用替换语义,应由应用级状态层设置一次。用户加入群组但尚未产生消息时不一定有会话;退出群组后也可能保留历史会话记录,不能用已加入群组列表替代会话列表。 diff --git a/content/zh/docs/chat/sdk/android/events/overview-events.mdx b/content/zh/docs/chat/sdk/android/events/overview-events.mdx new file mode 100644 index 0000000000..7ba0c0f9e2 --- /dev/null +++ b/content/zh/docs/chat/sdk/android/events/overview-events.mdx @@ -0,0 +1,121 @@ +--- +title: '事件概览' +description: '集中设置 Android SDK listener,并按业务领域分发连接、同步和数据事件。' +sourcePath: '/sdk/android/events/overview-events' +--- + +OpenIM Android SDK 通过 listener 推送连接、同步、用户、好友、会话、群组、消息和通话变化。各 manager 的 listener 设置方法采用替换语义,后一次设置会覆盖此前实例。因此应在应用级事件中心组合所有回调,并在登录前集中设置一次,不要在 Activity、Fragment、Compose 页面或功能组件中重复设置。 + +连接 listener 是例外:`OnConnListener` 在 `initSDK()` 时传入,其完整处理见[认证与管理登录会话](/sdk/android/getting-started/authenticate-and-manage-session)。 + +## 集中设置 listener + +下面的注册入口使用应用级稳定 listener。每个 listener 内应包含对应领域的全部回调;具体状态合并逻辑保留在事件归属页面。 + +```java +public final class OpenIMEventCenter { + private final OpenIMClient client = OpenIMClient.getInstance(); + + private final OnUserListener userListener = buildUserListener(); + private final OnFriendshipListener friendshipListener = buildFriendshipListener(); + private final OnConversationListener conversationListener = buildConversationListener(); + private final OnGroupListener groupListener = buildGroupListener(); + private final OnAdvanceMsgListener messageListener = buildMessageListener(); + private final OnCustomBusinessListener businessListener = buildBusinessListener(); + private final OnSignalingListener signalingListener = buildSignalingListener(); + + public void registerBeforeLogin() { + client.userInfoManager.setOnUserListener(userListener); + client.friendshipManager.setOnFriendshipListener(friendshipListener); + client.conversationManager.setOnConversationListener(conversationListener); + client.groupManager.setOnGroupListener(groupListener); + client.messageManager.setAdvancedMsgListener(messageListener); + client.messageManager.setCustomBusinessListener(businessListener); + client.signalingManager.setSignalingListener(signalingListener); + } +} +``` + +Android SDK 没有公开的 remove 或 unset 方法。退出登录、切换账号或销毁应用状态层时,应停止向旧账号状态和已销毁页面分发回调;重新登录前,用新账号对应的完整 listener 组合覆盖设置。 + +## 事件归属 + +| 事件范围 | Listener | 对应页面 | +| --- | --- | --- | +| 连接、Token 和强制下线 | `OnConnListener` | [认证与管理登录会话](/sdk/android/getting-started/authenticate-and-manage-session) | +| 当前用户资料 | `OnUserListener` | [更新当前用户资料](/sdk/android/user/user-profile/set-self-info) | +| 在线状态 | `OnUserListener` | [订阅用户在线状态](/sdk/android/user/online-status/subscribe-users-online-status) | +| 好友关系与资料 | `OnFriendshipListener` | [分页获取好友列表](/sdk/android/user/friends/get-friend-list-page) | +| 好友申请 | `OnFriendshipListener` | [获取收到的好友申请](/sdk/android/user/friend-applications/get-recv-friend-application-list) | +| 黑名单 | `OnFriendshipListener` | [拉黑用户](/sdk/android/user/blacklist/add-blacklist)、[移出黑名单](/sdk/android/user/blacklist/remove-blacklist) | +| 会话列表 | `OnConversationListener` | [获取会话列表](/sdk/android/conversation/retrieving-conversations/retrieve-conversation-list) | +| 总未读数 | `OnConversationListener` | [获取消息总未读数](/sdk/android/conversation/managing-conversations/get-total-unread-count) | +| 输入状态 | `OnConversationListener` | [上报输入状态](/sdk/android/message/composing-messages/update-typing-status) | +| 群资料、成员和群申请 | `OnGroupListener` | [群组概览](/sdk/android/group/overview-group) | +| 新消息、离线消息和在线消息 | `OnAdvanceMsgListener` | [接收消息](/sdk/android/message/receiving-messages/receive-messages) | +| 消息撤回 | `OnAdvanceMsgListener` | [撤回消息](/sdk/android/message/managing-messages/revoke-a-message) | +| 消息删除 | `OnAdvanceMsgListener` | [批量删除消息](/sdk/android/message/managing-messages/delete-saved-messages) | +| 消息修改 | `OnAdvanceMsgListener` | [修改消息](/sdk/android/message/managing-messages/modify-a-message) | +| 置顶消息 | `OnAdvanceMsgListener` | [置顶或取消置顶消息](/sdk/android/message/managing-messages/set-message-pinned) | +| 单聊已读回执 | `OnAdvanceMsgListener` | [标记会话已读](/sdk/android/conversation/managing-conversations/mark-conversation-read) | +| 自定义业务消息 | `OnCustomBusinessListener` | [接收自定义业务消息](/sdk/android/message/receiving-messages/receive-custom-business-messages) | +| 通话 | `OnSignalingListener` | [处理通话事件](/sdk/android/calling/managing-calls/handle-call-events) | +| 通话自定义信令 | `OnSignalingListener` | [发送自定义信令](/sdk/android/calling/sending-custom-signals/send-a-custom-signal) | +| SDK 数据同步 | `OnConversationListener` | [监听初始化同步](#监听初始化同步) | + +查询 API 建立状态快照,listener 合并后续增量,必要时再重新查询校准。API 成功 callback、事件到达和重新查询结果是三个独立阶段,不能相互替代。 + +## 监听初始化同步 + +同步生命周期属于应用级 `OnConversationListener`。该 listener 还应包含会话列表、未读数和输入状态回调;下面只展示本页负责的同步处理逻辑: + +```java +private OnConversationListener buildConversationListener() { + return new OnConversationListener() { + @Override + public void onNewConversation(List conversations) { + mergeNewConversations(conversations); + } + + @Override + public void onConversationChanged(List conversations) { + mergeChangedConversations(conversations); + } + + @Override + public void onTotalUnreadMessageCountChanged(int total) { + updateTotalUnreadCount(total); + } + + @Override + public void onConversationUserInputStatusChanged(String payload) { + handleInputStatus(payload); + } + + @Override + public void onSyncServerStart(boolean reinstall) { + setSyncState("syncing", 0, reinstall); + } + + @Override + public void onSyncServerProgress(long progress) { + setSyncProgress(progress); + } + + @Override + public void onSyncServerFinish(boolean reinstall) { + setSyncState("ready", 100, reinstall); + reloadVisibleSnapshots(); + } + + @Override + public void onSyncServerFailed(boolean reinstall) { + setSyncState("failed", 0, reinstall); + } + }; +} +``` + +`reinstall` 为 `true` 表示本地数据需要按重建场景处理,通常应展示更完整的同步状态,并避免在同步完成前使用旧缓存。`onSyncServerProgress` 提供当前进度;完成后重新查询当前界面所需快照,失败时记录错误并等待重试或连接恢复。 + +本页是 `onSyncServerStart`、`onSyncServerProgress`、`onSyncServerFinish` 和 `onSyncServerFailed` 的完整处理归属页。同步状态没有业务实体合并键,应按当前 `OpenIMClient` 单例和登录用户隔离。 diff --git a/content/zh/docs/chat/sdk/android/file-uploads/track-file-upload-progress.mdx b/content/zh/docs/chat/sdk/android/file-uploads/track-file-upload-progress.mdx new file mode 100644 index 0000000000..984a0e57b7 --- /dev/null +++ b/content/zh/docs/chat/sdk/android/file-uploads/track-file-upload-progress.mdx @@ -0,0 +1,44 @@ +--- +title: '监听文件上传进度' +description: '使用 Android SDK 的 OnPutFileListener 跟踪单次文件上传任务。' +sourcePath: '/sdk/android/file-uploads/track-file-upload-progress' +--- + +Android SDK 不设置全局文件上传 listener。每次调用 `uploadFile()` 时传入一个 `OnPutFileListener`,由该 listener 接收当前上传任务的进度、分片状态和完成信息。 + +```java +OnPutFileListener uploadListener = new OnPutFileListener() { + @Override + public void open(long size) { + initializeUploadProgress(uploadTaskID, size); + } + + @Override + public void uploadID(String id) { + bindSdkUploadID(uploadTaskID, id); + } + + @Override + public void uploadComplete(long fileSize, long uploadedSize, long storageSize) { + updateUploadProgress(uploadTaskID, uploadedSize, fileSize); + } + + @Override + public void uploadPartComplete(long partNumber, long partSize, String partHash) { + markPartComplete(uploadTaskID, partNumber, partSize, partHash); + } + + @Override + public void complete(long size, String url, long type) { + completeUpload(uploadTaskID, size, url, type); + } +}; + +OpenIMClient.getInstance().uploadFile(resultCallback, uploadListener, putArgs); +``` + +`open()` 可用于初始化总大小,`uploadID()` 返回 SDK 上传任务标识,`uploadComplete()` 提供上传过程数据,`uploadPartComplete()` 表示一个分片已经完成,`complete()` 返回最终大小、远端 URL 和资源类型。只有业务需要展示分片细节时才处理分片回调;普通进度条通常只需要过程回调和最终完成回调。 + +业务层仍应生成自己的稳定 `uploadTaskID`,并在 listener 闭包中关联界面状态。SDK 上传 ID、文件名和数组位置都不应代替业务任务主键。每个上传任务使用独立 listener;页面或账号状态销毁后应停止向旧状态分发回调。 + +完整的参数构造和错误处理见[上传文件](/sdk/android/file-uploads/upload-file)。 diff --git a/content/zh/docs/chat/sdk/android/file-uploads/upload-file.mdx b/content/zh/docs/chat/sdk/android/file-uploads/upload-file.mdx new file mode 100644 index 0000000000..b0e10e9ffd --- /dev/null +++ b/content/zh/docs/chat/sdk/android/file-uploads/upload-file.mdx @@ -0,0 +1,54 @@ +--- +title: '上传文件' +description: '使用 Android SDK 独立上传文件并获取远端资源地址。' +sourcePath: '/sdk/android/file-uploads/upload-file' +--- + +`uploadFile()` 是独立文件上传能力,可用于头像、群头像、资料附件或其他业务文件。上传过程不从属于消息,也不会自动创建消息或更新用户资料。 + +## 参数说明 + +| 参数 | 类型 | 是否必填 | 说明 | +| --- | --- | --- | --- | +| `base` | `OnBase` | 是 | 接收上传请求的最终成功或失败结果。 | +| `listener` | `OnPutFileListener` | 是 | 接收当前任务的上传进度、分片状态和完成信息。 | +| `putArgs.filepath` | `String` | 是 | Android 应用可读取的本地文件路径。 | +| `putArgs.name` | `String` | 是 | 上传使用的文件名;`PutArgs` 默认使用传入路径,可按业务需要改为原始文件名。 | +| `putArgs.cuase` | `String` | 否 | 业务约定的上传原因。字段名以 Android SDK 的 `PutArgs` 声明为准。 | + +```java +File file = new File(localPath); +PutArgs args = new PutArgs(file.getAbsolutePath()); +args.name = file.getName(); +args.cuase = "user-avatar"; + +OpenIMClient.getInstance().uploadFile( + new OnBase() { + @Override + public void onSuccess(String result) { + finishUploadRequest(result); + } + + @Override + public void onError(int code, String error) { + showUploadError(code, error); + } + }, + new OnPutFileListener() { + @Override + public void uploadComplete(long fileSize, long uploadedSize, long storageSize) { + updateUploadProgress(uploadTaskID, uploadedSize, fileSize); + } + + @Override + public void complete(long size, String url, long type) { + completeUpload(uploadTaskID, size, url, type); + } + }, + args +); +``` + +每次调用都传入独立的 `OnPutFileListener`,因此无需设置全局上传 listener。并行上传时应由业务层为任务生成稳定 ID,并在回调闭包中关联对应任务,不要使用文件名或列表位置作为唯一标识。各回调的职责见[跟踪文件上传进度](/sdk/android/file-uploads/track-file-upload-progress)。 + +`complete()` 返回的 URL 可用于后续更新头像、保存附件地址或创建 URL 类型的媒体消息。上传成功只表示文件资源已经写入远端;资料更新、消息创建和消息发送仍需分别调用对应 API。 diff --git a/content/zh/docs/chat/sdk/android/getting-started/authenticate-and-manage-session.mdx b/content/zh/docs/chat/sdk/android/getting-started/authenticate-and-manage-session.mdx new file mode 100644 index 0000000000..a0d74ec748 --- /dev/null +++ b/content/zh/docs/chat/sdk/android/getting-started/authenticate-and-manage-session.mdx @@ -0,0 +1,188 @@ +--- +title: '认证与管理登录会话' +description: '使用 OpenIM Android SDK 初始化、登录、查询登录状态、处理连接 callback 并退出当前账号。' +sourcePath: '/sdk/android/getting-started/authenticate-and-manage-session' +--- + +OpenIM Android SDK 使用 `initSDK()` 初始化本机运行环境,再使用 `login()` 建立当前用户的登录会话。开始认证前,应先完成[开始之前](/sdk/android/getting-started/before-you-start)列出的服务、用户和 Token 准备,并按[按 Android 环境接入](/sdk/android/getting-started/environment-specific-implementation)添加依赖和权限。 + +完整流程如下: + +1. 在应用级会话组件中创建稳定的 `OnConnListener`。 +2. 调用 `initSDK()` 并确认返回 `true`。 +3. 在登录前设置消息、用户、好友、会话、群组和通话信令 listener。 +4. 从可信后端取得对应的 `userID` 与 Token,然后调用 `login()`。 +5. 分别等待登录 callback 成功与 `onConnectSuccess()`,再开放依赖连接的业务操作。 +6. 主动退出或切换账号时调用 `logout()`,完成后清理当前账号的应用状态。 + +下文中的 `apiAddr`、`wsAddr`、`userID` 和 `token` 均由可信后端提供。 + +## 初始化并处理连接生命周期 + +在 `Application` 生命周期内创建数据目录、初始化 SDK,并传入连接 listener。应用应保存连接状态,但不要在 callback 中记录 Token 或完整服务凭据。 + +```java +import android.app.Application; + +import java.io.File; + +import io.openim.android.sdk.OpenIMClient; +import io.openim.android.sdk.enums.LogLevel; +import io.openim.android.sdk.listener.OnConnListener; +import io.openim.android.sdk.models.InitConfig; + +File dataDirectory = new File(application.getFilesDir(), "openim"); +if (!dataDirectory.exists() && !dataDirectory.mkdirs()) { + throw new IllegalStateException("Cannot create the OpenIM data directory."); +} + +InitConfig config = new InitConfig( + apiAddr, + wsAddr, + dataDirectory.getAbsolutePath() +); +config.logLevel = LogLevel.Info; +config.isLogStandardOutput = false; + +OnConnListener connectionListener = new OnConnListener() { + @Override + public void onConnecting() { + sessionState.setConnectionState("connecting"); + } + + @Override + public void onConnectSuccess() { + sessionState.setConnectionState("connected"); + sessionState.enableConnectedOperations(); + } + + @Override + public void onConnectFailed(long code, String error) { + sessionState.setConnectionState("failed"); + recordConnectionFailure(code, error); + } + + @Override + public void onKickedOffline() { + sessionState.clearCurrentAccount(); + showSignedInElsewhereScreen(); + } + + @Override + public void onUserTokenExpired() { + requestNewTokenAndRelogin(); + } + + @Override + public void onUserTokenInvalid(String reason) { + sessionState.clearCurrentAccount(); + showSignInScreen(reason); + } +}; + +boolean initialized = OpenIMClient.getInstance().initSDK( + application, + config, + connectionListener +); + +if (!initialized) { + throw new IllegalStateException("OpenIMClientSDK initialization failed."); +} +``` + +`initSDK()` 返回 `true` 表示 SDK 本地运行环境初始化成功。`OnConnListener` 的连接 callback 在调用 `login()` 后开始反映长连接状态。 + +| 字段 | 类型 | 说明 | +| --------------------- | ------------- | ---------------------------------------------------------- | +| `application` | `Application` | 应用级 Context,用于持有 SDK 生命周期。 | +| `apiAddr` | `String` | OpenIMServer HTTP API 地址。 | +| `wsAddr` | `String` | OpenIMServer WebSocket 地址。 | +| `dataDirectory` | `File` | SDK 数据库和日志使用的应用私有持久化目录。 | +| `config.logLevel` | `int` | 使用 `LogLevel` 常量;正式环境应主动收敛日志级别。 | +| `isLogStandardOutput` | `boolean` | 是否把 SDK Core 日志输出到标准日志流。 | + +SDK 只应在 `Application` 或应用级会话组件中初始化一次。当前 Java wrapper 公开 `networkChanged()`,用于通知 Core 重新检查网络;只有在应用已经统一监听系统网络变化时才调用,不能由多个页面重复注册网络 callback。 + +## 在登录前设置业务 listener + +SDK 的 listener 注册方法采用 set 语义,后一次设置会替换前一次设置。应由应用级事件中心创建稳定 listener,再把事件分发给页面状态层。消息 listener 的完整注册与增量合并示例见[发送第一条消息](/sdk/android/getting-started/send-first-message);用户、好友、会话、群组和通话信令 listener 采用相同的集中注册原则。 + +SDK 没有公开的 remove/unset 方法。退出或切换账号时,应用事件中心应停止向旧账号页面分发 callback,并在下次登录前用新账号对应的完整 listener 组合覆盖设置。 + +## 登录当前用户 + +```java +OpenIMClient.getInstance().login(new OnBase() { + @Override + public void onError(int code, String error) { + sessionState.setLoginState("failed"); + recordLoginFailure(code, error); + } + + @Override + public void onSuccess(String data) { + sessionState.setLoginState("logged"); + sessionState.setCurrentUserID(userID); + } +}, userID, token); +``` + +`login()` 的成功 callback 表示当前登录调用完成;`OnConnListener.onConnectSuccess()` 表示长连接可用。这两个阶段必须分别处理。不要并发调用 `login()`,也不要仅凭某一个 callback 同时推断登录与连接状态。 + +## 查询登录状态 + +```java +int loginStatus = OpenIMClient.getInstance().getLoginStatus(); + +if (loginStatus == LoginStatus.Logged) { + String currentUserID = OpenIMClient.getInstance().getLoginUserID(); + restoreSessionFor(currentUserID); +} +``` + +| 状态 | 说明 | +| --------------------- | ---------------------------------------------------- | +| `LoginStatus.Logout` | SDK 当前未登录。 | +| `LoginStatus.Logging` | 登录正在进行,不应再次发起并行登录。 | +| `LoginStatus.Logged` | SDK 已登录;网络是否连接仍以 `OnConnListener` 为准。 | + +`getLoginStatus()` 和 `getLoginUserID()` 返回本地 SDK 状态快照,不会触发连接 callback。切换账号时应先退出旧账号,而不是直接用新参数覆盖当前登录。 + +## 处理 Token 和强制下线 + +收到 `onUserTokenExpired()` 或 `onUserTokenInvalid()` 后,应重新向可信后端取得当前用户凭据,再按产品策略重新登录或返回登录页。收到 `onKickedOffline()` 时,应清理当前用户的会话列表、消息视图、未读数和其他业务状态,不能把它当作用户主动退出。 + +这些 callback 没有业务实体合并键,应按当前 `OpenIMClient` 单例和登录用户隔离状态。旧账号的异步任务和页面订阅必须在新账号登录前停止。 + +## 主动退出与释放 SDK + +```java +OpenIMClient.getInstance().logout(new OnBase() { + @Override + public void onError(int code, String error) { + recordLogoutFailure(code, error); + } + + @Override + public void onSuccess(String data) { + sessionState.clearCurrentAccount(); + } +}); +``` + +`logout()` 成功表示当前 SDK 登录会话已退出。应用状态清理应在成功 callback 后执行;切换账号时,等待旧账号退出完成后再调用新账号的 `login()`。 + +应用最终不再使用 SDK 时可以调用: + +```java +OpenIMClient.getInstance().unInit(); +``` + +`unInit()` 用于释放 SDK 运行环境,不是 `logout()` 的替代品,也不应在普通页面销毁时调用。 + +## 下一步 + +- [开始之前](/sdk/android/getting-started/before-you-start) +- [按 Android 环境接入](/sdk/android/getting-started/environment-specific-implementation) +- [发送第一条消息](/sdk/android/getting-started/send-first-message) diff --git a/content/zh/docs/chat/sdk/android/getting-started/before-you-start.mdx b/content/zh/docs/chat/sdk/android/getting-started/before-you-start.mdx new file mode 100644 index 0000000000..6a015cdf88 --- /dev/null +++ b/content/zh/docs/chat/sdk/android/getting-started/before-you-start.mdx @@ -0,0 +1,57 @@ +--- +title: '开始之前' +description: '准备 OpenIMServer、用户登录信息和 Android 工程环境,再开始初始化、认证或发送消息。' +sourcePath: '/sdk/android/getting-started/before-you-start' +--- + +在原生 Android 应用中接入 OpenIMClientSDK 前,需要准备可访问的 OpenIMServer、可信的用户认证流程,以及满足 SDK 构建要求的 Android 工程。这些条件同时适用于[认证与管理登录会话](/sdk/android/getting-started/authenticate-and-manage-session)和[发送第一条消息](/sdk/android/getting-started/send-first-message)。 + +## 准备 OpenIMServer + +如果还没有可用的 OpenIMServer,先按 [Docker 部署指南](/docs/guides/quick-deployment/docker)完成部署,并确认 Android 真机和模拟器均可访问以下地址: + +| 字段 | 说明 | +| --------- | ------------------------------------------------------ | +| `apiAddr` | OpenIMServer HTTP API 地址,用于登录、同步和资源请求。 | +| `wsAddr` | OpenIMServer WebSocket 地址,用于长连接和实时事件。 | + +不要只在开发电脑上验证地址。Android 模拟器中的 `localhost` 指向模拟器自身,不能直接访问开发电脑上的本地服务。如果 OpenIMServer 运行在开发电脑上,先将 API 和 WebSocket 端口映射到模拟器: + +```bash +adb reverse tcp:10002 tcp:10002 +adb reverse tcp:10001 tcp:10001 +``` + +映射后,模拟器中的应用可以使用 `http://127.0.0.1:10002` 作为 `apiAddr`,使用 `ws://127.0.0.1:10001` 作为 `wsAddr`。端口号应替换为开发电脑上实际监听的端口;执行命令前确认 `adb` 已连接到目标模拟器。生产环境应使用 HTTPS 与 WSS,并从真机检查 DNS、TLS 证书、防火墙、反向代理和 WebSocket 升级。 + +## 准备用户和 Token + +`userID` 标识 OpenIMSDK 用户,Token 用于认证该用户。创建或绑定用户、签发 Token 和校验业务权限都应由可信后端完成。Android 应用不能保存管理员 Token、secret 或其他服务端凭据。 + +后端接入 OpenIMServer REST API 前,可阅读[准备使用 Platform API](/platform-api/prepare-to-use-api)和[签发会话 Token](/platform-api/user/managing-session-tokens/issue-a-session-token)。业务后端完成自身账号认证后,只向客户端返回 SDK 登录所需的以下数据: + +| 数据 | 说明 | +| --- | --- | +| `userID` | 当前登录用户的 OpenIM 用户 ID。 | +| `token` | 与该用户对应的登录 Token。 | +| `apiAddr` | OpenIMServer HTTP API 地址。 | +| `wsAddr` | OpenIMServer WebSocket 地址。 | + +`userID` 必须与 Token 对应。客户端不得接受任意用户 ID 后自行签发、拼装或交换管理员 Token。 + +## 准备 Android 工程 + +接入前,确认 Android 工程具备以下条件: + +- 应用的 `minSdk` 不低于 `21`,使用 Java 8 编译选项,并将 `compileSdk` 设置为 `36` 或更高。 +- 应用 Manifest 声明 `android.permission.INTERNET`,并允许 SDK 读取网络状态。 +- 已准备应用私有且可持久化的数据目录,例如 `Application.getFilesDir()` 下的独立子目录;不要把 SDK 数据库放在临时缓存或共享存储中。 +- 真机能够访问 `apiAddr`、`wsAddr` 以及消息媒体资源域名。 +- 发布包覆盖目标设备 ABI;接入交付包时应核对实际包含的 native ABI。 +- 产品已经定义断网恢复、前后台切换、Token 失效、账号被踢下线和多端登录的处理方式。 + +具体依赖和 Manifest 配置见[按 Android 环境接入](/sdk/android/getting-started/environment-specific-implementation);SDK 初始化和认证流程见[认证与管理登录会话](/sdk/android/getting-started/authenticate-and-manage-session)。 + +## 继续接入 + +准备完成后,先完成[认证与管理登录会话](/sdk/android/getting-started/authenticate-and-manage-session)。确认登录 callback 成功且 `OnConnListener.onConnectSuccess()` 已到达,再按照[发送第一条消息](/sdk/android/getting-started/send-first-message)验证消息链路。 diff --git a/content/zh/docs/chat/sdk/android/getting-started/environment-specific-implementation.mdx b/content/zh/docs/chat/sdk/android/getting-started/environment-specific-implementation.mdx new file mode 100644 index 0000000000..3d27fc3bbe --- /dev/null +++ b/content/zh/docs/chat/sdk/android/getting-started/environment-specific-implementation.mdx @@ -0,0 +1,33 @@ +--- +title: '按 Android 环境接入' +description: '在 Android 工程中添加 OpenIM Android SDK 依赖并配置网络权限。' +sourcePath: '/sdk/android/getting-started/environment-specific-implementation' +--- + +本页只说明 Android 工程的依赖和权限配置。SDK 初始化、连接监听和登录流程见[认证与管理登录会话](/sdk/android/getting-started/authenticate-and-manage-session)。 + +## 添加 SDK 依赖 + +在应用 module 的 `build.gradle` 中添加依赖: + +```groovy +dependencies { + implementation 'io.openim:android-sdk:latest@aar' + implementation 'io.openim:core-sdk:latest@aar' + implementation 'com.google.code.gson:gson:2.9.0' +} +``` + +## 配置 Manifest + +应用需要网络访问权限: + +```xml + + +``` + +## 下一步 + +- [认证与管理登录会话](/sdk/android/getting-started/authenticate-and-manage-session) +- [发送第一条消息](/sdk/android/getting-started/send-first-message) diff --git a/content/zh/docs/chat/sdk/android/getting-started/send-first-message.mdx b/content/zh/docs/chat/sdk/android/getting-started/send-first-message.mdx new file mode 100644 index 0000000000..05af8e0166 --- /dev/null +++ b/content/zh/docs/chat/sdk/android/getting-started/send-first-message.mdx @@ -0,0 +1,104 @@ +--- +title: '发送第一条消息' +description: '在 Android 应用中发送并验证第一条单聊文本消息。' +sourcePath: '/sdk/android/getting-started/send-first-message' +--- + +本页用一条单聊文本消息验证 OpenIM 已接入成功。开始前,先按[认证与管理登录会话](/sdk/android/getting-started/authenticate-and-manage-session)完成 SDK 初始化和登录。 + +## 开始前准备 + +- 为发送方和接收方各准备一个测试账号。 +- 两个账号都需要按[认证与管理登录会话](/sdk/android/getting-started/authenticate-and-manage-session)完成 SDK 初始化;接收方需要在登录前设置下面的消息 listener。 +- 将示例中的 `user_b` 替换为接收方的真实 `userID`。 + +## 第 1 步:让接收方监听新消息 + +接收方在登录前设置消息 listener。收到消息后,将它加入页面消息列表或刷新界面即可。 + +```java +OpenIMClient.getInstance() + .messageManager + .setAdvancedMsgListener(new OnAdvanceMsgListener() { + @Override + public void onRecvNewMessage(Message message) { + // 将 message 显示在聊天界面中。 + } + }); +``` + +## 第 2 步:确认可以发送 + +两个账号登录后,发送方的登录 callback 成功且 `OnConnListener.onConnectSuccess()` 已到达,即可发送消息。接收方也应保持连接,以便收到新消息。连接尚未成功时,先等待连接恢复,不要重复调用 `login()`。 + +## 第 3 步:发送文本消息 + +### 发送单聊文本消息 + +先创建消息,再发送它。第三个目标参数填写接收方 `userID`,群组目标参数保持空字符串。 + +```java +Message message = OpenIMClient.getInstance() + .messageManager + .createTextMessage("你好,OpenIMSDK"); + +OnMsgSendCallback sendCallback = new OnMsgSendCallback() { + @Override + public void onProgress(long progress) { + // 文本消息通常不需要处理进度。 + } + + @Override + public void onError(int code, String error) { + // 提示发送失败,并允许用户重试。 + } + + @Override + public void onSuccess(Message sentMessage) { + // 将 sentMessage 更新到发送方的聊天界面。 + } +}; + +OpenIMClient.getInstance().messageManager.sendMessage( + sendCallback, + message, + "user_b", + "", + new OfflinePushInfo() +); +``` + +`OfflinePushInfo` 用于配置离线推送内容。首次验证时可以传入空对象,后续再按产品需要设置标题、摘要和扩展数据。 + +`onSuccess()` 表示发送方已成功发送消息;接收方的 `onRecvNewMessage()` 表示另一端已收到消息。这两个回调都会到达,才说明这次单聊验证完成。 + +### 发送群聊文本消息 + +发送群消息时,将接收方 `userID` 改为空字符串,并填写群组的 `groupID`: + +```java +Message groupMessage = OpenIMClient.getInstance() + .messageManager + .createTextMessage("大家好,OpenIMSDK"); + +OpenIMClient.getInstance().messageManager.sendMessage( + sendCallback, + groupMessage, + "", + "group_123", + new OfflinePushInfo() +); +``` + +一次调用只能填写 `userID` 或 `groupID` 其中之一。 + +## 验证成功 + +- 发送方进入 `onSuccess()`。 +- 接收方进入 `onRecvNewMessage()`,并看到文本消息。 +- 单聊只填写接收方 `userID`;群聊只填写 `groupID`。 + +## 下一步 + +- [认证与管理登录会话](/sdk/android/getting-started/authenticate-and-manage-session) +- [OpenIM Android SDK 概览](/sdk/android/overview) diff --git a/content/zh/docs/chat/sdk/android/group/change-group-mute.mdx b/content/zh/docs/chat/sdk/android/group/change-group-mute.mdx new file mode 100644 index 0000000000..157837178b --- /dev/null +++ b/content/zh/docs/chat/sdk/android/group/change-group-mute.mdx @@ -0,0 +1,16 @@ +--- +title: '设置群组全员禁言' +description: '使用 changeGroupMute 开启或关闭群组全员禁言。' +sourcePath: '/sdk/android/group/change-group-mute' +--- + +使用 `changeGroupMute()` 切换全员禁言。`true` 开启,`false` 关闭;成员级禁言见“禁言或解除禁言群成员”。 + +```java +OpenIMClient.getInstance().groupManager.changeGroupMute(new OnBase() { + @Override public void onSuccess(String data) { markGroupMuteSubmitted(groupID, true); } + @Override public void onError(int code, String error) { showGroupMuteError(error); } +}, groupID, true); +``` + +群主和管理员的实际发言权限以及服务端权限校验以部署策略为准。 diff --git a/content/zh/docs/chat/sdk/android/group/create-group.mdx b/content/zh/docs/chat/sdk/android/group/create-group.mdx new file mode 100644 index 0000000000..f233608aec --- /dev/null +++ b/content/zh/docs/chat/sdk/android/group/create-group.mdx @@ -0,0 +1,23 @@ +--- +title: '创建群组' +description: '使用 createGroup 创建群资料并指定初始成员、管理员和群主。' +sourcePath: '/sdk/android/group/create-group' +--- + +使用 `createGroup()` 创建群组。`GroupInfo` 填写群资料;初始普通成员、管理员和群主分别通过独立参数传入。成功回调返回创建后的完整 `GroupInfo`,应保存服务端确定的 `groupID`。 + +```java +GroupInfo info = new GroupInfo(); +info.setGroupName("项目讨论"); +info.setIntroduction("仅限项目成员"); + +OpenIMClient.getInstance().groupManager.createGroup( + memberUserIDs, adminUserIDs, info, ownerUserID, + new OnBase() { + @Override public void onSuccess(GroupInfo group) { openGroup(group.getGroupID()); } + @Override public void onError(int code, String error) { showCreateError(error); } + } +); +``` + +群主和管理员必须由业务侧按权限选择。不要在客户端根据本地用户列表推导群主身份。 diff --git a/content/zh/docs/chat/sdk/android/group/dismiss-group.mdx b/content/zh/docs/chat/sdk/android/group/dismiss-group.mdx new file mode 100644 index 0000000000..4224a10244 --- /dev/null +++ b/content/zh/docs/chat/sdk/android/group/dismiss-group.mdx @@ -0,0 +1,16 @@ +--- +title: '解散群组' +description: '使用 dismissGroup 解散当前用户有权限管理的群组。' +sourcePath: '/sdk/android/group/dismiss-group' +--- + +`dismissGroup()` 解散指定群组,通常仅群主可执行。调用前应在产品层提供明确确认,避免将“退出群组”误实现为解散。 + +```java +OpenIMClient.getInstance().groupManager.dismissGroup(new OnBase() { + @Override public void onSuccess(String data) { markDismissSubmitted(groupID); } + @Override public void onError(int code, String error) { showDismissError(error); } +}, groupID); +``` + +最终状态通过 `onGroupDismissed` 合并;收到事件后移除群资料、成员和群会话相关缓存。 diff --git a/content/zh/docs/chat/sdk/android/group/group-applications/accept-group-application.mdx b/content/zh/docs/chat/sdk/android/group/group-applications/accept-group-application.mdx new file mode 100644 index 0000000000..8838f4dd75 --- /dev/null +++ b/content/zh/docs/chat/sdk/android/group/group-applications/accept-group-application.mdx @@ -0,0 +1,16 @@ +--- +title: '接受入群申请' +description: '使用 acceptGroupApplication 同意指定用户的入群申请。' +sourcePath: '/sdk/android/group/group-applications/accept-group-application' +--- + +调用时同时传入申请的 `groupID`、申请人 `userID` 和处理说明。服务端负责校验当前用户是否有审批权限。 + +```java +OpenIMClient.getInstance().groupManager.acceptGroupApplication(new OnBase() { + @Override public void onSuccess(String data) { markApplicationHandled(groupID, applicantUserID); } + @Override public void onError(int code, String error) { showHandleError(error); } +}, groupID, applicantUserID, "欢迎加入"); +``` + +同意后通过群申请事件与 `onGroupMemberAdded` 更新申请列表和成员列表。 diff --git a/content/zh/docs/chat/sdk/android/group/group-applications/get-group-application-list-as-applicant.mdx b/content/zh/docs/chat/sdk/android/group/group-applications/get-group-application-list-as-applicant.mdx new file mode 100644 index 0000000000..ed061725ee --- /dev/null +++ b/content/zh/docs/chat/sdk/android/group/group-applications/get-group-application-list-as-applicant.mdx @@ -0,0 +1,18 @@ +--- +title: '获取发出的入群申请' +description: '使用 getSendGroupApplicationList 分页读取当前用户发出的入群申请。' +sourcePath: '/sdk/android/group/group-applications/get-group-application-list-as-applicant' +--- + +使用 `GetGroupApplicationListAsApplicantReq` 设置分页和筛选条件,再调用 `getSendGroupApplicationList()`。 + +```java +GetGroupApplicationListAsApplicantReq request = new GetGroupApplicationListAsApplicantReq(0, 20); +OpenIMClient.getInstance().groupManager.getSendGroupApplicationList( + new OnBase>() { + @Override public void onSuccess(List items) { mergeSentApplications(items); } + @Override public void onError(int code, String error) { showApplicationError(error); } + }, request); +``` + +申请被同意后,群列表变化以 `onJoinedGroupAdded` 为准。 diff --git a/content/zh/docs/chat/sdk/android/group/group-applications/get-group-application-list-as-recipient.mdx b/content/zh/docs/chat/sdk/android/group/group-applications/get-group-application-list-as-recipient.mdx new file mode 100644 index 0000000000..0f981e7d0f --- /dev/null +++ b/content/zh/docs/chat/sdk/android/group/group-applications/get-group-application-list-as-recipient.mdx @@ -0,0 +1,18 @@ +--- +title: '获取收到的入群申请' +description: '使用 getRecvGroupApplicationList 分页读取当前用户可处理的入群申请。' +sourcePath: '/sdk/android/group/group-applications/get-group-application-list-as-recipient' +--- + +使用非废弃重载并传入 `GetGroupApplicationListAsRecipientReq`。可设置 `offset`、`count`、`groupIDs` 和 `handleResults` 筛选条件。 + +```java +GetGroupApplicationListAsRecipientReq request = new GetGroupApplicationListAsRecipientReq(0, 20); +OpenIMClient.getInstance().groupManager.getRecvGroupApplicationList( + new OnBase>() { + @Override public void onSuccess(List items) { mergeReceivedApplications(items); } + @Override public void onError(int code, String error) { showApplicationError(error); } + }, request); +``` + +收到事件后按申请中的 `groupID` 和 `userID` 合并,不要把列表下标作为申请标识。 diff --git a/content/zh/docs/chat/sdk/android/group/group-applications/overview-group-applications.mdx b/content/zh/docs/chat/sdk/android/group/group-applications/overview-group-applications.mdx new file mode 100644 index 0000000000..2d8c85ba01 --- /dev/null +++ b/content/zh/docs/chat/sdk/android/group/group-applications/overview-group-applications.mdx @@ -0,0 +1,9 @@ +--- +title: '入群申请概览' +description: '说明 Android SDK 中收到和发出的群申请、处理结果及状态事件。' +sourcePath: '/sdk/android/group/group-applications/overview-group-applications' +--- + +群申请记录使用 `GroupApplicationInfo` 表示。收到的申请面向群管理者,发出的申请面向当前用户;`handleResult`、`reqMsg`、`handledMsg` 和处理时间用于展示申请状态。 + +Android SDK 提供收到与发出申请的分页查询,以及同意、拒绝操作;不提供 Flutter 菜单中的“待处理申请数量”接口。申请新增、同意、拒绝和删除事件由[群组概览](/sdk/android/group/overview-group)的统一 listener 负责合并。 diff --git a/content/zh/docs/chat/sdk/android/group/group-applications/refuse-group-application.mdx b/content/zh/docs/chat/sdk/android/group/group-applications/refuse-group-application.mdx new file mode 100644 index 0000000000..fb4d329b32 --- /dev/null +++ b/content/zh/docs/chat/sdk/android/group/group-applications/refuse-group-application.mdx @@ -0,0 +1,16 @@ +--- +title: '拒绝入群申请' +description: '使用 refuseGroupApplication 拒绝指定用户的入群申请。' +sourcePath: '/sdk/android/group/group-applications/refuse-group-application' +--- + +拒绝操作同样使用申请所属 `groupID`、申请人 `userID` 和处理说明。 + +```java +OpenIMClient.getInstance().groupManager.refuseGroupApplication(new OnBase() { + @Override public void onSuccess(String data) { markApplicationRejected(groupID, applicantUserID); } + @Override public void onError(int code, String error) { showHandleError(error); } +}, groupID, applicantUserID, "当前群组人数已满"); +``` + +成功 callback 后不要直接删除本地申请记录;以 `onGroupApplicationRejected` 或重新查询结果更新。 diff --git a/content/zh/docs/chat/sdk/android/group/join-group.mdx b/content/zh/docs/chat/sdk/android/group/join-group.mdx new file mode 100644 index 0000000000..8df82e8c90 --- /dev/null +++ b/content/zh/docs/chat/sdk/android/group/join-group.mdx @@ -0,0 +1,16 @@ +--- +title: '申请加入群组' +description: '使用 joinGroup 提交入群申请或加入请求。' +sourcePath: '/sdk/android/group/join-group' +--- + +使用 `joinGroup()` 提交入群请求。`joinSource` 使用群组来源值,例如邀请、搜索或二维码;带扩展数据时使用五参数重载。 + +```java +OpenIMClient.getInstance().groupManager.joinGroup(new OnBase() { + @Override public void onSuccess(String data) { markJoinSubmitted(groupID); } + @Override public void onError(int code, String error) { showJoinError(error); } +}, groupID, "希望加入项目讨论", 3, "{\"from\":\"search\"}"); +``` + +验证方式决定请求是否立即加入。后续通过 `onJoinedGroupAdded` 或群申请事件更新本地状态。 diff --git a/content/zh/docs/chat/sdk/android/group/managing-group-members/change-group-member-mute.mdx b/content/zh/docs/chat/sdk/android/group/managing-group-members/change-group-member-mute.mdx new file mode 100644 index 0000000000..c7ad6aad04 --- /dev/null +++ b/content/zh/docs/chat/sdk/android/group/managing-group-members/change-group-member-mute.mdx @@ -0,0 +1,16 @@ +--- +title: '设置群成员禁言' +description: '使用 changeGroupMemberMute 设置指定成员的禁言时长。' +sourcePath: '/sdk/android/group/managing-group-members/change-group-member-mute' +--- + +`seconds` 为禁言时长,单位为秒;传 `0` 解除成员禁言。该操作与全员禁言相互独立。 + +```java +OpenIMClient.getInstance().groupManager.changeGroupMemberMute(new OnBase() { + @Override public void onSuccess(String data) { markMemberMuteSubmitted(groupID, userID); } + @Override public void onError(int code, String error) { showMemberMuteError(error); } +}, groupID, userID, 3600L); +``` + +在 `onGroupMemberInfoChanged` 中读取 `muteEndTime` 更新成员状态;不要用本机时间和请求时长长期推算最终禁言状态。 diff --git a/content/zh/docs/chat/sdk/android/group/managing-group-members/invite-user-to-group.mdx b/content/zh/docs/chat/sdk/android/group/managing-group-members/invite-user-to-group.mdx new file mode 100644 index 0000000000..0943cf2601 --- /dev/null +++ b/content/zh/docs/chat/sdk/android/group/managing-group-members/invite-user-to-group.mdx @@ -0,0 +1,16 @@ +--- +title: '邀请用户加入群组' +description: '使用 inviteUserToGroup 邀请一组用户加入指定群组。' +sourcePath: '/sdk/android/group/managing-group-members/invite-user-to-group' +--- + +传入群 ID、待邀请用户 ID 列表和邀请说明。服务端根据群设置和当前用户权限决定是否立即加入。 + +```java +OpenIMClient.getInstance().groupManager.inviteUserToGroup(new OnBase() { + @Override public void onSuccess(String data) { markInviteSubmitted(groupID); } + @Override public void onError(int code, String error) { showInviteError(error); } +}, groupID, inviteeUserIDs, "邀请加入项目讨论"); +``` + +成员实际加入后以 `onGroupMemberAdded` 合并,不能仅以提交成功显示为已加入。 diff --git a/content/zh/docs/chat/sdk/android/group/managing-group-members/kick-group-member.mdx b/content/zh/docs/chat/sdk/android/group/managing-group-members/kick-group-member.mdx new file mode 100644 index 0000000000..2c0746b445 --- /dev/null +++ b/content/zh/docs/chat/sdk/android/group/managing-group-members/kick-group-member.mdx @@ -0,0 +1,16 @@ +--- +title: '移除群成员' +description: '使用 kickGroupMember 将指定成员移出群组。' +sourcePath: '/sdk/android/group/managing-group-members/kick-group-member' +--- + +`kickGroupMember()` 接收成员 ID 列表和移除说明。产品层应先防止当前用户误移除自身,并遵守群主、管理员权限边界。 + +```java +OpenIMClient.getInstance().groupManager.kickGroupMember(new OnBase() { + @Override public void onSuccess(String data) { markRemovalSubmitted(groupID); } + @Override public void onError(int code, String error) { showRemovalError(error); } +}, groupID, memberUserIDs, "已不再参与该项目"); +``` + +收到 `onGroupMemberDeleted` 后再从成员缓存中移除目标成员。 diff --git a/content/zh/docs/chat/sdk/android/group/managing-group-members/set-group-member-avatar.mdx b/content/zh/docs/chat/sdk/android/group/managing-group-members/set-group-member-avatar.mdx new file mode 100644 index 0000000000..989825ed52 --- /dev/null +++ b/content/zh/docs/chat/sdk/android/group/managing-group-members/set-group-member-avatar.mdx @@ -0,0 +1,21 @@ +--- +title: '更新群成员头像' +description: '使用 SetGroupMemberInfo.faceURL 更新成员在群内展示的头像。' +sourcePath: '/sdk/android/group/managing-group-members/set-group-member-avatar' +--- + +群成员头像是群内资料字段,不修改用户全局头像。传入已可访问的头像 URL。 + +```java +SetGroupMemberInfo update = new SetGroupMemberInfo(); +update.setGroupID(groupID); +update.setUserID(userID); +update.setFaceURL(avatarURL); + +OpenIMClient.getInstance().groupManager.setGroupMemberInfo(update, new OnBase() { + @Override public void onSuccess(String data) { markAvatarSubmitted(groupID, userID); } + @Override public void onError(int code, String error) { showMemberUpdateError(error); } +}); +``` + +事件到达前保留原头像或使用本地乐观状态,并按最新成员资料校准。 diff --git a/content/zh/docs/chat/sdk/android/group/managing-group-members/set-group-member-extension.mdx b/content/zh/docs/chat/sdk/android/group/managing-group-members/set-group-member-extension.mdx new file mode 100644 index 0000000000..aed46f645a --- /dev/null +++ b/content/zh/docs/chat/sdk/android/group/managing-group-members/set-group-member-extension.mdx @@ -0,0 +1,21 @@ +--- +title: '设置群成员扩展字段' +description: '使用 SetGroupMemberInfo.ex 保存应用定义的群成员扩展数据。' +sourcePath: '/sdk/android/group/managing-group-members/set-group-member-extension' +--- + +`SetGroupMemberInfo.ex` 是完整字符串,不会自动合并 JSON。多个业务模块共享时应先读取、合并并保留其他命名空间。 + +```java +SetGroupMemberInfo update = new SetGroupMemberInfo(); +update.setGroupID(groupID); +update.setUserID(userID); +update.setEx("{\"duty\":\"reviewer\"}"); + +OpenIMClient.getInstance().groupManager.setGroupMemberInfo(update, new OnBase() { + @Override public void onSuccess(String data) { markMemberExtensionSubmitted(groupID, userID); } + @Override public void onError(int code, String error) { showMemberUpdateError(error); } +}); +``` + +不要将凭据、令牌或仅限本机的显示状态写入该字段。 diff --git a/content/zh/docs/chat/sdk/android/group/managing-group-members/set-group-member-nickname.mdx b/content/zh/docs/chat/sdk/android/group/managing-group-members/set-group-member-nickname.mdx new file mode 100644 index 0000000000..1854d25a2c --- /dev/null +++ b/content/zh/docs/chat/sdk/android/group/managing-group-members/set-group-member-nickname.mdx @@ -0,0 +1,21 @@ +--- +title: '修改群内昵称' +description: '使用 SetGroupMemberInfo.nickname 更新成员在指定群中的显示昵称。' +sourcePath: '/sdk/android/group/managing-group-members/set-group-member-nickname' +--- + +成员资料修改统一使用 `setGroupMemberInfo()`。请求中填写 `groupID`、`userID` 和 `nickname`。 + +```java +SetGroupMemberInfo update = new SetGroupMemberInfo(); +update.setGroupID(groupID); +update.setUserID(userID); +update.setNickname("小林"); + +OpenIMClient.getInstance().groupManager.setGroupMemberInfo(update, new OnBase() { + @Override public void onSuccess(String data) { markNicknameSubmitted(groupID, userID); } + @Override public void onError(int code, String error) { showMemberUpdateError(error); } +}); +``` + +以 `onGroupMemberInfoChanged` 返回的 `GroupMembersInfo.nickname` 更新显示。 diff --git a/content/zh/docs/chat/sdk/android/group/managing-group-members/set-group-member-role-level.mdx b/content/zh/docs/chat/sdk/android/group/managing-group-members/set-group-member-role-level.mdx new file mode 100644 index 0000000000..88c908c115 --- /dev/null +++ b/content/zh/docs/chat/sdk/android/group/managing-group-members/set-group-member-role-level.mdx @@ -0,0 +1,21 @@ +--- +title: '设置管理员' +description: '使用 SetGroupMemberInfo.roleLevel 设置成员的群内角色。' +sourcePath: '/sdk/android/group/managing-group-members/set-group-member-role-level' +--- + +`roleLevel` 使用 `GroupRole` 常量:`OWNER`、`ADMIN` 和 `MEMBER`。群主转让使用独立接口,不应通过本接口推测转让流程。 + +```java +SetGroupMemberInfo update = new SetGroupMemberInfo(); +update.setGroupID(groupID); +update.setUserID(userID); +update.setRoleLevel(GroupRole.ADMIN); + +OpenIMClient.getInstance().groupManager.setGroupMemberInfo(update, new OnBase() { + @Override public void onSuccess(String data) { markRoleSubmitted(groupID, userID); } + @Override public void onError(int code, String error) { showRoleError(error); } +}); +``` + +实际角色变更和权限由服务端校验,以成员资料变化事件为准。 diff --git a/content/zh/docs/chat/sdk/android/group/managing-group-members/transfer-group-owner.mdx b/content/zh/docs/chat/sdk/android/group/managing-group-members/transfer-group-owner.mdx new file mode 100644 index 0000000000..a8370f10c0 --- /dev/null +++ b/content/zh/docs/chat/sdk/android/group/managing-group-members/transfer-group-owner.mdx @@ -0,0 +1,16 @@ +--- +title: '转让群主' +description: '使用 transferGroupOwner 将群主身份转让给指定群成员。' +sourcePath: '/sdk/android/group/managing-group-members/transfer-group-owner' +--- + +目标用户必须是该群成员。转让前应在产品层要求明确确认,并在完成后重新查询群主和管理员资料。 + +```java +OpenIMClient.getInstance().groupManager.transferGroupOwner(new OnBase() { + @Override public void onSuccess(String data) { markOwnershipTransferSubmitted(groupID); } + @Override public void onError(int code, String error) { showTransferError(error); } +}, groupID, newOwnerUserID); +``` + +`onGroupMemberInfoChanged` 和群资料变化可能异步到达;不要在成功 callback 中假定本地角色已完成更新。 diff --git a/content/zh/docs/chat/sdk/android/group/overview-group.mdx b/content/zh/docs/chat/sdk/android/group/overview-group.mdx new file mode 100644 index 0000000000..55b60c0f40 --- /dev/null +++ b/content/zh/docs/chat/sdk/android/group/overview-group.mdx @@ -0,0 +1,33 @@ +--- +title: '群组概览' +description: '了解 Android SDK 中群资料、成员、申请和群组事件的职责。' +sourcePath: '/sdk/android/group/overview-group' +--- + +群组由 `GroupInfo` 表示,`groupID` 是群资料、成员、申请和权限设置的唯一目标标识。`GroupMembersInfo` 表示成员在某个群内的昵称、角色、禁言结束时间和扩展字段;单聊关系和会话未读数不属于群组 API。 + +`GroupManager` 将群资料变化、成员增删改、入群申请处理和加入群组变化统一发送到一个 `OnGroupListener`。在共享状态层设置一次 listener,并按 `groupID` 或 `userID` 合并事件。 + +```java +OpenIMClient.getInstance().groupManager.setOnGroupListener(new OnGroupListener() { + @Override public void onGroupInfoChanged(GroupInfo group) { + groupStore.put(group.getGroupID(), group); + } + + @Override public void onGroupMemberInfoChanged(GroupMembersInfo member) { + memberStore.put(member.getGroupID() + member.getUserID(), member); + } +}); +``` + +群资料或成员操作的成功 callback 只表示该请求完成;状态以对应群组事件或重新查询结果为准。 + +## 主要能力 + +- [群资料与设置](/sdk/android/group/create-group) +- [群权限](/sdk/android/group/set-group-join-verification) +- [加入与退出群组](/sdk/android/group/join-group) +- [查询群组](/sdk/android/group/retrieving-groups/get-specified-groups-info) +- [群申请](/sdk/android/group/group-applications/overview-group-applications) +- [查询群成员](/sdk/android/group/retrieving-group-members/overview-retrieving-group-members) +- [管理群成员](/sdk/android/group/managing-group-members/invite-user-to-group) diff --git a/content/zh/docs/chat/sdk/android/group/quit-group.mdx b/content/zh/docs/chat/sdk/android/group/quit-group.mdx new file mode 100644 index 0000000000..be4a35e7ce --- /dev/null +++ b/content/zh/docs/chat/sdk/android/group/quit-group.mdx @@ -0,0 +1,16 @@ +--- +title: '退出群组' +description: '使用 quitGroup 让当前登录用户退出指定群组。' +sourcePath: '/sdk/android/group/quit-group' +--- + +`quitGroup()` 仅作用于当前登录用户,不会解散群组或移除其他成员。 + +```java +OpenIMClient.getInstance().groupManager.quitGroup(new OnBase() { + @Override public void onSuccess(String data) { removeJoinedGroup(groupID); } + @Override public void onError(int code, String error) { showQuitError(error); } +}, groupID); +``` + +请求成功后仍应处理 `onJoinedGroupDeleted`,并清理该群的成员列表、群会话入口等应用缓存。 diff --git a/content/zh/docs/chat/sdk/android/group/retrieving-group-members/get-group-member-list.mdx b/content/zh/docs/chat/sdk/android/group/retrieving-group-members/get-group-member-list.mdx new file mode 100644 index 0000000000..4da60e1a14 --- /dev/null +++ b/content/zh/docs/chat/sdk/android/group/retrieving-group-members/get-group-member-list.mdx @@ -0,0 +1,17 @@ +--- +title: '分页查询群成员' +description: '使用 getGroupMemberList 按角色和分页条件读取群成员。' +sourcePath: '/sdk/android/group/retrieving-group-members/get-group-member-list' +--- + +`filter` 传 `0` 查询全部成员,`1` 普通成员,`2` 群主,`3` 管理员。`offset` 与 `count` 控制分页。 + +```java +OpenIMClient.getInstance().groupManager.getGroupMemberList( + new OnBase>() { + @Override public void onSuccess(List members) { appendMembers(members); } + @Override public void onError(int code, String error) { showMemberQueryError(error); } + }, groupID, 0, offset, 50); +``` + +分页期间仍应接受成员事件,合并键使用 `groupID` 与 `userID`。 diff --git a/content/zh/docs/chat/sdk/android/group/retrieving-group-members/get-group-member-owner-and-admin.mdx b/content/zh/docs/chat/sdk/android/group/retrieving-group-members/get-group-member-owner-and-admin.mdx new file mode 100644 index 0000000000..688906b0b2 --- /dev/null +++ b/content/zh/docs/chat/sdk/android/group/retrieving-group-members/get-group-member-owner-and-admin.mdx @@ -0,0 +1,17 @@ +--- +title: '获取群主和管理员' +description: '使用 getGroupMemberOwnerAndAdmin 查询群主和管理员成员资料。' +sourcePath: '/sdk/android/group/retrieving-group-members/get-group-member-owner-and-admin' +--- + +使用 `getGroupMemberOwnerAndAdmin()` 获取需要展示或校验管理身份的成员记录。 + +```java +OpenIMClient.getInstance().groupManager.getGroupMemberOwnerAndAdmin( + new OnBase>() { + @Override public void onSuccess(List members) { showModerators(members); } + @Override public void onError(int code, String error) { showMemberQueryError(error); } + }, groupID); +``` + +`roleLevel` 的群主、管理员和普通成员常量见 `GroupRole`;实际操作权限仍由服务端决定。 diff --git a/content/zh/docs/chat/sdk/android/group/retrieving-group-members/get-specified-group-members-info.mdx b/content/zh/docs/chat/sdk/android/group/retrieving-group-members/get-specified-group-members-info.mdx new file mode 100644 index 0000000000..c15b5f4ce6 --- /dev/null +++ b/content/zh/docs/chat/sdk/android/group/retrieving-group-members/get-specified-group-members-info.mdx @@ -0,0 +1,17 @@ +--- +title: '查询指定群成员资料' +description: '使用 getGroupMembersInfo 批量读取指定成员在群内的资料。' +sourcePath: '/sdk/android/group/retrieving-group-members/get-specified-group-members-info' +--- + +`getGroupMembersInfo()` 接收一个 `groupID` 和目标用户 ID 列表,返回这些用户在群内的 `GroupMembersInfo`。 + +```java +OpenIMClient.getInstance().groupManager.getGroupMembersInfo( + new OnBase>() { + @Override public void onSuccess(List members) { mergeMembers(members); } + @Override public void onError(int code, String error) { showMemberQueryError(error); } + }, groupID, userIDs); +``` + +返回空列表可能表示目标未在群内或无读取权限,应按业务需求处理。 diff --git a/content/zh/docs/chat/sdk/android/group/retrieving-group-members/get-users-in-group.mdx b/content/zh/docs/chat/sdk/android/group/retrieving-group-members/get-users-in-group.mdx new file mode 100644 index 0000000000..17e80ec6f1 --- /dev/null +++ b/content/zh/docs/chat/sdk/android/group/retrieving-group-members/get-users-in-group.mdx @@ -0,0 +1,16 @@ +--- +title: '查询用户入群状态' +description: '使用 getUsersInGroup 从候选用户中筛出当前在群内的用户 ID。' +sourcePath: '/sdk/android/group/retrieving-group-members/get-users-in-group' +--- + +`getUsersInGroup()` 返回传入用户中已在指定群内的 ID 列表,不返回成员资料。 + +```java +OpenIMClient.getInstance().groupManager.getUsersInGroup(new OnBase>() { + @Override public void onSuccess(List joinedUserIDs) { updateMembership(joinedUserIDs); } + @Override public void onError(int code, String error) { showMembershipError(error); } +}, groupID, candidateUserIDs); +``` + +需要昵称、角色或禁言状态时,再调用“获取群成员资料”。 diff --git a/content/zh/docs/chat/sdk/android/group/retrieving-group-members/overview-retrieving-group-members.mdx b/content/zh/docs/chat/sdk/android/group/retrieving-group-members/overview-retrieving-group-members.mdx new file mode 100644 index 0000000000..77b68f84ea --- /dev/null +++ b/content/zh/docs/chat/sdk/android/group/retrieving-group-members/overview-retrieving-group-members.mdx @@ -0,0 +1,9 @@ +--- +title: '群成员查询概览' +description: '说明 Android SDK 中群成员列表、指定成员资料和成员状态查询。' +sourcePath: '/sdk/android/group/retrieving-group-members/overview-retrieving-group-members' +--- + +成员查询使用 `groupID` 限定范围,结果为 `GroupMembersInfo` 或用户 ID 列表。成员列表提供角色过滤和 offset 分页;指定成员资料、在群检查、群主管理员和关键词搜索各有独立接口。 + +成员增删和资料变化由[群组概览](/sdk/android/group/overview-group)归属的 `OnGroupListener` 统一合并。查询只建立快照,不能替代事件处理。 diff --git a/content/zh/docs/chat/sdk/android/group/retrieving-group-members/search-group-members.mdx b/content/zh/docs/chat/sdk/android/group/retrieving-group-members/search-group-members.mdx new file mode 100644 index 0000000000..b85d2d3f91 --- /dev/null +++ b/content/zh/docs/chat/sdk/android/group/retrieving-group-members/search-group-members.mdx @@ -0,0 +1,17 @@ +--- +title: '搜索群成员' +description: '使用 searchGroupMembers 按用户 ID 或群昵称搜索群成员。' +sourcePath: '/sdk/android/group/retrieving-group-members/search-group-members' +--- + +指定关键词列表、用户 ID 与群昵称两个搜索开关,以及分页条件。 + +```java +OpenIMClient.getInstance().groupManager.searchGroupMembers( + new OnBase>() { + @Override public void onSuccess(List members) { showMemberSearch(members); } + @Override public void onError(int code, String error) { showSearchError(error); } + }, groupID, Collections.singletonList(keyword), true, true, 0, 20); +``` + +搜索仅限目标群组;空关键词或两个搜索开关均关闭时不应发起请求。 diff --git a/content/zh/docs/chat/sdk/android/group/retrieving-groups/get-joined-group-list-page.mdx b/content/zh/docs/chat/sdk/android/group/retrieving-groups/get-joined-group-list-page.mdx new file mode 100644 index 0000000000..b5dce64676 --- /dev/null +++ b/content/zh/docs/chat/sdk/android/group/retrieving-groups/get-joined-group-list-page.mdx @@ -0,0 +1,16 @@ +--- +title: '分页获取已加入群组' +description: '使用 getJoinedGroupListPage 分页读取当前账号已加入的群组。' +sourcePath: '/sdk/android/group/retrieving-groups/get-joined-group-list-page' +--- + +Android SDK 仅提供分页版本。`offset` 从 `0` 开始,后续页按已经成功合并的条目数推进;返回为空时停止加载。 + +```java +OpenIMClient.getInstance().groupManager.getJoinedGroupListPage(new OnBase>() { + @Override public void onSuccess(List groups) { appendJoinedGroups(groups); } + @Override public void onError(int code, String error) { showPageError(error); } +}, offset, 20); +``` + +使用 `onJoinedGroupAdded` 与 `onJoinedGroupDeleted` 合并增量,不要仅依赖已加载分页作为完整群列表。 diff --git a/content/zh/docs/chat/sdk/android/group/retrieving-groups/get-specified-groups-info.mdx b/content/zh/docs/chat/sdk/android/group/retrieving-groups/get-specified-groups-info.mdx new file mode 100644 index 0000000000..dd7a3f5d80 --- /dev/null +++ b/content/zh/docs/chat/sdk/android/group/retrieving-groups/get-specified-groups-info.mdx @@ -0,0 +1,16 @@ +--- +title: '查询指定群组资料' +description: '使用 getGroupsInfo 批量查询指定群组的最新资料。' +sourcePath: '/sdk/android/group/retrieving-groups/get-specified-groups-info' +--- + +已持有一组 `groupID` 时,使用 `getGroupsInfo()` 查询群资料。结果是 `GroupInfo` 列表,不能依赖响应顺序与请求列表完全一致。 + +```java +OpenIMClient.getInstance().groupManager.getGroupsInfo(new OnBase>() { + @Override public void onSuccess(List groups) { mergeGroups(groups); } + @Override public void onError(int code, String error) { showGroupQueryError(error); } +}, groupIDs); +``` + +先移除空值和重复 ID;权限不足或群组不存在的 ID 应按缺失结果处理。 diff --git a/content/zh/docs/chat/sdk/android/group/retrieving-groups/is-join-group.mdx b/content/zh/docs/chat/sdk/android/group/retrieving-groups/is-join-group.mdx new file mode 100644 index 0000000000..24ef248c64 --- /dev/null +++ b/content/zh/docs/chat/sdk/android/group/retrieving-groups/is-join-group.mdx @@ -0,0 +1,16 @@ +--- +title: '检查是否已加入群组' +description: '使用 isJoinGroup 查询当前登录用户是否已经加入指定群组。' +sourcePath: '/sdk/android/group/retrieving-groups/is-join-group' +--- + +`isJoinGroup()` 仅检查当前登录用户与目标 `groupID` 的成员关系。 + +```java +OpenIMClient.getInstance().groupManager.isJoinGroup(groupID, new OnBase() { + @Override public void onSuccess(Boolean joined) { updateJoinAction(Boolean.TRUE.equals(joined)); } + @Override public void onError(int code, String error) { showMembershipError(error); } +}); +``` + +该结果不替代群资料查询,也不能用于判断其他用户是否在群内。 diff --git a/content/zh/docs/chat/sdk/android/group/retrieving-groups/search-groups.mdx b/content/zh/docs/chat/sdk/android/group/retrieving-groups/search-groups.mdx new file mode 100644 index 0000000000..6c3d3472d7 --- /dev/null +++ b/content/zh/docs/chat/sdk/android/group/retrieving-groups/search-groups.mdx @@ -0,0 +1,16 @@ +--- +title: '搜索群组' +description: '使用 searchGroups 按群 ID 或群名称搜索本地可查询的群组。' +sourcePath: '/sdk/android/group/retrieving-groups/search-groups' +--- + +`searchGroups()` 接收关键词列表,并分别指定是否搜索群 ID、群名称。两个开关都关闭时没有有效搜索范围。 + +```java +OpenIMClient.getInstance().groupManager.searchGroups(new OnBase>() { + @Override public void onSuccess(List groups) { showSearchResults(groups); } + @Override public void onError(int code, String error) { showSearchError(error); } +}, Collections.singletonList(keyword), true, true); +``` + +搜索结果不是成员资格证明。进入群组前可使用“检查是否加入群组”确认当前状态。 diff --git a/content/zh/docs/chat/sdk/android/group/set-group-announcement.mdx b/content/zh/docs/chat/sdk/android/group/set-group-announcement.mdx new file mode 100644 index 0000000000..b592ee761b --- /dev/null +++ b/content/zh/docs/chat/sdk/android/group/set-group-announcement.mdx @@ -0,0 +1,20 @@ +--- +title: '发布或更新群公告' +description: '通过 GroupInfo.notification 发布或更新群公告。' +sourcePath: '/sdk/android/group/set-group-announcement' +--- + +Android SDK 没有独立的公告方法。构造包含 `groupID` 与 `notification` 的 `GroupInfo`,再调用 `setGroupInfo()`。 + +```java +GroupInfo update = new GroupInfo(); +update.setGroupID(groupID); +update.setNotification("今晚 20:00 进行版本发布确认。"); + +OpenIMClient.getInstance().groupManager.setGroupInfo(update, new OnBase() { + @Override public void onSuccess(String data) { refreshAnnouncement(groupID); } + @Override public void onError(int code, String error) { showAnnouncementError(error); } +}); +``` + +公告的更新时间和更新人由返回的 `GroupInfo` 中 `notificationUpdateTime`、`notificationUserID` 表示。权限由服务端校验。 diff --git a/content/zh/docs/chat/sdk/android/group/set-group-extension.mdx b/content/zh/docs/chat/sdk/android/group/set-group-extension.mdx new file mode 100644 index 0000000000..2b08a36203 --- /dev/null +++ b/content/zh/docs/chat/sdk/android/group/set-group-extension.mdx @@ -0,0 +1,20 @@ +--- +title: '设置群组扩展字段' +description: '通过 GroupInfo.ex 保存应用定义的群组扩展数据。' +sourcePath: '/sdk/android/group/set-group-extension' +--- + +`GroupInfo.ex` 是完整字符串,SDK 不会合并 JSON。多个业务模块共用该字段时,应由应用读取旧值、合并自己的命名空间后再提交。 + +```java +GroupInfo update = new GroupInfo(); +update.setGroupID(groupID); +update.setEx("{\"projectCode\":\"mobile\",\"archived\":false}"); + +OpenIMClient.getInstance().groupManager.setGroupInfo(update, new OnBase() { + @Override public void onSuccess(String data) { markExtensionSubmitted(groupID); } + @Override public void onError(int code, String error) { showExtensionError(error); } +}); +``` + +不要将访问令牌、密钥或仅适合本机的 UI 状态写入群扩展字段。 diff --git a/content/zh/docs/chat/sdk/android/group/set-group-join-verification.mdx b/content/zh/docs/chat/sdk/android/group/set-group-join-verification.mdx new file mode 100644 index 0000000000..04c67d00a6 --- /dev/null +++ b/content/zh/docs/chat/sdk/android/group/set-group-join-verification.mdx @@ -0,0 +1,20 @@ +--- +title: '设置入群验证方式' +description: '通过 GroupInfo.needVerification 配置申请和邀请的入群验证规则。' +sourcePath: '/sdk/android/group/set-group-join-verification' +--- + +入群验证写入 `GroupInfo.needVerification`,再调用 `setGroupInfo()`。可使用 `GroupVerification` 常量:`APPLY_NEED_VERIFICATION_INVITE_DIRECTLY`、`ALL_NEED_VERIFICATION` 和 `DIRECTLY`。 + +```java +GroupInfo update = new GroupInfo(); +update.setGroupID(groupID); +update.setNeedVerification(GroupVerification.ALL_NEED_VERIFICATION); + +OpenIMClient.getInstance().groupManager.setGroupInfo(update, new OnBase() { + @Override public void onSuccess(String data) { markVerificationSubmitted(groupID); } + @Override public void onError(int code, String error) { showVerificationError(error); } +}); +``` + +该设置影响后续入群请求,不替代对已存在申请的同意或拒绝处理。 diff --git a/content/zh/docs/chat/sdk/android/group/set-group-member-friend-permission.mdx b/content/zh/docs/chat/sdk/android/group/set-group-member-friend-permission.mdx new file mode 100644 index 0000000000..c923b533e5 --- /dev/null +++ b/content/zh/docs/chat/sdk/android/group/set-group-member-friend-permission.mdx @@ -0,0 +1,20 @@ +--- +title: '设置群内添加好友权限' +description: '通过 GroupInfo.applyMemberFriend 设置是否允许从群成员发起好友申请。' +sourcePath: '/sdk/android/group/set-group-member-friend-permission' +--- + +`applyMemberFriend` 使用整数开关:`0` 关闭,`1` 打开。该规则只影响从该群成员关系入口发起的好友申请。 + +```java +GroupInfo update = new GroupInfo(); +update.setGroupID(groupID); +update.setApplyMemberFriend(0); + +OpenIMClient.getInstance().groupManager.setGroupInfo(update, new OnBase() { + @Override public void onSuccess(String data) { markFriendPermissionSubmitted(groupID); } + @Override public void onError(int code, String error) { showPermissionError(error); } +}); +``` + +更新后以 `onGroupInfoChanged` 或重新读取的 `GroupInfo` 为准。 diff --git a/content/zh/docs/chat/sdk/android/group/set-group-member-profile-access.mdx b/content/zh/docs/chat/sdk/android/group/set-group-member-profile-access.mdx new file mode 100644 index 0000000000..82a448d4b9 --- /dev/null +++ b/content/zh/docs/chat/sdk/android/group/set-group-member-profile-access.mdx @@ -0,0 +1,20 @@ +--- +title: '设置成员资料查看权限' +description: '通过 GroupInfo.lookMemberInfo 设置是否允许通过群组查看成员资料。' +sourcePath: '/sdk/android/group/set-group-member-profile-access' +--- + +`lookMemberInfo` 使用整数开关:`0` 关闭,`1` 打开。更新时只提交该权限字段和 `groupID`。 + +```java +GroupInfo update = new GroupInfo(); +update.setGroupID(groupID); +update.setLookMemberInfo(1); + +OpenIMClient.getInstance().groupManager.setGroupInfo(update, new OnBase() { + @Override public void onSuccess(String data) { markMemberInfoAccessSubmitted(groupID); } + @Override public void onError(int code, String error) { showPermissionError(error); } +}); +``` + +此开关约束通过群组入口获取成员资料的权限,不改变成员已经拥有的用户资料。 diff --git a/content/zh/docs/chat/sdk/android/group/update-group-profile.mdx b/content/zh/docs/chat/sdk/android/group/update-group-profile.mdx new file mode 100644 index 0000000000..1b64245029 --- /dev/null +++ b/content/zh/docs/chat/sdk/android/group/update-group-profile.mdx @@ -0,0 +1,21 @@ +--- +title: '更新群名称、简介和头像' +description: '使用 setGroupInfo 更新群名称、头像、简介和其他群资料字段。' +sourcePath: '/sdk/android/group/update-group-profile' +--- + +使用 `setGroupInfo()` 更新群资料。请求对象至少应包含 `groupID` 和需要修改的字段;不要用不完整的本地缓存覆盖未参与本次编辑的字段。 + +```java +GroupInfo update = new GroupInfo(); +update.setGroupID(groupID); +update.setGroupName("移动端项目组"); +update.setIntroduction("Android 与 iOS 协作群"); + +OpenIMClient.getInstance().groupManager.setGroupInfo(update, new OnBase() { + @Override public void onSuccess(String data) { markGroupUpdateSubmitted(groupID); } + @Override public void onError(int code, String error) { showGroupUpdateError(error); } +}); +``` + +最新群资料通过 `onGroupInfoChanged` 合并。群公告和扩展字段使用相同接口,分别见相关页面。 diff --git a/content/zh/docs/chat/sdk/android/logger.mdx b/content/zh/docs/chat/sdk/android/logger.mdx new file mode 100644 index 0000000000..7e40da542f --- /dev/null +++ b/content/zh/docs/chat/sdk/android/logger.mdx @@ -0,0 +1,112 @@ +--- +title: '日志' +description: '配置 Android SDK 日志、写入应用诊断信息并上传日志。' +sourcePath: '/sdk/android/logger' +--- + +OpenIM Android SDK 日志用于定位初始化、连接和业务 API 调用问题。开发和预发布环境可以输出较详细的信息;生产环境应减少日志量,并避免记录 Token、完整消息正文、原始文件 URL、通话房间凭据和用户隐私字段。 + +## 初始化日志配置 + +日志选项属于 `InitConfig`,必须在 `initSDK()` 前设置: + +```java +File dataDirectory = new File(application.getFilesDir(), "openim"); +File logDirectory = new File(application.getFilesDir(), "openim-logs"); + +InitConfig config = new InitConfig( + apiAddr, + wsAddr, + dataDirectory.getAbsolutePath() +); +config.logLevel = BuildConfig.DEBUG ? LogLevel.Debug : LogLevel.Warn; +config.isLogStandardOutput = BuildConfig.DEBUG; +config.logFilePath = logDirectory.getAbsolutePath(); + +boolean initialized = OpenIMClient.getInstance().initSDK( + application, + config, + connectionListener +); +``` + +| 字段 | 说明 | +| --- | --- | +| `logLevel` | 使用 `LogLevel` 常量控制详细程度。可选值包括 `DebugWithSQL`、`Debug`、`Info`、`Warn`、`Error`、`Panic` 和 `Fatal`。 | +| `isLogStandardOutput` | 是否把 SDK 日志输出到 Android 标准日志;开发诊断时开启。 | +| `logFilePath` | 可选日志目录,应位于应用可写范围并纳入容量与保留期管理。 | + +开发诊断可以使用 `Debug`;只有排查数据库问题时才临时启用 `DebugWithSQL`。生产环境通常使用 `Warn` 或 `Error`,并关闭不必要的标准输出。 + +## 写入应用诊断日志 + +需要把业务上下文写入 SDK 日志时,使用未废弃的 `logs()` 重载: + +```java +OpenIMClient.getInstance().logs( + LogLevel.Error, + ChatRepository.class.getSimpleName(), + 184, + "send_message_failed", + errorMessage, + "conversationID", conversationID, + "clientMsgID", clientMsgID +); +``` + +`currentClassName` 和 `currentLineNum` 用于定位调用位置,`msgStr` 是简短动作描述,`errStr` 是错误信息。`Warn`、`Error`、`Panic` 和 `Fatal` 级别必须提供非空错误信息。末尾的 `extra` 按“键、值”成对传入;只记录排查所需的非敏感标识。 + +旧的带 `OnBase`、`Map` 参数的 `logs()` 重载已经废弃,不应在新代码中使用。 + +## 上传诊断日志 + +只在用户明确同意提交诊断信息后调用 `uploadLogs()`。Android API 保留了 `params` 参数;没有额外参数时传空列表。`line` 表示本次上传读取的日志行数配置。 + +```java +String uploadID = UUID.randomUUID().toString(); + +OpenIMClient.getInstance().uploadLogs( + new OnBase() { + @Override + public void onSuccess(String data) { + showLogUploadCompleted(); + } + + @Override + public void onError(int code, String error) { + showLogUploadError(code, error); + } + }, + Collections.emptyList(), + 2000, + uploadID, + "support-ticket-42", + new UploadLogProgress() { + @Override + public void onProgress(long current, long total) { + updateLogUploadProgress(current, total); + } + } +); +``` + +| 参数 | 说明 | +| --- | --- | +| `line` | 本次上传读取的日志行数配置。 | +| `cancelID` | 本次上传的稳定标识,可使用业务生成的 UUID。 | +| `ex` | 附加到上传任务的诊断说明,例如工单 ID;不能包含凭据或隐私数据。 | +| `UploadLogProgress` | 提供当前进度和总量,用于更新上传界面。 | + +成功 callback 表示本次日志上传请求完成,不会修改用户、会话或消息状态,也不会触发业务领域事件。上传失败时记录错误码、当前用户和业务诊断 ID,不要再次输出完整日志内容。 + +## operationID 与业务追踪 + +Android Java wrapper 的公共业务方法不接收 `operationID`。每次调用时,wrapper 会通过 `ParamsUtil.buildOperationID()` 自动生成并传给 Core,因此应用通常不需要创建或传递该值。 + +应用日志应另外维护自己的 trace ID,并记录业务动作、错误码以及必要的 `conversationID`、`clientMsgID`、`groupID` 或 `roomID`。应用 trace ID 用于串联多步骤业务流程;SDK 的 `operationID` 用于单次 SDK 调用链路,两者都不是身份凭据或业务幂等键。 + +## 相关页面 + +- [按 Android 环境接入](/sdk/android/getting-started/environment-specific-implementation) +- [认证与管理登录会话](/sdk/android/getting-started/authenticate-and-manage-session) +- [发送消息](/sdk/android/message/sending-messages/send-message) diff --git a/content/zh/docs/chat/sdk/android/message/composing-messages/get-typing-status.mdx b/content/zh/docs/chat/sdk/android/message/composing-messages/get-typing-status.mdx new file mode 100644 index 0000000000..279f782485 --- /dev/null +++ b/content/zh/docs/chat/sdk/android/message/composing-messages/get-typing-status.mdx @@ -0,0 +1,28 @@ +--- +title: '查询输入状态' +description: '使用 getInputState 查询指定用户在会话中的当前输入状态。' +sourcePath: '/sdk/android/message/composing-messages/get-typing-status' +--- + +进入会话、连接恢复或需要校准状态时,查询指定用户当前正在输入的平台 ID 列表。 + +```java +OpenIMClient.getInstance().conversationManager.getInputState( + new OnBase>() { + @Override + public void onSuccess(List platformIDs) { + boolean typing = platformIDs != null && !platformIDs.isEmpty(); + updateTypingState(conversationID, userID, typing); + } + + @Override + public void onError(int code, String error) { + recordTypingStatusQueryFailure(code, error); + } + }, + conversationID, + userID +); +``` + +成功 callback 返回平台 ID 数组快照;空列表表示查询时没有平台处于输入状态。查询本身不会触发输入状态事件。群聊中不要频繁轮询全部成员,只在进入页面、连接恢复或补偿状态时查询重点成员;在线增量由[上报输入状态](/sdk/android/message/composing-messages/update-typing-status)归属的 listener 维护。 diff --git a/content/zh/docs/chat/sdk/android/message/composing-messages/update-typing-status.mdx b/content/zh/docs/chat/sdk/android/message/composing-messages/update-typing-status.mdx new file mode 100644 index 0000000000..83c36e8052 --- /dev/null +++ b/content/zh/docs/chat/sdk/android/message/composing-messages/update-typing-status.mdx @@ -0,0 +1,57 @@ +--- +title: '上报输入状态' +description: '使用 Android SDK 上报当前会话的输入状态。' +sourcePath: '/sdk/android/message/composing-messages/update-typing-status' +--- + +进入输入状态时,将 `focus` 设为 `true`;输入结束、输入框失去焦点或退出会话时,将其设为 `false`。 + +```java +conversationManager.changeInputState( + new OnBase() { + @Override + public void onSuccess(String data) { + // 输入状态已上报 + } + + @Override + public void onError(int code, String error) { + // 处理失败 + } + }, + conversationID, + true +); +``` + +输入结束时及时清除状态: + +```java +conversationManager.changeInputState(callback, conversationID, false); +``` + +调用侧应合并连续的焦点变化,并在页面退出或连接中断前尝试上报 `false`。成功回调只表示上报请求完成,不表示其他客户端已经更新界面。 + +其他客户端通过 `OnConversationListener.onConversationUserInputStatusChanged` 接收输入状态变化。Android SDK 以字符串形式返回事件载荷,应在校验 JSON 后再解析: + +```java +@Override +public void onConversationUserInputStatusChanged(String payload) { + InputStatesChangedData state = JsonUtil.toObj( + payload, + InputStatesChangedData.class + ); + if (state == null || state.getConversationID() == null) { + return; + } + updateTypingState( + state.getConversationID(), + state.getUserID(), + state.getPlatformIDs() + ); +} +``` + +输入状态按 `conversationID:userID` 合并,并设置业务侧超时自动清除。`ConversationManager` 只保存一个会话 listener,本回调应与会话列表、总未读数和同步事件组合后统一设置。 + +进入会话或连接恢复时,可通过[查询输入状态](/sdk/android/message/composing-messages/get-typing-status)获取当前快照。 diff --git a/content/zh/docs/chat/sdk/android/message/creating-messages/create-advanced-quote-message.mdx b/content/zh/docs/chat/sdk/android/message/creating-messages/create-advanced-quote-message.mdx new file mode 100644 index 0000000000..e9375d42cf --- /dev/null +++ b/content/zh/docs/chat/sdk/android/message/creating-messages/create-advanced-quote-message.mdx @@ -0,0 +1,23 @@ +--- +title: '创建富文本回复' +description: '使用 createAdvancedQuoteMessage 创建带富文本实体的引用回复消息。' +sourcePath: '/sdk/android/message/creating-messages/create-advanced-quote-message' +--- + +富文本回复同时保存回复正文、被引用的原消息和正文中的 `RichMessage` 实体范围。 + +```java +RichMessage mention = new RichMessage(); +mention.setType("mention"); +mention.setOffset(0); +mention.setLength(6); +mention.setInfo("{\"userID\":\"user_a\"}"); + +Message message = OpenIMClient.getInstance().messageManager.createAdvancedQuoteMessage( + "OpenIM agreed", + originalMessage, + Collections.singletonList(mention) +); +``` + +被引用的 `originalMessage` 应包含稳定的 `clientMsgID`,实体范围必须对应最终回复正文。`type`、`url` 和 `info` 的业务协议与[创建富文本消息](/sdk/android/message/creating-messages/create-advanced-text-message)相同。本方法只创建待发送对象,不会自动发送。 diff --git a/content/zh/docs/chat/sdk/android/message/creating-messages/create-advanced-text-message.mdx b/content/zh/docs/chat/sdk/android/message/creating-messages/create-advanced-text-message.mdx new file mode 100644 index 0000000000..76c5b8e988 --- /dev/null +++ b/content/zh/docs/chat/sdk/android/message/creating-messages/create-advanced-text-message.mdx @@ -0,0 +1,23 @@ +--- +title: '创建富文本消息' +description: '使用 createAdvancedTextMessage 创建包含结构化实体范围的富文本消息。' +sourcePath: '/sdk/android/message/creating-messages/create-advanced-text-message' +--- + +`RichMessage` 使用 `offset` 和 `length` 标记正文范围,并通过 `type`、`url` 和 `info` 携带业务定义的实体信息。 + +```java +RichMessage link = new RichMessage(); +link.setType("link"); +link.setOffset(0); +link.setLength(6); +link.setUrl("https://docs.openim.io"); +link.setInfo("{\"title\":\"OpenIM documentation\"}"); + +Message message = OpenIMClient.getInstance().messageManager.createAdvancedTextMessage( + "OpenIM docs", + Collections.singletonList(link) +); +``` + +每个实体的范围必须对应最终正文中的实际位置。发送前应校验范围、URL 和 `info` 内容,并确保接收端使用相同的 `type` 与 `info` 协议。本方法只创建 `Message`,不会发送消息;创建完成后使用[发送消息](/sdk/android/message/sending-messages/send-message)。 diff --git a/content/zh/docs/chat/sdk/android/message/creating-messages/create-card-message.mdx b/content/zh/docs/chat/sdk/android/message/creating-messages/create-card-message.mdx new file mode 100644 index 0000000000..09c8ceef54 --- /dev/null +++ b/content/zh/docs/chat/sdk/android/message/creating-messages/create-card-message.mdx @@ -0,0 +1,11 @@ +--- +title: '创建名片消息' +description: '使用 createCardMessage 创建联系人名片消息。' +sourcePath: '/sdk/android/message/creating-messages/create-card-message' +--- + +`CardElem` 保存名片用户的展示资料。 + +```java +Message message = OpenIMClient.getInstance().messageManager.createCardMessage(cardElem); +``` diff --git a/content/zh/docs/chat/sdk/android/message/creating-messages/create-custom-message.mdx b/content/zh/docs/chat/sdk/android/message/creating-messages/create-custom-message.mdx new file mode 100644 index 0000000000..75470bcac6 --- /dev/null +++ b/content/zh/docs/chat/sdk/android/message/creating-messages/create-custom-message.mdx @@ -0,0 +1,12 @@ +--- +title: '创建自定义消息' +description: '使用 createCustomMessage 承载业务定义的 JSON 消息。' +sourcePath: '/sdk/android/message/creating-messages/create-custom-message' +--- + +`data`、`extension` 和 `description` 由业务定义,接收端应按自己的协议解析。 + +```java +Message message = OpenIMClient.getInstance().messageManager.createCustomMessage( + dataJson, extensionJson, description); +``` diff --git a/content/zh/docs/chat/sdk/android/message/creating-messages/create-face-message.mdx b/content/zh/docs/chat/sdk/android/message/creating-messages/create-face-message.mdx new file mode 100644 index 0000000000..c803bbacc7 --- /dev/null +++ b/content/zh/docs/chat/sdk/android/message/creating-messages/create-face-message.mdx @@ -0,0 +1,11 @@ +--- +title: '创建表情消息' +description: '使用 createFaceMessage 创建自定义表情消息。' +sourcePath: '/sdk/android/message/creating-messages/create-face-message' +--- + +`index` 表示表情位置,`data` 保存表情 URL 等 JSON 数据。 + +```java +Message message = OpenIMClient.getInstance().messageManager.createFaceMessage(index, dataJson); +``` diff --git a/content/zh/docs/chat/sdk/android/message/creating-messages/create-file-message-by-file.mdx b/content/zh/docs/chat/sdk/android/message/creating-messages/create-file-message-by-file.mdx new file mode 100644 index 0000000000..b0df73bd91 --- /dev/null +++ b/content/zh/docs/chat/sdk/android/message/creating-messages/create-file-message-by-file.mdx @@ -0,0 +1,12 @@ +--- +title: '使用本地路径创建文件消息' +description: '使用绝对路径创建文件消息。' +sourcePath: '/sdk/android/message/creating-messages/create-file-message-by-file' +--- + +```java +Message message = OpenIMClient.getInstance().messageManager + .createFileMessageFromFullPath(absolutePath, fileName); +``` + +绝对路径必须可读,文件名与路径分别传入。本方法只创建待发送对象。 diff --git a/content/zh/docs/chat/sdk/android/message/creating-messages/create-file-message-by-url.mdx b/content/zh/docs/chat/sdk/android/message/creating-messages/create-file-message-by-url.mdx new file mode 100644 index 0000000000..474514464c --- /dev/null +++ b/content/zh/docs/chat/sdk/android/message/creating-messages/create-file-message-by-url.mdx @@ -0,0 +1,11 @@ +--- +title: '使用 URL 创建文件消息' +description: '使用 FileElem 创建已上传资源的文件消息。' +sourcePath: '/sdk/android/message/creating-messages/create-file-message-by-url' +--- + +`FileElem` 应包含远端 URL、文件名和文件大小。 + +```java +Message message = OpenIMClient.getInstance().messageManager.createFileMessageByURL(fileElem); +``` diff --git a/content/zh/docs/chat/sdk/android/message/creating-messages/create-file-message.mdx b/content/zh/docs/chat/sdk/android/message/creating-messages/create-file-message.mdx new file mode 100644 index 0000000000..ac83e0e22d --- /dev/null +++ b/content/zh/docs/chat/sdk/android/message/creating-messages/create-file-message.mdx @@ -0,0 +1,12 @@ +--- +title: '创建文件消息' +description: '使用相对于 SDK 初始化数据目录的路径创建文件消息。' +sourcePath: '/sdk/android/message/creating-messages/create-file-message' +--- + +```java +Message message = OpenIMClient.getInstance().messageManager + .createFileMessage(filePath, fileName); +``` + +文件应位于 SDK 初始化时配置的数据目录内,`filePath` 传入相对于该目录的路径,`fileName` 用于接收端展示。本方法只创建待发送对象。 diff --git a/content/zh/docs/chat/sdk/android/message/creating-messages/create-forward-message.mdx b/content/zh/docs/chat/sdk/android/message/creating-messages/create-forward-message.mdx new file mode 100644 index 0000000000..c7140fff6a --- /dev/null +++ b/content/zh/docs/chat/sdk/android/message/creating-messages/create-forward-message.mdx @@ -0,0 +1,11 @@ +--- +title: '创建转发消息' +description: '使用 createForwardMessage 创建转发消息。' +sourcePath: '/sdk/android/message/creating-messages/create-forward-message' +--- + +传入待转发的 `Message`,创建结果仍需通过发送方法投递到目标会话。 + +```java +Message message = OpenIMClient.getInstance().messageManager.createForwardMessage(sourceMessage); +``` diff --git a/content/zh/docs/chat/sdk/android/message/creating-messages/create-image-message-by-file.mdx b/content/zh/docs/chat/sdk/android/message/creating-messages/create-image-message-by-file.mdx new file mode 100644 index 0000000000..24fd6a258a --- /dev/null +++ b/content/zh/docs/chat/sdk/android/message/creating-messages/create-image-message-by-file.mdx @@ -0,0 +1,12 @@ +--- +title: '使用本地路径创建图片消息' +description: '使用绝对路径创建图片消息。' +sourcePath: '/sdk/android/message/creating-messages/create-image-message-by-file' +--- + +```java +Message message = OpenIMClient.getInstance().messageManager + .createImageMessageFromFullPath(absolutePath); +``` + +绝对路径必须可读。本方法只创建待发送对象,普通发送流程负责上传图片。 diff --git a/content/zh/docs/chat/sdk/android/message/creating-messages/create-image-message-by-url.mdx b/content/zh/docs/chat/sdk/android/message/creating-messages/create-image-message-by-url.mdx new file mode 100644 index 0000000000..47a1e6358f --- /dev/null +++ b/content/zh/docs/chat/sdk/android/message/creating-messages/create-image-message-by-url.mdx @@ -0,0 +1,12 @@ +--- +title: '使用 URL 创建图片消息' +description: '使用 createImageMessageByURL 创建已上传资源的图片消息。' +sourcePath: '/sdk/android/message/creating-messages/create-image-message-by-url' +--- + +准备 `PictureInfo` 的原图、大图和缩略图信息后创建消息。 + +```java +Message message = OpenIMClient.getInstance().messageManager.createImageMessageByURL( + sourceURL, sourcePicture, bigPicture, snapshotPicture); +``` diff --git a/content/zh/docs/chat/sdk/android/message/creating-messages/create-image-message.mdx b/content/zh/docs/chat/sdk/android/message/creating-messages/create-image-message.mdx new file mode 100644 index 0000000000..1ea3a0d49f --- /dev/null +++ b/content/zh/docs/chat/sdk/android/message/creating-messages/create-image-message.mdx @@ -0,0 +1,12 @@ +--- +title: '创建图片消息' +description: '使用相对于 SDK 初始化数据目录的路径创建图片消息。' +sourcePath: '/sdk/android/message/creating-messages/create-image-message' +--- + +```java +Message message = OpenIMClient.getInstance().messageManager + .createImageMessage(imagePath); +``` + +图片文件应位于 SDK 初始化时配置的数据目录内,`imagePath` 传入相对于该目录的路径。本方法只创建待发送对象,普通发送流程负责上传图片。 diff --git a/content/zh/docs/chat/sdk/android/message/creating-messages/create-location-message.mdx b/content/zh/docs/chat/sdk/android/message/creating-messages/create-location-message.mdx new file mode 100644 index 0000000000..d4b9115a1e --- /dev/null +++ b/content/zh/docs/chat/sdk/android/message/creating-messages/create-location-message.mdx @@ -0,0 +1,12 @@ +--- +title: '创建位置消息' +description: '使用 createLocationMessage 创建经纬度和描述位置消息。' +sourcePath: '/sdk/android/message/creating-messages/create-location-message' +--- + +经纬度使用十进制度数,描述用于地图或列表展示。 + +```java +Message message = OpenIMClient.getInstance().messageManager + .createLocationMessage(latitude, longitude, description); +``` diff --git a/content/zh/docs/chat/sdk/android/message/creating-messages/create-merger-message.mdx b/content/zh/docs/chat/sdk/android/message/creating-messages/create-merger-message.mdx new file mode 100644 index 0000000000..a1526dfaed --- /dev/null +++ b/content/zh/docs/chat/sdk/android/message/creating-messages/create-merger-message.mdx @@ -0,0 +1,12 @@ +--- +title: '创建合并消息' +description: '使用 createMergerMessage 将多条消息合并为一条摘要消息。' +sourcePath: '/sdk/android/message/creating-messages/create-merger-message' +--- + +传入消息列表、标题和摘要列表;摘要顺序应与展示协议保持一致。 + +```java +Message message = OpenIMClient.getInstance().messageManager.createMergerMessage( + messages, title, summaries); +``` diff --git a/content/zh/docs/chat/sdk/android/message/creating-messages/create-quote-message.mdx b/content/zh/docs/chat/sdk/android/message/creating-messages/create-quote-message.mdx new file mode 100644 index 0000000000..977ef62f22 --- /dev/null +++ b/content/zh/docs/chat/sdk/android/message/creating-messages/create-quote-message.mdx @@ -0,0 +1,12 @@ +--- +title: '创建回复消息' +description: '使用 createQuoteMessage 创建引用已有消息的回复。' +sourcePath: '/sdk/android/message/creating-messages/create-quote-message' +--- + +引用消息保存被引用的完整 `Message`,发送前应确保引用对象包含稳定的 `clientMsgID`。 + +```java +Message message = OpenIMClient.getInstance().messageManager + .createQuoteMessage(replyText, quotedMessage); +``` diff --git a/content/zh/docs/chat/sdk/android/message/creating-messages/create-sound-message-by-file.mdx b/content/zh/docs/chat/sdk/android/message/creating-messages/create-sound-message-by-file.mdx new file mode 100644 index 0000000000..476cbf4958 --- /dev/null +++ b/content/zh/docs/chat/sdk/android/message/creating-messages/create-sound-message-by-file.mdx @@ -0,0 +1,12 @@ +--- +title: '使用本地路径创建音频消息' +description: '使用绝对路径创建音频消息。' +sourcePath: '/sdk/android/message/creating-messages/create-sound-message-by-file' +--- + +```java +Message message = OpenIMClient.getInstance().messageManager + .createSoundMessageFromFullPath(absolutePath, durationSeconds); +``` + +绝对路径必须可读,音频时长单位为秒。本方法只创建待发送对象。 diff --git a/content/zh/docs/chat/sdk/android/message/creating-messages/create-sound-message-by-url.mdx b/content/zh/docs/chat/sdk/android/message/creating-messages/create-sound-message-by-url.mdx new file mode 100644 index 0000000000..fde2b58811 --- /dev/null +++ b/content/zh/docs/chat/sdk/android/message/creating-messages/create-sound-message-by-url.mdx @@ -0,0 +1,11 @@ +--- +title: '使用 URL 创建音频消息' +description: '使用 SoundElem 创建已上传资源的音频消息。' +sourcePath: '/sdk/android/message/creating-messages/create-sound-message-by-url' +--- + +`createSoundMessageByURL()` 接收已经包含 URL、时长和大小的 `SoundElem`。 + +```java +Message message = OpenIMClient.getInstance().messageManager.createSoundMessageByURL(soundElem); +``` diff --git a/content/zh/docs/chat/sdk/android/message/creating-messages/create-sound-message.mdx b/content/zh/docs/chat/sdk/android/message/creating-messages/create-sound-message.mdx new file mode 100644 index 0000000000..b84d206f0a --- /dev/null +++ b/content/zh/docs/chat/sdk/android/message/creating-messages/create-sound-message.mdx @@ -0,0 +1,12 @@ +--- +title: '创建音频消息' +description: '使用相对于 SDK 初始化数据目录的路径创建音频消息。' +sourcePath: '/sdk/android/message/creating-messages/create-sound-message' +--- + +```java +Message message = OpenIMClient.getInstance().messageManager + .createSoundMessage(soundPath, durationSeconds); +``` + +音频文件应位于 SDK 初始化时配置的数据目录内,`soundPath` 传入相对于该目录的路径,时长单位为秒。本方法只创建待发送对象。 diff --git a/content/zh/docs/chat/sdk/android/message/creating-messages/create-text-at-message.mdx b/content/zh/docs/chat/sdk/android/message/creating-messages/create-text-at-message.mdx new file mode 100644 index 0000000000..61732847ed --- /dev/null +++ b/content/zh/docs/chat/sdk/android/message/creating-messages/create-text-at-message.mdx @@ -0,0 +1,12 @@ +--- +title: '创建 @ 消息' +description: '使用 createTextAtMessage 创建带成员提醒的文本消息。' +sourcePath: '/sdk/android/message/creating-messages/create-text-at-message' +--- + +传入文本、被提醒用户 ID、`AtUserInfo` 列表和可选引用消息。 + +```java +Message message = OpenIMClient.getInstance().messageManager.createTextAtMessage( + text, userIDs, atUserInfos, quoteMessage); +``` diff --git a/content/zh/docs/chat/sdk/android/message/creating-messages/create-text-message.mdx b/content/zh/docs/chat/sdk/android/message/creating-messages/create-text-message.mdx new file mode 100644 index 0000000000..080407ba62 --- /dev/null +++ b/content/zh/docs/chat/sdk/android/message/creating-messages/create-text-message.mdx @@ -0,0 +1,11 @@ +--- +title: '创建文本消息' +description: '使用 createTextMessage 创建文本 Message。' +sourcePath: '/sdk/android/message/creating-messages/create-text-message' +--- + +`createTextMessage()` 只创建本地消息对象,不发送消息。 + +```java +Message message = OpenIMClient.getInstance().messageManager.createTextMessage(text); +``` diff --git a/content/zh/docs/chat/sdk/android/message/creating-messages/create-video-message-by-file.mdx b/content/zh/docs/chat/sdk/android/message/creating-messages/create-video-message-by-file.mdx new file mode 100644 index 0000000000..ed009dbd59 --- /dev/null +++ b/content/zh/docs/chat/sdk/android/message/creating-messages/create-video-message-by-file.mdx @@ -0,0 +1,16 @@ +--- +title: '使用本地路径创建视频消息' +description: '使用视频和缩略图的绝对路径创建视频消息。' +sourcePath: '/sdk/android/message/creating-messages/create-video-message-by-file' +--- + +```java +Message message = OpenIMClient.getInstance().messageManager.createVideoMessageFromFullPath( + absoluteVideoPath, + mimeType, + durationSeconds, + absoluteSnapshotPath +); +``` + +视频和缩略图的绝对路径必须可读,视频时长单位为秒。本方法只创建待发送对象。 diff --git a/content/zh/docs/chat/sdk/android/message/creating-messages/create-video-message-by-url.mdx b/content/zh/docs/chat/sdk/android/message/creating-messages/create-video-message-by-url.mdx new file mode 100644 index 0000000000..91cb67dec4 --- /dev/null +++ b/content/zh/docs/chat/sdk/android/message/creating-messages/create-video-message-by-url.mdx @@ -0,0 +1,11 @@ +--- +title: '使用 URL 创建视频消息' +description: '使用 VideoElem 创建已上传资源的视频消息。' +sourcePath: '/sdk/android/message/creating-messages/create-video-message-by-url' +--- + +将远端视频及缩略图信息填入 `VideoElem` 后创建消息。 + +```java +Message message = OpenIMClient.getInstance().messageManager.createVideoMessageByURL(videoElem); +``` diff --git a/content/zh/docs/chat/sdk/android/message/creating-messages/create-video-message.mdx b/content/zh/docs/chat/sdk/android/message/creating-messages/create-video-message.mdx new file mode 100644 index 0000000000..edc1e79f06 --- /dev/null +++ b/content/zh/docs/chat/sdk/android/message/creating-messages/create-video-message.mdx @@ -0,0 +1,16 @@ +--- +title: '创建视频消息' +description: '使用相对于 SDK 初始化数据目录的路径创建视频消息。' +sourcePath: '/sdk/android/message/creating-messages/create-video-message' +--- + +```java +Message message = OpenIMClient.getInstance().messageManager.createVideoMessage( + videoPath, + mimeType, + durationSeconds, + snapshotPath +); +``` + +视频和快照文件应位于 SDK 初始化时配置的数据目录内,两个路径均相对于该目录。视频时长单位为秒。本方法只创建待发送对象。 diff --git a/content/zh/docs/chat/sdk/android/message/managing-messages/clear-all-local-messages.mdx b/content/zh/docs/chat/sdk/android/message/managing-messages/clear-all-local-messages.mdx new file mode 100644 index 0000000000..38569554d7 --- /dev/null +++ b/content/zh/docs/chat/sdk/android/message/managing-messages/clear-all-local-messages.mdx @@ -0,0 +1,11 @@ +--- +title: '清理全部本地消息' +description: '使用 deleteAllMsgFromLocal 清理当前设备的全部消息。' +sourcePath: '/sdk/android/message/managing-messages/clear-all-local-messages' +--- + +该操作只清理当前设备本地缓存,不删除服务端记录。 + +```java +messageManager.deleteAllMsgFromLocal(callback); +``` diff --git a/content/zh/docs/chat/sdk/android/message/managing-messages/clear-all-messages.mdx b/content/zh/docs/chat/sdk/android/message/managing-messages/clear-all-messages.mdx new file mode 100644 index 0000000000..12a2130f0c --- /dev/null +++ b/content/zh/docs/chat/sdk/android/message/managing-messages/clear-all-messages.mdx @@ -0,0 +1,11 @@ +--- +title: '清理全部消息' +description: '使用 deleteAllMsgFromLocalAndSvr 清理本地和服务端消息。' +sourcePath: '/sdk/android/message/managing-messages/clear-all-messages' +--- + +这是高影响操作,产品层应二次确认,并在完成后清理本地会话展示。 + +```java +messageManager.deleteAllMsgFromLocalAndSvr(callback); +``` diff --git a/content/zh/docs/chat/sdk/android/message/managing-messages/delete-local-message.mdx b/content/zh/docs/chat/sdk/android/message/managing-messages/delete-local-message.mdx new file mode 100644 index 0000000000..dd06859d57 --- /dev/null +++ b/content/zh/docs/chat/sdk/android/message/managing-messages/delete-local-message.mdx @@ -0,0 +1,11 @@ +--- +title: '删除本地消息' +description: '使用 deleteMessageFromLocalStorage 仅删除当前设备的消息副本。' +sourcePath: '/sdk/android/message/managing-messages/delete-local-message' +--- + +该操作不影响其他设备和其他用户的消息记录。 + +```java +messageManager.deleteMessageFromLocalStorage(conversationID, clientMsgID, callback); +``` diff --git a/content/zh/docs/chat/sdk/android/message/managing-messages/delete-saved-messages.mdx b/content/zh/docs/chat/sdk/android/message/managing-messages/delete-saved-messages.mdx new file mode 100644 index 0000000000..dcb41dae6e --- /dev/null +++ b/content/zh/docs/chat/sdk/android/message/managing-messages/delete-saved-messages.mdx @@ -0,0 +1,48 @@ +--- +title: '批量删除消息' +description: '使用 Android SDK 批量删除当前账号在同一会话中的消息。' +sourcePath: '/sdk/android/message/managing-messages/delete-saved-messages' +--- + +## 参数说明 + +| 参数 | 类型 | 是否必填 | 说明 | +| --- | --- | --- | --- | +| `conversationID` | `String` | 是 | 要删除消息所在的会话 ID。 | +| `clientMsgIDs` | `String[]` | 是 | 要删除的消息 ID 列表;同一批 ID 必须属于同一会话。 | +| `isSync` | `boolean` | 是 | 是否把删除动作同步到当前账号的其他客户端。 | + +```java +DeleteMessagesReq request = new DeleteMessagesReq( + true, + conversationID, + selectedClientMsgIDs.toArray(new String[0]) +); + +messageManager.deleteMessages(request, new OnBase() { + @Override + public void onSuccess(String data) { + // 删除请求已完成 + } + + @Override + public void onError(int code, String error) { + // 处理失败 + } +}); +``` + +`isSync` 为 `false` 时,删除当前设备及当前账号服务端保存的记录;为 `true` 时,还会请求把删除动作同步到当前账号的其他客户端。该操作不会删除其他会话成员持有的副本,也不会产生撤回提示。 + +成功回调表示删除请求已经完成;开启同步时,不代表其他客户端已经收到事件或完成界面更新。 + +`OnAdvanceMsgListener.onMsgDeleted` 是本页归属事件。根据消息路由字段确定会话后,按 `clientMsgID` 幂等移除消息。 + +```java +@Override +public void onMsgDeleted(Message message) { + removeMessage(resolveConversationID(message), message.getClientMsgID()); +} +``` + +需要校准当前消息快照时,重新查询对应会话的历史消息。 diff --git a/content/zh/docs/chat/sdk/android/message/managing-messages/delete-user-messages.mdx b/content/zh/docs/chat/sdk/android/message/managing-messages/delete-user-messages.mdx new file mode 100644 index 0000000000..63239d1731 --- /dev/null +++ b/content/zh/docs/chat/sdk/android/message/managing-messages/delete-user-messages.mdx @@ -0,0 +1,36 @@ +--- +title: '删除群聊中指定用户的全部消息' +description: '使用 Android SDK 删除指定用户在群聊中的全部消息。' +sourcePath: '/sdk/android/message/managing-messages/delete-user-messages' +--- + +```java +messageManager.deleteUserAllMessagesInConv( + conversationID, + targetUserID, + new OnBase() { + @Override + public void onSuccess(String data) { + // 删除请求已完成 + } + + @Override + public void onError(int code, String error) { + // 处理失败 + } + } +); +``` + +该 API 只用于群聊,可删除指定用户在目标群会话中的全部消息。这是高影响的群组管控操作,不应放入普通单条消息菜单;操作者权限由 OpenIMServer 校验。成功回调不代表事件已经到达。 + +`OnAdvanceMsgListener.onDeleteUserAllMsgsInConv` 是本页归属事件。收到事件后,根据 `conversationID` 和 `userID` 移除缓存中该用户发送的消息,或重新读取会话历史进行校准。 + +```java +@Override +public void onDeleteUserAllMsgsInConv(DeleteUserAllMsgsListenerMsg event) { + removeMessagesBySender(event.getConversationID(), event.getUserID()); +} +``` + +成功回调、事件到达和重新查询历史是三个独立阶段。 diff --git a/content/zh/docs/chat/sdk/android/message/managing-messages/get-pinned-messages.mdx b/content/zh/docs/chat/sdk/android/message/managing-messages/get-pinned-messages.mdx new file mode 100644 index 0000000000..a8886cb400 --- /dev/null +++ b/content/zh/docs/chat/sdk/android/message/managing-messages/get-pinned-messages.mdx @@ -0,0 +1,14 @@ +--- +title: '查询会话置顶消息' +description: '使用 getConversationPinnedMsgs 查询会话中的置顶消息。' +sourcePath: '/sdk/android/message/managing-messages/get-pinned-messages' +--- + +查询结果是指定会话当前的置顶消息快照。 + +```java +messageManager.getConversationPinnedMsgs(new OnBase>() { + @Override public void onSuccess(List messages) { showPinned(messages); } + @Override public void onError(int code, String error) { showPinnedError(error); } +}, conversationID); +``` diff --git a/content/zh/docs/chat/sdk/android/message/managing-messages/insert-local-group-message.mdx b/content/zh/docs/chat/sdk/android/message/managing-messages/insert-local-group-message.mdx new file mode 100644 index 0000000000..fe438ba7c7 --- /dev/null +++ b/content/zh/docs/chat/sdk/android/message/managing-messages/insert-local-group-message.mdx @@ -0,0 +1,11 @@ +--- +title: '插入本地群聊消息' +description: '使用 insertGroupMessageToLocalStorage 插入仅当前设备可见的群聊消息。' +sourcePath: '/sdk/android/message/managing-messages/insert-local-group-message' +--- + +传入群 ID 与发送者 ID,消息不会同步到其他设备。 + +```java +messageManager.insertGroupMessageToLocalStorage(callback, message, groupID, senderUserID); +``` diff --git a/content/zh/docs/chat/sdk/android/message/managing-messages/insert-local-single-message.mdx b/content/zh/docs/chat/sdk/android/message/managing-messages/insert-local-single-message.mdx new file mode 100644 index 0000000000..398f05f14a --- /dev/null +++ b/content/zh/docs/chat/sdk/android/message/managing-messages/insert-local-single-message.mdx @@ -0,0 +1,11 @@ +--- +title: '插入本地单聊消息' +description: '使用 insertSingleMessageToLocalStorage 插入仅当前设备可见的单聊消息。' +sourcePath: '/sdk/android/message/managing-messages/insert-local-single-message' +--- + +该方法不向服务器发送消息,`receiver` 和 `sender` 用于建立本地消息归属。 + +```java +messageManager.insertSingleMessageToLocalStorage(callback, message, receiverUserID, senderUserID); +``` diff --git a/content/zh/docs/chat/sdk/android/message/managing-messages/modify-a-message.mdx b/content/zh/docs/chat/sdk/android/message/managing-messages/modify-a-message.mdx new file mode 100644 index 0000000000..ef13cc038a --- /dev/null +++ b/content/zh/docs/chat/sdk/android/message/managing-messages/modify-a-message.mdx @@ -0,0 +1,28 @@ +--- +title: '修改消息' +description: '修改支持编辑的消息内容,并处理其他客户端收到的消息修改事件。' +sourcePath: '/sdk/android/message/managing-messages/modify-a-message' +--- + +`modifyMessage` 用于修改会话中已经存在的消息。请求对象应保留原消息的会话 ID、`clientMsgID`、路由和发送者等字段,只更新允许修改的内容。 + +```java +messageManager.modifyMessage(callback, modifyRequest); +``` + +成功回调表示修改请求已经完成,不代表所有客户端界面都已经更新。其他客户端通过 `OnAdvanceMsgListener.onMessageModified` 接收修改后的完整 `Message`。 + +本页是 `onMessageModified` 的完整事件归属页。根据消息路由解析 `conversationID`,再按 `conversationID:clientMsgID` 替换原消息,不要按数组位置或显示文本匹配: + +```java +@Override +public void onMessageModified(Message message) { + String conversationID = resolveConversationID(message); + if (conversationID == null) { + return; + } + replaceMessage(conversationID, message.getClientMsgID(), message); +} +``` + +该回调应纳入应用唯一的 `OnAdvanceMsgListener`,集中设置入口见[事件概览](/sdk/android/events/overview-events)。成功回调、修改事件到达和重新查询历史是三个独立阶段。 diff --git a/content/zh/docs/chat/sdk/android/message/managing-messages/revoke-a-message.mdx b/content/zh/docs/chat/sdk/android/message/managing-messages/revoke-a-message.mdx new file mode 100644 index 0000000000..7479c49769 --- /dev/null +++ b/content/zh/docs/chat/sdk/android/message/managing-messages/revoke-a-message.mdx @@ -0,0 +1,31 @@ +--- +title: '撤回消息' +description: '撤回已发送消息,并处理其他客户端收到的撤回通知。' +sourcePath: '/sdk/android/message/managing-messages/revoke-a-message' +--- + +撤回会使其他客户端把原消息显示为撤回状态。调用前应确认消息已经发送成功,并由业务界面限制可撤回时间;最终权限由服务端校验。 + +```java +messageManager.revokeMessageV2(callback, conversationID, clientMsgID); +``` + +成功回调表示服务端完成撤回请求,不代表所有客户端都已经收到事件。接收端通过 `OnAdvanceMsgListener.onRecvMessageRevokedV2` 合并撤回变化。 + +本页是 `onRecvMessageRevokedV2` 的完整事件归属页。`RevokedInfo` 包含 `clientMsgID`、撤回者和撤回时间,但不包含 `conversationID`,应先从当前账号的消息索引解析所属会话,再按 `conversationID:clientMsgID` 更新消息: + +```java +@Override +public void onRecvMessageRevokedV2(RevokedInfo info) { + String clientMsgID = info.getClientMsgID(); + String conversationID = findConversationIDByClientMsgID(clientMsgID); + if (conversationID == null) { + return; + } + markMessageRevoked(conversationID, clientMsgID, info); +} +``` + +接收端应把对应消息更新为撤回状态,而不是直接从列表删除。该回调应纳入应用唯一的 `OnAdvanceMsgListener`,集中设置入口见[事件概览](/sdk/android/events/overview-events)。 + +成功回调、撤回事件到达和重新查询历史是三个独立阶段。需要校准时重新读取对应会话的历史消息。 diff --git a/content/zh/docs/chat/sdk/android/message/managing-messages/set-message-local-ex.mdx b/content/zh/docs/chat/sdk/android/message/managing-messages/set-message-local-ex.mdx new file mode 100644 index 0000000000..6e64c0b8a9 --- /dev/null +++ b/content/zh/docs/chat/sdk/android/message/managing-messages/set-message-local-ex.mdx @@ -0,0 +1,11 @@ +--- +title: '设置消息本地扩展' +description: '使用 setMessageLocalEx 保存仅当前设备使用的消息扩展数据。' +sourcePath: '/sdk/android/message/managing-messages/set-message-local-ex' +--- + +`localEx` 适合保存下载路径、播放状态等本地信息,不会同步给其他用户。 + +```java +messageManager.setMessageLocalEx(callback, conversationID, clientMsgID, localExJson); +``` diff --git a/content/zh/docs/chat/sdk/android/message/managing-messages/set-message-pinned.mdx b/content/zh/docs/chat/sdk/android/message/managing-messages/set-message-pinned.mdx new file mode 100644 index 0000000000..8c812ae422 --- /dev/null +++ b/content/zh/docs/chat/sdk/android/message/managing-messages/set-message-pinned.mdx @@ -0,0 +1,29 @@ +--- +title: '置顶或取消置顶消息' +description: '设置会话消息的置顶状态,并处理置顶消息变化事件。' +sourcePath: '/sdk/android/message/managing-messages/set-message-pinned' +--- + +最后一个参数为 `true` 时置顶消息,为 `false` 时取消置顶: + +```java +messageManager.setConversationPinnedMsg( + callback, + conversationID, + clientMsgID, + true +); +``` + +成功回调表示设置请求完成,不代表置顶变化事件已经到达。 + +`OnAdvanceMsgListener.onChangedPinnedMsg` 是本页归属事件。回调中的 `ChangedPinnedMsg` 包含 `conversationID` 和当前置顶消息集合;按会话替换集合,并按每条置顶消息的 `clientMsgID` 去重: + +```java +@Override +public void onChangedPinnedMsg(ChangedPinnedMsg event) { + replacePinnedMessages(event.getConversationID(), event.getMsgs()); +} +``` + +该回调应纳入应用唯一的 `OnAdvanceMsgListener`,集中设置入口见[事件概览](/sdk/android/events/overview-events)。成功回调、事件到达和[查询会话置顶消息](/sdk/android/message/managing-messages/get-pinned-messages)取得的快照是三个独立阶段。 diff --git a/content/zh/docs/chat/sdk/android/message/managing-read-status/get-group-message-readers.mdx b/content/zh/docs/chat/sdk/android/message/managing-read-status/get-group-message-readers.mdx new file mode 100644 index 0000000000..667a270226 --- /dev/null +++ b/content/zh/docs/chat/sdk/android/message/managing-read-status/get-group-message-readers.mdx @@ -0,0 +1,38 @@ +--- +title: '查询群消息已读成员' +description: '使用 Android SDK 分页查询群消息的已读或未读成员。' +sourcePath: '/sdk/android/message/managing-read-status/get-group-message-readers' +--- + +## 参数说明 + +| 参数 | 类型 | 是否必填 | 说明 | +| --- | --- | --- | --- | +| `conversationID` | `String` | 是 | 群聊会话 ID。 | +| `clientMsgID` | `String` | 是 | 要查询阅读成员的消息 ID。 | +| `filter` | `int` | 是 | `0` 查询已读成员,`1` 查询未读成员。 | +| `offset` | `int` | 是 | 分页偏移量,首页传 `0`。 | +| `count` | `int` | 是 | 本次请求的成员数量。 | + +```java +messageManager.getGroupMessageReaderList( + conversationID, + clientMsgID, + 0, + 0, + 50, + new OnBase>() { + @Override + public void onSuccess(List members) { + renderMembers(members); + } + + @Override + public void onError(int code, String error) { + // 处理失败 + } + } +); +``` + +成功回调返回当前页 `GroupMembersInfo` 列表,字段含义见[分页查询群成员](/sdk/android/group/retrieving-group-members/get-group-member-list)。按 `groupID:userID` 去重;查询只建立当前快照,不触发回执事件。需要完整列表时继续分页。 diff --git a/content/zh/docs/chat/sdk/android/message/managing-read-status/send-group-read-receipts.mdx b/content/zh/docs/chat/sdk/android/message/managing-read-status/send-group-read-receipts.mdx new file mode 100644 index 0000000000..aa0852b8dc --- /dev/null +++ b/content/zh/docs/chat/sdk/android/message/managing-read-status/send-group-read-receipts.mdx @@ -0,0 +1,36 @@ +--- +title: '上报群消息已读' +description: '使用 Android SDK 上报群消息已读回执。' +sourcePath: '/sdk/android/message/managing-read-status/send-group-read-receipts' +--- + +```java +messageManager.sendGroupMessageReadReceipt( + conversationID, + visibleClientMsgIDs, + new OnBase() { + @Override + public void onSuccess(String data) { + // 已读回执已上报 + } + + @Override + public void onError(int code, String error) { + // 处理失败 + } + } +); +``` + +同一批消息必须属于目标群会话。成功回调只表示服务端接受上报,不代表其他客户端界面已经更新。会话未读数仍由 `markConversationMessageAsRead` 独立维护。 + +其他客户端通过 `OnAdvanceMsgListener.onRecvGroupMessageReadReceipt` 接收群聊成员级已读变化。本页是该事件的完整监听归属页;根据 `conversationID` 以及回执中的消息 ID 合并消息已读数、未读数和成员信息。 + +```java +@Override +public void onRecvGroupMessageReadReceipt(GroupMessageReceipt receipt) { + mergeGroupReadReceipt(receipt); +} +``` + +上报回调、群回执事件和[查询群消息已读成员](/sdk/android/message/managing-read-status/get-group-message-readers)取得的成员快照是三个独立阶段。 diff --git a/content/zh/docs/chat/sdk/android/message/overview-message.mdx b/content/zh/docs/chat/sdk/android/message/overview-message.mdx new file mode 100644 index 0000000000..57abdea9ad --- /dev/null +++ b/content/zh/docs/chat/sdk/android/message/overview-message.mdx @@ -0,0 +1,15 @@ +--- +title: '消息概览' +description: '了解 Android SDK 的 Message 模型、消息生命周期和消息监听。' +sourcePath: '/sdk/android/message/overview-message' +--- + +Android 消息以 `Message` 表示,使用 `clientMsgID` 去重,使用 `sessionType`、`recvID` 和 `groupID` 区分单聊与群聊。消息内容由对应的 element 字段承载,发送、接收、撤回和删除是不同的状态变化。 + +```java +OpenIMClient.getInstance().messageManager.setAdvancedMsgListener(new OnAdvanceMsgListener() { + @Override public void onRecvNewMessage(Message message) { messageStore.merge(message); } +}); +``` + +查询建立快照,`OnAdvanceMsgListener` 合并增量;`MessageManager` 的 listener 设置会替换当前 listener。 diff --git a/content/zh/docs/chat/sdk/android/message/receiving-messages/receive-custom-business-messages.mdx b/content/zh/docs/chat/sdk/android/message/receiving-messages/receive-custom-business-messages.mdx new file mode 100644 index 0000000000..f1154c2d43 --- /dev/null +++ b/content/zh/docs/chat/sdk/android/message/receiving-messages/receive-custom-business-messages.mdx @@ -0,0 +1,17 @@ +--- +title: '接收自定义业务消息' +description: '使用 setCustomBusinessListener 接收独立于普通聊天消息的业务回调。' +sourcePath: '/sdk/android/message/receiving-messages/receive-custom-business-messages' +--- + +自定义业务回调携带字符串,业务侧应按协议校验来源和 JSON 结构,不要将其直接当作 `Message` 渲染。 + +```java +messageManager.setCustomBusinessListener(new OnCustomBusinessListener() { + @Override public void onRecvCustomBusinessMessage(String payload) { handleBusiness(payload); } +}); +``` + +本页是 `onRecvCustomBusinessMessage` 的完整处理归属页。载荷应包含业务协议版本和稳定幂等 ID,并按该 ID 去重;不要依赖回调顺序,也不要使用自定义业务消息授予客户端权限。 + +`MessageManager` 只保存一个自定义业务 listener,后一次设置会替换前一次。应在应用级事件中心设置一次,并在退出或切换账号时停止向旧账号状态分发。 diff --git a/content/zh/docs/chat/sdk/android/message/receiving-messages/receive-messages.mdx b/content/zh/docs/chat/sdk/android/message/receiving-messages/receive-messages.mdx new file mode 100644 index 0000000000..aba5b08446 --- /dev/null +++ b/content/zh/docs/chat/sdk/android/message/receiving-messages/receive-messages.mdx @@ -0,0 +1,14 @@ +--- +title: '接收消息' +description: '使用 OnAdvanceMsgListener 接收新消息、离线消息和在线消息。' +sourcePath: '/sdk/android/message/receiving-messages/receive-messages' +--- + +设置 `setAdvancedMsgListener()` 后,`onRecvNewMessage` 接收实时消息,`onRecvOfflineNewMessage` 接收离线批次,`onRecvOnlineOnlyMessage` 接收在线消息字符串。所有消息都按 `clientMsgID` 幂等合并。 + +```java +messageManager.setAdvancedMsgListener(new OnAdvanceMsgListener() { + @Override public void onRecvNewMessage(Message message) { messageStore.merge(message); } + @Override public void onRecvOfflineNewMessage(List messages) { messageStore.mergeAll(messages); } +}); +``` diff --git a/content/zh/docs/chat/sdk/android/message/retrieving-messages/find-messages-by-id.mdx b/content/zh/docs/chat/sdk/android/message/retrieving-messages/find-messages-by-id.mdx new file mode 100644 index 0000000000..2583ae4544 --- /dev/null +++ b/content/zh/docs/chat/sdk/android/message/retrieving-messages/find-messages-by-id.mdx @@ -0,0 +1,14 @@ +--- +title: '按 ID 查找消息' +description: '使用 findMessageList 按 SearchParams 查询消息记录。' +sourcePath: '/sdk/android/message/retrieving-messages/find-messages-by-id' +--- + +构造 `SearchParams` 列表查询消息。返回结果应按消息 ID 合并,不要用列表位置作为稳定标识。 + +```java +messageManager.findMessageList(new OnBase() { + @Override public void onSuccess(SearchResult result) { showFoundMessages(result); } + @Override public void onError(int code, String error) { showQueryError(error); } +}, searchParams); +``` diff --git a/content/zh/docs/chat/sdk/android/message/retrieving-messages/load-message-context.mdx b/content/zh/docs/chat/sdk/android/message/retrieving-messages/load-message-context.mdx new file mode 100644 index 0000000000..dcf4caaa73 --- /dev/null +++ b/content/zh/docs/chat/sdk/android/message/retrieving-messages/load-message-context.mdx @@ -0,0 +1,43 @@ +--- +title: '读取消息上下文' +description: '使用 Android SDK 读取一条消息前后的上下文。' +sourcePath: '/sdk/android/message/retrieving-messages/load-message-context' +--- + +从搜索结果或引用消息跳入聊天上下文时,把已经取得的 `Message` 作为锚点。 + +## 参数说明 + +| 参数 | 类型 | 是否必填 | 说明 | +| --- | --- | --- | --- | +| `conversationID` | `String` | 是 | 锚点消息所在的会话 ID。 | +| `startMsg` | `Message` | 是 | 已经取得的锚点消息。 | +| `type` | `ViewType` | 是 | 上下文查看类型;引用消息使用 `ViewType.History`,搜索结果使用 `ViewType.Search`。 | +| `before` | `int` | 是 | 锚点之前最多读取的消息数量。 | +| `after` | `int` | 是 | 锚点之后最多读取的消息数量。 | + +```java +messageManager.fetchSurroundingMessages( + new OnBase() { + @Override + public void onSuccess(Messages messages) { + List surrounding = messages.getData(); + renderMessages(surrounding); + } + + @Override + public void onError(int code, String error) { + // 处理失败 + } + }, + conversationID, + targetMessage, + ViewType.Search, + 20, + 20 +); +``` + +成功回调中的 `messages.getData()` 是锚点前后取得的消息列表,消息字段见[消息概览](/sdk/android/message/overview-message)。 + +`before` 和 `after` 分别限制锚点前后的数量。返回结果可能少于请求总数,例如锚点靠近历史边界或部分消息已经删除。按 `conversationID:clientMsgID` 合并,不要依赖固定数组位置。需要先定位消息时见[按 ID 查找消息](/sdk/android/message/retrieving-messages/find-messages-by-id)。 diff --git a/content/zh/docs/chat/sdk/android/message/retrieving-messages/load-newer-messages.mdx b/content/zh/docs/chat/sdk/android/message/retrieving-messages/load-newer-messages.mdx new file mode 100644 index 0000000000..a1a6b9355f --- /dev/null +++ b/content/zh/docs/chat/sdk/android/message/retrieving-messages/load-newer-messages.mdx @@ -0,0 +1,11 @@ +--- +title: '反向加载历史消息' +description: '使用 getAdvancedHistoryMessageListReverse 加载起点之后的消息。' +sourcePath: '/sdk/android/message/retrieving-messages/load-newer-messages' +--- + +该方法用于从消息定位点向后读取下一页历史消息。此类方向历史分页使用 `ViewType.History`。 + +```java +messageManager.getAdvancedHistoryMessageListReverse(callback, conversationID, startMessage, 20, ViewType.History); +``` diff --git a/content/zh/docs/chat/sdk/android/message/retrieving-messages/load-older-messages.mdx b/content/zh/docs/chat/sdk/android/message/retrieving-messages/load-older-messages.mdx new file mode 100644 index 0000000000..31e810cd30 --- /dev/null +++ b/content/zh/docs/chat/sdk/android/message/retrieving-messages/load-older-messages.mdx @@ -0,0 +1,11 @@ +--- +title: '加载历史消息' +description: '使用 getAdvancedHistoryMessageList 分页加载会话历史消息。' +sourcePath: '/sdk/android/message/retrieving-messages/load-older-messages' +--- + +首次查询传 `startMsg` 为 `null`,后续将上一页边界消息作为起点。普通历史消息使用 `ViewType.History`,按返回的 `clientMsgID` 去重。 + +```java +messageManager.getAdvancedHistoryMessageList(callback, conversationID, startMessage, 20, ViewType.History); +``` diff --git a/content/zh/docs/chat/sdk/android/message/searching-messages/search-messages.mdx b/content/zh/docs/chat/sdk/android/message/searching-messages/search-messages.mdx new file mode 100644 index 0000000000..df7132f4c3 --- /dev/null +++ b/content/zh/docs/chat/sdk/android/message/searching-messages/search-messages.mdx @@ -0,0 +1,12 @@ +--- +title: '搜索消息' +description: '使用 searchLocalMessages 搜索当前账号已同步到本地的消息。' +sourcePath: '/sdk/android/message/searching-messages/search-messages' +--- + +可按会话、关键词、发送者、消息类型、时间范围和分页参数搜索。`conversationID` 传 `null` 表示全局搜索。 + +```java +messageManager.searchLocalMessages(callback, conversationID, keywords, 1, + senderIDs, messageTypes, 0, 0, 0, 20); +``` diff --git a/content/zh/docs/chat/sdk/android/message/sending-messages/send-message-not-oss.mdx b/content/zh/docs/chat/sdk/android/message/sending-messages/send-message-not-oss.mdx new file mode 100644 index 0000000000..2d5fe56db3 --- /dev/null +++ b/content/zh/docs/chat/sdk/android/message/sending-messages/send-message-not-oss.mdx @@ -0,0 +1,11 @@ +--- +title: '发送不经 OSS 的消息' +description: '使用 sendMessageNotOss 发送已经由业务上传资源的媒体消息。' +sourcePath: '/sdk/android/message/sending-messages/send-message-not-oss' +--- + +消息中的媒体 URL 已准备好时使用该方法,避免 SDK 再次进入内置上传流程。 + +```java +messageManager.sendMessageNotOss(callback, message, peerUserID, null, offlinePushInfo); +``` diff --git a/content/zh/docs/chat/sdk/android/message/sending-messages/send-message.mdx b/content/zh/docs/chat/sdk/android/message/sending-messages/send-message.mdx new file mode 100644 index 0000000000..d18b4047c5 --- /dev/null +++ b/content/zh/docs/chat/sdk/android/message/sending-messages/send-message.mdx @@ -0,0 +1,14 @@ +--- +title: '发送消息' +description: '使用 sendMessage 将 Message 发送到单聊或群聊。' +sourcePath: '/sdk/android/message/sending-messages/send-message' +--- + +单聊填写 `recvUid`,群聊填写 `recvGid`,另一个目标参数传 `null`。`OnMsgSendCallback` 同时承载成功、失败和媒体进度。 + +```java +messageManager.sendMessage(new OnMsgSendCallback() { + @Override public void onSuccess(Message sentMessage) { mergeSentMessage(sentMessage); } + @Override public void onError(int code, String error) { showSendError(error); } +}, message, peerUserID, null, offlinePushInfo); +``` diff --git a/content/zh/docs/chat/sdk/android/message/sending-messages/set-msg-send-progress-listener.mdx b/content/zh/docs/chat/sdk/android/message/sending-messages/set-msg-send-progress-listener.mdx new file mode 100644 index 0000000000..521d34e08e --- /dev/null +++ b/content/zh/docs/chat/sdk/android/message/sending-messages/set-msg-send-progress-listener.mdx @@ -0,0 +1,15 @@ +--- +title: '监听消息发送进度' +description: '通过 OnMsgSendCallback 的进度回调更新媒体发送进度。' +sourcePath: '/sdk/android/message/sending-messages/set-msg-send-progress-listener' +--- + +Android 没有独立的全局发送进度 listener;进度随每次 `sendMessage()` 或 `sendMessageNotOss()` 传入的 `OnMsgSendCallback` 返回。 + +```java +messageManager.sendMessage(new OnMsgSendCallback() { + @Override public void onProgress(long progress) { updateProgress(progress); } + @Override public void onSuccess(Message sentMessage) { finishProgress(); } + @Override public void onError(int code, String error) { failProgress(error); } +}, message, peerUserID, null, offlinePushInfo); +``` diff --git a/content/zh/docs/chat/sdk/android/overview.mdx b/content/zh/docs/chat/sdk/android/overview.mdx new file mode 100644 index 0000000000..448e3fa4e4 --- /dev/null +++ b/content/zh/docs/chat/sdk/android/overview.mdx @@ -0,0 +1,21 @@ +--- +title: 'OpenIM Android SDK 概览' +description: '在原生 Android 应用中使用 OpenIM Android SDK 接入用户、会话、群组、消息、通话信令和事件能力。' +sourcePath: '/sdk/android/overview' +--- + +OpenIM Android SDK 用于在原生 Android 应用中接入 OpenIMSDK。选择下方领域进入对应章节。 + +## 文档导航 + +| 领域 | 内容 | +| --- | --- | +| [快速开始](/sdk/android/getting-started/environment-specific-implementation) | 接入 SDK、配置 Android 工程、认证、连接生命周期和发送第一条消息。 | +| [用户与关系链](/sdk/android/user/overview-user) | 用户资料、在线状态、好友、好友申请和黑名单。 | +| [会话](/sdk/android/conversation/overview-conversation) | 会话查询、草稿、未读数、接收选项、阅后即焚、隐藏和删除。 | +| [群组](/sdk/android/group/overview-group) | 群资料、群成员、入群申请、权限、禁言和群组事件。 | +| [消息](/sdk/android/message/overview-message) | 消息创建、发送、接收、历史记录、搜索、删除、撤回和已读回执。 | +| [文件上传](/sdk/android/file-uploads/upload-file) | 独立文件上传和上传进度。 | +| [音视频通话](/sdk/android/calling/overview-calling) | 通话邀请、接受、拒绝、取消、挂断、房间凭据和自定义信令。 | +| [事件](/sdk/android/events/overview-events) | 各 manager 的 listener、连接状态和数据事件。 | +| [日志](/sdk/android/logger) | SDK 日志配置和排查。 | diff --git a/content/zh/docs/chat/sdk/android/user/blacklist/add-blacklist.mdx b/content/zh/docs/chat/sdk/android/user/blacklist/add-blacklist.mdx new file mode 100644 index 0000000000..ef8e11487b --- /dev/null +++ b/content/zh/docs/chat/sdk/android/user/blacklist/add-blacklist.mdx @@ -0,0 +1,36 @@ +--- +title: '拉黑用户' +description: '使用 addBlacklist() 将用户加入当前账号黑名单。' +sourcePath: '/sdk/android/user/blacklist/add-blacklist' +--- + +```java +OpenIMClient.getInstance().friendshipManager.addBlacklist( + new OnBase() { + @Override + public void onSuccess(String data) { + markBlacklistRequestSubmitted(targetUserID); + } + + @Override + public void onError(int code, String error) { + recordBlacklistAddFailure(code, error); + } + }, + targetUserID, + "{\"source\":\"profile-menu\"}" +); +``` + +第二个参数是目标 `userID`,第三个参数是可选扩展字符串。无需扩展信息时可使用不带 `ex` 的重载。成功 callback 表示拉黑请求完成,不表示事件已经到达。 + +黑名单是单向关系:被拉黑用户不能向当前用户发送消息,但当前用户是否允许继续向对方发送消息由业务层决定。`ex` 是完整字符串,更新前应合并业务自己的扩展字段。 + +`onBlacklistAdded` 由本页归属,应组合进应用唯一的 `OnFriendshipListener`: + +```java +@Override +public void onBlacklistAdded(BlacklistInfo user) { + blacklistStore.put(user.getUserID(), user); +} +``` diff --git a/content/zh/docs/chat/sdk/android/user/blacklist/get-blacklist.mdx b/content/zh/docs/chat/sdk/android/user/blacklist/get-blacklist.mdx new file mode 100644 index 0000000000..19443fc3b4 --- /dev/null +++ b/content/zh/docs/chat/sdk/android/user/blacklist/get-blacklist.mdx @@ -0,0 +1,50 @@ +--- +title: '获取黑名单列表' +description: '使用 getBlacklist() 获取当前用户的黑名单。' +sourcePath: '/sdk/android/user/blacklist/get-blacklist' +--- + +黑名单记录当前用户主动拉黑的用户,可用于黑名单设置页、资料卡中的关系状态和聊天入口限制。黑名单与群成员管理是独立能力;禁言、移除群成员或调整群角色时,应使用群组 API。 + +## 获取黑名单 + +完成 SDK 初始化并登录后,调用 `getBlacklist()` 获取当前账号的完整黑名单。返回空列表表示当前没有黑名单用户。 + +```java +OpenIMClient.getInstance().friendshipManager.getBlacklist( + new OnBase>() { + @Override + public void onSuccess(List users) { + blacklistStore.replace(users); + } + + @Override + public void onError(int code, String error) { + recordBlacklistFailure(code, error); + } + } +); +``` + +成功 callback 返回 `List`;通过 `UserInfo.getBlackInfo()` 读取黑名单关系对象。 + +## 黑名单记录字段 + +`BlacklistInfo` 的常用字段如下: + +| 字段 | 说明 | +| ---------------- | ------------------------------------------------- | +| `userID` | 被当前用户拉黑的目标用户 ID,也是列表的稳定 key。 | +| `nickname` | 目标用户昵称快照。 | +| `faceURL` | 目标用户头像地址。 | +| `gender` | 目标用户性别值。 | +| `operatorUserID` | 执行拉黑操作的用户 ID。 | +| `createTime` | 黑名单关系创建时间。 | +| `addSource` | 黑名单关系的添加来源。 | +| `ex` | 黑名单关系扩展字符串。 | + +如果页面还要展示好友备注或最新公开资料,应按 `userID` 额外合并 `FriendInfo` 或 `PublicUserInfo`,不能把黑名单字段当作好友资料。 + +黑名单状态统一按 `userID` 合并。查询本身不会触发黑名单新增或删除事件。 + +首次进入页面、重连或用户主动刷新时,使用返回的完整列表替换本地快照;增量变化由[拉黑用户](/sdk/android/user/blacklist/add-blacklist)和[取消拉黑用户](/sdk/android/user/blacklist/remove-blacklist)页面归属的 listener 处理。 diff --git a/content/zh/docs/chat/sdk/android/user/blacklist/remove-blacklist.mdx b/content/zh/docs/chat/sdk/android/user/blacklist/remove-blacklist.mdx new file mode 100644 index 0000000000..f19628f9a3 --- /dev/null +++ b/content/zh/docs/chat/sdk/android/user/blacklist/remove-blacklist.mdx @@ -0,0 +1,33 @@ +--- +title: '取消拉黑用户' +description: '使用 removeBlacklist() 将用户移出当前账号黑名单。' +sourcePath: '/sdk/android/user/blacklist/remove-blacklist' +--- + +```java +OpenIMClient.getInstance().friendshipManager.removeBlacklist( + new OnBase() { + @Override + public void onSuccess(String data) { + markBlacklistRemovalSubmitted(targetUserID); + } + + @Override + public void onError(int code, String error) { + recordBlacklistRemovalFailure(code, error); + } + }, + targetUserID +); +``` + +成功 callback 表示移除请求完成,不表示事件已经到达。黑名单快照应在 `onBlacklistDeleted` 到达后按 `userID` 删除;如果事件丢失,可重新调用[获取黑名单列表](/sdk/android/user/blacklist/get-blacklist)校准。 + +`onBlacklistDeleted` 由本页归属,应按 `userID` 删除本地记录: + +```java +@Override +public void onBlacklistDeleted(BlacklistInfo user) { + blacklistStore.remove(user.getUserID()); +} +``` diff --git a/content/zh/docs/chat/sdk/android/user/friend-applications/accept-friend-application.mdx b/content/zh/docs/chat/sdk/android/user/friend-applications/accept-friend-application.mdx new file mode 100644 index 0000000000..a4d9c88512 --- /dev/null +++ b/content/zh/docs/chat/sdk/android/user/friend-applications/accept-friend-application.mdx @@ -0,0 +1,25 @@ +--- +title: '接受好友申请' +description: '使用 acceptFriendApplication() 接受好友申请。' +sourcePath: '/sdk/android/user/friend-applications/accept-friend-application' +--- + +```java +OpenIMClient.getInstance().friendshipManager.acceptFriendApplication( + new OnBase() { + @Override + public void onSuccess(String data) { + markApplicationAccepted(applicantUserID); + } + + @Override + public void onError(int code, String error) { + recordApplicationAcceptFailure(code, error); + } + }, + applicantUserID, + "已通过" +); +``` + +`applicantUserID` 是申请方用户 ID,最后一个参数是处理附言。成功 callback 表示接受请求完成;好友申请状态和新增好友关系可能通过不同 callback 到达,应分别合并。申请状态由 `onFriendApplicationAccepted` 更新,新好友关系由 `onFriendAdded` 更新。 diff --git a/content/zh/docs/chat/sdk/android/user/friend-applications/add-friend.mdx b/content/zh/docs/chat/sdk/android/user/friend-applications/add-friend.mdx new file mode 100644 index 0000000000..e016f501dc --- /dev/null +++ b/content/zh/docs/chat/sdk/android/user/friend-applications/add-friend.mdx @@ -0,0 +1,27 @@ +--- +title: '发送好友申请' +description: '使用 addFriend() 向指定用户发送好友申请。' +sourcePath: '/sdk/android/user/friend-applications/add-friend' +--- + +```java +OpenIMClient.getInstance().friendshipManager.addFriend( + new OnBase() { + @Override + public void onSuccess(String data) { + markFriendApplicationSubmitted(); + } + + @Override + public void onError(int code, String error) { + recordFriendApplicationFailure(code, error); + } + }, + "user_b", + "你好,我是 Alex" +); +``` + +第二个参数是申请接收方的 `userID`,第三个参数是申请附言。成功 callback 表示服务端已收到申请,不表示对方已经同意。目标用户 ID 不能为空;按昵称、手机号等字段搜索目标用户应先由业务后端完成。 + +好友申请状态变化通过 `OnFriendshipListener` 合并,见[获取收到的好友申请](/sdk/android/user/friend-applications/get-recv-friend-application-list)。 diff --git a/content/zh/docs/chat/sdk/android/user/friend-applications/get-recv-friend-application-list.mdx b/content/zh/docs/chat/sdk/android/user/friend-applications/get-recv-friend-application-list.mdx new file mode 100644 index 0000000000..788d2bfee8 --- /dev/null +++ b/content/zh/docs/chat/sdk/android/user/friend-applications/get-recv-friend-application-list.mdx @@ -0,0 +1,68 @@ +--- +title: '获取收到的好友申请' +description: '使用 getRecvFriendApplicationList() 分页查询当前用户收到的好友申请。' +sourcePath: '/sdk/android/user/friend-applications/get-recv-friend-application-list' +--- + +```java +GetFriendApplicationListAsRecipientReq request = + new GetFriendApplicationListAsRecipientReq(0, 20); + +OpenIMClient.getInstance().friendshipManager.getRecvFriendApplicationList( + new OnBase>() { + @Override + public void onSuccess(List applications) { + replaceReceivedApplications(applications); + } + + @Override + public void onError(int code, String error) { + recordReceivedApplicationFailure(code, error); + } + }, + request +); +``` + +`offset` 从 `0` 开始,`count` 是页大小。需要筛选处理状态时可通过 `setHandleResults(int[])` 设置服务端约定的状态值。成功 callback 返回当前页 `List`。 + +| 字段 | 说明 | +| --------------------------------------------- | ---------------------------------------------- | +| `fromUserID` / `fromNickname` / `fromFaceURL` | 申请发起人的 ID、昵称和头像快照。 | +| `toUserID` / `toNickname` / `toFaceURL` | 申请接收人的 ID、昵称和头像快照。 | +| `reqMsg` | 申请附言。 | +| `handleResult` | 处理结果:`0` 待处理,`1` 已同意,`2` 已拒绝。 | +| `handlerUserID` | 执行处理的用户 ID,待处理时可能为空。 | +| `handleMsg` | 处理附言。 | +| `handleTime` | 处理时间,待处理时不应作为有效时间使用。 | +| `createTime` | 申请记录创建时间。 | +| `ex` | 申请记录扩展字符串。 | + +好友申请使用 `fromUserID:toUserID` 作为稳定标识。本页归属好友申请新增、接受、拒绝和删除事件,以下 callback 应组合进应用唯一的 `OnFriendshipListener`: + +```java +@Override +public void onFriendApplicationAdded(FriendApplicationInfo application) { + friendApplicationStore.merge(application); +} + +@Override +public void onFriendApplicationAccepted(FriendApplicationInfo application) { + friendApplicationStore.merge(application); +} + +@Override +public void onFriendApplicationRejected(FriendApplicationInfo application) { + friendApplicationStore.merge(application); +} + +@Override +public void onFriendApplicationDeleted(FriendApplicationInfo application) { + friendApplicationStore.remove( + application.getFromUserID(), + application.getToUserID() + ); +} +``` + +按 `toUserID` 是否等于当前登录用户 ID,将记录分流到收到或发出的列表。申请被接受后,新好友关系由[分页获取好友列表](/sdk/android/user/friends/get-friend-list-page)归属的 `onFriendAdded` 合并。 diff --git a/content/zh/docs/chat/sdk/android/user/friend-applications/get-send-friend-application-list.mdx b/content/zh/docs/chat/sdk/android/user/friend-applications/get-send-friend-application-list.mdx new file mode 100644 index 0000000000..8379e69e7e --- /dev/null +++ b/content/zh/docs/chat/sdk/android/user/friend-applications/get-send-friend-application-list.mdx @@ -0,0 +1,29 @@ +--- +title: '获取发出的好友申请' +description: '使用 getSendFriendApplicationList() 分页查询当前用户发出的好友申请。' +sourcePath: '/sdk/android/user/friend-applications/get-send-friend-application-list' +--- + +```java +GetFriendApplicationListAsApplicantReq request = + new GetFriendApplicationListAsApplicantReq(0, 20); + +OpenIMClient.getInstance().friendshipManager.getSendFriendApplicationList( + new OnBase>() { + @Override + public void onSuccess(List applications) { + replaceSentApplications(applications); + } + + @Override + public void onError(int code, String error) { + recordSentApplicationFailure(code, error); + } + }, + request +); +``` + +`offset` 从 `0` 开始,`count` 是页大小。成功 callback 返回当前页 `List`;按 `fromUserID:toUserID` 合并。查询只建立快照,不触发好友申请事件。 + +发出的申请中,当前用户通常是 `fromUserID`。列表字段和处理结果含义与[获取收到的好友申请](/sdk/android/user/friend-applications/get-recv-friend-application-list)相同;申请处理状态使用 Android 服务端约定的 `0`(待处理)、`1`(已同意)和 `2`(已拒绝)。 diff --git a/content/zh/docs/chat/sdk/android/user/friend-applications/refuse-friend-application.mdx b/content/zh/docs/chat/sdk/android/user/friend-applications/refuse-friend-application.mdx new file mode 100644 index 0000000000..99dcfee3b4 --- /dev/null +++ b/content/zh/docs/chat/sdk/android/user/friend-applications/refuse-friend-application.mdx @@ -0,0 +1,25 @@ +--- +title: '拒绝好友申请' +description: '使用 refuseFriendApplication() 拒绝好友申请。' +sourcePath: '/sdk/android/user/friend-applications/refuse-friend-application' +--- + +```java +OpenIMClient.getInstance().friendshipManager.refuseFriendApplication( + new OnBase() { + @Override + public void onSuccess(String data) { + markApplicationRejected(applicantUserID); + } + + @Override + public void onError(int code, String error) { + recordApplicationRejectFailure(code, error); + } + }, + applicantUserID, + "暂不添加" +); +``` + +`applicantUserID` 是申请方用户 ID,最后一个参数是处理附言。成功 callback 表示拒绝请求完成;申请状态通过统一好友申请 listener 合并,并最终以 `handleResult == 2` 表示已拒绝。 diff --git a/content/zh/docs/chat/sdk/android/user/friends/check-friend.mdx b/content/zh/docs/chat/sdk/android/user/friends/check-friend.mdx new file mode 100644 index 0000000000..b9d5364cb8 --- /dev/null +++ b/content/zh/docs/chat/sdk/android/user/friends/check-friend.mdx @@ -0,0 +1,26 @@ +--- +title: '检查好友关系' +description: '使用 checkFriend() 检查指定用户是否为当前用户的好友。' +sourcePath: '/sdk/android/user/friends/check-friend' +--- + +```java +OpenIMClient.getInstance().friendshipManager.checkFriend( + new OnBase>() { + @Override + public void onSuccess(List relations) { + showFriendshipStates(relations); + } + + @Override + public void onError(int code, String error) { + recordFriendshipCheckFailure(code, error); + } + }, + Arrays.asList("user_a", "user_b") +); +``` + +成功 callback 返回 `List`。每项的 `userID` 标识目标用户,`result == 1` 表示目标是好友且不在黑名单中。`result` 以服务端返回值为准,不应在客户端扩展未声明的状态枚举。 + +该方法只建立关系快照,不触发好友 listener。需要昵称、头像或好友备注时使用 [`getFriendsInfo()`](/sdk/android/user/friends/get-friends-info)。 diff --git a/content/zh/docs/chat/sdk/android/user/friends/delete-friend.mdx b/content/zh/docs/chat/sdk/android/user/friends/delete-friend.mdx new file mode 100644 index 0000000000..f8325020e4 --- /dev/null +++ b/content/zh/docs/chat/sdk/android/user/friends/delete-friend.mdx @@ -0,0 +1,24 @@ +--- +title: '删除好友' +description: '使用 deleteFriend() 删除当前用户的一条好友关系。' +sourcePath: '/sdk/android/user/friends/delete-friend' +--- + +```java +OpenIMClient.getInstance().friendshipManager.deleteFriend( + new OnBase() { + @Override + public void onSuccess(String data) { + markFriendDeletionSubmitted(friendUserID); + } + + @Override + public void onError(int code, String error) { + recordFriendDeletionFailure(code, error); + } + }, + friendUserID +); +``` + +成功 callback 表示删除请求完成。`onFriendDeleted` 到达后再按 `userID` 从好友状态中移除记录,事件处理见[分页获取好友列表](/sdk/android/user/friends/get-friend-list-page)。 diff --git a/content/zh/docs/chat/sdk/android/user/friends/get-friend-list-page.mdx b/content/zh/docs/chat/sdk/android/user/friends/get-friend-list-page.mdx new file mode 100644 index 0000000000..c804c69daa --- /dev/null +++ b/content/zh/docs/chat/sdk/android/user/friends/get-friend-list-page.mdx @@ -0,0 +1,66 @@ +--- +title: '分页获取好友列表' +description: '使用 getFriendListPage() 分页获取当前用户的好友列表。' +sourcePath: '/sdk/android/user/friends/get-friend-list-page' +--- + +```java +OpenIMClient.getInstance().friendshipManager.getFriendListPage( + new OnBase>() { + @Override + public void onSuccess(List friends) { + for (UserInfo friend : friends) { + friendStore.put(friend.getUserID(), friend); + } + } + + @Override + public void onError(int code, String error) { + recordFriendListFailure(code, error); + } + }, + 0, + 40, + true +); +``` + +参数依次为 `offset`、`count` 和 `filterBlack`。`offset` 从 `0` 开始,`count` 是页大小,`filterBlack` 为 `true` 时过滤黑名单用户。成功 callback 返回当前页 `List`,好友关系详情可通过 `getFriendInfo()` 读取。继续加载下一页时按实际请求数量增加 `offset`;返回数量小于 `count` 时通常表示到达末页。 + +只使用分页 API,不使用非分页的 `getFriendList()`。快照和增量都应按 `userID` 合并。 + +## 好友资料字段 + +`UserInfo` 是 Android wrapper 的组合对象。好友列表中的 `getFriendInfo()` 返回 `FriendInfo`,常用字段如下: + +| 字段 | 说明 | +| ---------------- | ------------------------------------- | +| `userID` | 好友用户 ID,也是好友列表的稳定标识。 | +| `nickname` | 好友账号昵称。 | +| `faceURL` | 好友账号头像地址。 | +| `remark` | 当前账号设置的好友备注。 | +| `ex` | 好友关系扩展字符串。 | +| `addSource` | 好友关系添加来源。 | +| `operatorUserID` | 建立或更新关系的操作用户 ID。 | +| `createTime` | 好友关系创建时间。 | + +`nickname` 和 `faceURL` 是账号资料,`remark` 和 `ex` 属于好友关系。`UpdateFriendsReq` 支持提交 `isPinned`,但当前 Android `FriendInfo` 模型不提供对应读取字段,置顶状态应由业务层单独维护。不要用好友对象覆盖陌生人的 `PublicUserInfo`,也不要把好友备注写回账号昵称。 + +本页归属好友新增、资料变化和删除事件。以下 callback 应组合进应用唯一的 `OnFriendshipListener`: + +```java +@Override +public void onFriendAdded(FriendInfo friend) { + friendStore.put(friend.getUserID(), friend); +} + +@Override +public void onFriendInfoChanged(FriendInfo friend) { + friendStore.put(friend.getUserID(), friend); +} + +@Override +public void onFriendDeleted(FriendInfo friend) { + friendStore.remove(friend.getUserID()); +} +``` diff --git a/content/zh/docs/chat/sdk/android/user/friends/get-friends-info.mdx b/content/zh/docs/chat/sdk/android/user/friends/get-friends-info.mdx new file mode 100644 index 0000000000..7000e76a0e --- /dev/null +++ b/content/zh/docs/chat/sdk/android/user/friends/get-friends-info.mdx @@ -0,0 +1,31 @@ +--- +title: '查询指定好友资料' +description: '使用 getFriendsInfo() 查询指定用户的好友关系资料。' +sourcePath: '/sdk/android/user/friends/get-friends-info' +--- + +```java +OpenIMClient.getInstance().friendshipManager.getFriendsInfo( + new OnBase>() { + @Override + public void onSuccess(List friends) { + for (UserInfo friend : friends) { + friendStore.put(friend.getUserID(), friend); + } + } + + @Override + public void onError(int code, String error) { + recordFriendInfoFailure(code, error); + } + }, + Arrays.asList("user_a", "user_b"), + true +); +``` + +第二个参数是目标用户 ID 列表,`filterBlack` 决定是否过滤黑名单用户。成功 callback 返回 `List`;通过 `getFriendInfo()` 读取好友备注和关系字段,并按 `userID` 合并。调用前应去除空值和重复 ID。 + +当目标用户不是好友,或目标用户因 `filterBlack == true` 被过滤时,返回结果中可能没有对应记录。需要同时展示账号公开资料时,应再调用[获取指定用户资料](/sdk/android/user/user-profile/get-users-info),并按 `userID` 合并两类数据。 + +该查询不会触发好友 listener。只需要判断好友关系时使用 [`checkFriend()`](/sdk/android/user/friends/check-friend)。 diff --git a/content/zh/docs/chat/sdk/android/user/friends/search-friends.mdx b/content/zh/docs/chat/sdk/android/user/friends/search-friends.mdx new file mode 100644 index 0000000000..c2906f3348 --- /dev/null +++ b/content/zh/docs/chat/sdk/android/user/friends/search-friends.mdx @@ -0,0 +1,29 @@ +--- +title: '搜索好友' +description: '使用 searchFriends() 搜索当前用户的好友。' +sourcePath: '/sdk/android/user/friends/search-friends' +--- + +```java +OpenIMClient.getInstance().friendshipManager.searchFriends( + new OnBase>() { + @Override + public void onSuccess(List results) { + showFriendSearchResults(results); + } + + @Override + public void onError(int code, String error) { + recordFriendSearchFailure(code, error); + } + }, + Collections.singletonList(keyword.trim()), + true, + true, + true +); +``` + +`keywordList` 当前只传一个非空关键词。后面的三个布尔值依次控制是否匹配用户 ID、昵称和好友备注,至少应启用一种匹配方式。需要同时搜索多个字段时,将对应开关设为 `true`;不支持把多个关键词作为同一请求的独立搜索条件。 + +成功 callback 返回 `List`。搜索结果只属于当前搜索视图,不应覆盖完整好友列表,也不会触发好友 listener。 diff --git a/content/zh/docs/chat/sdk/android/user/friends/update-friends.mdx b/content/zh/docs/chat/sdk/android/user/friends/update-friends.mdx new file mode 100644 index 0000000000..2e60882934 --- /dev/null +++ b/content/zh/docs/chat/sdk/android/user/friends/update-friends.mdx @@ -0,0 +1,37 @@ +--- +title: '更新好友资料' +description: '使用 updateFriendsReq() 更新好友备注、置顶状态或扩展字段。' +sourcePath: '/sdk/android/user/friends/update-friends' +--- + +```java +UpdateFriendsReq request = new UpdateFriendsReq(); +request.setFriendUserIDs(new String[] { friendUserID }); +request.setRemark(remark.trim()); + +OpenIMClient.getInstance().friendshipManager.updateFriendsReq( + new OnBase() { + @Override + public void onSuccess(String data) { + markFriendUpdateSubmitted(); + } + + @Override + public void onError(int code, String error) { + recordFriendUpdateFailure(code, error); + } + }, + request +); +``` + +`UpdateFriendsReq` 可设置 `friendUserIDs`、`remark`、`isPinned` 和 `ex`。一次调用会把同一字段值应用到全部目标好友;不同好友需要不同值时应分别调用。`ex` 是完整字符串。 + +| 字段 | 说明 | +| --------------- | ---------------------------------- | +| `friendUserIDs` | 待更新的好友 ID 数组。 | +| `remark` | 当前账号设置的好友备注。 | +| `isPinned` | 是否置顶好友。 | +| `ex` | 好友关系扩展字符串,按完整值覆盖。 | + +成功 callback 表示更新请求完成。好友资料增量通过 `onFriendInfoChanged` 合并,事件处理见[分页获取好友列表](/sdk/android/user/friends/get-friend-list-page)。 diff --git a/content/zh/docs/chat/sdk/android/user/online-status/get-subscribe-online-users-status.mdx b/content/zh/docs/chat/sdk/android/user/online-status/get-subscribe-online-users-status.mdx new file mode 100644 index 0000000000..906c4b4045 --- /dev/null +++ b/content/zh/docs/chat/sdk/android/user/online-status/get-subscribe-online-users-status.mdx @@ -0,0 +1,25 @@ +--- +title: '查询已订阅用户状态' +description: '使用 getSubscribeOnlineUsersStatus() 获取已订阅用户的在线状态快照。' +sourcePath: '/sdk/android/user/online-status/get-subscribe-online-users-status' +--- + +```java +OpenIMClient.getInstance().userInfoManager.getSubscribeOnlineUsersStatus( + new OnBase>() { + @Override + public void onSuccess(List states) { + mergeOnlineStates(states); + } + + @Override + public void onError(int code, String error) { + recordStatusQueryFailure(code, error); + } + } +); +``` + +该方法不接收用户 ID,也不改变订阅集合。成功 callback 返回当前已订阅用户的 `List` 状态快照,适合在重连或重新进入页面时按 `userID` 校准状态。 + +查询本身不会触发 `onUserStatusChanged`。状态快照只应覆盖在线状态存储,不要覆盖用户昵称、头像等资料字段;需要资料时分别调用用户资料 API。 diff --git a/content/zh/docs/chat/sdk/android/user/online-status/subscribe-users-online-status.mdx b/content/zh/docs/chat/sdk/android/user/online-status/subscribe-users-online-status.mdx new file mode 100644 index 0000000000..db82484ce2 --- /dev/null +++ b/content/zh/docs/chat/sdk/android/user/online-status/subscribe-users-online-status.mdx @@ -0,0 +1,45 @@ +--- +title: '订阅用户在线状态' +description: '使用 subscribeUsersOnlineStatus() 订阅指定用户的在线状态。' +sourcePath: '/sdk/android/user/online-status/subscribe-users-online-status' +--- + +```java +List userIDs = Arrays.asList("user_a", "user_b"); + +OpenIMClient.getInstance().userInfoManager.subscribeUsersOnlineStatus( + new OnBase>() { + @Override + public void onSuccess(List states) { + mergeOnlineStates(states); + } + + @Override + public void onError(int code, String error) { + recordStatusSubscriptionFailure(code, error); + } + }, + userIDs +); +``` + +调用前应去除空值和重复 ID,并只订阅当前业务需要展示的用户。成功 callback 返回初始 `List` 快照,每项包含 `userID`、`status` 和 `platformIDs`。重复订阅同一个用户时,应由应用层去重并保留一份状态。 + +## 状态字段 + +| 字段 | 说明 | +| ------------- | ------------------------------------------ | +| `userID` | 目标用户 ID。 | +| `status` | 在线状态值,具体枚举含义以服务端契约为准。 | +| `platformIDs` | 当前在线的平台 ID 列表。 | + +`onUserStatusChanged` 由本页归属,应组合进应用唯一的 `OnUserListener`,并按 `userID` 合并: + +```java +@Override +public void onUserStatusChanged(UsersOnlineStatus status) { + onlineStatusStore.put(status.getUserID(), status); +} +``` + +订阅操作只建立或更新订阅集合,不应把 callback 返回值当作好友资料。用户离开可见范围或切换账号时,由应用统一管理订阅集合,并通过[取消用户状态订阅](/sdk/android/user/online-status/unsubscribe-users-online-status)移除不再需要的用户。 diff --git a/content/zh/docs/chat/sdk/android/user/online-status/unsubscribe-users-online-status.mdx b/content/zh/docs/chat/sdk/android/user/online-status/unsubscribe-users-online-status.mdx new file mode 100644 index 0000000000..caf17506e6 --- /dev/null +++ b/content/zh/docs/chat/sdk/android/user/online-status/unsubscribe-users-online-status.mdx @@ -0,0 +1,32 @@ +--- +title: '取消用户状态订阅' +description: '使用 unsubscribeOnlineUsersStatus 取消指定用户的在线状态订阅。' +sourcePath: '/sdk/android/user/online-status/unsubscribe-users-online-status' +--- + +用户离开可见范围、页面结束或切换账号时,取消不再需要的在线状态订阅。调用前应去除空值和重复 ID。 + +```java +List userIDs = Arrays.asList("user_a", "user_b"); + +OpenIMClient.getInstance().userInfoManager.unsubscribeOnlineUsersStatus( + new OnBase() { + @Override + public void onSuccess(String data) { + for (String userID : userIDs) { + presenceByUserID.remove(userID); + } + } + + @Override + public void onError(int code, String error) { + recordStatusUnsubscribeFailure(code, error); + } + }, + userIDs +); +``` + +成功 callback 表示取消订阅请求已完成。此后再从应用维护的订阅集合和在线状态缓存中移除这些 `userID`;失败时保留原状态,以便重试。该操作不会修改用户资料或好友关系。 + +需要再次跟踪用户状态时,重新调用[订阅用户在线状态](/sdk/android/user/online-status/subscribe-users-online-status)。 diff --git a/content/zh/docs/chat/sdk/android/user/overview-user.mdx b/content/zh/docs/chat/sdk/android/user/overview-user.mdx new file mode 100644 index 0000000000..7b447ea85c --- /dev/null +++ b/content/zh/docs/chat/sdk/android/user/overview-user.mdx @@ -0,0 +1,55 @@ +--- +title: '用户概览' +description: '了解 Android SDK 中的用户资料、好友关系、好友申请、黑名单和在线状态 API。' +sourcePath: '/sdk/android/user/overview-user' +--- + +OpenIM Android SDK 使用 `userID` 标识用户。实现资料卡、好友添加、联系人或黑名单功能时,需要区分应用用户的公开资料、当前用户维护的好友关系,以及黑名单状态。 + +群成员列表、群内昵称、群角色和成员管理属于群组能力,应使用群组相关 API;用户 API 只处理用户资料、好友关系、好友申请、黑名单和在线状态。 + +## 用户类型 + +Android SDK 会根据使用场景返回不同的用户对象: + +| 类型 | 适用场景 | 主要 API | +| ----------------------- | -------------------------------------------------------------------- | ----------------------------------------------------------------- | +| `LocalUser` | 当前登录用户的本地资料、设置页、头像、昵称和账号级接收设置 | `getSelfLocalUserInfo()`、`setSelfInfo()` | +| `PublicUserInfo` | 查询应用用户、查找好友候选人和展示陌生人资料卡 | `getUsersInfo()` | +| `UserInfo` | Android wrapper 返回的组合对象,可承载公开资料、好友资料或黑名单资料 | `getFriendListPage()`、`getFriendsInfo()`、`getBlacklist()` | +| `FriendInfo` | 当前用户的好友列表、好友备注和关系扩展字段 | `searchFriends()`、`getFriendListPage()` | +| `FriendApplicationInfo` | 好友申请双方、处理状态和附言 | 好友申请查询与 listener | +| `BlacklistInfo` | 当前用户拉黑的用户及黑名单关系字段 | `getBlacklist()`、`addBlacklist()`、`removeBlacklist()` | +| `UsersOnlineStatus` | 用户在线状态和在线平台列表 | `subscribeUsersOnlineStatus()`、`getSubscribeOnlineUsersStatus()`、`unsubscribeOnlineUsersStatus()` | + +同一个 `userID` 可能同时出现在公开资料、好友资料、黑名单和群成员资料中。展示联系人信息时优先使用 `UserInfo.getFriendInfo()`;只需要账号公开资料时使用 `PublicUserInfo`;黑名单页面使用 `UserInfo.getBlackInfo()`。会话列表和聊天页标题属于会话数据,应使用会话对象中的展示名称。 + +所有列表和事件都应使用 `userID` 作为稳定标识。好友申请同时包含申请方和接收方,应使用 `fromUserID:toUserID` 标识一条申请。 + +## 功能入口 + +下表列出了用户相关的常见需求和对应页面: + +| 需求 | 推荐页面 | +| -------------------------------------------------------- | -------------------------------------------------------------------------------------------- | +| 按 `userID` 查询公开资料,用于查找好友候选人或展示资料卡 | [获取指定用户资料](/sdk/android/user/user-profile/get-users-info) | +| 分页、搜索或按 ID 查询好友关系 | [分页获取好友列表](/sdk/android/user/friends/get-friend-list-page) | +| 发送、查询、接受或拒绝好友申请 | [获取收到的好友申请](/sdk/android/user/friend-applications/get-recv-friend-application-list) | +| 修改好友资料 | [更新好友资料](/sdk/android/user/friends/update-friends) | +| 删除好友关系 | [删除好友](/sdk/android/user/friends/delete-friend) | +| 查看和维护当前用户黑名单 | [获取黑名单列表](/sdk/android/user/blacklist/get-blacklist) | +| 读取或更新当前用户的昵称、头像和扩展资料 | [更新当前用户资料](/sdk/android/user/user-profile/set-self-info) | +| 设置账号级消息接收和通知策略 | [设置全局消息接收方式](/sdk/android/user/user-profile/set-global-message-reception) | +| 订阅、读取和取消在线状态 | [订阅用户在线状态](/sdk/android/user/online-status/subscribe-users-online-status)、[取消用户状态订阅](/sdk/android/user/online-status/unsubscribe-users-online-status) | + +## 状态更新 + +用户相关事件由对应能力页负责监听和合并: + +- 当前用户资料变化:见[更新当前用户资料](/sdk/android/user/user-profile/set-self-info)。 +- 好友申请变化:见[获取收到的好友申请](/sdk/android/user/friend-applications/get-recv-friend-application-list)。 +- 好友关系和好友资料变化:见[分页获取好友列表](/sdk/android/user/friends/get-friend-list-page)。 +- 黑名单变化:见[拉黑用户](/sdk/android/user/blacklist/add-blacklist)。 +- 在线状态变化:见[订阅用户在线状态](/sdk/android/user/online-status/subscribe-users-online-status)。 + +Android SDK 的 `UserInfoManager` 和 `FriendshipManager` 各保存一个 listener,`setOnUserListener()` 和 `setOnFriendshipListener()` 都采用替换语义。应用应在统一状态层组合各页面所需 callback,并分别设置一次,不能让多个页面重复设置而覆盖其他 callback。 diff --git a/content/zh/docs/chat/sdk/android/user/user-profile/get-self-local-user-info.mdx b/content/zh/docs/chat/sdk/android/user/user-profile/get-self-local-user-info.mdx new file mode 100644 index 0000000000..ba1e47677b --- /dev/null +++ b/content/zh/docs/chat/sdk/android/user/user-profile/get-self-local-user-info.mdx @@ -0,0 +1,39 @@ +--- +title: '获取当前用户资料' +description: '使用 getSelfLocalUserInfo() 获取当前登录用户的本地资料。' +sourcePath: '/sdk/android/user/user-profile/get-self-local-user-info' +--- + +```java +OpenIMClient.getInstance().userInfoManager.getSelfLocalUserInfo( + new OnBase() { + @Override + public void onSuccess(LocalUser user) { + currentUserStore.set(user); + } + + @Override + public void onError(int code, String error) { + recordSelfProfileFailure(code, error); + } + } +); +``` + +完成初始化并登录后调用该方法获取当前账号的本地资料。成功 callback 返回 `LocalUser`,包含 `userID`、`nickname`、`faceURL`、`ex`、`attachedInfo`、`globalRecvMsgOpt` 和 `addFriendPermission` 等字段。 + +## 返回结果 + +| 字段 | 说明 | +| --------------------- | -------------------------------------------------------------- | +| `userID` | 当前登录用户 ID。 | +| `nickname` | 当前账号昵称。 | +| `faceURL` | 当前账号头像地址。 | +| `ex` | 当前账号扩展字符串。 | +| `attachedInfo` | SDK 附加信息,只按业务约定解析。 | +| `globalRecvMsgOpt` | 全局消息接收方式:`0` 正常接收,`1` 不接收,`2` 接收但不提示。 | +| `addFriendPermission` | 添加好友权限值,具体含义由服务端契约定义。 | + +查询不会触发资料变更 callback。退出或切换账号时应清理旧账号快照,避免把上一个账号的资料显示在当前页面。 + +`getSelfUserInfo()` 已废弃,不作为推荐用法。 diff --git a/content/zh/docs/chat/sdk/android/user/user-profile/get-users-info.mdx b/content/zh/docs/chat/sdk/android/user/user-profile/get-users-info.mdx new file mode 100644 index 0000000000..ecda2545f8 --- /dev/null +++ b/content/zh/docs/chat/sdk/android/user/user-profile/get-users-info.mdx @@ -0,0 +1,48 @@ +--- +title: '获取指定用户资料' +description: '使用 getUsersInfo() 按 userID 批量查询用户公开资料。' +sourcePath: '/sdk/android/user/user-profile/get-users-info' +--- + +`getUsersInfo()` 根据 `userID` 列表返回用户的公开资料,适合展示好友候选人或陌生人资料卡。该方法只读取公开资料,不返回当前账号为好友设置的备注等关系字段。 + +```java +List userIDs = Arrays.asList("user_a", "user_b"); + +OpenIMClient.getInstance().userInfoManager.getUsersInfo( + new OnBase>() { + @Override + public void onSuccess(List users) { + for (PublicUserInfo user : users) { + publicUserStore.put(user.getUserID(), user); + } + } + + @Override + public void onError(int code, String error) { + recordUserQueryFailure(code, error); + } + }, + userIDs +); +``` + +调用前应去除空值和重复 ID,并控制单次请求的数量。成功 callback 返回 `List`,主要字段包括 `userID`、`nickname`、`faceURL`、`ex` 和 `createTime`。查询不会触发 `OnUserListener`,需要刷新资料时应重新调用并按 `userID` 合并结果。 + +## 返回结果 + +| 字段 | 说明 | +| ------------ | ---------------------------------------- | +| `userID` | OpenIM 用户 ID,也是本地缓存的稳定 key。 | +| `nickname` | 账号级公开昵称。 | +| `faceURL` | 账号级公开头像地址。 | +| `ex` | 账号级公开扩展字符串,格式由业务约定。 | +| `createTime` | 用户资料创建时间。 | + +`PublicUserInfo` 中的资料不能用于覆盖好友备注、置顶状态或群内昵称。展示好友时应使用 `FriendInfo`,展示群成员时应使用群成员模型。 + +按昵称、手机号或邮箱搜索用户属于业务服务能力,应由可信后端完成搜索和权限校验,再把候选 `userID` 交给客户端查询公开资料。 + +## 资料刷新 + +查询成功后,以返回结果更新公开资料快照。打开资料卡、用户主动刷新、断线重连或业务后端通知资料变化时,可以重新调用该方法校准数据。`OnUserListener.onSelfInfoUpdated` 只表示当前登录用户资料变化,不能作为其他用户资料变化事件。 diff --git a/content/zh/docs/chat/sdk/android/user/user-profile/set-global-message-reception.mdx b/content/zh/docs/chat/sdk/android/user/user-profile/set-global-message-reception.mdx new file mode 100644 index 0000000000..6b8608767f --- /dev/null +++ b/content/zh/docs/chat/sdk/android/user/user-profile/set-global-message-reception.mdx @@ -0,0 +1,37 @@ +--- +title: '设置全局消息接收方式' +description: '通过 setSelfInfo() 设置当前账号的全局消息接收与通知策略。' +sourcePath: '/sdk/android/user/user-profile/set-global-message-reception' +--- + +使用独立的 `UserInfoReq` 写入 `globalRecvMsgOpt`,避免在更新昵称或头像时意外覆盖账号级消息策略。 + +```java +UserInfoReq request = new UserInfoReq(); +request.setGlobalRecvMsgOpt(2); + +OpenIMClient.getInstance().userInfoManager.setSelfInfo( + new OnBase() { + @Override + public void onSuccess(String data) { + markGlobalReceiveOptionSubmitted(); + } + + @Override + public void onError(int code, String error) { + recordGlobalReceiveOptionFailure(code, error); + } + }, + request +); +``` + +| 数值 | 含义 | +| ---- | ------------------------ | +| `0` | 正常接收消息并允许通知。 | +| `1` | 屏蔽消息。 | +| `2` | 接收消息但不提示。 | + +如果产品只提供“全局免打扰”开关,通常在 `0` 和 `2` 之间切换;`1` 会停止接收消息,应单独展示。单个会话的接收方式由会话 API 管理,不受本设置替代。 + +成功 callback 表示请求完成。最终账号快照通过 `onSelfInfoUpdated` 或 `getSelfLocalUserInfo()` 校准,事件处理见[更新当前用户资料](/sdk/android/user/user-profile/set-self-info)。 diff --git a/content/zh/docs/chat/sdk/android/user/user-profile/set-self-info.mdx b/content/zh/docs/chat/sdk/android/user/user-profile/set-self-info.mdx new file mode 100644 index 0000000000..0378abf4a0 --- /dev/null +++ b/content/zh/docs/chat/sdk/android/user/user-profile/set-self-info.mdx @@ -0,0 +1,55 @@ +--- +title: '更新当前用户资料' +description: '使用 setSelfInfo() 更新当前用户的昵称、头像或扩展资料。' +sourcePath: '/sdk/android/user/user-profile/set-self-info' +--- + +使用 `UserInfoReq` 只设置实际需要修改的字段。SDK 序列化请求时会忽略 `null` 字段。 + +```java +UserInfoReq request = new UserInfoReq(); +request.setNickname(displayName.trim()); +request.setFaceURL(avatarURL); +request.setEx(mergedExtra); + +OpenIMClient.getInstance().userInfoManager.setSelfInfo( + new OnBase() { + @Override + public void onSuccess(String data) { + markProfileUpdateSubmitted(); + } + + @Override + public void onError(int code, String error) { + recordProfileUpdateFailure(code, error); + } + }, + request +); +``` + +`UserInfoReq` 支持 `nickname`、`faceURL`、`ex` 和 `addFriendPermission` 等字段。`ex` 是完整字符串,更新前应读取、解析并合并业务自己的命名空间;不要把部分 JSON 直接覆盖到服务端。 + +成功 callback 表示更新请求完成;当前账号资料的最终增量通过 `onSelfInfoUpdated(UserInfo info)` 到达,或重新调用 `getSelfLocalUserInfo()` 校准。 + +## 更新字段 + +| 字段 | 说明 | +| --------------------- | ------------------ | +| `nickname` | 要更新的昵称。 | +| `faceURL` | 要更新的头像地址。 | +| `ex` | 完整扩展字符串。 | +| `addFriendPermission` | 添加好友权限值。 | + +一次请求只写入需要变更的字段。全局消息接收策略虽然也由 `setSelfInfo()` 写入,但应使用独立入口,见[设置全局消息接收方式](/sdk/android/user/user-profile/set-global-message-reception)。 + +`onSelfInfoUpdated` 由本页归属,应组合进应用唯一的 `OnUserListener`: + +```java +@Override +public void onSelfInfoUpdated(UserInfo info) { + currentUserStore.merge(info.getUserID(), info); +} +``` + +账号级消息接收策略也通过 `UserInfoReq` 更新,但应使用独立入口,见[设置全局消息接收方式](/sdk/android/user/user-profile/set-global-message-reception)。 diff --git a/data/structure/android-content-audit.json b/data/structure/android-content-audit.json new file mode 100644 index 0000000000..a8d324a7df --- /dev/null +++ b/data/structure/android-content-audit.json @@ -0,0 +1,6052 @@ +{ + "schemaVersion": 1, + "sources": { + "openimDocs": { + "repository": "https://github.com/openimsdk/docs", + "commit": "efd0f251b288167e1ca617504b10dd73986429f0" + }, + "androidSdk": { + "repository": "https://github.com/openimsdk/open-im-sdk-android-enterprise", + "tag": "v3.8.4.0", + "commit": "f82b142c7d3b4b66ce20586adabc69de9cd61673" + } + }, + "pages": [ + { + "currentPath": "/sdk/android/group/overview-group", + "targetPath": "/sdk/android/group/overview-group", + "sourceKind": "openim-specific", + "disposition": "adapt", + "openimSources": [ + "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/manager/GroupManager.java" + ], + "sdkMethods": [ + "setOnGroupListener" + ], + "sdkEvents": [ + "onGroupApplicationAccepted", + "onGroupApplicationAdded", + "onGroupApplicationDeleted", + "onGroupApplicationRejected", + "onGroupDismissed", + "onGroupInfoChanged", + "onGroupMemberAdded", + "onGroupMemberDeleted", + "onGroupMemberInfoChanged", + "onJoinedGroupAdded", + "onJoinedGroupDeleted" + ], + "locales": { + "zh": { + "reviewStatus": "published", + "reviewer": "Codex", + "reviewedAt": "2026-08-07", + "exampleVerification": { + "status": "verified", + "evidence": [ + "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/listener/OnGroupListener.java" + ], + "reason": null + } + }, + "en": { + "reviewStatus": "published", + "reviewer": "Codex", + "reviewedAt": "2026-08-06", + "exampleVerification": { + "status": "verified", + "evidence": [ + "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/listener/OnGroupListener.java" + ], + "reason": null + } + } + }, + "redirectTo": null + }, + { + "currentPath": "/sdk/android/group/create-group", + "targetPath": "/sdk/android/group/create-group", + "sourceKind": "openim-specific", + "disposition": "adapt", + "openimSources": [ + "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/manager/GroupManager.java" + ], + "sdkMethods": [ + "createGroup" + ], + "sdkEvents": [], + "locales": { + "zh": { + "reviewStatus": "published", + "reviewer": "Codex", + "reviewedAt": "2026-08-07", + "exampleVerification": { + "status": "verified", + "evidence": [ + "GroupManager.createGroup" + ], + "reason": null + } + }, + "en": { + "reviewStatus": "published", + "reviewer": "Codex", + "reviewedAt": "2026-08-10", + "exampleVerification": { + "status": "verified", + "evidence": [ + "GroupManager.createGroup" + ], + "reason": null + } + } + }, + "redirectTo": null + }, + { + "currentPath": "/sdk/android/group/update-group-profile", + "targetPath": "/sdk/android/group/update-group-profile", + "sourceKind": "openim-specific", + "disposition": "adapt", + "openimSources": [ + "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/manager/GroupManager.java" + ], + "sdkMethods": [ + "setGroupInfo" + ], + "sdkEvents": [], + "locales": { + "zh": { + "reviewStatus": "published", + "reviewer": "Codex", + "reviewedAt": "2026-08-10", + "exampleVerification": { + "status": "verified", + "evidence": [ + "GroupManager.setGroupInfo" + ], + "reason": null + } + }, + "en": { + "reviewStatus": "published", + "reviewer": "Codex", + "reviewedAt": "2026-08-10", + "exampleVerification": { + "status": "verified", + "evidence": [ + "GroupManager.setGroupInfo" + ], + "reason": null + } + } + }, + "redirectTo": null + }, + { + "currentPath": "/sdk/android/group/set-group-announcement", + "targetPath": "/sdk/android/group/set-group-announcement", + "sourceKind": "openim-specific", + "disposition": "adapt", + "openimSources": [ + "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/manager/GroupManager.java" + ], + "sdkMethods": [ + "setGroupInfo" + ], + "sdkEvents": [], + "locales": { + "zh": { + "reviewStatus": "published", + "reviewer": "Codex", + "reviewedAt": "2026-08-10", + "exampleVerification": { + "status": "verified", + "evidence": [ + "GroupManager.setGroupInfo" + ], + "reason": null + } + }, + "en": { + "reviewStatus": "published", + "reviewer": "Codex", + "reviewedAt": "2026-08-10", + "exampleVerification": { + "status": "verified", + "evidence": [ + "GroupManager.setGroupInfo" + ], + "reason": null + } + } + }, + "redirectTo": null + }, + { + "currentPath": "/sdk/android/group/set-group-extension", + "targetPath": "/sdk/android/group/set-group-extension", + "sourceKind": "openim-specific", + "disposition": "adapt", + "openimSources": [ + "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/manager/GroupManager.java" + ], + "sdkMethods": [ + "setGroupInfo" + ], + "sdkEvents": [], + "locales": { + "zh": { + "reviewStatus": "published", + "reviewer": "Codex", + "reviewedAt": "2026-08-10", + "exampleVerification": { + "status": "verified", + "evidence": [ + "GroupManager.setGroupInfo" + ], + "reason": null + } + }, + "en": { + "reviewStatus": "published", + "reviewer": "Codex", + "reviewedAt": "2026-08-10", + "exampleVerification": { + "status": "verified", + "evidence": [ + "GroupManager.setGroupInfo" + ], + "reason": null + } + } + }, + "redirectTo": null + }, + { + "currentPath": "/sdk/android/group/set-group-join-verification", + "targetPath": "/sdk/android/group/set-group-join-verification", + "sourceKind": "openim-specific", + "disposition": "adapt", + "openimSources": [ + "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/manager/GroupManager.java" + ], + "sdkMethods": [ + "setGroupInfo" + ], + "sdkEvents": [], + "locales": { + "zh": { + "reviewStatus": "published", + "reviewer": "Codex", + "reviewedAt": "2026-08-07", + "exampleVerification": { + "status": "verified", + "evidence": [ + "GroupInfo.setNeedVerification" + ], + "reason": null + } + }, + "en": { + "reviewStatus": "published", + "reviewer": "Codex", + "reviewedAt": "2026-08-10", + "exampleVerification": { + "status": "verified", + "evidence": [ + "GroupInfo.setNeedVerification" + ], + "reason": null + } + } + }, + "redirectTo": null + }, + { + "currentPath": "/sdk/android/group/set-group-member-profile-access", + "targetPath": "/sdk/android/group/set-group-member-profile-access", + "sourceKind": "openim-specific", + "disposition": "adapt", + "openimSources": [ + "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/manager/GroupManager.java" + ], + "sdkMethods": [ + "setGroupInfo" + ], + "sdkEvents": [], + "locales": { + "zh": { + "reviewStatus": "published", + "reviewer": "Codex", + "reviewedAt": "2026-08-07", + "exampleVerification": { + "status": "verified", + "evidence": [ + "GroupInfo.setLookMemberInfo" + ], + "reason": null + } + }, + "en": { + "reviewStatus": "published", + "reviewer": "Codex", + "reviewedAt": "2026-08-10", + "exampleVerification": { + "status": "verified", + "evidence": [ + "GroupInfo.setLookMemberInfo" + ], + "reason": null + } + } + }, + "redirectTo": null + }, + { + "currentPath": "/sdk/android/group/set-group-member-friend-permission", + "targetPath": "/sdk/android/group/set-group-member-friend-permission", + "sourceKind": "openim-specific", + "disposition": "adapt", + "openimSources": [ + "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/manager/GroupManager.java" + ], + "sdkMethods": [ + "setGroupInfo" + ], + "sdkEvents": [], + "locales": { + "zh": { + "reviewStatus": "published", + "reviewer": "Codex", + "reviewedAt": "2026-08-10", + "exampleVerification": { + "status": "verified", + "evidence": [ + "GroupInfo.setApplyMemberFriend" + ], + "reason": null + } + }, + "en": { + "reviewStatus": "published", + "reviewer": "Codex", + "reviewedAt": "2026-08-10", + "exampleVerification": { + "status": "verified", + "evidence": [ + "GroupInfo.setApplyMemberFriend" + ], + "reason": null + } + } + }, + "redirectTo": null + }, + { + "currentPath": "/sdk/android/group/change-group-mute", + "targetPath": "/sdk/android/group/change-group-mute", + "sourceKind": "openim-specific", + "disposition": "adapt", + "openimSources": [ + "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/manager/GroupManager.java" + ], + "sdkMethods": [ + "changeGroupMute" + ], + "sdkEvents": [], + "locales": { + "zh": { + "reviewStatus": "published", + "reviewer": "Codex", + "reviewedAt": "2026-08-10", + "exampleVerification": { + "status": "verified", + "evidence": [ + "GroupManager.changeGroupMute" + ], + "reason": null + } + }, + "en": { + "reviewStatus": "published", + "reviewer": "Codex", + "reviewedAt": "2026-08-10", + "exampleVerification": { + "status": "verified", + "evidence": [ + "GroupManager.changeGroupMute" + ], + "reason": null + } + } + }, + "redirectTo": null + }, + { + "currentPath": "/sdk/android/group/join-group", + "targetPath": "/sdk/android/group/join-group", + "sourceKind": "openim-specific", + "disposition": "adapt", + "openimSources": [ + "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/manager/GroupManager.java" + ], + "sdkMethods": [ + "joinGroup" + ], + "sdkEvents": [], + "locales": { + "zh": { + "reviewStatus": "published", + "reviewer": "Codex", + "reviewedAt": "2026-08-07", + "exampleVerification": { + "status": "verified", + "evidence": [ + "GroupManager.joinGroup" + ], + "reason": null + } + }, + "en": { + "reviewStatus": "published", + "reviewer": "Codex", + "reviewedAt": "2026-08-10", + "exampleVerification": { + "status": "verified", + "evidence": [ + "GroupManager.joinGroup" + ], + "reason": null + } + } + }, + "redirectTo": null + }, + { + "currentPath": "/sdk/android/group/quit-group", + "targetPath": "/sdk/android/group/quit-group", + "sourceKind": "openim-specific", + "disposition": "adapt", + "openimSources": [ + "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/manager/GroupManager.java" + ], + "sdkMethods": [ + "quitGroup" + ], + "sdkEvents": [], + "locales": { + "zh": { + "reviewStatus": "published", + "reviewer": "Codex", + "reviewedAt": "2026-08-07", + "exampleVerification": { + "status": "verified", + "evidence": [ + "GroupManager.quitGroup" + ], + "reason": null + } + }, + "en": { + "reviewStatus": "published", + "reviewer": "Codex", + "reviewedAt": "2026-08-10", + "exampleVerification": { + "status": "verified", + "evidence": [ + "GroupManager.quitGroup" + ], + "reason": null + } + } + }, + "redirectTo": null + }, + { + "currentPath": "/sdk/android/group/dismiss-group", + "targetPath": "/sdk/android/group/dismiss-group", + "sourceKind": "openim-specific", + "disposition": "adapt", + "openimSources": [ + "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/manager/GroupManager.java" + ], + "sdkMethods": [ + "dismissGroup" + ], + "sdkEvents": [], + "locales": { + "zh": { + "reviewStatus": "published", + "reviewer": "Codex", + "reviewedAt": "2026-08-07", + "exampleVerification": { + "status": "verified", + "evidence": [ + "GroupManager.dismissGroup" + ], + "reason": null + } + }, + "en": { + "reviewStatus": "published", + "reviewer": "Codex", + "reviewedAt": "2026-08-10", + "exampleVerification": { + "status": "verified", + "evidence": [ + "GroupManager.dismissGroup" + ], + "reason": null + } + } + }, + "redirectTo": null + }, + { + "currentPath": "/sdk/android/group/retrieving-groups/get-specified-groups-info", + "targetPath": "/sdk/android/group/retrieving-groups/get-specified-groups-info", + "sourceKind": "openim-specific", + "disposition": "adapt", + "openimSources": [ + "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/manager/GroupManager.java" + ], + "sdkMethods": [ + "getGroupsInfo" + ], + "sdkEvents": [], + "locales": { + "zh": { + "reviewStatus": "published", + "reviewer": "Codex", + "reviewedAt": "2026-08-10", + "exampleVerification": { + "status": "verified", + "evidence": [ + "GroupManager.getGroupsInfo" + ], + "reason": null + } + }, + "en": { + "reviewStatus": "published", + "reviewer": "Codex", + "reviewedAt": "2026-08-10", + "exampleVerification": { + "status": "verified", + "evidence": [ + "GroupManager.getGroupsInfo" + ], + "reason": null + } + } + }, + "redirectTo": null + }, + { + "currentPath": "/sdk/android/group/retrieving-groups/get-joined-group-list-page", + "targetPath": "/sdk/android/group/retrieving-groups/get-joined-group-list-page", + "sourceKind": "openim-specific", + "disposition": "adapt", + "openimSources": [ + "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/manager/GroupManager.java" + ], + "sdkMethods": [ + "getJoinedGroupListPage" + ], + "sdkEvents": [], + "locales": { + "zh": { + "reviewStatus": "published", + "reviewer": "Codex", + "reviewedAt": "2026-08-07", + "exampleVerification": { + "status": "verified", + "evidence": [ + "GroupManager.getJoinedGroupListPage" + ], + "reason": null + } + }, + "en": { + "reviewStatus": "published", + "reviewer": "Codex", + "reviewedAt": "2026-08-10", + "exampleVerification": { + "status": "verified", + "evidence": [ + "GroupManager.getJoinedGroupListPage" + ], + "reason": null + } + } + }, + "redirectTo": null + }, + { + "currentPath": "/sdk/android/group/retrieving-groups/is-join-group", + "targetPath": "/sdk/android/group/retrieving-groups/is-join-group", + "sourceKind": "openim-specific", + "disposition": "adapt", + "openimSources": [ + "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/manager/GroupManager.java" + ], + "sdkMethods": [ + "isJoinGroup" + ], + "sdkEvents": [], + "locales": { + "zh": { + "reviewStatus": "published", + "reviewer": "Codex", + "reviewedAt": "2026-08-10", + "exampleVerification": { + "status": "verified", + "evidence": [ + "GroupManager.isJoinGroup" + ], + "reason": null + } + }, + "en": { + "reviewStatus": "published", + "reviewer": "Codex", + "reviewedAt": "2026-08-10", + "exampleVerification": { + "status": "verified", + "evidence": [ + "GroupManager.isJoinGroup" + ], + "reason": null + } + } + }, + "redirectTo": null + }, + { + "currentPath": "/sdk/android/group/retrieving-groups/search-groups", + "targetPath": "/sdk/android/group/retrieving-groups/search-groups", + "sourceKind": "openim-specific", + "disposition": "adapt", + "openimSources": [ + "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/manager/GroupManager.java" + ], + "sdkMethods": [ + "searchGroups" + ], + "sdkEvents": [], + "locales": { + "zh": { + "reviewStatus": "published", + "reviewer": "Codex", + "reviewedAt": "2026-08-07", + "exampleVerification": { + "status": "verified", + "evidence": [ + "GroupManager.searchGroups" + ], + "reason": null + } + }, + "en": { + "reviewStatus": "published", + "reviewer": "Codex", + "reviewedAt": "2026-08-10", + "exampleVerification": { + "status": "verified", + "evidence": [ + "GroupManager.searchGroups" + ], + "reason": null + } + } + }, + "redirectTo": null + }, + { + "currentPath": "/sdk/android/group/group-applications/overview-group-applications", + "targetPath": "/sdk/android/group/group-applications/overview-group-applications", + "sourceKind": "openim-specific", + "disposition": "adapt", + "openimSources": [ + "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/listener/OnGroupListener.java" + ], + "sdkMethods": [], + "sdkEvents": [], + "locales": { + "zh": { + "reviewStatus": "published", + "reviewer": "Codex", + "reviewedAt": "2026-08-10", + "exampleVerification": { + "status": "not-applicable", + "evidence": [], + "reason": "概览页仅说明申请状态和页面职责。" + } + }, + "en": { + "reviewStatus": "published", + "reviewer": "Codex", + "reviewedAt": "2026-08-10", + "exampleVerification": { + "status": "not-applicable", + "evidence": [], + "reason": "This overview explains application state and page responsibilities without a code example." + } + } + }, + "redirectTo": null + }, + { + "currentPath": "/sdk/android/group/group-applications/get-group-application-list-as-recipient", + "targetPath": "/sdk/android/group/group-applications/get-group-application-list-as-recipient", + "sourceKind": "openim-specific", + "disposition": "adapt", + "openimSources": [ + "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/manager/GroupManager.java" + ], + "sdkMethods": [ + "getRecvGroupApplicationList" + ], + "sdkEvents": [], + "locales": { + "zh": { + "reviewStatus": "published", + "reviewer": "Codex", + "reviewedAt": "2026-08-10", + "exampleVerification": { + "status": "verified", + "evidence": [ + "GroupManager.getRecvGroupApplicationList" + ], + "reason": null + } + }, + "en": { + "reviewStatus": "published", + "reviewer": "Codex", + "reviewedAt": "2026-08-10", + "exampleVerification": { + "status": "verified", + "evidence": [ + "GroupManager.getRecvGroupApplicationList" + ], + "reason": null + } + } + }, + "redirectTo": null + }, + { + "currentPath": "/sdk/android/group/group-applications/get-group-application-list-as-applicant", + "targetPath": "/sdk/android/group/group-applications/get-group-application-list-as-applicant", + "sourceKind": "openim-specific", + "disposition": "adapt", + "openimSources": [ + "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/manager/GroupManager.java" + ], + "sdkMethods": [ + "getSendGroupApplicationList" + ], + "sdkEvents": [], + "locales": { + "zh": { + "reviewStatus": "published", + "reviewer": "Codex", + "reviewedAt": "2026-08-10", + "exampleVerification": { + "status": "verified", + "evidence": [ + "GroupManager.getSendGroupApplicationList" + ], + "reason": null + } + }, + "en": { + "reviewStatus": "published", + "reviewer": "Codex", + "reviewedAt": "2026-08-10", + "exampleVerification": { + "status": "verified", + "evidence": [ + "GroupManager.getSendGroupApplicationList" + ], + "reason": null + } + } + }, + "redirectTo": null + }, + { + "currentPath": "/sdk/android/group/group-applications/accept-group-application", + "targetPath": "/sdk/android/group/group-applications/accept-group-application", + "sourceKind": "openim-specific", + "disposition": "adapt", + "openimSources": [ + "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/manager/GroupManager.java" + ], + "sdkMethods": [ + "acceptGroupApplication" + ], + "sdkEvents": [], + "locales": { + "zh": { + "reviewStatus": "published", + "reviewer": "Codex", + "reviewedAt": "2026-08-10", + "exampleVerification": { + "status": "verified", + "evidence": [ + "GroupManager.acceptGroupApplication" + ], + "reason": null + } + }, + "en": { + "reviewStatus": "published", + "reviewer": "Codex", + "reviewedAt": "2026-08-10", + "exampleVerification": { + "status": "verified", + "evidence": [ + "GroupManager.acceptGroupApplication" + ], + "reason": null + } + } + }, + "redirectTo": null + }, + { + "currentPath": "/sdk/android/group/group-applications/refuse-group-application", + "targetPath": "/sdk/android/group/group-applications/refuse-group-application", + "sourceKind": "openim-specific", + "disposition": "adapt", + "openimSources": [ + "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/manager/GroupManager.java" + ], + "sdkMethods": [ + "refuseGroupApplication" + ], + "sdkEvents": [], + "locales": { + "zh": { + "reviewStatus": "published", + "reviewer": "Codex", + "reviewedAt": "2026-08-10", + "exampleVerification": { + "status": "verified", + "evidence": [ + "GroupManager.refuseGroupApplication" + ], + "reason": null + } + }, + "en": { + "reviewStatus": "published", + "reviewer": "Codex", + "reviewedAt": "2026-08-10", + "exampleVerification": { + "status": "verified", + "evidence": [ + "GroupManager.refuseGroupApplication" + ], + "reason": null + } + } + }, + "redirectTo": null + }, + { + "currentPath": "/sdk/android/group/retrieving-group-members/overview-retrieving-group-members", + "targetPath": "/sdk/android/group/retrieving-group-members/overview-retrieving-group-members", + "sourceKind": "openim-specific", + "disposition": "adapt", + "openimSources": [ + "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/manager/GroupManager.java" + ], + "sdkMethods": [], + "sdkEvents": [], + "locales": { + "zh": { + "reviewStatus": "published", + "reviewer": "Codex", + "reviewedAt": "2026-08-07", + "exampleVerification": { + "status": "not-applicable", + "evidence": [], + "reason": "概览页仅说明成员查询的标识与返回模型。" + } + }, + "en": { + "reviewStatus": "published", + "reviewer": "Codex", + "reviewedAt": "2026-08-10", + "exampleVerification": { + "status": "not-applicable", + "evidence": [], + "reason": "This overview explains query identifiers and returned models without a code example." + } + } + }, + "redirectTo": null + }, + { + "currentPath": "/sdk/android/group/retrieving-group-members/get-group-member-list", + "targetPath": "/sdk/android/group/retrieving-group-members/get-group-member-list", + "sourceKind": "openim-specific", + "disposition": "adapt", + "openimSources": [ + "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/manager/GroupManager.java" + ], + "sdkMethods": [ + "getGroupMemberList" + ], + "sdkEvents": [], + "locales": { + "zh": { + "reviewStatus": "published", + "reviewer": "Codex", + "reviewedAt": "2026-08-10", + "exampleVerification": { + "status": "verified", + "evidence": [ + "GroupManager.getGroupMemberList" + ], + "reason": null + } + }, + "en": { + "reviewStatus": "published", + "reviewer": "Codex", + "reviewedAt": "2026-08-10", + "exampleVerification": { + "status": "verified", + "evidence": [ + "GroupManager.getGroupMemberList" + ], + "reason": null + } + } + }, + "redirectTo": null + }, + { + "currentPath": "/sdk/android/group/retrieving-group-members/get-specified-group-members-info", + "targetPath": "/sdk/android/group/retrieving-group-members/get-specified-group-members-info", + "sourceKind": "openim-specific", + "disposition": "adapt", + "openimSources": [ + "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/manager/GroupManager.java" + ], + "sdkMethods": [ + "getGroupMembersInfo" + ], + "sdkEvents": [], + "locales": { + "zh": { + "reviewStatus": "published", + "reviewer": "Codex", + "reviewedAt": "2026-08-10", + "exampleVerification": { + "status": "verified", + "evidence": [ + "GroupManager.getGroupMembersInfo" + ], + "reason": null + } + }, + "en": { + "reviewStatus": "published", + "reviewer": "Codex", + "reviewedAt": "2026-08-10", + "exampleVerification": { + "status": "verified", + "evidence": [ + "GroupManager.getGroupMembersInfo" + ], + "reason": null + } + } + }, + "redirectTo": null + }, + { + "currentPath": "/sdk/android/group/retrieving-group-members/get-users-in-group", + "targetPath": "/sdk/android/group/retrieving-group-members/get-users-in-group", + "sourceKind": "openim-specific", + "disposition": "adapt", + "openimSources": [ + "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/manager/GroupManager.java" + ], + "sdkMethods": [ + "getUsersInGroup" + ], + "sdkEvents": [], + "locales": { + "zh": { + "reviewStatus": "published", + "reviewer": "Codex", + "reviewedAt": "2026-08-10", + "exampleVerification": { + "status": "verified", + "evidence": [ + "GroupManager.getUsersInGroup" + ], + "reason": null + } + }, + "en": { + "reviewStatus": "published", + "reviewer": "Codex", + "reviewedAt": "2026-08-10", + "exampleVerification": { + "status": "verified", + "evidence": [ + "GroupManager.getUsersInGroup" + ], + "reason": null + } + } + }, + "redirectTo": null + }, + { + "currentPath": "/sdk/android/group/retrieving-group-members/get-group-member-owner-and-admin", + "targetPath": "/sdk/android/group/retrieving-group-members/get-group-member-owner-and-admin", + "sourceKind": "openim-specific", + "disposition": "adapt", + "openimSources": [ + "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/manager/GroupManager.java" + ], + "sdkMethods": [ + "getGroupMemberOwnerAndAdmin" + ], + "sdkEvents": [], + "locales": { + "zh": { + "reviewStatus": "published", + "reviewer": "Codex", + "reviewedAt": "2026-08-07", + "exampleVerification": { + "status": "verified", + "evidence": [ + "GroupManager.getGroupMemberOwnerAndAdmin" + ], + "reason": null + } + }, + "en": { + "reviewStatus": "published", + "reviewer": "Codex", + "reviewedAt": "2026-08-10", + "exampleVerification": { + "status": "verified", + "evidence": [ + "GroupManager.getGroupMemberOwnerAndAdmin" + ], + "reason": null + } + } + }, + "redirectTo": null + }, + { + "currentPath": "/sdk/android/group/retrieving-group-members/search-group-members", + "targetPath": "/sdk/android/group/retrieving-group-members/search-group-members", + "sourceKind": "openim-specific", + "disposition": "adapt", + "openimSources": [ + "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/manager/GroupManager.java" + ], + "sdkMethods": [ + "searchGroupMembers" + ], + "sdkEvents": [], + "locales": { + "zh": { + "reviewStatus": "published", + "reviewer": "Codex", + "reviewedAt": "2026-08-07", + "exampleVerification": { + "status": "verified", + "evidence": [ + "GroupManager.searchGroupMembers" + ], + "reason": null + } + }, + "en": { + "reviewStatus": "published", + "reviewer": "Codex", + "reviewedAt": "2026-08-10", + "exampleVerification": { + "status": "verified", + "evidence": [ + "GroupManager.searchGroupMembers" + ], + "reason": null + } + } + }, + "redirectTo": null + }, + { + "currentPath": "/sdk/android/group/managing-group-members/invite-user-to-group", + "targetPath": "/sdk/android/group/managing-group-members/invite-user-to-group", + "sourceKind": "openim-specific", + "disposition": "adapt", + "openimSources": [ + "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/manager/GroupManager.java" + ], + "sdkMethods": [ + "inviteUserToGroup" + ], + "sdkEvents": [], + "locales": { + "zh": { + "reviewStatus": "published", + "reviewer": "Codex", + "reviewedAt": "2026-08-10", + "exampleVerification": { + "status": "verified", + "evidence": [ + "GroupManager.inviteUserToGroup" + ], + "reason": null + } + }, + "en": { + "reviewStatus": "published", + "reviewer": "Codex", + "reviewedAt": "2026-08-10", + "exampleVerification": { + "status": "verified", + "evidence": [ + "GroupManager.inviteUserToGroup" + ], + "reason": null + } + } + }, + "redirectTo": null + }, + { + "currentPath": "/sdk/android/group/managing-group-members/kick-group-member", + "targetPath": "/sdk/android/group/managing-group-members/kick-group-member", + "sourceKind": "openim-specific", + "disposition": "adapt", + "openimSources": [ + "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/manager/GroupManager.java" + ], + "sdkMethods": [ + "kickGroupMember" + ], + "sdkEvents": [], + "locales": { + "zh": { + "reviewStatus": "published", + "reviewer": "Codex", + "reviewedAt": "2026-08-07", + "exampleVerification": { + "status": "verified", + "evidence": [ + "GroupManager.kickGroupMember" + ], + "reason": null + } + }, + "en": { + "reviewStatus": "published", + "reviewer": "Codex", + "reviewedAt": "2026-08-10", + "exampleVerification": { + "status": "verified", + "evidence": [ + "GroupManager.kickGroupMember" + ], + "reason": null + } + } + }, + "redirectTo": null + }, + { + "currentPath": "/sdk/android/group/managing-group-members/set-group-member-nickname", + "targetPath": "/sdk/android/group/managing-group-members/set-group-member-nickname", + "sourceKind": "openim-specific", + "disposition": "adapt", + "openimSources": [ + "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/manager/GroupManager.java" + ], + "sdkMethods": [ + "setGroupMemberInfo" + ], + "sdkEvents": [], + "locales": { + "zh": { + "reviewStatus": "published", + "reviewer": "Codex", + "reviewedAt": "2026-08-10", + "exampleVerification": { + "status": "verified", + "evidence": [ + "GroupManager.setGroupMemberInfo" + ], + "reason": null + } + }, + "en": { + "reviewStatus": "published", + "reviewer": "Codex", + "reviewedAt": "2026-08-10", + "exampleVerification": { + "status": "verified", + "evidence": [ + "GroupManager.setGroupMemberInfo" + ], + "reason": null + } + } + }, + "redirectTo": null + }, + { + "currentPath": "/sdk/android/group/managing-group-members/set-group-member-role-level", + "targetPath": "/sdk/android/group/managing-group-members/set-group-member-role-level", + "sourceKind": "openim-specific", + "disposition": "adapt", + "openimSources": [ + "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/manager/GroupManager.java" + ], + "sdkMethods": [ + "setGroupMemberInfo" + ], + "sdkEvents": [], + "locales": { + "zh": { + "reviewStatus": "published", + "reviewer": "Codex", + "reviewedAt": "2026-08-10", + "exampleVerification": { + "status": "verified", + "evidence": [ + "GroupManager.setGroupMemberInfo" + ], + "reason": null + } + }, + "en": { + "reviewStatus": "published", + "reviewer": "Codex", + "reviewedAt": "2026-08-10", + "exampleVerification": { + "status": "verified", + "evidence": [ + "GroupManager.setGroupMemberInfo" + ], + "reason": null + } + } + }, + "redirectTo": null + }, + { + "currentPath": "/sdk/android/group/managing-group-members/set-group-member-avatar", + "targetPath": "/sdk/android/group/managing-group-members/set-group-member-avatar", + "sourceKind": "openim-specific", + "disposition": "adapt", + "openimSources": [ + "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/manager/GroupManager.java" + ], + "sdkMethods": [ + "setGroupMemberInfo" + ], + "sdkEvents": [], + "locales": { + "zh": { + "reviewStatus": "published", + "reviewer": "Codex", + "reviewedAt": "2026-08-07", + "exampleVerification": { + "status": "verified", + "evidence": [ + "GroupManager.setGroupMemberInfo" + ], + "reason": null + } + }, + "en": { + "reviewStatus": "published", + "reviewer": "Codex", + "reviewedAt": "2026-08-10", + "exampleVerification": { + "status": "verified", + "evidence": [ + "GroupManager.setGroupMemberInfo" + ], + "reason": null + } + } + }, + "redirectTo": null + }, + { + "currentPath": "/sdk/android/group/managing-group-members/set-group-member-extension", + "targetPath": "/sdk/android/group/managing-group-members/set-group-member-extension", + "sourceKind": "openim-specific", + "disposition": "adapt", + "openimSources": [ + "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/manager/GroupManager.java" + ], + "sdkMethods": [ + "setGroupMemberInfo" + ], + "sdkEvents": [], + "locales": { + "zh": { + "reviewStatus": "published", + "reviewer": "Codex", + "reviewedAt": "2026-08-07", + "exampleVerification": { + "status": "verified", + "evidence": [ + "GroupManager.setGroupMemberInfo" + ], + "reason": null + } + }, + "en": { + "reviewStatus": "published", + "reviewer": "Codex", + "reviewedAt": "2026-08-10", + "exampleVerification": { + "status": "verified", + "evidence": [ + "GroupManager.setGroupMemberInfo" + ], + "reason": null + } + } + }, + "redirectTo": null + }, + { + "currentPath": "/sdk/android/group/managing-group-members/transfer-group-owner", + "targetPath": "/sdk/android/group/managing-group-members/transfer-group-owner", + "sourceKind": "openim-specific", + "disposition": "adapt", + "openimSources": [ + "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/manager/GroupManager.java" + ], + "sdkMethods": [ + "transferGroupOwner" + ], + "sdkEvents": [], + "locales": { + "zh": { + "reviewStatus": "published", + "reviewer": "Codex", + "reviewedAt": "2026-08-07", + "exampleVerification": { + "status": "verified", + "evidence": [ + "GroupManager.transferGroupOwner" + ], + "reason": null + } + }, + "en": { + "reviewStatus": "published", + "reviewer": "Codex", + "reviewedAt": "2026-08-10", + "exampleVerification": { + "status": "verified", + "evidence": [ + "GroupManager.transferGroupOwner" + ], + "reason": null + } + } + }, + "redirectTo": null + }, + { + "currentPath": "/sdk/android/group/managing-group-members/change-group-member-mute", + "targetPath": "/sdk/android/group/managing-group-members/change-group-member-mute", + "sourceKind": "openim-specific", + "disposition": "adapt", + "openimSources": [ + "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/manager/GroupManager.java" + ], + "sdkMethods": [ + "changeGroupMemberMute" + ], + "sdkEvents": [], + "locales": { + "zh": { + "reviewStatus": "published", + "reviewer": "Codex", + "reviewedAt": "2026-08-10", + "exampleVerification": { + "status": "verified", + "evidence": [ + "GroupManager.changeGroupMemberMute" + ], + "reason": null + } + }, + "en": { + "reviewStatus": "published", + "reviewer": "Codex", + "reviewedAt": "2026-08-10", + "exampleVerification": { + "status": "verified", + "evidence": [ + "GroupManager.changeGroupMemberMute" + ], + "reason": null + } + } + }, + "redirectTo": null + }, + { + "currentPath": "/sdk/android/overview", + "targetPath": "/sdk/android/overview", + "sourceKind": "openim-specific", + "disposition": "adapt", + "openimSources": [ + "https://github.com/openimsdk/open-im-sdk-android-enterprise/tree/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk", + "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/OpenIMClient.java" + ], + "sdkMethods": [ + "OpenIMClient.getInstance" + ], + "sdkEvents": [], + "locales": { + "zh": { + "reviewStatus": "published", + "reviewer": "Codex", + "reviewedAt": "2026-08-06", + "exampleVerification": { + "status": "verified", + "evidence": [ + "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/OpenIMClient.java" + ], + "reason": null + } + }, + "en": { + "reviewStatus": "published", + "reviewer": "Codex", + "reviewedAt": "2026-08-06", + "exampleVerification": { + "status": "verified", + "evidence": [ + "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/OpenIMClient.java" + ], + "reason": "Manually translated from the reviewed Chinese page and verified against the pinned Android SDK source." + } + } + }, + "redirectTo": null, + "notes": [ + "2026-08-06:基于 Android SDK v3.8.4.0 固定提交逐页核对客户端入口、manager 划分、状态合并标识和版本边界。" + ] + }, + { + "currentPath": "/sdk/android/getting-started/before-you-start", + "targetPath": "/sdk/android/getting-started/before-you-start", + "sourceKind": "openim-specific", + "disposition": "adapt", + "openimSources": [ + "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/build.gradle", + "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/models/InitConfig.java" + ], + "sdkMethods": [], + "sdkEvents": [], + "locales": { + "zh": { + "reviewStatus": "published", + "reviewer": "Codex", + "reviewedAt": "2026-08-06", + "exampleVerification": { + "status": "verified", + "evidence": [ + "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/build.gradle", + "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/models/InitConfig.java" + ], + "reason": null + } + }, + "en": { + "reviewStatus": "published", + "reviewer": "Codex", + "reviewedAt": "2026-08-10", + "exampleVerification": { + "status": "verified", + "evidence": [ + "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/build.gradle", + "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/models/InitConfig.java" + ], + "reason": "Manually translated from the reviewed Chinese page and verified against the pinned Android SDK source." + } + } + }, + "redirectTo": null, + "notes": [ + "2026-08-06:逐页核对服务地址、可信 Token 来源、Android 构建版本、数据目录和 ABI 准备项。" + ] + }, + { + "currentPath": "/sdk/android/getting-started/environment-specific-implementation", + "targetPath": "/sdk/android/getting-started/environment-specific-implementation", + "sourceKind": "openim-specific", + "disposition": "adapt", + "openimSources": [ + "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/README.md", + "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/build.gradle", + "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/OpenIMClient.java", + "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/models/InitConfig.java" + ], + "sdkMethods": [ + "initSDK", + "networkChanged", + "logout", + "unInit" + ], + "sdkEvents": [], + "locales": { + "zh": { + "reviewStatus": "published", + "reviewer": "Codex", + "reviewedAt": "2026-08-06", + "exampleVerification": { + "status": "verified", + "evidence": [ + "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/README.md", + "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/OpenIMClient.java", + "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/models/InitConfig.java" + ], + "reason": null + } + }, + "en": { + "reviewStatus": "published", + "reviewer": "Codex", + "reviewedAt": "2026-08-06", + "exampleVerification": { + "status": "verified", + "evidence": [ + "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/README.md", + "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/OpenIMClient.java", + "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/models/InitConfig.java" + ], + "reason": "Manually translated from the reviewed Chinese page and verified against the pinned Android SDK source." + } + } + }, + "redirectTo": null, + "notes": [ + "2026-08-06:逐页核对源码 module、Core AAR、Manifest、混淆、InitConfig 和应用生命周期边界;未沿用旧文档中不可验证的 latest@aar 坐标。" + ] + }, + { + "currentPath": "/sdk/android/getting-started/authenticate-and-manage-session", + "targetPath": "/sdk/android/getting-started/authenticate-and-manage-session", + "sourceKind": "openim-specific", + "disposition": "adapt", + "openimSources": [ + "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/OpenIMClient.java", + "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/enums/LoginStatus.java", + "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/listener/OnConnListener.java" + ], + "sdkMethods": [ + "initSDK", + "login", + "getLoginStatus", + "getLoginUserID", + "logout", + "unInit" + ], + "sdkEvents": [ + "onConnecting", + "onConnectSuccess", + "onConnectFailed", + "onKickedOffline", + "onUserTokenExpired", + "onUserTokenInvalid" + ], + "locales": { + "zh": { + "reviewStatus": "published", + "reviewer": "Codex", + "reviewedAt": "2026-08-06", + "exampleVerification": { + "status": "verified", + "evidence": [ + "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/OpenIMClient.java", + "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/enums/LoginStatus.java", + "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/listener/OnConnListener.java" + ], + "reason": null + } + }, + "en": { + "reviewStatus": "published", + "reviewer": "Codex", + "reviewedAt": "2026-08-06", + "exampleVerification": { + "status": "verified", + "evidence": [ + "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/OpenIMClient.java", + "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/enums/LoginStatus.java", + "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/listener/OnConnListener.java" + ], + "reason": "Manually translated from the reviewed Chinese page and verified against the pinned Android SDK source." + } + } + }, + "redirectTo": null, + "notes": [ + "2026-08-06:逐页核对初始化、登录状态、连接 callback、Token 失效、强制下线、退出与释放边界。" + ] + }, + { + "currentPath": "/sdk/android/getting-started/send-first-message", + "targetPath": "/sdk/android/getting-started/send-first-message", + "sourceKind": "openim-specific", + "disposition": "adapt", + "openimSources": [ + "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/manager/MessageManager.java", + "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/listener/OnAdvanceMsgListener.java", + "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/listener/OnMsgSendCallback.java", + "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/models/OfflinePushInfo.java" + ], + "sdkMethods": [ + "setAdvancedMsgListener", + "login", + "createTextMessage", + "sendMessage" + ], + "sdkEvents": [ + "onRecvNewMessage" + ], + "locales": { + "zh": { + "reviewStatus": "published", + "reviewer": "Codex", + "reviewedAt": "2026-08-06", + "exampleVerification": { + "status": "verified", + "evidence": [ + "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/manager/MessageManager.java", + "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/listener/OnAdvanceMsgListener.java", + "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/listener/OnMsgSendCallback.java" + ], + "reason": null + } + }, + "en": { + "reviewStatus": "published", + "reviewer": "Codex", + "reviewedAt": "2026-08-06", + "exampleVerification": { + "status": "verified", + "evidence": [ + "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/manager/MessageManager.java", + "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/listener/OnAdvanceMsgListener.java", + "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/listener/OnMsgSendCallback.java" + ], + "reason": "Manually translated from the reviewed Chinese page and verified against the pinned Android SDK source." + } + } + }, + "redirectTo": null, + "notes": [ + "2026-08-06:逐页核对文本消息创建、单聊与群聊目标、离线推送信息、发送 callback、接收 listener 和 clientMsgID 合并规则。" + ] + }, + { + "currentPath": "/sdk/android/user/overview-user", + "targetPath": "/sdk/android/user/overview-user", + "sourceKind": "openim-specific", + "disposition": "adapt", + "openimSources": [ + "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/manager/UserInfoManager.java", + "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/manager/FriendshipManager.java" + ], + "sdkMethods": [], + "sdkEvents": [], + "locales": { + "zh": { + "reviewStatus": "published", + "reviewer": "Codex", + "reviewedAt": "2026-08-10", + "exampleVerification": { + "status": "not-applicable", + "evidence": [], + "reason": "概览页不包含代码示例。" + } + }, + "en": { + "reviewStatus": "published", + "reviewer": "Codex", + "reviewedAt": "2026-08-10", + "exampleVerification": { + "status": "not-applicable", + "evidence": [], + "reason": "The overview does not contain code examples." + } + } + }, + "redirectTo": null + }, + { + "currentPath": "/sdk/android/user/user-profile/get-users-info", + "targetPath": "/sdk/android/user/user-profile/get-users-info", + "sourceKind": "openim-specific", + "disposition": "adapt", + "openimSources": [ + "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/manager/UserInfoManager.java" + ], + "sdkMethods": [ + "getUsersInfo" + ], + "sdkEvents": [], + "locales": { + "zh": { + "reviewStatus": "published", + "reviewer": "Codex", + "reviewedAt": "2026-08-06", + "exampleVerification": { + "status": "verified", + "evidence": [ + "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/manager/UserInfoManager.java" + ], + "reason": null + } + }, + "en": { + "reviewStatus": "published", + "reviewer": "Codex", + "reviewedAt": "2026-08-06", + "exampleVerification": { + "status": "verified", + "evidence": [ + "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/manager/UserInfoManager.java" + ], + "reason": "Manually translated and verified against the pinned Android source." + } + } + }, + "redirectTo": null + }, + { + "currentPath": "/sdk/android/user/user-profile/get-self-local-user-info", + "targetPath": "/sdk/android/user/user-profile/get-self-local-user-info", + "sourceKind": "openim-specific", + "disposition": "adapt", + "openimSources": [ + "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/manager/UserInfoManager.java" + ], + "sdkMethods": [ + "getSelfLocalUserInfo" + ], + "sdkEvents": [], + "locales": { + "zh": { + "reviewStatus": "published", + "reviewer": "Codex", + "reviewedAt": "2026-08-06", + "exampleVerification": { + "status": "verified", + "evidence": [ + "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/manager/UserInfoManager.java" + ], + "reason": null + } + }, + "en": { + "reviewStatus": "published", + "reviewer": "Codex", + "reviewedAt": "2026-08-06", + "exampleVerification": { + "status": "verified", + "evidence": [ + "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/manager/UserInfoManager.java" + ], + "reason": "Manually translated and verified against the pinned Android source." + } + } + }, + "redirectTo": null + }, + { + "currentPath": "/sdk/android/user/user-profile/set-self-info", + "targetPath": "/sdk/android/user/user-profile/set-self-info", + "sourceKind": "openim-specific", + "disposition": "adapt", + "openimSources": [ + "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/manager/UserInfoManager.java", + "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/listener/OnUserListener.java" + ], + "sdkMethods": [ + "setSelfInfo" + ], + "sdkEvents": [ + "onSelfInfoUpdated" + ], + "locales": { + "zh": { + "reviewStatus": "published", + "reviewer": "Codex", + "reviewedAt": "2026-08-06", + "exampleVerification": { + "status": "verified", + "evidence": [ + "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/manager/UserInfoManager.java", + "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/listener/OnUserListener.java" + ], + "reason": null + } + }, + "en": { + "reviewStatus": "published", + "reviewer": "Codex", + "reviewedAt": "2026-08-10", + "exampleVerification": { + "status": "verified", + "evidence": [ + "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/manager/UserInfoManager.java", + "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/listener/OnUserListener.java" + ], + "reason": "Manually translated and verified against the pinned Android source." + } + } + }, + "redirectTo": null + }, + { + "currentPath": "/sdk/android/user/user-profile/set-global-message-reception", + "targetPath": "/sdk/android/user/user-profile/set-global-message-reception", + "sourceKind": "openim-specific", + "disposition": "adapt", + "openimSources": [ + "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/manager/UserInfoManager.java" + ], + "sdkMethods": [ + "setSelfInfo" + ], + "sdkEvents": [], + "locales": { + "zh": { + "reviewStatus": "published", + "reviewer": "Codex", + "reviewedAt": "2026-08-06", + "exampleVerification": { + "status": "verified", + "evidence": [ + "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/manager/UserInfoManager.java" + ], + "reason": null + } + }, + "en": { + "reviewStatus": "published", + "reviewer": "Codex", + "reviewedAt": "2026-08-06", + "exampleVerification": { + "status": "verified", + "evidence": [ + "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/manager/UserInfoManager.java" + ], + "reason": "Manually translated and verified against the pinned Android source." + } + } + }, + "redirectTo": null + }, + { + "currentPath": "/sdk/android/user/friends/get-friend-list-page", + "targetPath": "/sdk/android/user/friends/get-friend-list-page", + "sourceKind": "openim-specific", + "disposition": "adapt", + "openimSources": [ + "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/manager/FriendshipManager.java", + "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/listener/OnFriendshipListener.java" + ], + "sdkMethods": [ + "getFriendListPage" + ], + "sdkEvents": [ + "onFriendAdded", + "onFriendInfoChanged", + "onFriendDeleted" + ], + "locales": { + "zh": { + "reviewStatus": "published", + "reviewer": "Codex", + "reviewedAt": "2026-08-06", + "exampleVerification": { + "status": "verified", + "evidence": [ + "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/manager/FriendshipManager.java", + "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/listener/OnFriendshipListener.java" + ], + "reason": null + } + }, + "en": { + "reviewStatus": "published", + "reviewer": "Codex", + "reviewedAt": "2026-08-06", + "exampleVerification": { + "status": "verified", + "evidence": [ + "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/manager/FriendshipManager.java", + "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/listener/OnFriendshipListener.java" + ], + "reason": "Manually translated and verified against the pinned Android source." + } + } + }, + "redirectTo": null + }, + { + "currentPath": "/sdk/android/user/friends/search-friends", + "targetPath": "/sdk/android/user/friends/search-friends", + "sourceKind": "openim-specific", + "disposition": "adapt", + "openimSources": [ + "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/manager/FriendshipManager.java" + ], + "sdkMethods": [ + "searchFriends" + ], + "sdkEvents": [], + "locales": { + "zh": { + "reviewStatus": "published", + "reviewer": "Codex", + "reviewedAt": "2026-08-06", + "exampleVerification": { + "status": "verified", + "evidence": [ + "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/manager/FriendshipManager.java" + ], + "reason": null + } + }, + "en": { + "reviewStatus": "published", + "reviewer": "Codex", + "reviewedAt": "2026-08-06", + "exampleVerification": { + "status": "verified", + "evidence": [ + "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/manager/FriendshipManager.java" + ], + "reason": "Manually translated and verified against the pinned Android source." + } + } + }, + "redirectTo": null + }, + { + "currentPath": "/sdk/android/user/friends/get-friends-info", + "targetPath": "/sdk/android/user/friends/get-friends-info", + "sourceKind": "openim-specific", + "disposition": "adapt", + "openimSources": [ + "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/manager/FriendshipManager.java" + ], + "sdkMethods": [ + "getFriendsInfo" + ], + "sdkEvents": [], + "locales": { + "zh": { + "reviewStatus": "published", + "reviewer": "Codex", + "reviewedAt": "2026-08-06", + "exampleVerification": { + "status": "verified", + "evidence": [ + "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/manager/FriendshipManager.java" + ], + "reason": null + } + }, + "en": { + "reviewStatus": "published", + "reviewer": "Codex", + "reviewedAt": "2026-08-06", + "exampleVerification": { + "status": "verified", + "evidence": [ + "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/manager/FriendshipManager.java" + ], + "reason": "Manually translated and verified against the pinned Android source." + } + } + }, + "redirectTo": null + }, + { + "currentPath": "/sdk/android/user/friends/check-friend", + "targetPath": "/sdk/android/user/friends/check-friend", + "sourceKind": "openim-specific", + "disposition": "adapt", + "openimSources": [ + "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/manager/FriendshipManager.java" + ], + "sdkMethods": [ + "checkFriend" + ], + "sdkEvents": [], + "locales": { + "zh": { + "reviewStatus": "published", + "reviewer": "Codex", + "reviewedAt": "2026-08-06", + "exampleVerification": { + "status": "verified", + "evidence": [ + "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/manager/FriendshipManager.java" + ], + "reason": null + } + }, + "en": { + "reviewStatus": "published", + "reviewer": "Codex", + "reviewedAt": "2026-08-06", + "exampleVerification": { + "status": "verified", + "evidence": [ + "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/manager/FriendshipManager.java" + ], + "reason": "Manually translated and verified against the pinned Android source." + } + } + }, + "redirectTo": null + }, + { + "currentPath": "/sdk/android/user/friends/update-friends", + "targetPath": "/sdk/android/user/friends/update-friends", + "sourceKind": "openim-specific", + "disposition": "adapt", + "openimSources": [ + "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/manager/FriendshipManager.java" + ], + "sdkMethods": [ + "updateFriendsReq" + ], + "sdkEvents": [], + "locales": { + "zh": { + "reviewStatus": "published", + "reviewer": "Codex", + "reviewedAt": "2026-08-06", + "exampleVerification": { + "status": "verified", + "evidence": [ + "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/manager/FriendshipManager.java" + ], + "reason": null + } + }, + "en": { + "reviewStatus": "published", + "reviewer": "Codex", + "reviewedAt": "2026-08-06", + "exampleVerification": { + "status": "verified", + "evidence": [ + "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/manager/FriendshipManager.java" + ], + "reason": "Manually translated and verified against the pinned Android source." + } + } + }, + "redirectTo": null + }, + { + "currentPath": "/sdk/android/user/friends/delete-friend", + "targetPath": "/sdk/android/user/friends/delete-friend", + "sourceKind": "openim-specific", + "disposition": "adapt", + "openimSources": [ + "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/manager/FriendshipManager.java" + ], + "sdkMethods": [ + "deleteFriend" + ], + "sdkEvents": [], + "locales": { + "zh": { + "reviewStatus": "published", + "reviewer": "Codex", + "reviewedAt": "2026-08-06", + "exampleVerification": { + "status": "verified", + "evidence": [ + "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/manager/FriendshipManager.java" + ], + "reason": null + } + }, + "en": { + "reviewStatus": "published", + "reviewer": "Codex", + "reviewedAt": "2026-08-06", + "exampleVerification": { + "status": "verified", + "evidence": [ + "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/manager/FriendshipManager.java" + ], + "reason": "Manually translated and verified against the pinned Android source." + } + } + }, + "redirectTo": null + }, + { + "currentPath": "/sdk/android/user/friend-applications/add-friend", + "targetPath": "/sdk/android/user/friend-applications/add-friend", + "sourceKind": "openim-specific", + "disposition": "adapt", + "openimSources": [ + "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/manager/FriendshipManager.java" + ], + "sdkMethods": [ + "addFriend" + ], + "sdkEvents": [], + "locales": { + "zh": { + "reviewStatus": "published", + "reviewer": "Codex", + "reviewedAt": "2026-08-06", + "exampleVerification": { + "status": "verified", + "evidence": [ + "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/manager/FriendshipManager.java" + ], + "reason": null + } + }, + "en": { + "reviewStatus": "published", + "reviewer": "Codex", + "reviewedAt": "2026-08-06", + "exampleVerification": { + "status": "verified", + "evidence": [ + "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/manager/FriendshipManager.java" + ], + "reason": "Manually translated and verified against the pinned Android source." + } + } + }, + "redirectTo": null + }, + { + "currentPath": "/sdk/android/user/friend-applications/get-recv-friend-application-list", + "targetPath": "/sdk/android/user/friend-applications/get-recv-friend-application-list", + "sourceKind": "openim-specific", + "disposition": "adapt", + "openimSources": [ + "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/manager/FriendshipManager.java", + "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/listener/OnFriendshipListener.java" + ], + "sdkMethods": [ + "getRecvFriendApplicationList" + ], + "sdkEvents": [ + "onFriendApplicationAdded", + "onFriendApplicationAccepted", + "onFriendApplicationRejected", + "onFriendApplicationDeleted" + ], + "locales": { + "zh": { + "reviewStatus": "published", + "reviewer": "Codex", + "reviewedAt": "2026-08-06", + "exampleVerification": { + "status": "verified", + "evidence": [ + "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/manager/FriendshipManager.java", + "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/listener/OnFriendshipListener.java" + ], + "reason": null + } + }, + "en": { + "reviewStatus": "published", + "reviewer": "Codex", + "reviewedAt": "2026-08-06", + "exampleVerification": { + "status": "verified", + "evidence": [ + "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/manager/FriendshipManager.java", + "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/listener/OnFriendshipListener.java" + ], + "reason": "Manually translated and verified against the pinned Android source." + } + } + }, + "redirectTo": null + }, + { + "currentPath": "/sdk/android/user/friend-applications/get-send-friend-application-list", + "targetPath": "/sdk/android/user/friend-applications/get-send-friend-application-list", + "sourceKind": "openim-specific", + "disposition": "adapt", + "openimSources": [ + "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/manager/FriendshipManager.java" + ], + "sdkMethods": [ + "getSendFriendApplicationList" + ], + "sdkEvents": [], + "locales": { + "zh": { + "reviewStatus": "published", + "reviewer": "Codex", + "reviewedAt": "2026-08-06", + "exampleVerification": { + "status": "verified", + "evidence": [ + "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/manager/FriendshipManager.java" + ], + "reason": null + } + }, + "en": { + "reviewStatus": "published", + "reviewer": "Codex", + "reviewedAt": "2026-08-06", + "exampleVerification": { + "status": "verified", + "evidence": [ + "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/manager/FriendshipManager.java" + ], + "reason": "Manually translated and verified against the pinned Android source." + } + } + }, + "redirectTo": null + }, + { + "currentPath": "/sdk/android/user/friend-applications/accept-friend-application", + "targetPath": "/sdk/android/user/friend-applications/accept-friend-application", + "sourceKind": "openim-specific", + "disposition": "adapt", + "openimSources": [ + "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/manager/FriendshipManager.java" + ], + "sdkMethods": [ + "acceptFriendApplication" + ], + "sdkEvents": [], + "locales": { + "zh": { + "reviewStatus": "published", + "reviewer": "Codex", + "reviewedAt": "2026-08-06", + "exampleVerification": { + "status": "verified", + "evidence": [ + "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/manager/FriendshipManager.java" + ], + "reason": null + } + }, + "en": { + "reviewStatus": "published", + "reviewer": "Codex", + "reviewedAt": "2026-08-06", + "exampleVerification": { + "status": "verified", + "evidence": [ + "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/manager/FriendshipManager.java" + ], + "reason": "Manually translated and verified against the pinned Android source." + } + } + }, + "redirectTo": null + }, + { + "currentPath": "/sdk/android/user/friend-applications/refuse-friend-application", + "targetPath": "/sdk/android/user/friend-applications/refuse-friend-application", + "sourceKind": "openim-specific", + "disposition": "adapt", + "openimSources": [ + "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/manager/FriendshipManager.java" + ], + "sdkMethods": [ + "refuseFriendApplication" + ], + "sdkEvents": [], + "locales": { + "zh": { + "reviewStatus": "published", + "reviewer": "Codex", + "reviewedAt": "2026-08-06", + "exampleVerification": { + "status": "verified", + "evidence": [ + "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/manager/FriendshipManager.java" + ], + "reason": null + } + }, + "en": { + "reviewStatus": "published", + "reviewer": "Codex", + "reviewedAt": "2026-08-06", + "exampleVerification": { + "status": "verified", + "evidence": [ + "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/manager/FriendshipManager.java" + ], + "reason": "Manually translated and verified against the pinned Android source." + } + } + }, + "redirectTo": null + }, + { + "currentPath": "/sdk/android/user/blacklist/get-blacklist", + "targetPath": "/sdk/android/user/blacklist/get-blacklist", + "sourceKind": "openim-specific", + "disposition": "adapt", + "openimSources": [ + "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/manager/FriendshipManager.java" + ], + "sdkMethods": [ + "getBlacklist" + ], + "sdkEvents": [], + "locales": { + "zh": { + "reviewStatus": "published", + "reviewer": "Codex", + "reviewedAt": "2026-08-06", + "exampleVerification": { + "status": "verified", + "evidence": [ + "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/manager/FriendshipManager.java" + ], + "reason": null + } + }, + "en": { + "reviewStatus": "published", + "reviewer": "Codex", + "reviewedAt": "2026-08-06", + "exampleVerification": { + "status": "verified", + "evidence": [ + "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/manager/FriendshipManager.java" + ], + "reason": "Manually translated and verified against the pinned Android source." + } + } + }, + "redirectTo": null + }, + { + "currentPath": "/sdk/android/user/blacklist/add-blacklist", + "targetPath": "/sdk/android/user/blacklist/add-blacklist", + "sourceKind": "openim-specific", + "disposition": "adapt", + "openimSources": [ + "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/manager/FriendshipManager.java", + "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/listener/OnFriendshipListener.java" + ], + "sdkMethods": [ + "addBlacklist" + ], + "sdkEvents": [ + "onBlacklistAdded" + ], + "locales": { + "zh": { + "reviewStatus": "published", + "reviewer": "Codex", + "reviewedAt": "2026-08-06", + "exampleVerification": { + "status": "verified", + "evidence": [ + "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/manager/FriendshipManager.java", + "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/listener/OnFriendshipListener.java" + ], + "reason": null + } + }, + "en": { + "reviewStatus": "published", + "reviewer": "Codex", + "reviewedAt": "2026-08-06", + "exampleVerification": { + "status": "verified", + "evidence": [ + "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/manager/FriendshipManager.java", + "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/listener/OnFriendshipListener.java" + ], + "reason": "Manually translated and verified against the pinned Android source." + } + } + }, + "redirectTo": null + }, + { + "currentPath": "/sdk/android/user/blacklist/remove-blacklist", + "targetPath": "/sdk/android/user/blacklist/remove-blacklist", + "sourceKind": "openim-specific", + "disposition": "adapt", + "openimSources": [ + "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/manager/FriendshipManager.java", + "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/listener/OnFriendshipListener.java" + ], + "sdkMethods": [ + "removeBlacklist" + ], + "sdkEvents": [ + "onBlacklistDeleted" + ], + "locales": { + "zh": { + "reviewStatus": "published", + "reviewer": "Codex", + "reviewedAt": "2026-08-06", + "exampleVerification": { + "status": "verified", + "evidence": [ + "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/manager/FriendshipManager.java", + "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/listener/OnFriendshipListener.java" + ], + "reason": null + } + }, + "en": { + "reviewStatus": "published", + "reviewer": "Codex", + "reviewedAt": "2026-08-06", + "exampleVerification": { + "status": "verified", + "evidence": [ + "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/manager/FriendshipManager.java", + "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/listener/OnFriendshipListener.java" + ], + "reason": "Manually translated and verified against the pinned Android source." + } + } + }, + "redirectTo": null + }, + { + "currentPath": "/sdk/android/user/online-status/subscribe-users-online-status", + "targetPath": "/sdk/android/user/online-status/subscribe-users-online-status", + "sourceKind": "openim-specific", + "disposition": "adapt", + "openimSources": [ + "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/manager/UserInfoManager.java", + "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/listener/OnUserListener.java" + ], + "sdkMethods": [ + "subscribeUsersOnlineStatus" + ], + "sdkEvents": [ + "onUserStatusChanged" + ], + "locales": { + "zh": { + "reviewStatus": "published", + "reviewer": "Codex", + "reviewedAt": "2026-08-10", + "exampleVerification": { + "status": "verified", + "evidence": [ + "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/manager/UserInfoManager.java", + "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/listener/OnUserListener.java" + ], + "reason": null + } + }, + "en": { + "reviewStatus": "published", + "reviewer": "Codex", + "reviewedAt": "2026-08-10", + "exampleVerification": { + "status": "verified", + "evidence": [ + "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/manager/UserInfoManager.java", + "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/listener/OnUserListener.java" + ], + "reason": "Manually translated and verified against the pinned Android source." + } + } + }, + "redirectTo": null + }, + { + "currentPath": "/sdk/android/user/online-status/get-subscribe-online-users-status", + "targetPath": "/sdk/android/user/online-status/get-subscribe-online-users-status", + "sourceKind": "openim-specific", + "disposition": "adapt", + "openimSources": [ + "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/manager/UserInfoManager.java" + ], + "sdkMethods": [ + "getSubscribeOnlineUsersStatus" + ], + "sdkEvents": [], + "locales": { + "zh": { + "reviewStatus": "published", + "reviewer": "Codex", + "reviewedAt": "2026-08-06", + "exampleVerification": { + "status": "verified", + "evidence": [ + "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/manager/UserInfoManager.java" + ], + "reason": null + } + }, + "en": { + "reviewStatus": "published", + "reviewer": "Codex", + "reviewedAt": "2026-08-06", + "exampleVerification": { + "status": "verified", + "evidence": [ + "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/manager/UserInfoManager.java" + ], + "reason": "Manually translated and verified against the pinned Android source." + } + } + }, + "redirectTo": null + }, + { + "currentPath": "/sdk/android/user/online-status/unsubscribe-users-online-status", + "targetPath": "/sdk/android/user/online-status/unsubscribe-users-online-status", + "sourceKind": "openim-specific", + "disposition": "adapt", + "openimSources": [ + "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/manager/UserInfoManager.java" + ], + "sdkMethods": [ + "unsubscribeOnlineUsersStatus" + ], + "sdkEvents": [], + "locales": { + "zh": { + "reviewStatus": "published", + "reviewer": "Codex", + "reviewedAt": "2026-08-10", + "exampleVerification": { + "status": "verified", + "evidence": [ + "UserInfoManager.unsubscribeOnlineUsersStatus" + ], + "reason": null + } + }, + "en": { + "reviewStatus": "published", + "reviewer": "Codex", + "reviewedAt": "2026-08-10", + "exampleVerification": { + "status": "verified", + "evidence": [ + "UserInfoManager.unsubscribeOnlineUsersStatus" + ], + "reason": null + } + } + }, + "redirectTo": null + }, + { + "currentPath": "/sdk/android/conversation/overview-conversation", + "targetPath": "/sdk/android/conversation/overview-conversation", + "sourceKind": "openim-specific", + "disposition": "adapt", + "openimSources": [ + "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/manager/ConversationManager.java", + "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/models/ConversationInfo.java" + ], + "sdkMethods": [], + "sdkEvents": [], + "locales": { + "zh": { + "reviewStatus": "published", + "reviewer": "Codex", + "reviewedAt": "2026-08-07", + "exampleVerification": { + "status": "not-applicable", + "evidence": [], + "reason": "概览页不包含代码示例。" + } + }, + "en": { + "reviewStatus": "published", + "reviewer": "Codex", + "reviewedAt": "2026-08-07", + "exampleVerification": { + "status": "not-applicable", + "evidence": [], + "reason": "The overview does not contain code examples." + } + } + }, + "redirectTo": null + }, + { + "currentPath": "/sdk/android/conversation/retrieving-conversations/get-conversation-by-target", + "targetPath": "/sdk/android/conversation/retrieving-conversations/get-conversation-by-target", + "sourceKind": "openim-specific", + "disposition": "adapt", + "openimSources": [ + "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/manager/ConversationManager.java" + ], + "sdkMethods": [ + "getOneConversation" + ], + "sdkEvents": [], + "locales": { + "zh": { + "reviewStatus": "published", + "reviewer": "Codex", + "reviewedAt": "2026-08-07", + "exampleVerification": { + "status": "verified", + "evidence": [ + "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/manager/ConversationManager.java" + ], + "reason": null + } + }, + "en": { + "reviewStatus": "published", + "reviewer": "Codex", + "reviewedAt": "2026-08-07", + "exampleVerification": { + "status": "verified", + "evidence": [ + "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/manager/ConversationManager.java" + ], + "reason": "Manually translated and verified against the pinned Android source." + } + } + }, + "redirectTo": null + }, + { + "currentPath": "/sdk/android/conversation/retrieving-conversations/get-conversation-id", + "targetPath": "/sdk/android/conversation/retrieving-conversations/get-conversation-id", + "sourceKind": "openim-specific", + "disposition": "adapt", + "openimSources": [ + "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/manager/ConversationManager.java" + ], + "sdkMethods": [ + "getConversationIDBySessionType" + ], + "sdkEvents": [], + "locales": { + "zh": { + "reviewStatus": "published", + "reviewer": "Codex", + "reviewedAt": "2026-08-07", + "exampleVerification": { + "status": "verified", + "evidence": [ + "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/manager/ConversationManager.java" + ], + "reason": null + } + }, + "en": { + "reviewStatus": "published", + "reviewer": "Codex", + "reviewedAt": "2026-08-07", + "exampleVerification": { + "status": "verified", + "evidence": [ + "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/manager/ConversationManager.java" + ], + "reason": "Manually translated and verified against the pinned Android source." + } + } + }, + "redirectTo": null + }, + { + "currentPath": "/sdk/android/conversation/retrieving-conversations/get-conversations-by-id", + "targetPath": "/sdk/android/conversation/retrieving-conversations/get-conversations-by-id", + "sourceKind": "openim-specific", + "disposition": "adapt", + "openimSources": [ + "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/manager/ConversationManager.java" + ], + "sdkMethods": [ + "getMultipleConversation" + ], + "sdkEvents": [], + "locales": { + "zh": { + "reviewStatus": "published", + "reviewer": "Codex", + "reviewedAt": "2026-08-07", + "exampleVerification": { + "status": "verified", + "evidence": [ + "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/manager/ConversationManager.java" + ], + "reason": null + } + }, + "en": { + "reviewStatus": "published", + "reviewer": "Codex", + "reviewedAt": "2026-08-07", + "exampleVerification": { + "status": "verified", + "evidence": [ + "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/manager/ConversationManager.java" + ], + "reason": "Manually translated and verified against the pinned Android source." + } + } + }, + "redirectTo": null + }, + { + "currentPath": "/sdk/android/conversation/retrieving-conversations/retrieve-conversation-list", + "targetPath": "/sdk/android/conversation/retrieving-conversations/retrieve-conversation-list", + "sourceKind": "openim-specific", + "disposition": "adapt", + "openimSources": [ + "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/manager/ConversationManager.java", + "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/listener/OnConversationListener.java" + ], + "sdkMethods": [ + "getConversationListSplit", + "setOnConversationListener" + ], + "sdkEvents": [ + "onNewConversation", + "onConversationChanged" + ], + "locales": { + "zh": { + "reviewStatus": "published", + "reviewer": "Codex", + "reviewedAt": "2026-08-07", + "exampleVerification": { + "status": "verified", + "evidence": [ + "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/manager/ConversationManager.java" + ], + "reason": null + } + }, + "en": { + "reviewStatus": "published", + "reviewer": "Codex", + "reviewedAt": "2026-08-07", + "exampleVerification": { + "status": "verified", + "evidence": [ + "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/manager/ConversationManager.java" + ], + "reason": "Manually translated and verified against the pinned Android source." + } + } + }, + "redirectTo": null + }, + { + "currentPath": "/sdk/android/conversation/managing-conversations/pin-conversation", + "targetPath": "/sdk/android/conversation/managing-conversations/pin-conversation", + "sourceKind": "openim-specific", + "disposition": "adapt", + "openimSources": [ + "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/manager/ConversationManager.java" + ], + "sdkMethods": [ + "pinConversation" + ], + "sdkEvents": [], + "locales": { + "zh": { + "reviewStatus": "published", + "reviewer": "Codex", + "reviewedAt": "2026-08-07", + "exampleVerification": { + "status": "verified", + "evidence": [ + "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/manager/ConversationManager.java" + ], + "reason": null + } + }, + "en": { + "reviewStatus": "published", + "reviewer": "Codex", + "reviewedAt": "2026-08-07", + "exampleVerification": { + "status": "verified", + "evidence": [ + "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/manager/ConversationManager.java" + ], + "reason": "Manually translated and verified against the pinned Android source." + } + } + }, + "redirectTo": null + }, + { + "currentPath": "/sdk/android/conversation/managing-conversations/set-conversation-extension", + "targetPath": "/sdk/android/conversation/managing-conversations/set-conversation-extension", + "sourceKind": "openim-specific", + "disposition": "adapt", + "openimSources": [ + "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/manager/ConversationManager.java" + ], + "sdkMethods": [ + "setConversationEx" + ], + "sdkEvents": [], + "locales": { + "zh": { + "reviewStatus": "published", + "reviewer": "Codex", + "reviewedAt": "2026-08-07", + "exampleVerification": { + "status": "verified", + "evidence": [ + "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/manager/ConversationManager.java" + ], + "reason": null + } + }, + "en": { + "reviewStatus": "published", + "reviewer": "Codex", + "reviewedAt": "2026-08-07", + "exampleVerification": { + "status": "verified", + "evidence": [ + "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/manager/ConversationManager.java" + ], + "reason": "Manually translated and verified against the pinned Android source." + } + } + }, + "redirectTo": null + }, + { + "currentPath": "/sdk/android/conversation/managing-conversations/set-conversation-draft", + "targetPath": "/sdk/android/conversation/managing-conversations/set-conversation-draft", + "sourceKind": "openim-specific", + "disposition": "adapt", + "openimSources": [ + "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/manager/ConversationManager.java" + ], + "sdkMethods": [ + "setConversationDraft" + ], + "sdkEvents": [], + "locales": { + "zh": { + "reviewStatus": "published", + "reviewer": "Codex", + "reviewedAt": "2026-08-07", + "exampleVerification": { + "status": "verified", + "evidence": [ + "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/manager/ConversationManager.java" + ], + "reason": null + } + }, + "en": { + "reviewStatus": "published", + "reviewer": "Codex", + "reviewedAt": "2026-08-07", + "exampleVerification": { + "status": "verified", + "evidence": [ + "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/manager/ConversationManager.java" + ], + "reason": "Manually translated and verified against the pinned Android source." + } + } + }, + "redirectTo": null + }, + { + "currentPath": "/sdk/android/conversation/managing-conversations/set-message-receive-option", + "targetPath": "/sdk/android/conversation/managing-conversations/set-message-receive-option", + "sourceKind": "openim-specific", + "disposition": "adapt", + "openimSources": [ + "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/manager/ConversationManager.java" + ], + "sdkMethods": [ + "setConversationRecvMessageOpt" + ], + "sdkEvents": [], + "locales": { + "zh": { + "reviewStatus": "published", + "reviewer": "Codex", + "reviewedAt": "2026-08-07", + "exampleVerification": { + "status": "verified", + "evidence": [ + "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/manager/ConversationManager.java" + ], + "reason": null + } + }, + "en": { + "reviewStatus": "published", + "reviewer": "Codex", + "reviewedAt": "2026-08-07", + "exampleVerification": { + "status": "verified", + "evidence": [ + "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/manager/ConversationManager.java" + ], + "reason": "Manually translated and verified against the pinned Android source." + } + } + }, + "redirectTo": null + }, + { + "currentPath": "/sdk/android/conversation/managing-conversations/clear-group-mentions", + "targetPath": "/sdk/android/conversation/managing-conversations/clear-group-mentions", + "sourceKind": "openim-specific", + "disposition": "adapt", + "openimSources": [ + "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/manager/ConversationManager.java" + ], + "sdkMethods": [ + "resetConversationGroupAtType" + ], + "sdkEvents": [], + "locales": { + "zh": { + "reviewStatus": "published", + "reviewer": "Codex", + "reviewedAt": "2026-08-07", + "exampleVerification": { + "status": "verified", + "evidence": [ + "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/manager/ConversationManager.java" + ], + "reason": null + } + }, + "en": { + "reviewStatus": "published", + "reviewer": "Codex", + "reviewedAt": "2026-08-07", + "exampleVerification": { + "status": "verified", + "evidence": [ + "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/manager/ConversationManager.java" + ], + "reason": "Manually translated and verified against the pinned Android source." + } + } + }, + "redirectTo": null + }, + { + "currentPath": "/sdk/android/conversation/managing-conversations/mark-conversation-read", + "targetPath": "/sdk/android/conversation/managing-conversations/mark-conversation-read", + "sourceKind": "openim-specific", + "disposition": "adapt", + "openimSources": [ + "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/manager/MessageManager.java", + "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/listener/OnAdvanceMsgListener.java" + ], + "sdkMethods": [ + "markConversationMessageAsRead", + "setAdvancedMsgListener" + ], + "sdkEvents": [ + "onRecvC2CReadReceipt" + ], + "locales": { + "zh": { + "reviewStatus": "published", + "reviewer": "Codex", + "reviewedAt": "2026-08-07", + "exampleVerification": { + "status": "verified", + "evidence": [ + "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/manager/MessageManager.java" + ], + "reason": null + } + }, + "en": { + "reviewStatus": "published", + "reviewer": "Codex", + "reviewedAt": "2026-08-07", + "exampleVerification": { + "status": "verified", + "evidence": [ + "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/manager/MessageManager.java" + ], + "reason": "Manually translated and verified against the pinned Android source." + } + } + }, + "redirectTo": null + }, + { + "currentPath": "/sdk/android/conversation/managing-conversations/get-total-unread-count", + "targetPath": "/sdk/android/conversation/managing-conversations/get-total-unread-count", + "sourceKind": "openim-specific", + "disposition": "adapt", + "openimSources": [ + "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/manager/ConversationManager.java", + "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/listener/OnConversationListener.java" + ], + "sdkMethods": [ + "getTotalUnreadMsgCount" + ], + "sdkEvents": [ + "onTotalUnreadMessageCountChanged" + ], + "locales": { + "zh": { + "reviewStatus": "published", + "reviewer": "Codex", + "reviewedAt": "2026-08-07", + "exampleVerification": { + "status": "verified", + "evidence": [ + "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/manager/ConversationManager.java" + ], + "reason": null + } + }, + "en": { + "reviewStatus": "published", + "reviewer": "Codex", + "reviewedAt": "2026-08-07", + "exampleVerification": { + "status": "verified", + "evidence": [ + "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/manager/ConversationManager.java" + ], + "reason": "Manually translated and verified against the pinned Android source." + } + } + }, + "redirectTo": null + }, + { + "currentPath": "/sdk/android/conversation/managing-conversations/set-private-chat", + "targetPath": "/sdk/android/conversation/managing-conversations/set-private-chat", + "sourceKind": "openim-specific", + "disposition": "adapt", + "openimSources": [ + "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/manager/ConversationManager.java" + ], + "sdkMethods": [ + "setOneConversationPrivateChat" + ], + "sdkEvents": [], + "locales": { + "zh": { + "reviewStatus": "published", + "reviewer": "Codex", + "reviewedAt": "2026-08-07", + "exampleVerification": { + "status": "verified", + "evidence": [ + "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/manager/ConversationManager.java" + ], + "reason": null + } + }, + "en": { + "reviewStatus": "published", + "reviewer": "Codex", + "reviewedAt": "2026-08-07", + "exampleVerification": { + "status": "verified", + "evidence": [ + "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/manager/ConversationManager.java" + ], + "reason": "Manually translated and verified against the pinned Android source." + } + } + }, + "redirectTo": null + }, + { + "currentPath": "/sdk/android/conversation/managing-conversations/set-burn-duration", + "targetPath": "/sdk/android/conversation/managing-conversations/set-burn-duration", + "sourceKind": "openim-specific", + "disposition": "adapt", + "openimSources": [ + "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/manager/ConversationManager.java" + ], + "sdkMethods": [ + "setConversationBurnDuration" + ], + "sdkEvents": [], + "locales": { + "zh": { + "reviewStatus": "published", + "reviewer": "Codex", + "reviewedAt": "2026-08-07", + "exampleVerification": { + "status": "verified", + "evidence": [ + "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/manager/ConversationManager.java" + ], + "reason": null + } + }, + "en": { + "reviewStatus": "published", + "reviewer": "Codex", + "reviewedAt": "2026-08-07", + "exampleVerification": { + "status": "verified", + "evidence": [ + "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/manager/ConversationManager.java" + ], + "reason": "Manually translated and verified against the pinned Android source." + } + } + }, + "redirectTo": null + }, + { + "currentPath": "/sdk/android/conversation/managing-conversations/set-message-destruct", + "targetPath": "/sdk/android/conversation/managing-conversations/set-message-destruct", + "sourceKind": "openim-specific", + "disposition": "adapt", + "openimSources": [ + "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/manager/ConversationManager.java" + ], + "sdkMethods": [ + "setConversation" + ], + "sdkEvents": [], + "locales": { + "zh": { + "reviewStatus": "published", + "reviewer": "Codex", + "reviewedAt": "2026-08-07", + "exampleVerification": { + "status": "verified", + "evidence": [ + "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/manager/ConversationManager.java" + ], + "reason": null + } + }, + "en": { + "reviewStatus": "published", + "reviewer": "Codex", + "reviewedAt": "2026-08-07", + "exampleVerification": { + "status": "verified", + "evidence": [ + "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/manager/ConversationManager.java" + ], + "reason": "Manually translated and verified against the pinned Android source." + } + } + }, + "redirectTo": null + }, + { + "currentPath": "/sdk/android/conversation/managing-conversations/hide-a-conversation", + "targetPath": "/sdk/android/conversation/managing-conversations/hide-a-conversation", + "sourceKind": "openim-specific", + "disposition": "adapt", + "openimSources": [ + "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/manager/ConversationManager.java" + ], + "sdkMethods": [ + "hideConversation" + ], + "sdkEvents": [], + "locales": { + "zh": { + "reviewStatus": "published", + "reviewer": "Codex", + "reviewedAt": "2026-08-07", + "exampleVerification": { + "status": "verified", + "evidence": [ + "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/manager/ConversationManager.java" + ], + "reason": null + } + }, + "en": { + "reviewStatus": "published", + "reviewer": "Codex", + "reviewedAt": "2026-08-07", + "exampleVerification": { + "status": "verified", + "evidence": [ + "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/manager/ConversationManager.java" + ], + "reason": "Manually translated and verified against the pinned Android source." + } + } + }, + "redirectTo": null + }, + { + "currentPath": "/sdk/android/conversation/managing-conversations/delete-conversation-with-messages", + "targetPath": "/sdk/android/conversation/managing-conversations/delete-conversation-with-messages", + "sourceKind": "openim-specific", + "disposition": "adapt", + "openimSources": [ + "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/manager/ConversationManager.java" + ], + "sdkMethods": [ + "deleteConversationAndDeleteAllMsg" + ], + "sdkEvents": [], + "locales": { + "zh": { + "reviewStatus": "published", + "reviewer": "Codex", + "reviewedAt": "2026-08-07", + "exampleVerification": { + "status": "verified", + "evidence": [ + "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/manager/ConversationManager.java" + ], + "reason": null + } + }, + "en": { + "reviewStatus": "published", + "reviewer": "Codex", + "reviewedAt": "2026-08-07", + "exampleVerification": { + "status": "verified", + "evidence": [ + "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/manager/ConversationManager.java" + ], + "reason": "Manually translated and verified against the pinned Android source." + } + } + }, + "redirectTo": null + }, + { + "currentPath": "/sdk/android/conversation/managing-conversations/clear-conversation-messages", + "targetPath": "/sdk/android/conversation/managing-conversations/clear-conversation-messages", + "sourceKind": "openim-specific", + "disposition": "adapt", + "openimSources": [ + "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/manager/MessageManager.java" + ], + "sdkMethods": [ + "clearConversationAndDeleteAllMsg" + ], + "sdkEvents": [], + "locales": { + "zh": { + "reviewStatus": "published", + "reviewer": "Codex", + "reviewedAt": "2026-08-07", + "exampleVerification": { + "status": "verified", + "evidence": [ + "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/manager/MessageManager.java" + ], + "reason": null + } + }, + "en": { + "reviewStatus": "published", + "reviewer": "Codex", + "reviewedAt": "2026-08-07", + "exampleVerification": { + "status": "verified", + "evidence": [ + "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/manager/MessageManager.java" + ], + "reason": "Manually translated and verified against the pinned Android source." + } + } + }, + "redirectTo": null + }, + { + "currentPath": "/sdk/android/message/overview-message", + "targetPath": "/sdk/android/message/overview-message", + "sourceKind": "openim-specific", + "disposition": "adapt", + "openimSources": [ + "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/manager/MessageManager.java" + ], + "sdkMethods": [ + "setAdvancedMsgListener" + ], + "sdkEvents": [], + "locales": { + "zh": { + "reviewStatus": "published", + "reviewer": "Codex", + "reviewedAt": "2026-08-07", + "exampleVerification": { + "status": "verified", + "evidence": [ + "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/listener/OnAdvanceMsgListener.java" + ], + "reason": null + } + }, + "en": { + "reviewStatus": "published", + "reviewer": "Codex", + "reviewedAt": "2026-08-10", + "exampleVerification": { + "status": "verified", + "evidence": [ + "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/listener/OnAdvanceMsgListener.java" + ], + "reason": null + } + } + }, + "redirectTo": null + }, + { + "currentPath": "/sdk/android/message/creating-messages/create-text-message", + "targetPath": "/sdk/android/message/creating-messages/create-text-message", + "sourceKind": "openim-specific", + "disposition": "adapt", + "openimSources": [ + "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/manager/MessageManager.java" + ], + "sdkMethods": [ + "createTextMessage" + ], + "sdkEvents": [], + "locales": { + "zh": { + "reviewStatus": "published", + "reviewer": "Codex", + "reviewedAt": "2026-08-07", + "exampleVerification": { + "status": "verified", + "evidence": [ + "MessageManager.createTextMessage" + ], + "reason": null + } + }, + "en": { + "reviewStatus": "published", + "reviewer": "Codex", + "reviewedAt": "2026-08-10", + "exampleVerification": { + "status": "verified", + "evidence": [ + "MessageManager.createTextMessage" + ], + "reason": null + } + } + }, + "redirectTo": null + }, + { + "currentPath": "/sdk/android/message/creating-messages/create-text-at-message", + "targetPath": "/sdk/android/message/creating-messages/create-text-at-message", + "sourceKind": "openim-specific", + "disposition": "adapt", + "openimSources": [ + "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/manager/MessageManager.java" + ], + "sdkMethods": [ + "createTextAtMessage" + ], + "sdkEvents": [], + "locales": { + "zh": { + "reviewStatus": "published", + "reviewer": "Codex", + "reviewedAt": "2026-08-07", + "exampleVerification": { + "status": "verified", + "evidence": [ + "MessageManager.createTextAtMessage" + ], + "reason": null + } + }, + "en": { + "reviewStatus": "published", + "reviewer": "Codex", + "reviewedAt": "2026-08-10", + "exampleVerification": { + "status": "verified", + "evidence": [ + "MessageManager.createTextAtMessage" + ], + "reason": null + } + } + }, + "redirectTo": null + }, + { + "currentPath": "/sdk/android/message/creating-messages/create-custom-message", + "targetPath": "/sdk/android/message/creating-messages/create-custom-message", + "sourceKind": "openim-specific", + "disposition": "adapt", + "openimSources": [ + "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/manager/MessageManager.java" + ], + "sdkMethods": [ + "createCustomMessage" + ], + "sdkEvents": [], + "locales": { + "zh": { + "reviewStatus": "published", + "reviewer": "Codex", + "reviewedAt": "2026-08-07", + "exampleVerification": { + "status": "verified", + "evidence": [ + "MessageManager.createCustomMessage" + ], + "reason": null + } + }, + "en": { + "reviewStatus": "published", + "reviewer": "Codex", + "reviewedAt": "2026-08-10", + "exampleVerification": { + "status": "verified", + "evidence": [ + "MessageManager.createCustomMessage" + ], + "reason": null + } + } + }, + "redirectTo": null + }, + { + "currentPath": "/sdk/android/message/creating-messages/create-image-message", + "targetPath": "/sdk/android/message/creating-messages/create-image-message", + "sourceKind": "openim-specific", + "disposition": "adapt", + "openimSources": [ + "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/manager/MessageManager.java" + ], + "sdkMethods": [ + "createImageMessage" + ], + "sdkEvents": [], + "locales": { + "zh": { + "reviewStatus": "published", + "reviewer": "Codex", + "reviewedAt": "2026-08-10", + "exampleVerification": { + "status": "verified", + "evidence": [ + "MessageManager.createImageMessage" + ], + "reason": null + } + }, + "en": { + "reviewStatus": "published", + "reviewer": "Codex", + "reviewedAt": "2026-08-10", + "exampleVerification": { + "status": "verified", + "evidence": [ + "MessageManager.createImageMessage" + ], + "reason": null + } + } + }, + "redirectTo": null + }, + { + "currentPath": "/sdk/android/message/creating-messages/create-image-message-by-file", + "targetPath": "/sdk/android/message/creating-messages/create-image-message-by-file", + "sourceKind": "openim-specific", + "disposition": "adapt", + "openimSources": [ + "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/manager/MessageManager.java" + ], + "sdkMethods": [ + "createImageMessageFromFullPath" + ], + "sdkEvents": [], + "locales": { + "zh": { + "reviewStatus": "published", + "reviewer": "Codex", + "reviewedAt": "2026-08-10", + "exampleVerification": { + "status": "verified", + "evidence": [ + "MessageManager.createImageMessageFromFullPath" + ], + "reason": null + } + }, + "en": { + "reviewStatus": "published", + "reviewer": "Codex", + "reviewedAt": "2026-08-10", + "exampleVerification": { + "status": "verified", + "evidence": [ + "MessageManager.createImageMessageFromFullPath" + ], + "reason": null + } + } + }, + "redirectTo": null + }, + { + "currentPath": "/sdk/android/message/creating-messages/create-image-message-by-url", + "targetPath": "/sdk/android/message/creating-messages/create-image-message-by-url", + "sourceKind": "openim-specific", + "disposition": "adapt", + "openimSources": [ + "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/manager/MessageManager.java" + ], + "sdkMethods": [ + "createImageMessageByURL" + ], + "sdkEvents": [], + "locales": { + "zh": { + "reviewStatus": "published", + "reviewer": "Codex", + "reviewedAt": "2026-08-10", + "exampleVerification": { + "status": "verified", + "evidence": [ + "MessageManager.createImageMessageByURL" + ], + "reason": null + } + }, + "en": { + "reviewStatus": "published", + "reviewer": "Codex", + "reviewedAt": "2026-08-10", + "exampleVerification": { + "status": "verified", + "evidence": [ + "MessageManager.createImageMessageByURL" + ], + "reason": null + } + } + }, + "redirectTo": null + }, + { + "currentPath": "/sdk/android/message/creating-messages/create-sound-message", + "targetPath": "/sdk/android/message/creating-messages/create-sound-message", + "sourceKind": "openim-specific", + "disposition": "adapt", + "openimSources": [ + "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/manager/MessageManager.java" + ], + "sdkMethods": [ + "createSoundMessage" + ], + "sdkEvents": [], + "locales": { + "zh": { + "reviewStatus": "published", + "reviewer": "Codex", + "reviewedAt": "2026-08-10", + "exampleVerification": { + "status": "verified", + "evidence": [ + "MessageManager.createSoundMessage" + ], + "reason": null + } + }, + "en": { + "reviewStatus": "published", + "reviewer": "Codex", + "reviewedAt": "2026-08-10", + "exampleVerification": { + "status": "verified", + "evidence": [ + "MessageManager.createSoundMessage" + ], + "reason": null + } + } + }, + "redirectTo": null + }, + { + "currentPath": "/sdk/android/message/creating-messages/create-sound-message-by-file", + "targetPath": "/sdk/android/message/creating-messages/create-sound-message-by-file", + "sourceKind": "openim-specific", + "disposition": "adapt", + "openimSources": [ + "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/manager/MessageManager.java" + ], + "sdkMethods": [ + "createSoundMessageFromFullPath" + ], + "sdkEvents": [], + "locales": { + "zh": { + "reviewStatus": "published", + "reviewer": "Codex", + "reviewedAt": "2026-08-10", + "exampleVerification": { + "status": "verified", + "evidence": [ + "MessageManager.createSoundMessageFromFullPath" + ], + "reason": null + } + }, + "en": { + "reviewStatus": "published", + "reviewer": "Codex", + "reviewedAt": "2026-08-10", + "exampleVerification": { + "status": "verified", + "evidence": [ + "MessageManager.createSoundMessageFromFullPath" + ], + "reason": null + } + } + }, + "redirectTo": null + }, + { + "currentPath": "/sdk/android/message/creating-messages/create-sound-message-by-url", + "targetPath": "/sdk/android/message/creating-messages/create-sound-message-by-url", + "sourceKind": "openim-specific", + "disposition": "adapt", + "openimSources": [ + "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/manager/MessageManager.java" + ], + "sdkMethods": [ + "createSoundMessageByURL" + ], + "sdkEvents": [], + "locales": { + "zh": { + "reviewStatus": "published", + "reviewer": "Codex", + "reviewedAt": "2026-08-10", + "exampleVerification": { + "status": "verified", + "evidence": [ + "MessageManager.createSoundMessageByURL" + ], + "reason": null + } + }, + "en": { + "reviewStatus": "published", + "reviewer": "Codex", + "reviewedAt": "2026-08-10", + "exampleVerification": { + "status": "verified", + "evidence": [ + "MessageManager.createSoundMessageByURL" + ], + "reason": null + } + } + }, + "redirectTo": null + }, + { + "currentPath": "/sdk/android/message/creating-messages/create-video-message", + "targetPath": "/sdk/android/message/creating-messages/create-video-message", + "sourceKind": "openim-specific", + "disposition": "adapt", + "openimSources": [ + "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/manager/MessageManager.java" + ], + "sdkMethods": [ + "createVideoMessage" + ], + "sdkEvents": [], + "locales": { + "zh": { + "reviewStatus": "published", + "reviewer": "Codex", + "reviewedAt": "2026-08-10", + "exampleVerification": { + "status": "verified", + "evidence": [ + "MessageManager.createVideoMessage" + ], + "reason": null + } + }, + "en": { + "reviewStatus": "published", + "reviewer": "Codex", + "reviewedAt": "2026-08-10", + "exampleVerification": { + "status": "verified", + "evidence": [ + "MessageManager.createVideoMessage" + ], + "reason": null + } + } + }, + "redirectTo": null + }, + { + "currentPath": "/sdk/android/message/creating-messages/create-video-message-by-file", + "targetPath": "/sdk/android/message/creating-messages/create-video-message-by-file", + "sourceKind": "openim-specific", + "disposition": "adapt", + "openimSources": [ + "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/manager/MessageManager.java" + ], + "sdkMethods": [ + "createVideoMessageFromFullPath" + ], + "sdkEvents": [], + "locales": { + "zh": { + "reviewStatus": "published", + "reviewer": "Codex", + "reviewedAt": "2026-08-10", + "exampleVerification": { + "status": "verified", + "evidence": [ + "MessageManager.createVideoMessageFromFullPath" + ], + "reason": null + } + }, + "en": { + "reviewStatus": "published", + "reviewer": "Codex", + "reviewedAt": "2026-08-10", + "exampleVerification": { + "status": "verified", + "evidence": [ + "MessageManager.createVideoMessageFromFullPath" + ], + "reason": null + } + } + }, + "redirectTo": null + }, + { + "currentPath": "/sdk/android/message/creating-messages/create-video-message-by-url", + "targetPath": "/sdk/android/message/creating-messages/create-video-message-by-url", + "sourceKind": "openim-specific", + "disposition": "adapt", + "openimSources": [ + "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/manager/MessageManager.java" + ], + "sdkMethods": [ + "createVideoMessageByURL" + ], + "sdkEvents": [], + "locales": { + "zh": { + "reviewStatus": "published", + "reviewer": "Codex", + "reviewedAt": "2026-08-10", + "exampleVerification": { + "status": "verified", + "evidence": [ + "MessageManager.createVideoMessageByURL" + ], + "reason": null + } + }, + "en": { + "reviewStatus": "published", + "reviewer": "Codex", + "reviewedAt": "2026-08-10", + "exampleVerification": { + "status": "verified", + "evidence": [ + "MessageManager.createVideoMessageByURL" + ], + "reason": null + } + } + }, + "redirectTo": null + }, + { + "currentPath": "/sdk/android/message/creating-messages/create-file-message", + "targetPath": "/sdk/android/message/creating-messages/create-file-message", + "sourceKind": "openim-specific", + "disposition": "adapt", + "openimSources": [ + "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/manager/MessageManager.java" + ], + "sdkMethods": [ + "createFileMessage" + ], + "sdkEvents": [], + "locales": { + "zh": { + "reviewStatus": "published", + "reviewer": "Codex", + "reviewedAt": "2026-08-10", + "exampleVerification": { + "status": "verified", + "evidence": [ + "MessageManager.createFileMessage" + ], + "reason": null + } + }, + "en": { + "reviewStatus": "published", + "reviewer": "Codex", + "reviewedAt": "2026-08-10", + "exampleVerification": { + "status": "verified", + "evidence": [ + "MessageManager.createFileMessage" + ], + "reason": null + } + } + }, + "redirectTo": null + }, + { + "currentPath": "/sdk/android/message/creating-messages/create-file-message-by-file", + "targetPath": "/sdk/android/message/creating-messages/create-file-message-by-file", + "sourceKind": "openim-specific", + "disposition": "adapt", + "openimSources": [ + "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/manager/MessageManager.java" + ], + "sdkMethods": [ + "createFileMessageFromFullPath" + ], + "sdkEvents": [], + "locales": { + "zh": { + "reviewStatus": "published", + "reviewer": "Codex", + "reviewedAt": "2026-08-10", + "exampleVerification": { + "status": "verified", + "evidence": [ + "MessageManager.createFileMessageFromFullPath" + ], + "reason": null + } + }, + "en": { + "reviewStatus": "published", + "reviewer": "Codex", + "reviewedAt": "2026-08-10", + "exampleVerification": { + "status": "verified", + "evidence": [ + "MessageManager.createFileMessageFromFullPath" + ], + "reason": null + } + } + }, + "redirectTo": null + }, + { + "currentPath": "/sdk/android/message/creating-messages/create-file-message-by-url", + "targetPath": "/sdk/android/message/creating-messages/create-file-message-by-url", + "sourceKind": "openim-specific", + "disposition": "adapt", + "openimSources": [ + "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/manager/MessageManager.java" + ], + "sdkMethods": [ + "createFileMessageByURL" + ], + "sdkEvents": [], + "locales": { + "zh": { + "reviewStatus": "published", + "reviewer": "Codex", + "reviewedAt": "2026-08-10", + "exampleVerification": { + "status": "verified", + "evidence": [ + "MessageManager.createFileMessageByURL" + ], + "reason": null + } + }, + "en": { + "reviewStatus": "published", + "reviewer": "Codex", + "reviewedAt": "2026-08-10", + "exampleVerification": { + "status": "verified", + "evidence": [ + "MessageManager.createFileMessageByURL" + ], + "reason": null + } + } + }, + "redirectTo": null + }, + { + "currentPath": "/sdk/android/message/creating-messages/create-card-message", + "targetPath": "/sdk/android/message/creating-messages/create-card-message", + "sourceKind": "openim-specific", + "disposition": "adapt", + "openimSources": [ + "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/manager/MessageManager.java" + ], + "sdkMethods": [ + "createCardMessage" + ], + "sdkEvents": [], + "locales": { + "zh": { + "reviewStatus": "published", + "reviewer": "Codex", + "reviewedAt": "2026-08-07", + "exampleVerification": { + "status": "verified", + "evidence": [ + "MessageManager.createCardMessage" + ], + "reason": null + } + }, + "en": { + "reviewStatus": "published", + "reviewer": "Codex", + "reviewedAt": "2026-08-10", + "exampleVerification": { + "status": "verified", + "evidence": [ + "MessageManager.createCardMessage" + ], + "reason": null + } + } + }, + "redirectTo": null + }, + { + "currentPath": "/sdk/android/message/creating-messages/create-location-message", + "targetPath": "/sdk/android/message/creating-messages/create-location-message", + "sourceKind": "openim-specific", + "disposition": "adapt", + "openimSources": [ + "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/manager/MessageManager.java" + ], + "sdkMethods": [ + "createLocationMessage" + ], + "sdkEvents": [], + "locales": { + "zh": { + "reviewStatus": "published", + "reviewer": "Codex", + "reviewedAt": "2026-08-07", + "exampleVerification": { + "status": "verified", + "evidence": [ + "MessageManager.createLocationMessage" + ], + "reason": null + } + }, + "en": { + "reviewStatus": "published", + "reviewer": "Codex", + "reviewedAt": "2026-08-10", + "exampleVerification": { + "status": "verified", + "evidence": [ + "MessageManager.createLocationMessage" + ], + "reason": null + } + } + }, + "redirectTo": null + }, + { + "currentPath": "/sdk/android/message/creating-messages/create-face-message", + "targetPath": "/sdk/android/message/creating-messages/create-face-message", + "sourceKind": "openim-specific", + "disposition": "adapt", + "openimSources": [ + "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/manager/MessageManager.java" + ], + "sdkMethods": [ + "createFaceMessage" + ], + "sdkEvents": [], + "locales": { + "zh": { + "reviewStatus": "published", + "reviewer": "Codex", + "reviewedAt": "2026-08-07", + "exampleVerification": { + "status": "verified", + "evidence": [ + "MessageManager.createFaceMessage" + ], + "reason": null + } + }, + "en": { + "reviewStatus": "published", + "reviewer": "Codex", + "reviewedAt": "2026-08-10", + "exampleVerification": { + "status": "verified", + "evidence": [ + "MessageManager.createFaceMessage" + ], + "reason": null + } + } + }, + "redirectTo": null + }, + { + "currentPath": "/sdk/android/message/creating-messages/create-quote-message", + "targetPath": "/sdk/android/message/creating-messages/create-quote-message", + "sourceKind": "openim-specific", + "disposition": "adapt", + "openimSources": [ + "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/manager/MessageManager.java" + ], + "sdkMethods": [ + "createQuoteMessage" + ], + "sdkEvents": [], + "locales": { + "zh": { + "reviewStatus": "published", + "reviewer": "Codex", + "reviewedAt": "2026-08-10", + "exampleVerification": { + "status": "verified", + "evidence": [ + "MessageManager.createQuoteMessage" + ], + "reason": null + } + }, + "en": { + "reviewStatus": "published", + "reviewer": "Codex", + "reviewedAt": "2026-08-10", + "exampleVerification": { + "status": "verified", + "evidence": [ + "MessageManager.createQuoteMessage" + ], + "reason": null + } + } + }, + "redirectTo": null + }, + { + "currentPath": "/sdk/android/message/creating-messages/create-advanced-text-message", + "targetPath": "/sdk/android/message/creating-messages/create-advanced-text-message", + "sourceKind": "openim-specific", + "disposition": "adapt", + "openimSources": [ + "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/manager/MessageManager.java", + "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/models/RichMessage.java" + ], + "sdkMethods": [ + "createAdvancedTextMessage" + ], + "sdkEvents": [], + "locales": { + "zh": { + "reviewStatus": "published", + "reviewer": "Codex", + "reviewedAt": "2026-08-10", + "exampleVerification": { + "status": "verified", + "evidence": [ + "MessageManager.createAdvancedTextMessage", + "RichMessage" + ], + "reason": null + } + }, + "en": { + "reviewStatus": "published", + "reviewer": "Codex", + "reviewedAt": "2026-08-10", + "exampleVerification": { + "status": "verified", + "evidence": [ + "MessageManager.createAdvancedTextMessage", + "RichMessage" + ], + "reason": null + } + } + }, + "redirectTo": null + }, + { + "currentPath": "/sdk/android/message/creating-messages/create-advanced-quote-message", + "targetPath": "/sdk/android/message/creating-messages/create-advanced-quote-message", + "sourceKind": "openim-specific", + "disposition": "adapt", + "openimSources": [ + "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/manager/MessageManager.java", + "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/models/RichMessage.java" + ], + "sdkMethods": [ + "createAdvancedQuoteMessage" + ], + "sdkEvents": [], + "locales": { + "zh": { + "reviewStatus": "published", + "reviewer": "Codex", + "reviewedAt": "2026-08-10", + "exampleVerification": { + "status": "verified", + "evidence": [ + "MessageManager.createAdvancedQuoteMessage", + "RichMessage" + ], + "reason": null + } + }, + "en": { + "reviewStatus": "published", + "reviewer": "Codex", + "reviewedAt": "2026-08-10", + "exampleVerification": { + "status": "verified", + "evidence": [ + "MessageManager.createAdvancedQuoteMessage", + "RichMessage" + ], + "reason": null + } + } + }, + "redirectTo": null + }, + { + "currentPath": "/sdk/android/message/creating-messages/create-forward-message", + "targetPath": "/sdk/android/message/creating-messages/create-forward-message", + "sourceKind": "openim-specific", + "disposition": "adapt", + "openimSources": [ + "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/manager/MessageManager.java" + ], + "sdkMethods": [ + "createForwardMessage" + ], + "sdkEvents": [], + "locales": { + "zh": { + "reviewStatus": "published", + "reviewer": "Codex", + "reviewedAt": "2026-08-07", + "exampleVerification": { + "status": "verified", + "evidence": [ + "MessageManager.createForwardMessage" + ], + "reason": null + } + }, + "en": { + "reviewStatus": "published", + "reviewer": "Codex", + "reviewedAt": "2026-08-10", + "exampleVerification": { + "status": "verified", + "evidence": [ + "MessageManager.createForwardMessage" + ], + "reason": null + } + } + }, + "redirectTo": null + }, + { + "currentPath": "/sdk/android/message/creating-messages/create-merger-message", + "targetPath": "/sdk/android/message/creating-messages/create-merger-message", + "sourceKind": "openim-specific", + "disposition": "adapt", + "openimSources": [ + "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/manager/MessageManager.java" + ], + "sdkMethods": [ + "createMergerMessage" + ], + "sdkEvents": [], + "locales": { + "zh": { + "reviewStatus": "published", + "reviewer": "Codex", + "reviewedAt": "2026-08-07", + "exampleVerification": { + "status": "verified", + "evidence": [ + "MessageManager.createMergerMessage" + ], + "reason": null + } + }, + "en": { + "reviewStatus": "published", + "reviewer": "Codex", + "reviewedAt": "2026-08-10", + "exampleVerification": { + "status": "verified", + "evidence": [ + "MessageManager.createMergerMessage" + ], + "reason": null + } + } + }, + "redirectTo": null + }, + { + "currentPath": "/sdk/android/message/sending-messages/send-message", + "targetPath": "/sdk/android/message/sending-messages/send-message", + "sourceKind": "openim-specific", + "disposition": "adapt", + "openimSources": [ + "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/manager/MessageManager.java" + ], + "sdkMethods": [ + "sendMessage" + ], + "sdkEvents": [], + "locales": { + "zh": { + "reviewStatus": "published", + "reviewer": "Codex", + "reviewedAt": "2026-08-07", + "exampleVerification": { + "status": "verified", + "evidence": [ + "MessageManager.sendMessage" + ], + "reason": null + } + }, + "en": { + "reviewStatus": "published", + "reviewer": "Codex", + "reviewedAt": "2026-08-10", + "exampleVerification": { + "status": "verified", + "evidence": [ + "MessageManager.sendMessage" + ], + "reason": null + } + } + }, + "redirectTo": null + }, + { + "currentPath": "/sdk/android/message/sending-messages/send-message-not-oss", + "targetPath": "/sdk/android/message/sending-messages/send-message-not-oss", + "sourceKind": "openim-specific", + "disposition": "adapt", + "openimSources": [ + "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/manager/MessageManager.java" + ], + "sdkMethods": [ + "sendMessageNotOss" + ], + "sdkEvents": [], + "locales": { + "zh": { + "reviewStatus": "published", + "reviewer": "Codex", + "reviewedAt": "2026-08-10", + "exampleVerification": { + "status": "verified", + "evidence": [ + "MessageManager.sendMessageNotOss" + ], + "reason": null + } + }, + "en": { + "reviewStatus": "published", + "reviewer": "Codex", + "reviewedAt": "2026-08-10", + "exampleVerification": { + "status": "verified", + "evidence": [ + "MessageManager.sendMessageNotOss" + ], + "reason": null + } + } + }, + "redirectTo": null + }, + { + "currentPath": "/sdk/android/message/sending-messages/set-msg-send-progress-listener", + "targetPath": "/sdk/android/message/sending-messages/set-msg-send-progress-listener", + "sourceKind": "openim-specific", + "disposition": "adapt", + "openimSources": [ + "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/listener/OnMsgSendCallback.java" + ], + "sdkMethods": [], + "sdkEvents": [], + "locales": { + "zh": { + "reviewStatus": "published", + "reviewer": "Codex", + "reviewedAt": "2026-08-10", + "exampleVerification": { + "status": "verified", + "evidence": [ + "OnMsgSendCallback" + ], + "reason": null + } + }, + "en": { + "reviewStatus": "published", + "reviewer": "Codex", + "reviewedAt": "2026-08-10", + "exampleVerification": { + "status": "verified", + "evidence": [ + "OnMsgSendCallback" + ], + "reason": null + } + } + }, + "redirectTo": null + }, + { + "currentPath": "/sdk/android/message/receiving-messages/receive-messages", + "targetPath": "/sdk/android/message/receiving-messages/receive-messages", + "sourceKind": "openim-specific", + "disposition": "adapt", + "openimSources": [ + "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/listener/OnAdvanceMsgListener.java" + ], + "sdkMethods": [], + "sdkEvents": [ + "onRecvOfflineNewMessage", + "onRecvOnlineOnlyMessage" + ], + "locales": { + "zh": { + "reviewStatus": "published", + "reviewer": "Codex", + "reviewedAt": "2026-08-07", + "exampleVerification": { + "status": "verified", + "evidence": [ + "OnAdvanceMsgListener" + ], + "reason": null + } + }, + "en": { + "reviewStatus": "published", + "reviewer": "Codex", + "reviewedAt": "2026-08-10", + "exampleVerification": { + "status": "verified", + "evidence": [ + "OnAdvanceMsgListener" + ], + "reason": null + } + } + }, + "redirectTo": null + }, + { + "currentPath": "/sdk/android/message/receiving-messages/receive-custom-business-messages", + "targetPath": "/sdk/android/message/receiving-messages/receive-custom-business-messages", + "sourceKind": "openim-specific", + "disposition": "adapt", + "openimSources": [ + "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/manager/MessageManager.java", + "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/listener/OnCustomBusinessListener.java" + ], + "sdkMethods": [ + "setCustomBusinessListener" + ], + "sdkEvents": [ + "onRecvCustomBusinessMessage" + ], + "locales": { + "zh": { + "reviewStatus": "published", + "reviewer": "Codex", + "reviewedAt": "2026-08-07", + "exampleVerification": { + "status": "verified", + "evidence": [ + "MessageManager.setCustomBusinessListener", + "OnCustomBusinessListener.onRecvCustomBusinessMessage" + ], + "reason": null + } + }, + "en": { + "reviewStatus": "published", + "reviewer": "Codex", + "reviewedAt": "2026-08-10", + "exampleVerification": { + "status": "verified", + "evidence": [ + "MessageManager.setCustomBusinessListener", + "OnCustomBusinessListener.onRecvCustomBusinessMessage" + ], + "reason": null + } + } + }, + "redirectTo": null + }, + { + "currentPath": "/sdk/android/message/retrieving-messages/load-older-messages", + "targetPath": "/sdk/android/message/retrieving-messages/load-older-messages", + "sourceKind": "openim-specific", + "disposition": "adapt", + "openimSources": [ + "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/manager/MessageManager.java" + ], + "sdkMethods": [ + "getAdvancedHistoryMessageList" + ], + "sdkEvents": [], + "locales": { + "zh": { + "reviewStatus": "published", + "reviewer": "Codex", + "reviewedAt": "2026-08-10", + "exampleVerification": { + "status": "verified", + "evidence": [ + "MessageManager.getAdvancedHistoryMessageList" + ], + "reason": null + } + }, + "en": { + "reviewStatus": "published", + "reviewer": "Codex", + "reviewedAt": "2026-08-10", + "exampleVerification": { + "status": "verified", + "evidence": [ + "MessageManager.getAdvancedHistoryMessageList" + ], + "reason": null + } + } + }, + "redirectTo": null + }, + { + "currentPath": "/sdk/android/message/retrieving-messages/load-newer-messages", + "targetPath": "/sdk/android/message/retrieving-messages/load-newer-messages", + "sourceKind": "openim-specific", + "disposition": "adapt", + "openimSources": [ + "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/manager/MessageManager.java" + ], + "sdkMethods": [ + "getAdvancedHistoryMessageListReverse" + ], + "sdkEvents": [], + "locales": { + "zh": { + "reviewStatus": "published", + "reviewer": "Codex", + "reviewedAt": "2026-08-10", + "exampleVerification": { + "status": "verified", + "evidence": [ + "MessageManager.getAdvancedHistoryMessageListReverse" + ], + "reason": null + } + }, + "en": { + "reviewStatus": "published", + "reviewer": "Codex", + "reviewedAt": "2026-08-10", + "exampleVerification": { + "status": "verified", + "evidence": [ + "MessageManager.getAdvancedHistoryMessageListReverse" + ], + "reason": null + } + } + }, + "redirectTo": null + }, + { + "currentPath": "/sdk/android/message/retrieving-messages/find-messages-by-id", + "targetPath": "/sdk/android/message/retrieving-messages/find-messages-by-id", + "sourceKind": "openim-specific", + "disposition": "adapt", + "openimSources": [ + "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/manager/MessageManager.java" + ], + "sdkMethods": [ + "findMessageList" + ], + "sdkEvents": [], + "locales": { + "zh": { + "reviewStatus": "published", + "reviewer": "Codex", + "reviewedAt": "2026-08-10", + "exampleVerification": { + "status": "verified", + "evidence": [ + "MessageManager.findMessageList" + ], + "reason": null + } + }, + "en": { + "reviewStatus": "published", + "reviewer": "Codex", + "reviewedAt": "2026-08-10", + "exampleVerification": { + "status": "verified", + "evidence": [ + "MessageManager.findMessageList" + ], + "reason": null + } + } + }, + "redirectTo": null + }, + { + "currentPath": "/sdk/android/message/retrieving-messages/load-message-context", + "targetPath": "/sdk/android/message/retrieving-messages/load-message-context", + "sourceKind": "openim-specific", + "disposition": "adapt", + "openimSources": [ + "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/manager/MessageManager.java", + "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/models/Messages.java" + ], + "sdkMethods": [ + "fetchSurroundingMessages" + ], + "sdkEvents": [], + "locales": { + "zh": { + "reviewStatus": "published", + "reviewer": "Codex", + "reviewedAt": "2026-08-10", + "exampleVerification": { + "status": "verified", + "evidence": [ + "MessageManager.fetchSurroundingMessages", + "Messages.getData" + ], + "reason": null + } + }, + "en": { + "reviewStatus": "published", + "reviewer": "Codex", + "reviewedAt": "2026-08-10", + "exampleVerification": { + "status": "verified", + "evidence": [ + "MessageManager.fetchSurroundingMessages", + "Messages.getData" + ], + "reason": null + } + } + }, + "redirectTo": null + }, + { + "currentPath": "/sdk/android/message/searching-messages/search-messages", + "targetPath": "/sdk/android/message/searching-messages/search-messages", + "sourceKind": "openim-specific", + "disposition": "adapt", + "openimSources": [ + "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/manager/MessageManager.java" + ], + "sdkMethods": [ + "searchLocalMessages" + ], + "sdkEvents": [], + "locales": { + "zh": { + "reviewStatus": "published", + "reviewer": "Codex", + "reviewedAt": "2026-08-07", + "exampleVerification": { + "status": "verified", + "evidence": [ + "MessageManager.searchLocalMessages" + ], + "reason": null + } + }, + "en": { + "reviewStatus": "published", + "reviewer": "Codex", + "reviewedAt": "2026-08-10", + "exampleVerification": { + "status": "verified", + "evidence": [ + "MessageManager.searchLocalMessages" + ], + "reason": null + } + } + }, + "redirectTo": null + }, + { + "currentPath": "/sdk/android/message/composing-messages/update-typing-status", + "targetPath": "/sdk/android/message/composing-messages/update-typing-status", + "sourceKind": "openim-specific", + "disposition": "adapt", + "openimSources": [ + "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/manager/ConversationManager.java", + "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/listener/OnConversationListener.java", + "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/models/InputStatesChangedData.java" + ], + "sdkMethods": [ + "changeInputState" + ], + "sdkEvents": [ + "onConversationUserInputStatusChanged" + ], + "locales": { + "zh": { + "reviewStatus": "published", + "reviewer": "Codex", + "reviewedAt": "2026-08-10", + "exampleVerification": { + "status": "verified", + "evidence": [ + "ConversationManager.changeInputState", + "OnConversationListener.onConversationUserInputStatusChanged" + ], + "reason": null + } + }, + "en": { + "reviewStatus": "published", + "reviewer": "Codex", + "reviewedAt": "2026-08-10", + "exampleVerification": { + "status": "verified", + "evidence": [ + "ConversationManager.changeInputState", + "OnConversationListener.onConversationUserInputStatusChanged" + ], + "reason": null + } + } + }, + "redirectTo": null + }, + { + "currentPath": "/sdk/android/message/composing-messages/get-typing-status", + "targetPath": "/sdk/android/message/composing-messages/get-typing-status", + "sourceKind": "openim-specific", + "disposition": "adapt", + "openimSources": [ + "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/manager/ConversationManager.java" + ], + "sdkMethods": [ + "getInputState" + ], + "sdkEvents": [], + "locales": { + "zh": { + "reviewStatus": "published", + "reviewer": "Codex", + "reviewedAt": "2026-08-10", + "exampleVerification": { + "status": "verified", + "evidence": [ + "ConversationManager.getInputState" + ], + "reason": null + } + }, + "en": { + "reviewStatus": "published", + "reviewer": "Codex", + "reviewedAt": "2026-08-10", + "exampleVerification": { + "status": "verified", + "evidence": [ + "ConversationManager.getInputState" + ], + "reason": null + } + } + }, + "redirectTo": null + }, + { + "currentPath": "/sdk/android/message/managing-messages/delete-local-message", + "targetPath": "/sdk/android/message/managing-messages/delete-local-message", + "sourceKind": "openim-specific", + "disposition": "adapt", + "openimSources": [ + "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/manager/MessageManager.java" + ], + "sdkMethods": [ + "deleteMessageFromLocalStorage" + ], + "sdkEvents": [], + "locales": { + "zh": { + "reviewStatus": "published", + "reviewer": "Codex", + "reviewedAt": "2026-08-07", + "exampleVerification": { + "status": "verified", + "evidence": [ + "MessageManager.deleteMessageFromLocalStorage" + ], + "reason": null + } + }, + "en": { + "reviewStatus": "published", + "reviewer": "Codex", + "reviewedAt": "2026-08-10", + "exampleVerification": { + "status": "verified", + "evidence": [ + "MessageManager.deleteMessageFromLocalStorage" + ], + "reason": null + } + } + }, + "redirectTo": null + }, + { + "currentPath": "/sdk/android/message/managing-messages/delete-saved-messages", + "targetPath": "/sdk/android/message/managing-messages/delete-saved-messages", + "sourceKind": "openim-specific", + "disposition": "adapt", + "openimSources": [ + "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/manager/MessageManager.java" + ], + "sdkMethods": [ + "deleteMessages" + ], + "sdkEvents": [ + "onMsgDeleted" + ], + "locales": { + "zh": { + "reviewStatus": "published", + "reviewer": "Codex", + "reviewedAt": "2026-08-10", + "exampleVerification": { + "status": "verified", + "evidence": [ + "MessageManager.deleteMessages", + "OnAdvanceMsgListener.onMsgDeleted" + ], + "reason": null + } + }, + "en": { + "reviewStatus": "published", + "reviewer": "Codex", + "reviewedAt": "2026-08-10", + "exampleVerification": { + "status": "verified", + "evidence": [ + "MessageManager.deleteMessages", + "OnAdvanceMsgListener.onMsgDeleted" + ], + "reason": null + } + } + }, + "redirectTo": null + }, + { + "currentPath": "/sdk/android/message/managing-messages/delete-user-messages", + "targetPath": "/sdk/android/message/managing-messages/delete-user-messages", + "sourceKind": "openim-specific", + "disposition": "adapt", + "openimSources": [ + "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/manager/MessageManager.java", + "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/listener/OnAdvanceMsgListener.java", + "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/models/DeleteUserAllMsgsListenerMsg.java" + ], + "sdkMethods": [ + "deleteUserAllMessagesInConv" + ], + "sdkEvents": [ + "onDeleteUserAllMsgsInConv" + ], + "locales": { + "zh": { + "reviewStatus": "published", + "reviewer": "Codex", + "reviewedAt": "2026-08-10", + "exampleVerification": { + "status": "verified", + "evidence": [ + "MessageManager.deleteUserAllMessagesInConv", + "OnAdvanceMsgListener.onDeleteUserAllMsgsInConv" + ], + "reason": null + } + }, + "en": { + "reviewStatus": "published", + "reviewer": "Codex", + "reviewedAt": "2026-08-10", + "exampleVerification": { + "status": "verified", + "evidence": [ + "MessageManager.deleteUserAllMessagesInConv", + "OnAdvanceMsgListener.onDeleteUserAllMsgsInConv" + ], + "reason": null + } + } + }, + "redirectTo": null + }, + { + "currentPath": "/sdk/android/message/managing-messages/revoke-a-message", + "targetPath": "/sdk/android/message/managing-messages/revoke-a-message", + "sourceKind": "openim-specific", + "disposition": "adapt", + "openimSources": [ + "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/manager/MessageManager.java" + ], + "sdkMethods": [ + "revokeMessageV2" + ], + "sdkEvents": [ + "onRecvMessageRevokedV2" + ], + "locales": { + "zh": { + "reviewStatus": "published", + "reviewer": "Codex", + "reviewedAt": "2026-08-07", + "exampleVerification": { + "status": "verified", + "evidence": [ + "MessageManager.revokeMessageV2", + "OnAdvanceMsgListener.onRecvMessageRevokedV2" + ], + "reason": null + } + }, + "en": { + "reviewStatus": "published", + "reviewer": "Codex", + "reviewedAt": "2026-08-10", + "exampleVerification": { + "status": "verified", + "evidence": [ + "MessageManager.revokeMessageV2", + "OnAdvanceMsgListener.onRecvMessageRevokedV2" + ], + "reason": null + } + } + }, + "redirectTo": null + }, + { + "currentPath": "/sdk/android/message/managing-messages/modify-a-message", + "targetPath": "/sdk/android/message/managing-messages/modify-a-message", + "sourceKind": "openim-specific", + "disposition": "adapt", + "openimSources": [ + "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/manager/MessageManager.java" + ], + "sdkMethods": [ + "modifyMessage" + ], + "sdkEvents": [ + "onMessageModified" + ], + "locales": { + "zh": { + "reviewStatus": "published", + "reviewer": "Codex", + "reviewedAt": "2026-08-07", + "exampleVerification": { + "status": "verified", + "evidence": [ + "MessageManager.modifyMessage", + "OnAdvanceMsgListener.onMessageModified" + ], + "reason": null + } + }, + "en": { + "reviewStatus": "published", + "reviewer": "Codex", + "reviewedAt": "2026-08-10", + "exampleVerification": { + "status": "verified", + "evidence": [ + "MessageManager.modifyMessage", + "OnAdvanceMsgListener.onMessageModified" + ], + "reason": null + } + } + }, + "redirectTo": null + }, + { + "currentPath": "/sdk/android/message/managing-messages/get-pinned-messages", + "targetPath": "/sdk/android/message/managing-messages/get-pinned-messages", + "sourceKind": "openim-specific", + "disposition": "adapt", + "openimSources": [ + "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/manager/MessageManager.java" + ], + "sdkMethods": [ + "getConversationPinnedMsgs" + ], + "sdkEvents": [], + "locales": { + "zh": { + "reviewStatus": "published", + "reviewer": "Codex", + "reviewedAt": "2026-08-10", + "exampleVerification": { + "status": "verified", + "evidence": [ + "MessageManager.getConversationPinnedMsgs" + ], + "reason": null + } + }, + "en": { + "reviewStatus": "published", + "reviewer": "Codex", + "reviewedAt": "2026-08-10", + "exampleVerification": { + "status": "verified", + "evidence": [ + "MessageManager.getConversationPinnedMsgs" + ], + "reason": null + } + } + }, + "redirectTo": null + }, + { + "currentPath": "/sdk/android/message/managing-messages/set-message-pinned", + "targetPath": "/sdk/android/message/managing-messages/set-message-pinned", + "sourceKind": "openim-specific", + "disposition": "adapt", + "openimSources": [ + "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/manager/MessageManager.java" + ], + "sdkMethods": [ + "setConversationPinnedMsg" + ], + "sdkEvents": [ + "onChangedPinnedMsg" + ], + "locales": { + "zh": { + "reviewStatus": "published", + "reviewer": "Codex", + "reviewedAt": "2026-08-07", + "exampleVerification": { + "status": "verified", + "evidence": [ + "MessageManager.setConversationPinnedMsg", + "OnAdvanceMsgListener.onChangedPinnedMsg" + ], + "reason": null + } + }, + "en": { + "reviewStatus": "published", + "reviewer": "Codex", + "reviewedAt": "2026-08-10", + "exampleVerification": { + "status": "verified", + "evidence": [ + "MessageManager.setConversationPinnedMsg", + "OnAdvanceMsgListener.onChangedPinnedMsg" + ], + "reason": null + } + } + }, + "redirectTo": null + }, + { + "currentPath": "/sdk/android/message/managing-messages/insert-local-single-message", + "targetPath": "/sdk/android/message/managing-messages/insert-local-single-message", + "sourceKind": "openim-specific", + "disposition": "adapt", + "openimSources": [ + "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/manager/MessageManager.java" + ], + "sdkMethods": [ + "insertSingleMessageToLocalStorage" + ], + "sdkEvents": [], + "locales": { + "zh": { + "reviewStatus": "published", + "reviewer": "Codex", + "reviewedAt": "2026-08-07", + "exampleVerification": { + "status": "verified", + "evidence": [ + "MessageManager.insertSingleMessageToLocalStorage" + ], + "reason": null + } + }, + "en": { + "reviewStatus": "published", + "reviewer": "Codex", + "reviewedAt": "2026-08-10", + "exampleVerification": { + "status": "verified", + "evidence": [ + "MessageManager.insertSingleMessageToLocalStorage" + ], + "reason": null + } + } + }, + "redirectTo": null + }, + { + "currentPath": "/sdk/android/message/managing-messages/insert-local-group-message", + "targetPath": "/sdk/android/message/managing-messages/insert-local-group-message", + "sourceKind": "openim-specific", + "disposition": "adapt", + "openimSources": [ + "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/manager/MessageManager.java" + ], + "sdkMethods": [ + "insertGroupMessageToLocalStorage" + ], + "sdkEvents": [], + "locales": { + "zh": { + "reviewStatus": "published", + "reviewer": "Codex", + "reviewedAt": "2026-08-07", + "exampleVerification": { + "status": "verified", + "evidence": [ + "MessageManager.insertGroupMessageToLocalStorage" + ], + "reason": null + } + }, + "en": { + "reviewStatus": "published", + "reviewer": "Codex", + "reviewedAt": "2026-08-10", + "exampleVerification": { + "status": "verified", + "evidence": [ + "MessageManager.insertGroupMessageToLocalStorage" + ], + "reason": null + } + } + }, + "redirectTo": null + }, + { + "currentPath": "/sdk/android/message/managing-messages/clear-all-local-messages", + "targetPath": "/sdk/android/message/managing-messages/clear-all-local-messages", + "sourceKind": "openim-specific", + "disposition": "adapt", + "openimSources": [ + "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/manager/MessageManager.java" + ], + "sdkMethods": [ + "deleteAllMsgFromLocal" + ], + "sdkEvents": [], + "locales": { + "zh": { + "reviewStatus": "published", + "reviewer": "Codex", + "reviewedAt": "2026-08-10", + "exampleVerification": { + "status": "verified", + "evidence": [ + "MessageManager.deleteAllMsgFromLocal" + ], + "reason": null + } + }, + "en": { + "reviewStatus": "published", + "reviewer": "Codex", + "reviewedAt": "2026-08-10", + "exampleVerification": { + "status": "verified", + "evidence": [ + "MessageManager.deleteAllMsgFromLocal" + ], + "reason": null + } + } + }, + "redirectTo": null + }, + { + "currentPath": "/sdk/android/message/managing-messages/clear-all-messages", + "targetPath": "/sdk/android/message/managing-messages/clear-all-messages", + "sourceKind": "openim-specific", + "disposition": "adapt", + "openimSources": [ + "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/manager/MessageManager.java" + ], + "sdkMethods": [ + "deleteAllMsgFromLocalAndSvr" + ], + "sdkEvents": [], + "locales": { + "zh": { + "reviewStatus": "published", + "reviewer": "Codex", + "reviewedAt": "2026-08-10", + "exampleVerification": { + "status": "verified", + "evidence": [ + "MessageManager.deleteAllMsgFromLocalAndSvr" + ], + "reason": null + } + }, + "en": { + "reviewStatus": "published", + "reviewer": "Codex", + "reviewedAt": "2026-08-10", + "exampleVerification": { + "status": "verified", + "evidence": [ + "MessageManager.deleteAllMsgFromLocalAndSvr" + ], + "reason": null + } + } + }, + "redirectTo": null + }, + { + "currentPath": "/sdk/android/message/managing-messages/set-message-local-ex", + "targetPath": "/sdk/android/message/managing-messages/set-message-local-ex", + "sourceKind": "openim-specific", + "disposition": "adapt", + "openimSources": [ + "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/manager/MessageManager.java" + ], + "sdkMethods": [ + "setMessageLocalEx" + ], + "sdkEvents": [], + "locales": { + "zh": { + "reviewStatus": "published", + "reviewer": "Codex", + "reviewedAt": "2026-08-10", + "exampleVerification": { + "status": "verified", + "evidence": [ + "MessageManager.setMessageLocalEx" + ], + "reason": null + } + }, + "en": { + "reviewStatus": "published", + "reviewer": "Codex", + "reviewedAt": "2026-08-10", + "exampleVerification": { + "status": "verified", + "evidence": [ + "MessageManager.setMessageLocalEx" + ], + "reason": null + } + } + }, + "redirectTo": null + }, + { + "currentPath": "/sdk/android/message/managing-read-status/send-group-read-receipts", + "targetPath": "/sdk/android/message/managing-read-status/send-group-read-receipts", + "sourceKind": "openim-specific", + "disposition": "adapt", + "openimSources": [ + "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/manager/MessageManager.java", + "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/listener/OnAdvanceMsgListener.java", + "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/models/GroupMessageReceipt.java" + ], + "sdkMethods": [ + "sendGroupMessageReadReceipt" + ], + "sdkEvents": [ + "onRecvGroupMessageReadReceipt" + ], + "locales": { + "zh": { + "reviewStatus": "published", + "reviewer": "Codex", + "reviewedAt": "2026-08-10", + "exampleVerification": { + "status": "verified", + "evidence": [ + "MessageManager.sendGroupMessageReadReceipt", + "OnAdvanceMsgListener.onRecvGroupMessageReadReceipt" + ], + "reason": null + } + }, + "en": { + "reviewStatus": "published", + "reviewer": "Codex", + "reviewedAt": "2026-08-10", + "exampleVerification": { + "status": "verified", + "evidence": [ + "MessageManager.sendGroupMessageReadReceipt", + "OnAdvanceMsgListener.onRecvGroupMessageReadReceipt" + ], + "reason": null + } + } + }, + "redirectTo": null + }, + { + "currentPath": "/sdk/android/message/managing-read-status/get-group-message-readers", + "targetPath": "/sdk/android/message/managing-read-status/get-group-message-readers", + "sourceKind": "openim-specific", + "disposition": "adapt", + "openimSources": [ + "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/manager/MessageManager.java", + "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/models/GroupMembersInfo.java" + ], + "sdkMethods": [ + "getGroupMessageReaderList" + ], + "sdkEvents": [], + "locales": { + "zh": { + "reviewStatus": "published", + "reviewer": "Codex", + "reviewedAt": "2026-08-10", + "exampleVerification": { + "status": "verified", + "evidence": [ + "MessageManager.getGroupMessageReaderList" + ], + "reason": null + } + }, + "en": { + "reviewStatus": "published", + "reviewer": "Codex", + "reviewedAt": "2026-08-10", + "exampleVerification": { + "status": "verified", + "evidence": [ + "MessageManager.getGroupMessageReaderList" + ], + "reason": null + } + } + }, + "redirectTo": null + }, + { + "currentPath": "/sdk/android/file-uploads/track-file-upload-progress", + "targetPath": "/sdk/android/file-uploads/track-file-upload-progress", + "sourceKind": "openim-specific", + "disposition": "adapt", + "openimSources": [ + "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/OpenIMClient.java", + "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/listener/OnPutFileListener.java" + ], + "sdkMethods": [], + "sdkEvents": [], + "locales": { + "zh": { + "reviewStatus": "published", + "reviewer": "Codex", + "reviewedAt": "2026-08-10", + "exampleVerification": { + "status": "verified", + "evidence": [ + "OpenIMClient.uploadFile", + "OnPutFileListener" + ], + "reason": null + } + }, + "en": { + "reviewStatus": "published", + "reviewer": "Codex", + "reviewedAt": "2026-08-10", + "exampleVerification": { + "status": "verified", + "evidence": [ + "OpenIMClient.uploadFile", + "OnPutFileListener" + ], + "reason": null + } + } + }, + "redirectTo": null + }, + { + "currentPath": "/sdk/android/file-uploads/upload-file", + "targetPath": "/sdk/android/file-uploads/upload-file", + "sourceKind": "openim-specific", + "disposition": "adapt", + "openimSources": [ + "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/OpenIMClient.java", + "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/listener/OnPutFileListener.java", + "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/models/PutArgs.java" + ], + "sdkMethods": [ + "uploadFile" + ], + "sdkEvents": [], + "locales": { + "zh": { + "reviewStatus": "published", + "reviewer": "Codex", + "reviewedAt": "2026-08-07", + "exampleVerification": { + "status": "verified", + "evidence": [ + "OpenIMClient.uploadFile", + "OnPutFileListener", + "PutArgs" + ], + "reason": null + } + }, + "en": { + "reviewStatus": "published", + "reviewer": "Codex", + "reviewedAt": "2026-08-10", + "exampleVerification": { + "status": "verified", + "evidence": [ + "OpenIMClient.uploadFile", + "OnPutFileListener", + "PutArgs" + ], + "reason": null + } + } + }, + "redirectTo": null + }, + { + "currentPath": "/sdk/android/calling/overview-calling", + "targetPath": "/sdk/android/calling/overview-calling", + "sourceKind": "openim-specific", + "disposition": "adapt", + "openimSources": [ + "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/manager/SignalingManager.java", + "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/models/SignalingInfo.java", + "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/models/SignalingCertificate.java" + ], + "sdkMethods": [], + "sdkEvents": [], + "locales": { + "zh": { + "reviewStatus": "published", + "reviewer": "Codex", + "reviewedAt": "2026-08-07", + "exampleVerification": { + "status": "not-applicable", + "evidence": [], + "reason": "Conceptual overview without a code example." + } + }, + "en": { + "reviewStatus": "published", + "reviewer": "Codex", + "reviewedAt": "2026-08-10", + "exampleVerification": { + "status": "not-applicable", + "evidence": [], + "reason": "Conceptual overview without a code example." + } + } + }, + "redirectTo": null + }, + { + "currentPath": "/sdk/android/calling/managing-calls/start-single-call", + "targetPath": "/sdk/android/calling/managing-calls/start-single-call", + "sourceKind": "openim-specific", + "disposition": "adapt", + "openimSources": [ + "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/manager/SignalingManager.java", + "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/models/SignalingInvitationInfo.java" + ], + "sdkMethods": [ + "signalingInvite" + ], + "sdkEvents": [], + "locales": { + "zh": { + "reviewStatus": "published", + "reviewer": "Codex", + "reviewedAt": "2026-08-07", + "exampleVerification": { + "status": "verified", + "evidence": [ + "SignalingManager.signalingInvite", + "SignalingInvitationInfo" + ], + "reason": null + } + }, + "en": { + "reviewStatus": "published", + "reviewer": "Codex", + "reviewedAt": "2026-08-10", + "exampleVerification": { + "status": "verified", + "evidence": [ + "SignalingManager.signalingInvite", + "SignalingInvitationInfo" + ], + "reason": null + } + } + }, + "redirectTo": null + }, + { + "currentPath": "/sdk/android/calling/managing-calls/start-group-call", + "targetPath": "/sdk/android/calling/managing-calls/start-group-call", + "sourceKind": "openim-specific", + "disposition": "adapt", + "openimSources": [ + "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/manager/SignalingManager.java", + "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/models/SignalingInvitationInfo.java" + ], + "sdkMethods": [ + "signalingInviteInGroup" + ], + "sdkEvents": [], + "locales": { + "zh": { + "reviewStatus": "published", + "reviewer": "Codex", + "reviewedAt": "2026-08-07", + "exampleVerification": { + "status": "verified", + "evidence": [ + "SignalingManager.signalingInviteInGroup", + "SignalingInvitationInfo" + ], + "reason": null + } + }, + "en": { + "reviewStatus": "published", + "reviewer": "Codex", + "reviewedAt": "2026-08-10", + "exampleVerification": { + "status": "verified", + "evidence": [ + "SignalingManager.signalingInviteInGroup", + "SignalingInvitationInfo" + ], + "reason": null + } + } + }, + "redirectTo": null + }, + { + "currentPath": "/sdk/android/calling/managing-calls/accept-call", + "targetPath": "/sdk/android/calling/managing-calls/accept-call", + "sourceKind": "openim-specific", + "disposition": "adapt", + "openimSources": [ + "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/manager/SignalingManager.java" + ], + "sdkMethods": [ + "signalingAccept" + ], + "sdkEvents": [], + "locales": { + "zh": { + "reviewStatus": "published", + "reviewer": "Codex", + "reviewedAt": "2026-08-07", + "exampleVerification": { + "status": "verified", + "evidence": [ + "SignalingManager.signalingAccept" + ], + "reason": null + } + }, + "en": { + "reviewStatus": "published", + "reviewer": "Codex", + "reviewedAt": "2026-08-10", + "exampleVerification": { + "status": "verified", + "evidence": [ + "SignalingManager.signalingAccept" + ], + "reason": null + } + } + }, + "redirectTo": null + }, + { + "currentPath": "/sdk/android/calling/managing-calls/reject-call", + "targetPath": "/sdk/android/calling/managing-calls/reject-call", + "sourceKind": "openim-specific", + "disposition": "adapt", + "openimSources": [ + "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/manager/SignalingManager.java" + ], + "sdkMethods": [ + "signalingReject" + ], + "sdkEvents": [], + "locales": { + "zh": { + "reviewStatus": "published", + "reviewer": "Codex", + "reviewedAt": "2026-08-07", + "exampleVerification": { + "status": "verified", + "evidence": [ + "SignalingManager.signalingReject" + ], + "reason": null + } + }, + "en": { + "reviewStatus": "published", + "reviewer": "Codex", + "reviewedAt": "2026-08-10", + "exampleVerification": { + "status": "verified", + "evidence": [ + "SignalingManager.signalingReject" + ], + "reason": null + } + } + }, + "redirectTo": null + }, + { + "currentPath": "/sdk/android/calling/managing-calls/cancel-call", + "targetPath": "/sdk/android/calling/managing-calls/cancel-call", + "sourceKind": "openim-specific", + "disposition": "adapt", + "openimSources": [ + "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/manager/SignalingManager.java" + ], + "sdkMethods": [ + "signalingCancel" + ], + "sdkEvents": [], + "locales": { + "zh": { + "reviewStatus": "published", + "reviewer": "Codex", + "reviewedAt": "2026-08-07", + "exampleVerification": { + "status": "verified", + "evidence": [ + "SignalingManager.signalingCancel" + ], + "reason": null + } + }, + "en": { + "reviewStatus": "published", + "reviewer": "Codex", + "reviewedAt": "2026-08-10", + "exampleVerification": { + "status": "verified", + "evidence": [ + "SignalingManager.signalingCancel" + ], + "reason": null + } + } + }, + "redirectTo": null + }, + { + "currentPath": "/sdk/android/calling/managing-calls/hang-up-call", + "targetPath": "/sdk/android/calling/managing-calls/hang-up-call", + "sourceKind": "openim-specific", + "disposition": "adapt", + "openimSources": [ + "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/manager/SignalingManager.java" + ], + "sdkMethods": [ + "signalingHungUp" + ], + "sdkEvents": [], + "locales": { + "zh": { + "reviewStatus": "published", + "reviewer": "Codex", + "reviewedAt": "2026-08-07", + "exampleVerification": { + "status": "verified", + "evidence": [ + "SignalingManager.signalingHungUp" + ], + "reason": null + } + }, + "en": { + "reviewStatus": "published", + "reviewer": "Codex", + "reviewedAt": "2026-08-10", + "exampleVerification": { + "status": "verified", + "evidence": [ + "SignalingManager.signalingHungUp" + ], + "reason": null + } + } + }, + "redirectTo": null + }, + { + "currentPath": "/sdk/android/calling/managing-calls/handle-call-events", + "targetPath": "/sdk/android/calling/managing-calls/handle-call-events", + "sourceKind": "openim-specific", + "disposition": "adapt", + "openimSources": [ + "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/manager/SignalingManager.java", + "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/listener/OnSignalingListener.java", + "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/listener/_SignalingListener.java" + ], + "sdkMethods": [ + "setSignalingListener" + ], + "sdkEvents": [ + "onHangup", + "onInvitationCancelled", + "onInvitationTimeout", + "onInviteeAccepted", + "onInviteeAcceptedByOtherDevice", + "onInviteeRejected", + "onInviteeRejectedByOtherDevice", + "onReceiveNewInvitation", + "onRoomParticipantConnected", + "onRoomParticipantDisconnected", + "onStreamChange" + ], + "locales": { + "zh": { + "reviewStatus": "published", + "reviewer": "Codex", + "reviewedAt": "2026-08-07", + "exampleVerification": { + "status": "verified", + "evidence": [ + "SignalingManager.setSignalingListener", + "_SignalingListener" + ], + "reason": null + } + }, + "en": { + "reviewStatus": "published", + "reviewer": "Codex", + "reviewedAt": "2026-08-10", + "exampleVerification": { + "status": "verified", + "evidence": [ + "SignalingManager.setSignalingListener", + "_SignalingListener" + ], + "reason": null + } + } + }, + "redirectTo": null + }, + { + "currentPath": "/sdk/android/calling/retrieving-call-information/restore-pending-invitation", + "targetPath": "/sdk/android/calling/retrieving-call-information/restore-pending-invitation", + "sourceKind": "openim-specific", + "disposition": "adapt", + "openimSources": [ + "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/manager/SignalingManager.java" + ], + "sdkMethods": [ + "getSignalingInvitationInfoStartApp" + ], + "sdkEvents": [], + "locales": { + "zh": { + "reviewStatus": "published", + "reviewer": "Codex", + "reviewedAt": "2026-08-07", + "exampleVerification": { + "status": "verified", + "evidence": [ + "SignalingManager.getSignalingInvitationInfoStartApp" + ], + "reason": null + } + }, + "en": { + "reviewStatus": "published", + "reviewer": "Codex", + "reviewedAt": "2026-08-10", + "exampleVerification": { + "status": "verified", + "evidence": [ + "SignalingManager.getSignalingInvitationInfoStartApp" + ], + "reason": null + } + } + }, + "redirectTo": null + }, + { + "currentPath": "/sdk/android/calling/retrieving-call-information/get-room-by-group-id", + "targetPath": "/sdk/android/calling/retrieving-call-information/get-room-by-group-id", + "sourceKind": "openim-specific", + "disposition": "adapt", + "openimSources": [ + "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/manager/SignalingManager.java", + "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/models/RoomCallingInfo.java" + ], + "sdkMethods": [ + "signalingGetRoomByGroupID" + ], + "sdkEvents": [], + "locales": { + "zh": { + "reviewStatus": "published", + "reviewer": "Codex", + "reviewedAt": "2026-08-07", + "exampleVerification": { + "status": "verified", + "evidence": [ + "SignalingManager.signalingGetRoomByGroupID", + "RoomCallingInfo" + ], + "reason": null + } + }, + "en": { + "reviewStatus": "published", + "reviewer": "Codex", + "reviewedAt": "2026-08-10", + "exampleVerification": { + "status": "verified", + "evidence": [ + "SignalingManager.signalingGetRoomByGroupID", + "RoomCallingInfo" + ], + "reason": null + } + } + }, + "redirectTo": null + }, + { + "currentPath": "/sdk/android/calling/retrieving-call-information/get-token-by-room-id", + "targetPath": "/sdk/android/calling/retrieving-call-information/get-token-by-room-id", + "sourceKind": "openim-specific", + "disposition": "adapt", + "openimSources": [ + "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/manager/SignalingManager.java", + "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/models/SignalingCertificate.java" + ], + "sdkMethods": [ + "signalingGetTokenByRoomID" + ], + "sdkEvents": [], + "locales": { + "zh": { + "reviewStatus": "published", + "reviewer": "Codex", + "reviewedAt": "2026-08-07", + "exampleVerification": { + "status": "verified", + "evidence": [ + "SignalingManager.signalingGetTokenByRoomID", + "SignalingCertificate" + ], + "reason": null + } + }, + "en": { + "reviewStatus": "published", + "reviewer": "Codex", + "reviewedAt": "2026-08-10", + "exampleVerification": { + "status": "verified", + "evidence": [ + "SignalingManager.signalingGetTokenByRoomID", + "SignalingCertificate" + ], + "reason": null + } + } + }, + "redirectTo": null + }, + { + "currentPath": "/sdk/android/calling/sending-custom-signals/send-a-custom-signal", + "targetPath": "/sdk/android/calling/sending-custom-signals/send-a-custom-signal", + "sourceKind": "openim-specific", + "disposition": "adapt", + "openimSources": [ + "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/manager/SignalingManager.java", + "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/listener/OnSignalingListener.java", + "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/models/CustomSignalingInfo.java" + ], + "sdkMethods": [ + "signalingSendCustomSignal" + ], + "sdkEvents": [ + "onReceiveCustomSignal" + ], + "locales": { + "zh": { + "reviewStatus": "published", + "reviewer": "Codex", + "reviewedAt": "2026-08-07", + "exampleVerification": { + "status": "verified", + "evidence": [ + "SignalingManager.signalingSendCustomSignal", + "OnSignalingListener.onReceiveCustomSignal" + ], + "reason": null + } + }, + "en": { + "reviewStatus": "published", + "reviewer": "Codex", + "reviewedAt": "2026-08-10", + "exampleVerification": { + "status": "verified", + "evidence": [ + "SignalingManager.signalingSendCustomSignal", + "OnSignalingListener.onReceiveCustomSignal" + ], + "reason": null + } + } + }, + "redirectTo": null + }, + { + "currentPath": "/sdk/android/events/overview-events", + "targetPath": "/sdk/android/events/overview-events", + "sourceKind": "openim-specific", + "disposition": "adapt", + "openimSources": [ + "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/manager/ConversationManager.java", + "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/listener/OnConversationListener.java", + "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/listener/_ConversationListener.java" + ], + "sdkMethods": [], + "sdkEvents": [ + "onSyncServerStart", + "onSyncServerProgress", + "onSyncServerFinish", + "onSyncServerFailed" + ], + "locales": { + "zh": { + "reviewStatus": "published", + "reviewer": "Codex", + "reviewedAt": "2026-08-07", + "exampleVerification": { + "status": "verified", + "evidence": [ + "ConversationManager.setOnConversationListener", + "OnConversationListener" + ], + "reason": null + } + }, + "en": { + "reviewStatus": "published", + "reviewer": "Codex", + "reviewedAt": "2026-08-10", + "exampleVerification": { + "status": "verified", + "evidence": [ + "ConversationManager.setOnConversationListener", + "OnConversationListener" + ], + "reason": null + } + } + }, + "redirectTo": null + }, + { + "currentPath": "/sdk/android/logger", + "targetPath": "/sdk/android/logger", + "sourceKind": "openim-specific", + "disposition": "adapt", + "openimSources": [ + "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/OpenIMClient.java", + "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/models/InitConfig.java", + "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/enums/LogLevel.java", + "https://github.com/openimsdk/open-im-sdk-android-enterprise/blob/f82b142c7d3b4b66ce20586adabc69de9cd61673/OpenIM-SDK/src/main/java/io/openim/android/sdk/utils/ParamsUtil.java" + ], + "sdkMethods": [ + "logs", + "uploadLogs" + ], + "sdkEvents": [], + "locales": { + "zh": { + "reviewStatus": "published", + "reviewer": "Codex", + "reviewedAt": "2026-08-07", + "exampleVerification": { + "status": "verified", + "evidence": [ + "OpenIMClient.logs", + "OpenIMClient.uploadLogs", + "InitConfig", + "LogLevel" + ], + "reason": null + } + }, + "en": { + "reviewStatus": "published", + "reviewer": "Codex", + "reviewedAt": "2026-08-10", + "exampleVerification": { + "status": "verified", + "evidence": [ + "OpenIMClient.logs", + "OpenIMClient.uploadLogs", + "InitConfig", + "LogLevel" + ], + "reason": null + } + } + }, + "redirectTo": null + } + ] +} diff --git a/data/structure/android-navigation-labels.json b/data/structure/android-navigation-labels.json new file mode 100644 index 0000000000..e75bc1a784 --- /dev/null +++ b/data/structure/android-navigation-labels.json @@ -0,0 +1,413 @@ +{ + "OpenIM SDK for Android": "OpenIM Android SDK 概览", + "Overview": "概览", + "overview": "概览", + "Getting started": "快速开始", + "getting-started": "快速开始", + "Before you start": "开始之前", + "before-you-start": "开始之前", + "Integrate for Android": "按 Android 环境接入", + "Environment-specific implementation": "按 Android 环境接入", + "environment-specific-implementation": "按 Android 环境接入", + "Authenticate and manage a session": "认证与管理登录会话", + "authenticate-and-manage-session": "认证与管理登录会话", + "Send your first message": "发送第一条消息", + "send-first-message": "发送第一条消息", + "Users": "用户", + "User": "用户", + "user": "用户", + "User overview": "用户概览", + "overview-user": "用户概览", + "User profiles": "用户资料", + "User profile": "用户资料", + "user-profile": "用户资料", + "user/user-profile": "用户资料", + "Get specified user profiles": "获取指定用户资料", + "get-users-info": "获取指定用户资料", + "Get the current user profile": "获取当前用户资料", + "get-self-local-user-info": "获取当前用户资料", + "Update your profile": "更新当前用户资料", + "set-self-info": "更新当前用户资料", + "Set global message reception": "设置全局消息接收方式", + "set-global-message-reception": "设置全局消息接收方式", + "Relationships": "关系链", + "relationships": "关系链", + "Friends": "好友", + "friends": "好友", + "user/friends": "好友", + "Get the friend list by page": "分页获取好友列表", + "Get the friend list": "分页获取好友列表", + "get-friend-list-page": "分页获取好友列表", + "Search friends": "搜索好友", + "search-friends": "搜索好友", + "Get specified friend profiles": "查询指定好友资料", + "Get friend profiles": "查询指定好友资料", + "get-friends-info": "查询指定好友资料", + "Check friendship": "检查好友关系", + "Check friendship status": "检查好友关系", + "check-friend": "检查好友关系", + "Update friend profiles": "更新好友资料", + "Update friend information": "更新好友资料", + "update-friends": "更新好友资料", + "Delete a friend": "删除好友", + "delete-friend": "删除好友", + "Friend requests": "好友申请", + "Friend applications": "好友申请", + "friend-applications": "好友申请", + "user/friend-applications": "好友申请", + "Send a friend request": "发送好友申请", + "Send a friend application": "发送好友申请", + "add-friend": "发送好友申请", + "Get received friend requests": "获取收到的好友申请", + "Get received friend applications": "获取收到的好友申请", + "get-recv-friend-application-list": "获取收到的好友申请", + "Get sent friend requests": "获取发出的好友申请", + "Get sent friend applications": "获取发出的好友申请", + "get-send-friend-application-list": "获取发出的好友申请", + "Accept a friend request": "接受好友申请", + "Accept a friend application": "接受好友申请", + "accept-friend-application": "接受好友申请", + "Reject a friend request": "拒绝好友申请", + "Reject a friend application": "拒绝好友申请", + "refuse-friend-application": "拒绝好友申请", + "Blacklist": "黑名单", + "blacklist": "黑名单", + "user/blacklist": "黑名单", + "Get the blacklist": "获取黑名单列表", + "get-blacklist": "获取黑名单列表", + "Block a user": "拉黑用户", + "add-blacklist": "拉黑用户", + "Unblock a user": "取消拉黑用户", + "remove-blacklist": "取消拉黑用户", + "Online status": "在线状态", + "online-status": "在线状态", + "user/online-status": "在线状态", + "Subscribe to user online status": "订阅用户在线状态", + "Subscribe to user status": "订阅用户在线状态", + "subscribe-users-online-status": "订阅用户在线状态", + "Get subscribed user online status": "查询已订阅用户状态", + "Refresh subscribed user status": "查询已订阅用户状态", + "get-subscribe-online-users-status": "查询已订阅用户状态", + "Unsubscribe from user status": "取消用户状态订阅", + "unsubscribe-users-online-status": "取消用户状态订阅", + "Conversation": "会话", + "conversation": "会话", + "Conversation overview": "会话概览", + "overview-conversation": "会话概览", + "Retrieving conversations": "查询会话", + "retrieving-conversations": "查询会话", + "Open a conversation": "查询指定会话", + "get-conversation-by-target": "查询指定会话", + "Resolve a conversation ID": "生成会话 ID", + "get-conversation-id": "生成会话 ID", + "Get conversations by ID": "按 ID 批量获取会话", + "get-conversations-by-id": "按 ID 批量获取会话", + "Get the conversation list": "获取会话列表", + "retrieve-conversation-list": "获取会话列表", + "Conversation organization": "会话整理", + "conversation-list-and-drafts": "会话整理", + "Pin or unpin a conversation": "置顶或取消置顶会话", + "pin-conversation": "置顶或取消置顶会话", + "Set conversation extra data": "设置会话扩展字段", + "set-conversation-extension": "设置会话扩展字段", + "Set a conversation draft": "设置会话草稿", + "set-conversation-draft": "设置会话草稿", + "Unread status and notifications": "未读与消息提醒", + "message-reception-and-reminders": "未读与消息提醒", + "Set conversation message reception": "设置会话消息接收方式", + "set-message-receive-option": "设置会话消息接收方式", + "Reset group mention status": "重置群聊 @ 状态", + "clear-group-mentions": "重置群聊 @ 状态", + "Mark a conversation as read": "标记会话已读", + "mark-conversation-read": "标记会话已读", + "Track the total unread count": "获取消息总未读数", + "get-total-unread-count": "获取消息总未读数", + "Message retention and privacy": "消息保留与隐私", + "message-retention-and-privacy": "消息保留与隐私", + "Enable or disable burn after reading": "开启或关闭阅后即焚", + "set-private-chat": "开启或关闭阅后即焚", + "Set the burn duration": "设置阅后即焚时长", + "set-burn-duration": "设置阅后即焚时长", + "Schedule server message deletion": "定期删除服务端消息", + "set-message-destruct": "定期删除服务端消息", + "Hiding and deleting conversations": "隐藏与删除会话", + "hiding-and-deleting-conversations": "隐藏与删除会话", + "Hide a conversation": "隐藏会话", + "hide-a-conversation": "隐藏会话", + "Delete a conversation and its messages": "删除会话及消息", + "delete-conversation-with-messages": "删除会话及消息", + "Clear messages in a conversation": "清空会话消息", + "clear-conversation-messages": "清空会话消息", + "Group": "群组", + "group": "群组", + "Group overview": "群组概览", + "overview-group": "群组概览", + "Group profile and settings": "群资料与设置", + "profile-and-settings": "群资料与设置", + "Create a group": "创建群组", + "create-group": "创建群组", + "Update group profile": "更新群名称、简介和头像", + "update-group-profile": "更新群名称、简介和头像", + "Publish a group announcement": "发布或更新群公告", + "set-group-announcement": "发布或更新群公告", + "Set group extra data": "设置群组扩展字段", + "set-group-extension": "设置群组扩展字段", + "Group permissions": "群权限与管理", + "permissions": "群权限与管理", + "Set group join verification": "设置入群验证方式", + "set-group-join-verification": "设置入群验证方式", + "Set member profile access": "设置成员资料查看权限", + "set-group-member-profile-access": "设置成员资料查看权限", + "Set member friend request permission": "设置群内添加好友权限", + "set-group-member-friend-permission": "设置群内添加好友权限", + "Change group mute status": "设置群组全员禁言", + "change-group-mute": "设置群组全员禁言", + "Joining and leaving groups": "加入、退出与解散群组", + "joining-and-leaving": "加入、退出与解散群组", + "Apply to join a group": "申请加入群组", + "join-group": "申请加入群组", + "Leave a group": "退出群组", + "quit-group": "退出群组", + "Dismiss a group": "解散群组", + "dismiss-group": "解散群组", + "Retrieving groups": "查询群组", + "retrieving-groups": "查询群组", + "Get group information": "查询指定群组资料", + "get-specified-groups-info": "查询指定群组资料", + "Get joined groups by page": "分页获取已加入群组", + "get-joined-group-list-page": "分页获取已加入群组", + "Check group membership": "检查是否已加入群组", + "is-join-group": "检查是否已加入群组", + "Search groups": "搜索群组", + "search-groups": "搜索群组", + "Group applications": "入群申请", + "group-applications": "入群申请", + "Group applications overview": "入群申请概览", + "overview-group-applications": "入群申请概览", + "Get received group applications": "获取收到的入群申请", + "get-group-application-list-as-recipient": "获取收到的入群申请", + "Get sent group applications": "获取发出的入群申请", + "get-group-application-list-as-applicant": "获取发出的入群申请", + "Accept a group application": "接受入群申请", + "accept-group-application": "接受入群申请", + "Reject a group application": "拒绝入群申请", + "refuse-group-application": "拒绝入群申请", + "Retrieving group members": "查询群成员", + "retrieving-group-members": "查询群成员", + "Group member queries overview": "群成员查询概览", + "overview-retrieving-group-members": "群成员查询概览", + "Get group members": "分页查询群成员", + "get-group-member-list": "分页查询群成员", + "Get group member profiles": "查询指定群成员资料", + "get-specified-group-members-info": "查询指定群成员资料", + "Check users in a group": "查询用户入群状态", + "get-users-in-group": "查询用户入群状态", + "Get group owners and admins": "获取群主和管理员", + "get-group-member-owner-and-admin": "获取群主和管理员", + "Search group members": "搜索群成员", + "search-group-members": "搜索群成员", + "Managing group members": "管理群成员", + "managing-group-members": "管理群成员", + "Invite users to a group": "邀请用户加入群组", + "invite-user-to-group": "邀请用户加入群组", + "Remove group members": "移除群成员", + "kick-group-member": "移除群成员", + "Update a group nickname": "修改群内昵称", + "set-group-member-nickname": "修改群内昵称", + "Manage group administrators": "设置管理员", + "set-group-member-role-level": "设置管理员", + "Update a group member avatar": "更新群成员头像", + "set-group-member-avatar": "更新群成员头像", + "Set group member extra data": "设置群成员扩展字段", + "set-group-member-extension": "设置群成员扩展字段", + "Transfer group ownership": "转让群主", + "transfer-group-owner": "转让群主", + "Mute or unmute a group member": "设置群成员禁言", + "change-group-member-mute": "设置群成员禁言", + "Message": "消息", + "message": "消息", + "Message overview": "消息概览", + "overview-message": "消息概览", + "Creating messages": "创建消息", + "creating-messages": "创建消息", + "Create a text message": "创建文本消息", + "create-text-message": "创建文本消息", + "Create a mention message": "创建 @ 消息", + "create-text-at-message": "创建 @ 消息", + "Create a custom message": "创建自定义消息", + "create-custom-message": "创建自定义消息", + "Create an image message": "创建图片消息", + "create-image-message": "创建图片消息", + "Create an image message from a file": "使用本地路径创建图片消息", + "Create an image message from a path": "使用本地路径创建图片消息", + "create-image-message-by-file": "使用本地路径创建图片消息", + "Create an image message from a URL": "使用 URL 创建图片消息", + "Create an image message from URLs": "使用 URL 创建图片消息", + "create-image-message-by-url": "使用 URL 创建图片消息", + "Create an audio message": "创建音频消息", + "create-sound-message": "创建音频消息", + "Create an audio message from a file": "使用本地路径创建音频消息", + "Create an audio message from a path": "使用本地路径创建音频消息", + "create-sound-message-by-file": "使用本地路径创建音频消息", + "Create an audio message from a URL": "使用 URL 创建音频消息", + "create-sound-message-by-url": "使用 URL 创建音频消息", + "Create a video message": "创建视频消息", + "create-video-message": "创建视频消息", + "Create a video message from a file": "使用本地路径创建视频消息", + "Create a video message from a path": "使用本地路径创建视频消息", + "create-video-message-by-file": "使用本地路径创建视频消息", + "Create a video message from a URL": "使用 URL 创建视频消息", + "create-video-message-by-url": "使用 URL 创建视频消息", + "Create a file message": "创建文件消息", + "create-file-message": "创建文件消息", + "Create a file message from a file": "使用本地路径创建文件消息", + "Create a file message from a path": "使用本地路径创建文件消息", + "create-file-message-by-file": "使用本地路径创建文件消息", + "Create a file message from a URL": "使用 URL 创建文件消息", + "create-file-message-by-url": "使用 URL 创建文件消息", + "Create a contact card message": "创建名片消息", + "create-card-message": "创建名片消息", + "Create a location message": "创建位置消息", + "create-location-message": "创建位置消息", + "Create an emoji message": "创建表情消息", + "create-face-message": "创建表情消息", + "Create a reply message": "创建回复消息", + "create-quote-message": "创建回复消息", + "Create rich text": "创建富文本消息", + "create-advanced-text-message": "创建富文本消息", + "Create a rich reply": "创建富文本回复", + "create-advanced-quote-message": "创建富文本回复", + "Create a forwarded message": "创建转发消息", + "create-forward-message": "创建转发消息", + "Create a merged message": "创建合并消息", + "create-merger-message": "创建合并消息", + "Sending messages": "发送消息", + "sending-messages": "发送消息", + "Send a message": "发送消息", + "send-message": "发送消息", + "Send a message without OSS": "发送不经 OSS 的消息", + "send-message-not-oss": "发送不经 OSS 的消息", + "Track message sending progress": "监听消息发送进度", + "set-msg-send-progress-listener": "监听消息发送进度", + "Receiving messages": "接收消息", + "receiving-messages": "接收消息", + "Receive messages": "接收消息", + "receive-messages": "接收消息", + "Receive custom business messages": "接收自定义业务消息", + "receive-custom-business-messages": "接收自定义业务消息", + "Retrieving messages": "查询消息", + "retrieving-messages": "查询消息", + "Load older messages": "加载历史消息", + "load-older-messages": "加载历史消息", + "Load newer messages": "反向加载历史消息", + "load-newer-messages": "反向加载历史消息", + "Find messages by ID": "按 ID 查找消息", + "find-messages-by-id": "按 ID 查找消息", + "Load message context": "读取消息上下文", + "load-message-context": "读取消息上下文", + "Search messages": "搜索消息", + "search-messages": "搜索消息", + "Composing messages": "编辑消息", + "composing-messages": "编辑消息", + "Update typing status": "上报输入状态", + "update-typing-status": "上报输入状态", + "Get typing status": "查询输入状态", + "get-typing-status": "查询输入状态", + "Managing messages": "管理消息", + "managing-messages": "管理消息", + "Delete a local message": "删除本地消息", + "delete-local-message": "删除本地消息", + "Delete a message": "批量删除消息", + "Delete a saved message": "批量删除消息", + "Delete saved messages": "批量删除消息", + "Delete messages in a batch": "批量删除消息", + "delete-saved-messages": "批量删除消息", + "Delete messages from a user": "删除群聊中指定用户的全部消息", + "Delete all messages from a user in a group chat": "删除群聊中指定用户的全部消息", + "delete-user-messages": "删除群聊中指定用户的全部消息", + "Revoke a message": "撤回消息", + "revoke-a-message": "撤回消息", + "Modify a message": "修改消息", + "modify-a-message": "修改消息", + "View pinned messages": "查询会话置顶消息", + "get-pinned-messages": "查询会话置顶消息", + "Pin or unpin a message": "置顶或取消置顶消息", + "set-message-pinned": "置顶或取消置顶消息", + "Insert a local direct message": "插入本地单聊消息", + "insert-local-single-message": "插入本地单聊消息", + "Insert a local group message": "插入本地群聊消息", + "insert-local-group-message": "插入本地群聊消息", + "Clear all local messages": "清理全部本地消息", + "clear-all-local-messages": "清理全部本地消息", + "Clear all saved messages": "清理全部消息", + "clear-all-messages": "清理全部消息", + "Set local message extensions": "设置消息本地扩展", + "set-message-local-ex": "设置消息本地扩展", + "Group message read status": "群消息已读状态", + "group-message-read-status": "群消息已读状态", + "Send group read receipts": "上报群消息已读", + "Report group messages as read": "上报群消息已读", + "send-group-read-receipts": "上报群消息已读", + "View group message readers": "查询群消息已读成员", + "Get members who read a group message": "查询群消息已读成员", + "get-group-message-readers": "查询群消息已读成员", + "Create an @ message": "创建 @ 消息", + "Create a video message from files": "使用本地路径创建视频消息", + "Create a video message from URLs": "使用 URL 创建视频消息", + "Create a merged forward message": "创建合并转发消息", + "Send an uploaded media message": "发送不经 OSS 的消息", + "Load message history": "加载历史消息", + "Load message history in reverse": "反向加载历史消息", + "Report typing status": "上报输入状态", + "Get pinned messages in a conversation": "查询会话置顶消息", + "Insert a local one-to-one message": "插入本地单聊消息", + "Insert a local group message": "插入本地群聊消息", + "Clear local and server messages": "清理全部消息", + "Set a local message extension": "设置消息本地扩展", + "File uploads": "文件上传", + "file-uploads": "文件上传", + "Track file upload progress": "监听文件上传进度", + "track-file-upload-progress": "监听文件上传进度", + "Upload a file": "上传文件", + "upload-file": "上传文件", + "Calling": "音视频通话", + "calling": "音视频通话", + "Audio and video calling overview": "音视频通话概览", + "Calling overview": "音视频通话概览", + "overview-calling": "音视频通话概览", + "Managing calls": "管理通话", + "managing-calls": "管理通话", + "Start a one-to-one call": "发起单聊通话", + "start-single-call": "发起单聊通话", + "Start a group call": "发起群聊通话", + "start-group-call": "发起群聊通话", + "Accept a call": "接受通话", + "accept-call": "接受通话", + "Reject a call": "拒绝通话", + "reject-call": "拒绝通话", + "Cancel a call invitation": "取消通话邀请", + "cancel-call": "取消通话邀请", + "Hang up a call": "挂断通话", + "hang-up-call": "挂断通话", + "Handle call events": "处理通话事件", + "handle-call-events": "处理通话事件", + "Retrieving call information": "通话恢复与房间信息", + "retrieving-call-information": "通话恢复与房间信息", + "Restore a pending invitation": "恢复启动前收到的通话邀请", + "restore-pending-invitation": "恢复启动前收到的通话邀请", + "Get a group call room": "查询群组通话房间", + "get-room-by-group-id": "查询群组通话房间", + "Get room credentials": "获取通话房间 Token", + "get-token-by-room-id": "获取通话房间 Token", + "Sending custom signals": "发送自定义信令", + "sending-custom-signals": "发送自定义信令", + "Send a custom signal": "发送自定义信令", + "send-a-custom-signal": "发送自定义信令", + "Events": "事件", + "events": "事件", + "Events overview": "事件概览", + "overview-events": "事件概览", + "Logging": "日志", + "Logger": "日志", + "logger": "日志" +} diff --git a/data/structure/android-sidebar.json b/data/structure/android-sidebar.json new file mode 100644 index 0000000000..c1cef64e32 --- /dev/null +++ b/data/structure/android-sidebar.json @@ -0,0 +1,628 @@ +{ + "sidebarExpansion": "active-path", + "nodes": [ + { + "path": "/sdk/android/overview", + "navigationTitle": "Overview" + }, + { + "id": "getting-started", + "title": "Getting started", + "children": [ + "/sdk/android/getting-started/before-you-start", + "/sdk/android/getting-started/environment-specific-implementation", + "/sdk/android/getting-started/authenticate-and-manage-session", + "/sdk/android/getting-started/send-first-message" + ] + }, + { + "id": "user", + "title": "User", + "children": [ + "/sdk/android/user/overview-user", + { + "id": "user/user-profile", + "title": "User profile", + "children": [ + "/sdk/android/user/user-profile/get-users-info", + "/sdk/android/user/user-profile/get-self-local-user-info", + "/sdk/android/user/user-profile/set-self-info" + ] + }, + { + "path": "/sdk/android/user/user-profile/set-global-message-reception", + "navigationTitle": "Set global message reception" + }, + { + "id": "user/online-status", + "title": "Online status", + "children": [ + { + "path": "/sdk/android/user/online-status/subscribe-users-online-status", + "navigationTitle": "Subscribe to user status" + }, + { + "path": "/sdk/android/user/online-status/get-subscribe-online-users-status", + "navigationTitle": "Refresh subscribed user status" + }, + { + "path": "/sdk/android/user/online-status/unsubscribe-users-online-status", + "navigationTitle": "Unsubscribe from user status" + } + ] + } + ] + }, + { + "id": "relationships", + "title": "Relationships", + "children": [ + { + "id": "user/friends", + "title": "Friends", + "children": [ + { + "path": "/sdk/android/user/friends/get-friend-list-page", + "navigationTitle": "Get the friend list" + }, + { + "path": "/sdk/android/user/friends/search-friends", + "navigationTitle": "Search friends" + }, + { + "path": "/sdk/android/user/friends/get-friends-info", + "navigationTitle": "Get friend profiles" + }, + { + "path": "/sdk/android/user/friends/check-friend", + "navigationTitle": "Check friendship status" + }, + { + "path": "/sdk/android/user/friends/update-friends", + "navigationTitle": "Update friend information" + }, + { + "path": "/sdk/android/user/friends/delete-friend", + "navigationTitle": "Delete a friend" + }, + { + "id": "user/friend-applications", + "title": "Friend applications", + "children": [ + { + "path": "/sdk/android/user/friend-applications/add-friend", + "navigationTitle": "Send a friend application" + }, + { + "path": "/sdk/android/user/friend-applications/get-recv-friend-application-list", + "navigationTitle": "Get received friend applications" + }, + { + "path": "/sdk/android/user/friend-applications/get-send-friend-application-list", + "navigationTitle": "Get sent friend applications" + }, + { + "path": "/sdk/android/user/friend-applications/accept-friend-application", + "navigationTitle": "Accept a friend application" + }, + { + "path": "/sdk/android/user/friend-applications/refuse-friend-application", + "navigationTitle": "Reject a friend application" + } + ] + } + ] + }, + { + "id": "user/blacklist", + "title": "Blacklist", + "children": [ + "/sdk/android/user/blacklist/get-blacklist", + { + "path": "/sdk/android/user/blacklist/add-blacklist", + "navigationTitle": "Block a user" + }, + { + "path": "/sdk/android/user/blacklist/remove-blacklist", + "navigationTitle": "Unblock a user" + } + ] + } + ] + }, + { + "id": "conversation", + "title": "Conversation", + "children": [ + "/sdk/android/conversation/overview-conversation", + { + "id": "conversation/retrieving-conversations", + "title": "Retrieving conversations", + "children": [ + { + "path": "/sdk/android/conversation/retrieving-conversations/get-conversation-by-target", + "navigationTitle": "Open a conversation" + }, + { + "path": "/sdk/android/conversation/retrieving-conversations/get-conversation-id", + "navigationTitle": "Resolve a conversation ID" + }, + { + "path": "/sdk/android/conversation/retrieving-conversations/get-conversations-by-id", + "navigationTitle": "Get conversations by ID" + }, + "/sdk/android/conversation/retrieving-conversations/retrieve-conversation-list" + ] + }, + { + "id": "conversation/conversation-list-and-drafts", + "title": "Conversation organization", + "children": [ + { + "path": "/sdk/android/conversation/managing-conversations/pin-conversation", + "navigationTitle": "Pin or unpin a conversation" + }, + { + "path": "/sdk/android/conversation/managing-conversations/set-conversation-extension", + "navigationTitle": "Set conversation extra data" + }, + "/sdk/android/conversation/managing-conversations/set-conversation-draft" + ] + }, + { + "id": "conversation/message-reception-and-reminders", + "title": "Unread status and notifications", + "children": [ + { + "path": "/sdk/android/conversation/managing-conversations/set-message-receive-option", + "navigationTitle": "Set conversation message reception" + }, + { + "path": "/sdk/android/conversation/managing-conversations/clear-group-mentions", + "navigationTitle": "Reset group mention status" + }, + { + "path": "/sdk/android/conversation/managing-conversations/mark-conversation-read", + "navigationTitle": "Mark a conversation as read" + }, + { + "path": "/sdk/android/conversation/managing-conversations/get-total-unread-count", + "navigationTitle": "Track the total unread count" + } + ] + }, + { + "id": "conversation/message-retention-and-privacy", + "title": "Message retention and privacy", + "children": [ + { + "path": "/sdk/android/conversation/managing-conversations/set-private-chat", + "navigationTitle": "Enable or disable burn after reading" + }, + { + "path": "/sdk/android/conversation/managing-conversations/set-burn-duration", + "navigationTitle": "Set the burn duration" + }, + { + "path": "/sdk/android/conversation/managing-conversations/set-message-destruct", + "navigationTitle": "Schedule server message deletion" + } + ] + }, + { + "id": "conversation/hiding-and-deleting-conversations", + "title": "Hiding and deleting conversations", + "children": [ + "/sdk/android/conversation/managing-conversations/hide-a-conversation", + { + "path": "/sdk/android/conversation/managing-conversations/delete-conversation-with-messages", + "navigationTitle": "Delete a conversation and its messages" + }, + { + "path": "/sdk/android/conversation/managing-conversations/clear-conversation-messages", + "navigationTitle": "Clear messages in a conversation" + } + ] + } + ] + }, + { + "id": "group", + "title": "Group", + "children": [ + { "path": "/sdk/android/group/overview-group", "navigationTitle": "Group overview" }, + { + "id": "group/profile-and-settings", + "title": "Group profile and settings", + "children": [ + { "path": "/sdk/android/group/create-group", "navigationTitle": "Create a group" }, + { + "path": "/sdk/android/group/update-group-profile", + "navigationTitle": "Update group profile" + }, + { + "path": "/sdk/android/group/set-group-announcement", + "navigationTitle": "Publish a group announcement" + }, + { + "path": "/sdk/android/group/set-group-extension", + "navigationTitle": "Set group extra data" + } + ] + }, + { + "id": "group/permissions", + "title": "Group permissions", + "children": [ + { + "path": "/sdk/android/group/set-group-join-verification", + "navigationTitle": "Set group join verification" + }, + { + "path": "/sdk/android/group/set-group-member-profile-access", + "navigationTitle": "Set member profile access" + }, + { + "path": "/sdk/android/group/set-group-member-friend-permission", + "navigationTitle": "Set member friend request permission" + }, + { + "path": "/sdk/android/group/change-group-mute", + "navigationTitle": "Change group mute status" + } + ] + }, + { + "id": "group/joining-and-leaving", + "title": "Joining and leaving groups", + "children": [ + { "path": "/sdk/android/group/join-group", "navigationTitle": "Apply to join a group" }, + { "path": "/sdk/android/group/quit-group", "navigationTitle": "Leave a group" }, + { "path": "/sdk/android/group/dismiss-group", "navigationTitle": "Dismiss a group" } + ] + }, + { + "id": "group/retrieving-groups", + "title": "Retrieving groups", + "children": [ + { + "path": "/sdk/android/group/retrieving-groups/get-specified-groups-info", + "navigationTitle": "Get group information" + }, + { + "path": "/sdk/android/group/retrieving-groups/get-joined-group-list-page", + "navigationTitle": "Get joined groups by page" + }, + { + "path": "/sdk/android/group/retrieving-groups/is-join-group", + "navigationTitle": "Check group membership" + }, + { + "path": "/sdk/android/group/retrieving-groups/search-groups", + "navigationTitle": "Search groups" + } + ] + }, + { + "id": "group/group-applications", + "title": "Group applications", + "children": [ + { + "path": "/sdk/android/group/group-applications/overview-group-applications", + "navigationTitle": "Group applications overview" + }, + { + "path": "/sdk/android/group/group-applications/get-group-application-list-as-recipient", + "navigationTitle": "Get received group applications" + }, + { + "path": "/sdk/android/group/group-applications/get-group-application-list-as-applicant", + "navigationTitle": "Get sent group applications" + }, + { + "path": "/sdk/android/group/group-applications/accept-group-application", + "navigationTitle": "Accept a group application" + }, + { + "path": "/sdk/android/group/group-applications/refuse-group-application", + "navigationTitle": "Reject a group application" + } + ] + }, + { + "id": "group/retrieving-group-members", + "title": "Retrieving group members", + "children": [ + { + "path": "/sdk/android/group/retrieving-group-members/overview-retrieving-group-members", + "navigationTitle": "Group member queries overview" + }, + { + "path": "/sdk/android/group/retrieving-group-members/get-group-member-list", + "navigationTitle": "Get group members" + }, + { + "path": "/sdk/android/group/retrieving-group-members/get-specified-group-members-info", + "navigationTitle": "Get group member profiles" + }, + { + "path": "/sdk/android/group/retrieving-group-members/get-users-in-group", + "navigationTitle": "Check users in a group" + }, + { + "path": "/sdk/android/group/retrieving-group-members/get-group-member-owner-and-admin", + "navigationTitle": "Get group owners and admins" + }, + { + "path": "/sdk/android/group/retrieving-group-members/search-group-members", + "navigationTitle": "Search group members" + } + ] + }, + { + "id": "group/managing-group-members", + "title": "Managing group members", + "children": [ + { + "path": "/sdk/android/group/managing-group-members/invite-user-to-group", + "navigationTitle": "Invite users to a group" + }, + { + "path": "/sdk/android/group/managing-group-members/kick-group-member", + "navigationTitle": "Remove group members" + }, + { + "path": "/sdk/android/group/managing-group-members/set-group-member-nickname", + "navigationTitle": "Update a group nickname" + }, + { + "path": "/sdk/android/group/managing-group-members/set-group-member-role-level", + "navigationTitle": "Manage group administrators" + }, + { + "path": "/sdk/android/group/managing-group-members/set-group-member-avatar", + "navigationTitle": "Update a group member avatar" + }, + { + "path": "/sdk/android/group/managing-group-members/set-group-member-extension", + "navigationTitle": "Set group member extra data" + }, + { + "path": "/sdk/android/group/managing-group-members/transfer-group-owner", + "navigationTitle": "Transfer group ownership" + }, + { + "path": "/sdk/android/group/managing-group-members/change-group-member-mute", + "navigationTitle": "Mute or unmute a group member" + } + ] + } + ] + }, + { + "id": "message", + "title": "Message", + "children": [ + "/sdk/android/message/overview-message", + { + "id": "message/creating-messages", + "title": "Creating messages", + "children": [ + "/sdk/android/message/creating-messages/create-text-message", + "/sdk/android/message/creating-messages/create-text-at-message", + "/sdk/android/message/creating-messages/create-custom-message", + { + "path": "/sdk/android/message/creating-messages/create-image-message", + "navigationTitle": "Create an image message" + }, + { + "path": "/sdk/android/message/creating-messages/create-image-message-by-file", + "navigationTitle": "Create an image message from a path" + }, + "/sdk/android/message/creating-messages/create-image-message-by-url", + { + "path": "/sdk/android/message/creating-messages/create-sound-message", + "navigationTitle": "Create an audio message" + }, + { + "path": "/sdk/android/message/creating-messages/create-sound-message-by-file", + "navigationTitle": "Create an audio message from a path" + }, + "/sdk/android/message/creating-messages/create-sound-message-by-url", + { + "path": "/sdk/android/message/creating-messages/create-video-message", + "navigationTitle": "Create a video message" + }, + { + "path": "/sdk/android/message/creating-messages/create-video-message-by-file", + "navigationTitle": "Create a video message from a path" + }, + "/sdk/android/message/creating-messages/create-video-message-by-url", + { + "path": "/sdk/android/message/creating-messages/create-file-message", + "navigationTitle": "Create a file message" + }, + { + "path": "/sdk/android/message/creating-messages/create-file-message-by-file", + "navigationTitle": "Create a file message from a path" + }, + "/sdk/android/message/creating-messages/create-file-message-by-url", + "/sdk/android/message/creating-messages/create-card-message", + "/sdk/android/message/creating-messages/create-location-message", + "/sdk/android/message/creating-messages/create-face-message", + "/sdk/android/message/creating-messages/create-quote-message", + { + "path": "/sdk/android/message/creating-messages/create-advanced-text-message", + "navigationTitle": "Create rich text" + }, + { + "path": "/sdk/android/message/creating-messages/create-advanced-quote-message", + "navigationTitle": "Create a rich reply" + }, + "/sdk/android/message/creating-messages/create-forward-message", + "/sdk/android/message/creating-messages/create-merger-message" + ] + }, + { + "id": "message/sending-messages", + "title": "Sending messages", + "children": [ + "/sdk/android/message/sending-messages/send-message", + "/sdk/android/message/sending-messages/send-message-not-oss", + { + "path": "/sdk/android/message/sending-messages/set-msg-send-progress-listener", + "navigationTitle": "Track message sending progress" + } + ] + }, + "/sdk/android/message/receiving-messages/receive-messages", + "/sdk/android/message/receiving-messages/receive-custom-business-messages", + { + "id": "message/retrieving-messages", + "title": "Retrieving messages", + "children": [ + "/sdk/android/message/retrieving-messages/load-older-messages", + "/sdk/android/message/retrieving-messages/load-newer-messages", + "/sdk/android/message/retrieving-messages/find-messages-by-id", + { + "path": "/sdk/android/message/retrieving-messages/load-message-context", + "navigationTitle": "Load message context" + }, + "/sdk/android/message/searching-messages/search-messages" + ] + }, + { + "id": "message/composing-messages", + "title": "Composing messages", + "children": [ + { + "path": "/sdk/android/message/composing-messages/update-typing-status", + "navigationTitle": "Update typing status" + }, + { + "path": "/sdk/android/message/composing-messages/get-typing-status", + "navigationTitle": "Get typing status" + } + ] + }, + { + "id": "message/managing-messages", + "title": "Managing messages", + "children": [ + "/sdk/android/message/managing-messages/delete-local-message", + { + "path": "/sdk/android/message/managing-messages/delete-saved-messages", + "navigationTitle": "Delete saved messages" + }, + { + "path": "/sdk/android/message/managing-messages/delete-user-messages", + "navigationTitle": "Delete messages from a user" + }, + "/sdk/android/message/managing-messages/revoke-a-message", + "/sdk/android/message/managing-messages/modify-a-message", + "/sdk/android/message/managing-messages/get-pinned-messages", + "/sdk/android/message/managing-messages/set-message-pinned", + "/sdk/android/message/managing-messages/insert-local-single-message", + "/sdk/android/message/managing-messages/insert-local-group-message", + "/sdk/android/message/managing-messages/clear-all-local-messages", + "/sdk/android/message/managing-messages/clear-all-messages", + "/sdk/android/message/managing-messages/set-message-local-ex" + ] + }, + { + "id": "message/group-message-read-status", + "title": "Group message read status", + "children": [ + { + "path": "/sdk/android/message/managing-read-status/send-group-read-receipts", + "navigationTitle": "Send group read receipts" + }, + { + "path": "/sdk/android/message/managing-read-status/get-group-message-readers", + "navigationTitle": "View group message readers" + } + ] + } + ] + }, + { + "id": "file-uploads", + "title": "File uploads", + "children": [ + { + "path": "/sdk/android/file-uploads/track-file-upload-progress", + "navigationTitle": "Track file upload progress" + }, + { + "path": "/sdk/android/file-uploads/upload-file", + "navigationTitle": "Upload a file" + } + ] + }, + { + "id": "calling", + "title": "Calling", + "children": [ + "/sdk/android/calling/overview-calling", + { + "id": "calling/managing-calls", + "title": "Managing calls", + "children": [ + { + "path": "/sdk/android/calling/managing-calls/start-single-call", + "navigationTitle": "Start a one-to-one call" + }, + { + "path": "/sdk/android/calling/managing-calls/start-group-call", + "navigationTitle": "Start a group call" + }, + { + "path": "/sdk/android/calling/managing-calls/accept-call", + "navigationTitle": "Accept a call" + }, + { + "path": "/sdk/android/calling/managing-calls/reject-call", + "navigationTitle": "Reject a call" + }, + { + "path": "/sdk/android/calling/managing-calls/cancel-call", + "navigationTitle": "Cancel a call invitation" + }, + { + "path": "/sdk/android/calling/managing-calls/hang-up-call", + "navigationTitle": "Hang up a call" + }, + { + "path": "/sdk/android/calling/managing-calls/handle-call-events", + "navigationTitle": "Handle call events" + } + ] + }, + { + "id": "calling/retrieving-call-information", + "title": "Retrieving call information", + "children": [ + { + "path": "/sdk/android/calling/retrieving-call-information/restore-pending-invitation", + "navigationTitle": "Restore a pending invitation" + }, + { + "path": "/sdk/android/calling/retrieving-call-information/get-room-by-group-id", + "navigationTitle": "Get a group call room" + }, + { + "path": "/sdk/android/calling/retrieving-call-information/get-token-by-room-id", + "navigationTitle": "Get room credentials" + } + ] + }, + "/sdk/android/calling/sending-custom-signals/send-a-custom-signal" + ] + }, + { + "path": "/sdk/android/events/overview-events", + "navigationTitle": "Events" + }, + "/sdk/android/logger" + ] +} diff --git a/data/structure/chat-pages.json b/data/structure/chat-pages.json index fb14be0834..6f008d9aa2 100644 --- a/data/structure/chat-pages.json +++ b/data/structure/chat-pages.json @@ -1,6499 +1,6643 @@ [ { - "sourcePath": "/sdk/ios/overview", - "openimPath": "/sdk/ios/overview", - "title": "OpenIM SDK for iOS", - "context": "chat/sdk/ios", + "sourcePath": "/platform-api/overview", + "openimPath": "/platform-api/overview", + "title": "Overview", + "context": "chat/platform-api", "template": "overview", - "contentFile": "content/docs/chat/sdk/ios/overview.mdx" + "contentFile": "content/docs/chat/platform-api/overview.mdx" }, { - "sourcePath": "/sdk/ios/getting-started/before-you-start", - "openimPath": "/sdk/ios/getting-started/before-you-start", - "title": "Before you start", - "context": "chat/sdk/ios", - "template": "guide", - "contentFile": "content/docs/chat/sdk/ios/getting-started/before-you-start.mdx" + "sourcePath": "/platform-api/prepare-to-use-api", + "openimPath": "/platform-api/prepare-to-use-api", + "title": "Prepare to use the API", + "context": "chat/platform-api", + "template": "overview", + "contentFile": "content/docs/chat/platform-api/prepare-to-use-api.mdx" }, { - "sourcePath": "/sdk/ios/getting-started/environment-specific-implementation", - "openimPath": "/sdk/ios/getting-started/environment-specific-implementation", - "title": "Environment-specific implementation", - "context": "chat/sdk/ios", - "template": "guide", - "contentFile": "content/docs/chat/sdk/ios/getting-started/environment-specific-implementation.mdx" + "sourcePath": "/platform-api/user/overview", + "openimPath": "/platform-api/user/overview", + "title": "Overview", + "context": "chat/platform-api", + "template": "overview", + "contentFile": "content/docs/chat/platform-api/user/overview.mdx" }, { - "sourcePath": "/sdk/ios/getting-started/authenticate-and-manage-session", - "openimPath": "/sdk/ios/getting-started/authenticate-and-manage-session", - "title": "Authenticate and manage a session", - "context": "chat/sdk/ios", - "template": "guide", - "contentFile": "content/docs/chat/sdk/ios/getting-started/authenticate-and-manage-session.mdx" + "sourcePath": "/platform-api/user/listing-users/list-users", + "openimPath": "/platform-api/user/listing-users/list-users", + "title": "List users", + "context": "chat/platform-api", + "template": "api", + "contentFile": "content/docs/chat/platform-api/user/listing-users/list-users.mdx" }, { - "sourcePath": "/sdk/ios/getting-started/send-first-message", - "openimPath": "/sdk/ios/getting-started/send-first-message", - "title": "Send your first message", - "context": "chat/sdk/ios", - "template": "guide", - "contentFile": "content/docs/chat/sdk/ios/getting-started/send-first-message.mdx" + "sourcePath": "/platform-api/user/listing-users/list-all-user-ids", + "openimPath": "/platform-api/user/listing-users/list-all-user-ids", + "title": "List all user IDs", + "context": "chat/platform-api", + "template": "api", + "contentFile": "content/docs/chat/platform-api/user/listing-users/list-all-user-ids.mdx" }, { - "sourcePath": "/sdk/ios/user/overview-user", - "openimPath": "/sdk/ios/user/overview-user", - "title": "Overview", - "context": "chat/sdk/ios", - "template": "guide", - "contentFile": "content/docs/chat/sdk/ios/user/overview-user.mdx" + "sourcePath": "/platform-api/user/listing-users/check-user-accounts", + "openimPath": "/platform-api/user/listing-users/check-user-accounts", + "title": "Check user accounts", + "context": "chat/platform-api", + "template": "api", + "contentFile": "content/docs/chat/platform-api/user/listing-users/check-user-accounts.mdx" }, { - "sourcePath": "/sdk/ios/user/retrieving-users/retrieve-users", - "openimPath": "/sdk/ios/user/retrieving-users/retrieve-users", - "title": "Retrieve users", - "context": "chat/sdk/ios", - "template": "guide", - "contentFile": "content/docs/chat/sdk/ios/user/retrieving-users/retrieve-users.mdx" + "sourcePath": "/platform-api/user/listing-users/get-a-user", + "openimPath": "/platform-api/user/listing-users/get-a-user", + "title": "Get a user", + "context": "chat/platform-api", + "template": "api", + "contentFile": "content/docs/chat/platform-api/user/listing-users/get-a-user.mdx" }, { - "sourcePath": "/sdk/ios/user/retrieving-and-updating-user-information/get-self-profile", - "openimPath": "/sdk/ios/user/retrieving-and-updating-user-information/get-self-profile", - "title": "View your profile", - "context": "chat/sdk/ios", - "template": "guide", - "contentFile": "content/docs/chat/sdk/ios/user/retrieving-and-updating-user-information/get-self-profile.mdx" + "sourcePath": "/platform-api/user/creating-users/create-a-user", + "openimPath": "/platform-api/user/creating-users/create-a-user", + "title": "Create a user", + "context": "chat/platform-api", + "template": "api", + "contentFile": "content/docs/chat/platform-api/user/creating-users/create-a-user.mdx" }, { - "sourcePath": "/sdk/ios/user/retrieving-and-updating-user-information/update-self-profile", - "openimPath": "/sdk/ios/user/retrieving-and-updating-user-information/update-self-profile", - "title": "Update your profile", - "context": "chat/sdk/ios", - "template": "guide", - "contentFile": "content/docs/chat/sdk/ios/user/retrieving-and-updating-user-information/update-self-profile.mdx" + "sourcePath": "/platform-api/user/managing-users/update-a-user", + "openimPath": "/platform-api/user/managing-users/update-a-user", + "title": "Update a user", + "context": "chat/platform-api", + "template": "api", + "contentFile": "content/docs/chat/platform-api/user/managing-users/update-a-user.mdx" }, { - "sourcePath": "/sdk/ios/user/retrieving-and-updating-user-information/set-global-message-reception", - "openimPath": "/sdk/ios/user/retrieving-and-updating-user-information/set-global-message-reception", - "title": "Set global message reception", - "context": "chat/sdk/ios", - "template": "guide", - "contentFile": "content/docs/chat/sdk/ios/user/retrieving-and-updating-user-information/set-global-message-reception.mdx" + "sourcePath": "/platform-api/user/presence/get-users-online-status", + "openimPath": "/platform-api/user/presence/get-users-online-status", + "title": "Get users' online status", + "context": "chat/platform-api", + "template": "api", + "contentFile": "content/docs/chat/platform-api/user/presence/get-users-online-status.mdx" }, { - "sourcePath": "/sdk/ios/user/retrieving-and-updating-user-information/subscribe-user-status", - "openimPath": "/sdk/ios/user/retrieving-and-updating-user-information/subscribe-user-status", - "title": "Subscribe to user status", - "context": "chat/sdk/ios", - "template": "guide", - "contentFile": "content/docs/chat/sdk/ios/user/retrieving-and-updating-user-information/subscribe-user-status.mdx" + "sourcePath": "/platform-api/user/presence/get-users-online-token-detail", + "openimPath": "/platform-api/user/presence/get-users-online-token-detail", + "title": "Get users online token details", + "context": "chat/platform-api", + "template": "api", + "contentFile": "content/docs/chat/platform-api/user/presence/get-users-online-token-detail.mdx" }, { - "sourcePath": "/sdk/ios/user/retrieving-and-updating-user-information/get-subscribed-user-status", - "openimPath": "/sdk/ios/user/retrieving-and-updating-user-information/get-subscribed-user-status", - "title": "Refresh subscribed user status", - "context": "chat/sdk/ios", - "template": "guide", - "contentFile": "content/docs/chat/sdk/ios/user/retrieving-and-updating-user-information/get-subscribed-user-status.mdx" + "sourcePath": "/platform-api/user/notification-accounts/add-notification-account", + "openimPath": "/platform-api/user/notification-accounts/add-notification-account", + "title": "Add a notification account", + "context": "chat/platform-api", + "template": "api", + "contentFile": "content/docs/chat/platform-api/user/notification-accounts/add-notification-account.mdx" }, { - "sourcePath": "/sdk/ios/user/retrieving-and-updating-user-information/unsubscribe-user-status", - "openimPath": "/sdk/ios/user/retrieving-and-updating-user-information/unsubscribe-user-status", - "title": "Unsubscribe from user status", - "context": "chat/sdk/ios", - "template": "guide", - "contentFile": "content/docs/chat/sdk/ios/user/retrieving-and-updating-user-information/unsubscribe-user-status.mdx" + "sourcePath": "/platform-api/user/notification-accounts/update-notification-account", + "openimPath": "/platform-api/user/notification-accounts/update-notification-account", + "title": "Update a notification account", + "context": "chat/platform-api", + "template": "api", + "contentFile": "content/docs/chat/platform-api/user/notification-accounts/update-notification-account.mdx" }, { - "sourcePath": "/sdk/ios/user/friends/get-friend-list-page", - "openimPath": "/sdk/ios/user/friends/get-friend-list-page", - "title": "Get the friend list", - "context": "chat/sdk/ios", - "template": "guide", - "contentFile": "content/docs/chat/sdk/ios/user/friends/get-friend-list-page.mdx" + "sourcePath": "/platform-api/user/notification-accounts/search-notification-account", + "openimPath": "/platform-api/user/notification-accounts/search-notification-account", + "title": "Search notification accounts", + "context": "chat/platform-api", + "template": "api", + "contentFile": "content/docs/chat/platform-api/user/notification-accounts/search-notification-account.mdx" }, { - "sourcePath": "/sdk/ios/user/friends/search-friends", - "openimPath": "/sdk/ios/user/friends/search-friends", - "title": "Search friends", - "context": "chat/sdk/ios", - "template": "guide", - "contentFile": "content/docs/chat/sdk/ios/user/friends/search-friends.mdx" + "sourcePath": "/platform-api/relation/overview", + "openimPath": "/platform-api/relation/overview", + "title": "Overview", + "context": "chat/platform-api", + "template": "overview", + "contentFile": "content/docs/chat/platform-api/relation/overview.mdx" }, { - "sourcePath": "/sdk/ios/user/friends/get-specified-friends-info", - "openimPath": "/sdk/ios/user/friends/get-specified-friends-info", - "title": "Get friend profiles", - "context": "chat/sdk/ios", - "template": "guide", - "contentFile": "content/docs/chat/sdk/ios/user/friends/get-specified-friends-info.mdx" + "sourcePath": "/platform-api/relation/managing-friend-requests/apply-to-add-friend", + "openimPath": "/platform-api/relation/managing-friend-requests/apply-to-add-friend", + "title": "Apply to add a friend", + "context": "chat/platform-api", + "template": "api", + "contentFile": "content/docs/chat/platform-api/relation/managing-friend-requests/apply-to-add-friend.mdx" }, { - "sourcePath": "/sdk/ios/user/friends/check-friend", - "openimPath": "/sdk/ios/user/friends/check-friend", - "title": "Check friendship status", - "context": "chat/sdk/ios", - "template": "guide", - "contentFile": "content/docs/chat/sdk/ios/user/friends/check-friend.mdx" + "sourcePath": "/platform-api/relation/managing-friend-requests/respond-friend-apply", + "openimPath": "/platform-api/relation/managing-friend-requests/respond-friend-apply", + "title": "Respond to a friend request", + "context": "chat/platform-api", + "template": "api", + "contentFile": "content/docs/chat/platform-api/relation/managing-friend-requests/respond-friend-apply.mdx" }, { - "sourcePath": "/sdk/ios/user/friends/update-friends", - "openimPath": "/sdk/ios/user/friends/update-friends", - "title": "Update friend information", - "context": "chat/sdk/ios", - "template": "guide", - "contentFile": "content/docs/chat/sdk/ios/user/friends/update-friends.mdx" + "sourcePath": "/platform-api/relation/managing-friend-requests/list-received-friend-requests", + "openimPath": "/platform-api/relation/managing-friend-requests/list-received-friend-requests", + "title": "List received friend requests", + "context": "chat/platform-api", + "template": "api", + "contentFile": "content/docs/chat/platform-api/relation/managing-friend-requests/list-received-friend-requests.mdx" }, { - "sourcePath": "/sdk/ios/user/friends/delete-friend", - "openimPath": "/sdk/ios/user/friends/delete-friend", - "title": "Delete a friend", - "context": "chat/sdk/ios", - "template": "guide", - "contentFile": "content/docs/chat/sdk/ios/user/friends/delete-friend.mdx" + "sourcePath": "/platform-api/relation/managing-friend-requests/list-sent-friend-requests", + "openimPath": "/platform-api/relation/managing-friend-requests/list-sent-friend-requests", + "title": "List sent friend requests", + "context": "chat/platform-api", + "template": "api", + "contentFile": "content/docs/chat/platform-api/relation/managing-friend-requests/list-sent-friend-requests.mdx" }, { - "sourcePath": "/sdk/ios/user/friend-applications/add-friend", - "openimPath": "/sdk/ios/user/friend-applications/add-friend", - "title": "Send a friend application", - "context": "chat/sdk/ios", - "template": "guide", - "contentFile": "content/docs/chat/sdk/ios/user/friend-applications/add-friend.mdx" + "sourcePath": "/platform-api/relation/listing-friends/list-friends", + "openimPath": "/platform-api/relation/listing-friends/list-friends", + "title": "List friends", + "context": "chat/platform-api", + "template": "api", + "contentFile": "content/docs/chat/platform-api/relation/listing-friends/list-friends.mdx" }, { - "sourcePath": "/sdk/ios/user/friend-applications/get-friend-application-list-as-recipient", - "openimPath": "/sdk/ios/user/friend-applications/get-friend-application-list-as-recipient", - "title": "Get received friend applications", - "context": "chat/sdk/ios", - "template": "guide", - "contentFile": "content/docs/chat/sdk/ios/user/friend-applications/get-friend-application-list-as-recipient.mdx" + "sourcePath": "/platform-api/relation/listing-friends/get-designated-friends", + "openimPath": "/platform-api/relation/listing-friends/get-designated-friends", + "title": "Get designated friends", + "context": "chat/platform-api", + "template": "api", + "contentFile": "content/docs/chat/platform-api/relation/listing-friends/get-designated-friends.mdx" }, { - "sourcePath": "/sdk/ios/user/friend-applications/get-friend-application-list-as-applicant", - "openimPath": "/sdk/ios/user/friend-applications/get-friend-application-list-as-applicant", - "title": "Get sent friend applications", - "context": "chat/sdk/ios", - "template": "guide", - "contentFile": "content/docs/chat/sdk/ios/user/friend-applications/get-friend-application-list-as-applicant.mdx" + "sourcePath": "/platform-api/relation/managing-friends/delete-friend", + "openimPath": "/platform-api/relation/managing-friends/delete-friend", + "title": "Delete a friend", + "context": "chat/platform-api", + "template": "api", + "contentFile": "content/docs/chat/platform-api/relation/managing-friends/delete-friend.mdx" }, { - "sourcePath": "/sdk/ios/user/friend-applications/get-friend-application-unhandled-count", - "openimPath": "/sdk/ios/user/friend-applications/get-friend-application-unhandled-count", - "title": "Get pending application count", - "context": "chat/sdk/ios", - "template": "guide", - "contentFile": "content/docs/chat/sdk/ios/user/friend-applications/get-friend-application-unhandled-count.mdx" + "sourcePath": "/platform-api/error-codes", + "openimPath": "/platform-api/error-codes", + "title": "Error codes", + "context": "chat/platform-api", + "template": "overview", + "contentFile": "content/docs/chat/platform-api/error-codes.mdx" }, { - "sourcePath": "/sdk/ios/user/friend-applications/accept-friend-application", - "openimPath": "/sdk/ios/user/friend-applications/accept-friend-application", - "title": "Accept a friend application", - "context": "chat/sdk/ios", - "template": "guide", - "contentFile": "content/docs/chat/sdk/ios/user/friend-applications/accept-friend-application.mdx" + "sourcePath": "/platform-api/relation/managing-friends/import-friends", + "openimPath": "/platform-api/relation/managing-friends/import-friends", + "title": "Import friends", + "context": "chat/platform-api", + "template": "api", + "contentFile": "content/docs/chat/platform-api/relation/managing-friends/import-friends.mdx" }, { - "sourcePath": "/sdk/ios/user/friend-applications/refuse-friend-application", - "openimPath": "/sdk/ios/user/friend-applications/refuse-friend-application", - "title": "Reject a friend application", - "context": "chat/sdk/ios", - "template": "guide", - "contentFile": "content/docs/chat/sdk/ios/user/friend-applications/refuse-friend-application.mdx" + "sourcePath": "/platform-api/relation/managing-friends/update-friends", + "openimPath": "/platform-api/relation/managing-friends/update-friends", + "title": "Update friends", + "context": "chat/platform-api", + "template": "api", + "contentFile": "content/docs/chat/platform-api/relation/managing-friends/update-friends.mdx" }, { - "sourcePath": "/sdk/ios/user/friend-applications/delete-friend-requests", - "openimPath": "/sdk/ios/user/friend-applications/delete-friend-requests", - "title": "Delete friend applications", - "context": "chat/sdk/ios", - "template": "guide", - "contentFile": "content/docs/chat/sdk/ios/user/friend-applications/delete-friend-requests.mdx" + "sourcePath": "/platform-api/relation/blacklist/add-black", + "openimPath": "/platform-api/relation/blacklist/add-black", + "title": "Add to blacklist", + "context": "chat/platform-api", + "template": "api", + "contentFile": "content/docs/chat/platform-api/relation/blacklist/add-black.mdx" }, { - "sourcePath": "/sdk/ios/user/moderating-a-user/retrieve-a-list-of-blocked-users", - "openimPath": "/sdk/ios/user/moderating-a-user/retrieve-a-list-of-blocked-users", - "title": "Retrieve a list of blocked users", - "context": "chat/sdk/ios", - "template": "guide", - "contentFile": "content/docs/chat/sdk/ios/user/moderating-a-user/retrieve-a-list-of-blocked-users.mdx" + "sourcePath": "/platform-api/relation/blacklist/list-blacks", + "openimPath": "/platform-api/relation/blacklist/list-blacks", + "title": "List blacklisted users", + "context": "chat/platform-api", + "template": "api", + "contentFile": "content/docs/chat/platform-api/relation/blacklist/list-blacks.mdx" }, { - "sourcePath": "/sdk/ios/user/moderating-a-user/block-user", - "openimPath": "/sdk/ios/user/moderating-a-user/block-user", - "title": "Block a user", - "context": "chat/sdk/ios", - "template": "guide", - "contentFile": "content/docs/chat/sdk/ios/user/moderating-a-user/block-user.mdx" + "sourcePath": "/platform-api/relation/blacklist/remove-black", + "openimPath": "/platform-api/relation/blacklist/remove-black", + "title": "Remove from blacklist", + "context": "chat/platform-api", + "template": "api", + "contentFile": "content/docs/chat/platform-api/relation/blacklist/remove-black.mdx" }, { - "sourcePath": "/sdk/ios/user/moderating-a-user/unblock-user", - "openimPath": "/sdk/ios/user/moderating-a-user/unblock-user", - "title": "Unblock a user", - "context": "chat/sdk/ios", - "template": "guide", - "contentFile": "content/docs/chat/sdk/ios/user/moderating-a-user/unblock-user.mdx" + "sourcePath": "/platform-api/group/overview", + "openimPath": "/platform-api/group/overview", + "title": "Overview", + "context": "chat/platform-api", + "template": "overview", + "contentFile": "content/docs/chat/platform-api/group/overview.mdx" }, { - "sourcePath": "/sdk/ios/conversation/overview-conversation", - "openimPath": "/sdk/ios/conversation/overview-conversation", - "title": "Conversation overview", - "context": "chat/sdk/ios", - "template": "guide", - "contentFile": "content/docs/chat/sdk/ios/conversation/overview-conversation.mdx" + "sourcePath": "/platform-api/group/managing-groups/create-group", + "openimPath": "/platform-api/group/managing-groups/create-group", + "title": "Create group", + "context": "chat/platform-api", + "template": "api", + "contentFile": "content/docs/chat/platform-api/group/managing-groups/create-group.mdx" }, { - "sourcePath": "/sdk/ios/conversation/retrieving-conversations/get-conversation-by-target", - "openimPath": "/sdk/ios/conversation/retrieving-conversations/get-conversation-by-target", - "title": "Open a conversation", - "context": "chat/sdk/ios", - "template": "guide", - "contentFile": "content/docs/chat/sdk/ios/conversation/retrieving-conversations/get-conversation-by-target.mdx" + "sourcePath": "/platform-api/group/managing-groups/set-group-info-ex", + "openimPath": "/platform-api/group/managing-groups/set-group-info-ex", + "title": "Set group info extension", + "context": "chat/platform-api", + "template": "api", + "contentFile": "content/docs/chat/platform-api/group/managing-groups/set-group-info-ex.mdx" }, { - "sourcePath": "/sdk/ios/conversation/retrieving-conversations/get-conversation-id", - "openimPath": "/sdk/ios/conversation/retrieving-conversations/get-conversation-id", - "title": "Resolve a conversation ID", - "context": "chat/sdk/ios", - "template": "guide", - "contentFile": "content/docs/chat/sdk/ios/conversation/retrieving-conversations/get-conversation-id.mdx" + "sourcePath": "/platform-api/group/group-applications/join-group", + "openimPath": "/platform-api/group/group-applications/join-group", + "title": "Join group", + "context": "chat/platform-api", + "template": "api", + "contentFile": "content/docs/chat/platform-api/group/group-applications/join-group.mdx" }, { - "sourcePath": "/sdk/ios/conversation/retrieving-conversations/get-conversations-by-id", - "openimPath": "/sdk/ios/conversation/retrieving-conversations/get-conversations-by-id", - "title": "Get conversations by ID", - "context": "chat/sdk/ios", - "template": "guide", - "contentFile": "content/docs/chat/sdk/ios/conversation/retrieving-conversations/get-conversations-by-id.mdx" + "sourcePath": "/platform-api/group/group-membership/quit-group", + "openimPath": "/platform-api/group/group-membership/quit-group", + "title": "Quit group", + "context": "chat/platform-api", + "template": "api", + "contentFile": "content/docs/chat/platform-api/group/group-membership/quit-group.mdx" }, { - "sourcePath": "/sdk/ios/conversation/retrieving-conversations/retrieve-conversation-list", - "openimPath": "/sdk/ios/conversation/retrieving-conversations/retrieve-conversation-list", - "title": "Retrieve a conversation list", - "context": "chat/sdk/ios", - "template": "guide", - "contentFile": "content/docs/chat/sdk/ios/conversation/retrieving-conversations/retrieve-conversation-list.mdx" + "sourcePath": "/platform-api/group/group-applications/respond-group-application", + "openimPath": "/platform-api/group/group-applications/respond-group-application", + "title": "Respond to a group application", + "context": "chat/platform-api", + "template": "api", + "contentFile": "content/docs/chat/platform-api/group/group-applications/respond-group-application.mdx" }, { - "sourcePath": "/sdk/ios/conversation/managing-conversations/pin-conversation", - "openimPath": "/sdk/ios/conversation/managing-conversations/pin-conversation", - "title": "Pin or unpin a conversation", - "context": "chat/sdk/ios", - "template": "guide", - "contentFile": "content/docs/chat/sdk/ios/conversation/managing-conversations/pin-conversation.mdx" + "sourcePath": "/platform-api/group/managing-groups/transfer-group-owner", + "openimPath": "/platform-api/group/managing-groups/transfer-group-owner", + "title": "Transfer group owner", + "context": "chat/platform-api", + "template": "api", + "contentFile": "content/docs/chat/platform-api/group/managing-groups/transfer-group-owner.mdx" }, { - "sourcePath": "/sdk/ios/conversation/managing-conversations/set-conversation-extension", - "openimPath": "/sdk/ios/conversation/managing-conversations/set-conversation-extension", - "title": "Set conversation extra data", - "context": "chat/sdk/ios", - "template": "guide", - "contentFile": "content/docs/chat/sdk/ios/conversation/managing-conversations/set-conversation-extension.mdx" + "sourcePath": "/platform-api/group/group-applications/list-received-group-applications", + "openimPath": "/platform-api/group/group-applications/list-received-group-applications", + "title": "List received group applications", + "context": "chat/platform-api", + "template": "api", + "contentFile": "content/docs/chat/platform-api/group/group-applications/list-received-group-applications.mdx" }, { - "sourcePath": "/sdk/ios/conversation/managing-conversations/set-conversation-draft", - "openimPath": "/sdk/ios/conversation/managing-conversations/set-conversation-draft", - "title": "Set a conversation draft", - "context": "chat/sdk/ios", - "template": "guide", - "contentFile": "content/docs/chat/sdk/ios/conversation/managing-conversations/set-conversation-draft.mdx" + "sourcePath": "/platform-api/group/group-applications/list-user-requested-group-applications", + "openimPath": "/platform-api/group/group-applications/list-user-requested-group-applications", + "title": "List user requested group applications", + "context": "chat/platform-api", + "template": "api", + "contentFile": "content/docs/chat/platform-api/group/group-applications/list-user-requested-group-applications.mdx" }, { - "sourcePath": "/sdk/ios/conversation/managing-conversations/set-message-receive-option", - "openimPath": "/sdk/ios/conversation/managing-conversations/set-message-receive-option", - "title": "Set message reception", - "context": "chat/sdk/ios", - "template": "guide", - "contentFile": "content/docs/chat/sdk/ios/conversation/managing-conversations/set-message-receive-option.mdx" + "sourcePath": "/platform-api/group/group-applications/list-group-users-request-applications", + "openimPath": "/platform-api/group/group-applications/list-group-users-request-applications", + "title": "List group users request applications", + "context": "chat/platform-api", + "template": "api", + "contentFile": "content/docs/chat/platform-api/group/group-applications/list-group-users-request-applications.mdx" }, { - "sourcePath": "/sdk/ios/conversation/managing-conversations/clear-group-mentions", - "openimPath": "/sdk/ios/conversation/managing-conversations/clear-group-mentions", - "title": "Reset group mention status", - "context": "chat/sdk/ios", - "template": "guide", - "contentFile": "content/docs/chat/sdk/ios/conversation/managing-conversations/clear-group-mentions.mdx" + "sourcePath": "/platform-api/group/group-applications/get-specified-user-group-request-info", + "openimPath": "/platform-api/group/group-applications/get-specified-user-group-request-info", + "title": "Get specified user group request info", + "context": "chat/platform-api", + "template": "api", + "contentFile": "content/docs/chat/platform-api/group/group-applications/get-specified-user-group-request-info.mdx" }, { - "sourcePath": "/sdk/ios/conversation/managing-conversations/mark-conversation-read", - "openimPath": "/sdk/ios/conversation/managing-conversations/mark-conversation-read", - "title": "Mark a conversation as read", - "context": "chat/sdk/ios", + "sourcePath": "/platform-api/group/managing-groups/get-groups-info", + "openimPath": "/platform-api/group/managing-groups/get-groups-info", + "title": "Get groups info", + "context": "chat/platform-api", + "template": "api", + "contentFile": "content/docs/chat/platform-api/group/managing-groups/get-groups-info.mdx" + }, + { + "sourcePath": "/platform-api/group/group-members/kick-group-members", + "openimPath": "/platform-api/group/group-members/kick-group-members", + "title": "Kick group members", + "context": "chat/platform-api", + "template": "api", + "contentFile": "content/docs/chat/platform-api/group/group-members/kick-group-members.mdx" + }, + { + "sourcePath": "/platform-api/group/group-members/get-group-members-info", + "openimPath": "/platform-api/group/group-members/get-group-members-info", + "title": "Get group members info", + "context": "chat/platform-api", + "template": "api", + "contentFile": "content/docs/chat/platform-api/group/group-members/get-group-members-info.mdx" + }, + { + "sourcePath": "/platform-api/group/group-members/get-group-member-list", + "openimPath": "/platform-api/group/group-members/get-group-member-list", + "title": "Get group member list", + "context": "chat/platform-api", + "template": "api", + "contentFile": "content/docs/chat/platform-api/group/group-members/get-group-member-list.mdx" + }, + { + "sourcePath": "/platform-api/group/group-members/invite-users-to-group", + "openimPath": "/platform-api/group/group-members/invite-users-to-group", + "title": "Invite users to group", + "context": "chat/platform-api", + "template": "api", + "contentFile": "content/docs/chat/platform-api/group/group-members/invite-users-to-group.mdx" + }, + { + "sourcePath": "/platform-api/group/group-membership/get-joined-group-list", + "openimPath": "/platform-api/group/group-membership/get-joined-group-list", + "title": "Get joined group list", + "context": "chat/platform-api", + "template": "api", + "contentFile": "content/docs/chat/platform-api/group/group-membership/get-joined-group-list.mdx" + }, + { + "sourcePath": "/platform-api/group/managing-groups/dismiss-group", + "openimPath": "/platform-api/group/managing-groups/dismiss-group", + "title": "Dismiss group", + "context": "chat/platform-api", + "template": "api", + "contentFile": "content/docs/chat/platform-api/group/managing-groups/dismiss-group.mdx" + }, + { + "sourcePath": "/platform-api/group/group-moderation/mute-group-member", + "openimPath": "/platform-api/group/group-moderation/mute-group-member", + "title": "Mute group member", + "context": "chat/platform-api", + "template": "api", + "contentFile": "content/docs/chat/platform-api/group/group-moderation/mute-group-member.mdx" + }, + { + "sourcePath": "/platform-api/group/group-moderation/cancel-mute-group-member", + "openimPath": "/platform-api/group/group-moderation/cancel-mute-group-member", + "title": "Cancel mute group member", + "context": "chat/platform-api", + "template": "api", + "contentFile": "content/docs/chat/platform-api/group/group-moderation/cancel-mute-group-member.mdx" + }, + { + "sourcePath": "/platform-api/group/group-moderation/mute-group", + "openimPath": "/platform-api/group/group-moderation/mute-group", + "title": "Mute group", + "context": "chat/platform-api", + "template": "api", + "contentFile": "content/docs/chat/platform-api/group/group-moderation/mute-group.mdx" + }, + { + "sourcePath": "/platform-api/group/group-moderation/cancel-mute-group", + "openimPath": "/platform-api/group/group-moderation/cancel-mute-group", + "title": "Cancel mute group", + "context": "chat/platform-api", + "template": "api", + "contentFile": "content/docs/chat/platform-api/group/group-moderation/cancel-mute-group.mdx" + }, + { + "sourcePath": "/platform-api/group/group-members/set-group-member-info", + "openimPath": "/platform-api/group/group-members/set-group-member-info", + "title": "Set group member info", + "context": "chat/platform-api", + "template": "api", + "contentFile": "content/docs/chat/platform-api/group/group-members/set-group-member-info.mdx" + }, + { + "sourcePath": "/platform-api/auth/overview", + "openimPath": "/platform-api/auth/overview", + "title": "Overview", + "context": "chat/platform-api", + "template": "overview", + "contentFile": "content/docs/chat/platform-api/auth/overview.mdx" + }, + { + "sourcePath": "/platform-api/auth/tokens/get-admin-token", + "openimPath": "/platform-api/auth/tokens/get-admin-token", + "title": "Get an administrator token", + "context": "chat/platform-api", + "template": "api", + "contentFile": "content/docs/chat/platform-api/auth/tokens/get-admin-token.mdx" + }, + { + "sourcePath": "/platform-api/auth/tokens/get-user-token", + "openimPath": "/platform-api/auth/tokens/get-user-token", + "title": "Get a user token", + "context": "chat/platform-api", + "template": "api", + "contentFile": "content/docs/chat/platform-api/auth/tokens/get-user-token.mdx" + }, + { + "sourcePath": "/platform-api/auth/sessions/force-logout", + "openimPath": "/platform-api/auth/sessions/force-logout", + "title": "Force logout", + "context": "chat/platform-api", + "template": "api", + "contentFile": "content/docs/chat/platform-api/auth/sessions/force-logout.mdx" + }, + { + "sourcePath": "/platform-api/message/overview", + "openimPath": "/platform-api/message/overview", + "title": "Overview", + "context": "chat/platform-api", + "template": "overview", + "contentFile": "content/docs/chat/platform-api/message/overview.mdx" + }, + { + "sourcePath": "/platform-api/message/message-content-types", + "openimPath": "/platform-api/message/message-content-types", + "title": "Message content types", + "context": "chat/platform-api", "template": "guide", - "contentFile": "content/docs/chat/sdk/ios/conversation/managing-conversations/mark-conversation-read.mdx" + "contentFile": "content/docs/chat/platform-api/message/message-content-types.mdx" + }, + { + "sourcePath": "/platform-api/message/sending-messages/send-msg", + "openimPath": "/platform-api/message/sending-messages/send-msg", + "title": "Send a message", + "context": "chat/platform-api", + "template": "api", + "contentFile": "content/docs/chat/platform-api/message/sending-messages/send-msg.mdx" + }, + { + "sourcePath": "/platform-api/message/sending-messages/batch-send-msg", + "openimPath": "/platform-api/message/sending-messages/batch-send-msg", + "title": "Batch send messages", + "context": "chat/platform-api", + "template": "api", + "contentFile": "content/docs/chat/platform-api/message/sending-messages/batch-send-msg.mdx" + }, + { + "sourcePath": "/platform-api/message/sending-messages/send-business-notification", + "openimPath": "/platform-api/message/sending-messages/send-business-notification", + "title": "Send a business notification", + "context": "chat/platform-api", + "template": "api", + "contentFile": "content/docs/chat/platform-api/message/sending-messages/send-business-notification.mdx" + }, + { + "sourcePath": "/platform-api/message/managing-messages/revoke-msg", + "openimPath": "/platform-api/message/managing-messages/revoke-msg", + "title": "Revoke a message", + "context": "chat/platform-api", + "template": "api", + "contentFile": "content/docs/chat/platform-api/message/managing-messages/revoke-msg.mdx" + }, + { + "sourcePath": "/platform-api/message/retrieving-messages/get-server-time", + "openimPath": "/platform-api/message/retrieving-messages/get-server-time", + "title": "Get server time", + "context": "chat/platform-api", + "template": "api", + "contentFile": "content/docs/chat/platform-api/message/retrieving-messages/get-server-time.mdx" }, { - "sourcePath": "/sdk/ios/conversation/managing-conversations/get-total-unread-count", - "openimPath": "/sdk/ios/conversation/managing-conversations/get-total-unread-count", - "title": "Track the total unread count", - "context": "chat/sdk/ios", - "template": "guide", - "contentFile": "content/docs/chat/sdk/ios/conversation/managing-conversations/get-total-unread-count.mdx" + "sourcePath": "/platform-api/conversation/overview", + "openimPath": "/platform-api/conversation/overview", + "title": "Overview", + "context": "chat/platform-api", + "template": "overview", + "contentFile": "content/docs/chat/platform-api/conversation/overview.mdx" }, { - "sourcePath": "/sdk/ios/conversation/managing-conversations/set-private-chat", - "openimPath": "/sdk/ios/conversation/managing-conversations/set-private-chat", - "title": "Set private chat", - "context": "chat/sdk/ios", - "template": "guide", - "contentFile": "content/docs/chat/sdk/ios/conversation/managing-conversations/set-private-chat.mdx" + "sourcePath": "/platform-api/conversation/listing-conversations/get-sorted-conversation-list", + "openimPath": "/platform-api/conversation/listing-conversations/get-sorted-conversation-list", + "title": "Get sorted conversation list", + "context": "chat/platform-api", + "template": "api", + "contentFile": "content/docs/chat/platform-api/conversation/listing-conversations/get-sorted-conversation-list.mdx" }, { - "sourcePath": "/sdk/ios/conversation/managing-conversations/set-burn-duration", - "openimPath": "/sdk/ios/conversation/managing-conversations/set-burn-duration", - "title": "Set the burn duration", - "context": "chat/sdk/ios", - "template": "guide", - "contentFile": "content/docs/chat/sdk/ios/conversation/managing-conversations/set-burn-duration.mdx" + "sourcePath": "/platform-api/conversation/listing-conversations/get-conversation", + "openimPath": "/platform-api/conversation/listing-conversations/get-conversation", + "title": "Get conversation", + "context": "chat/platform-api", + "template": "api", + "contentFile": "content/docs/chat/platform-api/conversation/listing-conversations/get-conversation.mdx" }, { - "sourcePath": "/sdk/ios/conversation/managing-conversations/set-message-destruct", - "openimPath": "/sdk/ios/conversation/managing-conversations/set-message-destruct", - "title": "Schedule server message deletion", - "context": "chat/sdk/ios", - "template": "guide", - "contentFile": "content/docs/chat/sdk/ios/conversation/managing-conversations/set-message-destruct.mdx" + "sourcePath": "/platform-api/conversation/listing-conversations/get-conversations", + "openimPath": "/platform-api/conversation/listing-conversations/get-conversations", + "title": "Get conversations", + "context": "chat/platform-api", + "template": "api", + "contentFile": "content/docs/chat/platform-api/conversation/listing-conversations/get-conversations.mdx" }, { - "sourcePath": "/sdk/ios/conversation/managing-conversations/set-message-destruct-time", - "openimPath": "/sdk/ios/conversation/managing-conversations/set-message-destruct-time", - "title": "Set server message deletion period", - "context": "chat/sdk/ios", - "template": "guide", - "contentFile": "content/docs/chat/sdk/ios/conversation/managing-conversations/set-message-destruct-time.mdx" + "sourcePath": "/platform-api/conversation/managing-conversations/set-conversations", + "openimPath": "/platform-api/conversation/managing-conversations/set-conversations", + "title": "Set conversations", + "context": "chat/platform-api", + "template": "api", + "contentFile": "content/docs/chat/platform-api/conversation/managing-conversations/set-conversations.mdx" }, { - "sourcePath": "/sdk/ios/conversation/managing-conversations/hide-a-conversation", - "openimPath": "/sdk/ios/conversation/managing-conversations/hide-a-conversation", - "title": "Hide a conversation", - "context": "chat/sdk/ios", - "template": "guide", - "contentFile": "content/docs/chat/sdk/ios/conversation/managing-conversations/hide-a-conversation.mdx" + "sourcePath": "/platform-api/conversation/listing-conversations/get-owner-conversation", + "openimPath": "/platform-api/conversation/listing-conversations/get-owner-conversation", + "title": "Get owner conversation", + "context": "chat/platform-api", + "template": "api", + "contentFile": "content/docs/chat/platform-api/conversation/listing-conversations/get-owner-conversation.mdx" }, { - "sourcePath": "/sdk/ios/conversation/managing-conversations/delete-conversation-with-messages", - "openimPath": "/sdk/ios/conversation/managing-conversations/delete-conversation-with-messages", - "title": "Delete a conversation and its messages", - "context": "chat/sdk/ios", - "template": "guide", - "contentFile": "content/docs/chat/sdk/ios/conversation/managing-conversations/delete-conversation-with-messages.mdx" + "sourcePath": "/platform-api/migration-to-openim", + "openimPath": "/platform-api/migration-to-openim", + "title": "Migrate to OpenIM", + "context": "chat/platform-api", + "template": "overview", + "contentFile": "content/docs/chat/platform-api/migration-to-openim.mdx" }, { - "sourcePath": "/sdk/ios/conversation/managing-conversations/clear-conversation-messages", - "openimPath": "/sdk/ios/conversation/managing-conversations/clear-conversation-messages", - "title": "Clear messages in a conversation", - "context": "chat/sdk/ios", - "template": "guide", - "contentFile": "content/docs/chat/sdk/ios/conversation/managing-conversations/clear-conversation-messages.mdx" + "sourcePath": "/platform-api/logs/overview", + "openimPath": "/platform-api/logs/overview", + "title": "Overview", + "context": "chat/platform-api", + "template": "overview", + "contentFile": "content/docs/chat/platform-api/logs/overview.mdx" }, { - "sourcePath": "/sdk/ios/conversation/managing-conversations/hide-all-conversations", - "openimPath": "/sdk/ios/conversation/managing-conversations/hide-all-conversations", - "title": "Hide all conversations", - "context": "chat/sdk/ios", - "template": "guide", - "contentFile": "content/docs/chat/sdk/ios/conversation/managing-conversations/hide-all-conversations.mdx" + "sourcePath": "/platform-api/logs/upload-logs", + "openimPath": "/platform-api/logs/upload-logs", + "title": "Upload log records", + "context": "chat/platform-api", + "template": "api", + "contentFile": "content/docs/chat/platform-api/logs/upload-logs.mdx" }, { - "sourcePath": "/sdk/ios/conversation/managing-conversation-groups/overview-conversation-groups", - "openimPath": "/sdk/ios/conversation/managing-conversation-groups/overview-conversation-groups", - "title": "Conversation group overview", - "context": "chat/sdk/ios", - "template": "guide", - "contentFile": "content/docs/chat/sdk/ios/conversation/managing-conversation-groups/overview-conversation-groups.mdx" + "sourcePath": "/platform-api/logs/search-logs", + "openimPath": "/platform-api/logs/search-logs", + "title": "Search log records", + "context": "chat/platform-api", + "template": "api", + "contentFile": "content/docs/chat/platform-api/logs/search-logs.mdx" }, { - "sourcePath": "/sdk/ios/conversation/managing-conversation-groups/create-conversation-group", - "openimPath": "/sdk/ios/conversation/managing-conversation-groups/create-conversation-group", - "title": "Open_im_sdkCreateConversationGroup", - "context": "chat/sdk/ios", - "template": "guide", - "contentFile": "content/docs/chat/sdk/ios/conversation/managing-conversation-groups/create-conversation-group.mdx" + "sourcePath": "/platform-api/logs/delete-logs", + "openimPath": "/platform-api/logs/delete-logs", + "title": "Delete log records", + "context": "chat/platform-api", + "template": "api", + "contentFile": "content/docs/chat/platform-api/logs/delete-logs.mdx" }, { - "sourcePath": "/sdk/ios/conversation/managing-conversation-groups/get-conversation-groups", - "openimPath": "/sdk/ios/conversation/managing-conversation-groups/get-conversation-groups", - "title": "Open_im_sdkGetConversationGroups", + "sourcePath": "/sdk/ios/overview", + "openimPath": "/sdk/ios/overview", + "title": "OpenIM SDK for iOS", "context": "chat/sdk/ios", - "template": "guide", - "contentFile": "content/docs/chat/sdk/ios/conversation/managing-conversation-groups/get-conversation-groups.mdx" + "template": "overview", + "contentFile": "content/docs/chat/sdk/ios/overview.mdx" }, { - "sourcePath": "/sdk/ios/conversation/managing-conversation-groups/get-conversation-group-info-with-conversations", - "openimPath": "/sdk/ios/conversation/managing-conversation-groups/get-conversation-group-info-with-conversations", - "title": "Open_im_sdkGetConversationGroupInfoWithConversations", + "sourcePath": "/sdk/ios/getting-started/before-you-start", + "openimPath": "/sdk/ios/getting-started/before-you-start", + "title": "Before you start", "context": "chat/sdk/ios", "template": "guide", - "contentFile": "content/docs/chat/sdk/ios/conversation/managing-conversation-groups/get-conversation-group-info-with-conversations.mdx" + "contentFile": "content/docs/chat/sdk/ios/getting-started/before-you-start.mdx" }, { - "sourcePath": "/sdk/ios/conversation/managing-conversation-groups/get-conversation-group-ids-by-conversation-id", - "openimPath": "/sdk/ios/conversation/managing-conversation-groups/get-conversation-group-ids-by-conversation-id", - "title": "Open_im_sdkGetConversationGroupByConversationID", + "sourcePath": "/sdk/ios/getting-started/environment-specific-implementation", + "openimPath": "/sdk/ios/getting-started/environment-specific-implementation", + "title": "Environment-specific implementation", "context": "chat/sdk/ios", "template": "guide", - "contentFile": "content/docs/chat/sdk/ios/conversation/managing-conversation-groups/get-conversation-group-ids-by-conversation-id.mdx" + "contentFile": "content/docs/chat/sdk/ios/getting-started/environment-specific-implementation.mdx" }, { - "sourcePath": "/sdk/ios/conversation/managing-conversation-groups/update-conversation-group", - "openimPath": "/sdk/ios/conversation/managing-conversation-groups/update-conversation-group", - "title": "Open_im_sdkUpdateConversationGroup", + "sourcePath": "/sdk/ios/getting-started/authenticate-and-manage-session", + "openimPath": "/sdk/ios/getting-started/authenticate-and-manage-session", + "title": "Authenticate and manage a session", "context": "chat/sdk/ios", "template": "guide", - "contentFile": "content/docs/chat/sdk/ios/conversation/managing-conversation-groups/update-conversation-group.mdx" + "contentFile": "content/docs/chat/sdk/ios/getting-started/authenticate-and-manage-session.mdx" }, { - "sourcePath": "/sdk/ios/conversation/managing-conversation-groups/set-conversation-group-order", - "openimPath": "/sdk/ios/conversation/managing-conversation-groups/set-conversation-group-order", - "title": "Open_im_sdkSetConversationGroupOrder", + "sourcePath": "/sdk/ios/getting-started/send-first-message", + "openimPath": "/sdk/ios/getting-started/send-first-message", + "title": "Send your first message", "context": "chat/sdk/ios", "template": "guide", - "contentFile": "content/docs/chat/sdk/ios/conversation/managing-conversation-groups/set-conversation-group-order.mdx" + "contentFile": "content/docs/chat/sdk/ios/getting-started/send-first-message.mdx" }, { - "sourcePath": "/sdk/ios/conversation/managing-conversation-groups/add-conversations-to-groups", - "openimPath": "/sdk/ios/conversation/managing-conversation-groups/add-conversations-to-groups", - "title": "Open_im_sdkAddConversationsToGroups", + "sourcePath": "/sdk/ios/user/overview-user", + "openimPath": "/sdk/ios/user/overview-user", + "title": "Overview", "context": "chat/sdk/ios", "template": "guide", - "contentFile": "content/docs/chat/sdk/ios/conversation/managing-conversation-groups/add-conversations-to-groups.mdx" + "contentFile": "content/docs/chat/sdk/ios/user/overview-user.mdx" }, { - "sourcePath": "/sdk/ios/conversation/managing-conversation-groups/remove-conversations-from-groups", - "openimPath": "/sdk/ios/conversation/managing-conversation-groups/remove-conversations-from-groups", - "title": "Open_im_sdkRemoveConversationsFromGroups", + "sourcePath": "/sdk/ios/user/retrieving-users/retrieve-users", + "openimPath": "/sdk/ios/user/retrieving-users/retrieve-users", + "title": "Retrieve users", "context": "chat/sdk/ios", "template": "guide", - "contentFile": "content/docs/chat/sdk/ios/conversation/managing-conversation-groups/remove-conversations-from-groups.mdx" + "contentFile": "content/docs/chat/sdk/ios/user/retrieving-users/retrieve-users.mdx" }, { - "sourcePath": "/sdk/ios/conversation/managing-conversation-groups/delete-conversation-group", - "openimPath": "/sdk/ios/conversation/managing-conversation-groups/delete-conversation-group", - "title": "Open_im_sdkDeleteConversationGroup", + "sourcePath": "/sdk/ios/user/retrieving-and-updating-user-information/get-self-profile", + "openimPath": "/sdk/ios/user/retrieving-and-updating-user-information/get-self-profile", + "title": "View your profile", "context": "chat/sdk/ios", "template": "guide", - "contentFile": "content/docs/chat/sdk/ios/conversation/managing-conversation-groups/delete-conversation-group.mdx" + "contentFile": "content/docs/chat/sdk/ios/user/retrieving-and-updating-user-information/get-self-profile.mdx" }, { - "sourcePath": "/sdk/ios/group/overview-group", - "openimPath": "/sdk/ios/group/overview-group", - "title": "Group overview", + "sourcePath": "/sdk/ios/user/retrieving-and-updating-user-information/update-self-profile", + "openimPath": "/sdk/ios/user/retrieving-and-updating-user-information/update-self-profile", + "title": "Update your profile", "context": "chat/sdk/ios", "template": "guide", - "contentFile": "content/docs/chat/sdk/ios/group/overview-group.mdx" + "contentFile": "content/docs/chat/sdk/ios/user/retrieving-and-updating-user-information/update-self-profile.mdx" }, { - "sourcePath": "/sdk/ios/group/create-group", - "openimPath": "/sdk/ios/group/create-group", - "title": "Create a group", + "sourcePath": "/sdk/ios/user/retrieving-and-updating-user-information/set-global-message-reception", + "openimPath": "/sdk/ios/user/retrieving-and-updating-user-information/set-global-message-reception", + "title": "Set global message reception", "context": "chat/sdk/ios", "template": "guide", - "contentFile": "content/docs/chat/sdk/ios/group/create-group.mdx" + "contentFile": "content/docs/chat/sdk/ios/user/retrieving-and-updating-user-information/set-global-message-reception.mdx" }, { - "sourcePath": "/sdk/ios/group/update-group-profile", - "openimPath": "/sdk/ios/group/update-group-profile", - "title": "Update group profile", + "sourcePath": "/sdk/ios/user/retrieving-and-updating-user-information/subscribe-user-status", + "openimPath": "/sdk/ios/user/retrieving-and-updating-user-information/subscribe-user-status", + "title": "Subscribe to user status", "context": "chat/sdk/ios", - "template": "overview", - "contentFile": "content/docs/chat/sdk/ios/group/update-group-profile.mdx" + "template": "guide", + "contentFile": "content/docs/chat/sdk/ios/user/retrieving-and-updating-user-information/subscribe-user-status.mdx" }, { - "sourcePath": "/sdk/ios/group/set-group-announcement", - "openimPath": "/sdk/ios/group/set-group-announcement", - "title": "Publish a group announcement", + "sourcePath": "/sdk/ios/user/retrieving-and-updating-user-information/get-subscribed-user-status", + "openimPath": "/sdk/ios/user/retrieving-and-updating-user-information/get-subscribed-user-status", + "title": "Refresh subscribed user status", "context": "chat/sdk/ios", - "template": "overview", - "contentFile": "content/docs/chat/sdk/ios/group/set-group-announcement.mdx" + "template": "guide", + "contentFile": "content/docs/chat/sdk/ios/user/retrieving-and-updating-user-information/get-subscribed-user-status.mdx" }, { - "sourcePath": "/sdk/ios/group/set-group-extension", - "openimPath": "/sdk/ios/group/set-group-extension", - "title": "Set group extra data", + "sourcePath": "/sdk/ios/user/retrieving-and-updating-user-information/unsubscribe-user-status", + "openimPath": "/sdk/ios/user/retrieving-and-updating-user-information/unsubscribe-user-status", + "title": "Unsubscribe from user status", "context": "chat/sdk/ios", - "template": "overview", - "contentFile": "content/docs/chat/sdk/ios/group/set-group-extension.mdx" + "template": "guide", + "contentFile": "content/docs/chat/sdk/ios/user/retrieving-and-updating-user-information/unsubscribe-user-status.mdx" }, { - "sourcePath": "/sdk/ios/group/set-group-join-verification", - "openimPath": "/sdk/ios/group/set-group-join-verification", - "title": "Set group join verification", + "sourcePath": "/sdk/ios/user/friends/get-friend-list-page", + "openimPath": "/sdk/ios/user/friends/get-friend-list-page", + "title": "Get the friend list", "context": "chat/sdk/ios", - "template": "overview", - "contentFile": "content/docs/chat/sdk/ios/group/set-group-join-verification.mdx" + "template": "guide", + "contentFile": "content/docs/chat/sdk/ios/user/friends/get-friend-list-page.mdx" }, { - "sourcePath": "/sdk/ios/group/set-group-member-profile-access", - "openimPath": "/sdk/ios/group/set-group-member-profile-access", - "title": "Set member profile access", + "sourcePath": "/sdk/ios/user/friends/search-friends", + "openimPath": "/sdk/ios/user/friends/search-friends", + "title": "Search friends", "context": "chat/sdk/ios", - "template": "overview", - "contentFile": "content/docs/chat/sdk/ios/group/set-group-member-profile-access.mdx" + "template": "guide", + "contentFile": "content/docs/chat/sdk/ios/user/friends/search-friends.mdx" }, { - "sourcePath": "/sdk/ios/group/set-group-member-friend-permission", - "openimPath": "/sdk/ios/group/set-group-member-friend-permission", - "title": "Set member friend request permission", + "sourcePath": "/sdk/ios/user/friends/get-specified-friends-info", + "openimPath": "/sdk/ios/user/friends/get-specified-friends-info", + "title": "Get friend profiles", "context": "chat/sdk/ios", - "template": "overview", - "contentFile": "content/docs/chat/sdk/ios/group/set-group-member-friend-permission.mdx" + "template": "guide", + "contentFile": "content/docs/chat/sdk/ios/user/friends/get-specified-friends-info.mdx" }, { - "sourcePath": "/sdk/ios/group/change-group-mute", - "openimPath": "/sdk/ios/group/change-group-mute", - "title": "Change group mute status", + "sourcePath": "/sdk/ios/user/friends/check-friend", + "openimPath": "/sdk/ios/user/friends/check-friend", + "title": "Check friendship status", "context": "chat/sdk/ios", "template": "guide", - "contentFile": "content/docs/chat/sdk/ios/group/change-group-mute.mdx" + "contentFile": "content/docs/chat/sdk/ios/user/friends/check-friend.mdx" }, { - "sourcePath": "/sdk/ios/group/join-group", - "openimPath": "/sdk/ios/group/join-group", - "title": "Apply to join a group", + "sourcePath": "/sdk/ios/user/friends/update-friends", + "openimPath": "/sdk/ios/user/friends/update-friends", + "title": "Update friend information", "context": "chat/sdk/ios", "template": "guide", - "contentFile": "content/docs/chat/sdk/ios/group/join-group.mdx" + "contentFile": "content/docs/chat/sdk/ios/user/friends/update-friends.mdx" }, { - "sourcePath": "/sdk/ios/group/quit-group", - "openimPath": "/sdk/ios/group/quit-group", - "title": "Leave a group", + "sourcePath": "/sdk/ios/user/friends/delete-friend", + "openimPath": "/sdk/ios/user/friends/delete-friend", + "title": "Delete a friend", "context": "chat/sdk/ios", "template": "guide", - "contentFile": "content/docs/chat/sdk/ios/group/quit-group.mdx" + "contentFile": "content/docs/chat/sdk/ios/user/friends/delete-friend.mdx" }, { - "sourcePath": "/sdk/ios/group/dismiss-group", - "openimPath": "/sdk/ios/group/dismiss-group", - "title": "Dismiss a group", + "sourcePath": "/sdk/ios/user/friend-applications/add-friend", + "openimPath": "/sdk/ios/user/friend-applications/add-friend", + "title": "Send a friend application", "context": "chat/sdk/ios", "template": "guide", - "contentFile": "content/docs/chat/sdk/ios/group/dismiss-group.mdx" + "contentFile": "content/docs/chat/sdk/ios/user/friend-applications/add-friend.mdx" }, { - "sourcePath": "/sdk/ios/group/retrieving-groups/get-specified-groups-info", - "openimPath": "/sdk/ios/group/retrieving-groups/get-specified-groups-info", - "title": "Get group information", + "sourcePath": "/sdk/ios/user/friend-applications/get-friend-application-list-as-recipient", + "openimPath": "/sdk/ios/user/friend-applications/get-friend-application-list-as-recipient", + "title": "Get received friend applications", "context": "chat/sdk/ios", "template": "guide", - "contentFile": "content/docs/chat/sdk/ios/group/retrieving-groups/get-specified-groups-info.mdx" + "contentFile": "content/docs/chat/sdk/ios/user/friend-applications/get-friend-application-list-as-recipient.mdx" }, { - "sourcePath": "/sdk/ios/group/retrieving-groups/get-joined-group-list", - "openimPath": "/sdk/ios/group/retrieving-groups/get-joined-group-list", - "title": "Get joined groups", + "sourcePath": "/sdk/ios/user/friend-applications/get-friend-application-list-as-applicant", + "openimPath": "/sdk/ios/user/friend-applications/get-friend-application-list-as-applicant", + "title": "Get sent friend applications", "context": "chat/sdk/ios", "template": "guide", - "contentFile": "content/docs/chat/sdk/ios/group/retrieving-groups/get-joined-group-list.mdx" + "contentFile": "content/docs/chat/sdk/ios/user/friend-applications/get-friend-application-list-as-applicant.mdx" }, { - "sourcePath": "/sdk/ios/group/retrieving-groups/get-joined-group-list-page", - "openimPath": "/sdk/ios/group/retrieving-groups/get-joined-group-list-page", - "title": "Get joined groups by page", + "sourcePath": "/sdk/ios/user/friend-applications/get-friend-application-unhandled-count", + "openimPath": "/sdk/ios/user/friend-applications/get-friend-application-unhandled-count", + "title": "Get pending application count", "context": "chat/sdk/ios", "template": "guide", - "contentFile": "content/docs/chat/sdk/ios/group/retrieving-groups/get-joined-group-list-page.mdx" + "contentFile": "content/docs/chat/sdk/ios/user/friend-applications/get-friend-application-unhandled-count.mdx" }, { - "sourcePath": "/sdk/ios/group/retrieving-groups/is-join-group", - "openimPath": "/sdk/ios/group/retrieving-groups/is-join-group", - "title": "Check group membership", + "sourcePath": "/sdk/ios/user/friend-applications/accept-friend-application", + "openimPath": "/sdk/ios/user/friend-applications/accept-friend-application", + "title": "Accept a friend application", "context": "chat/sdk/ios", "template": "guide", - "contentFile": "content/docs/chat/sdk/ios/group/retrieving-groups/is-join-group.mdx" + "contentFile": "content/docs/chat/sdk/ios/user/friend-applications/accept-friend-application.mdx" }, { - "sourcePath": "/sdk/ios/group/retrieving-groups/search-groups", - "openimPath": "/sdk/ios/group/retrieving-groups/search-groups", - "title": "Search groups", + "sourcePath": "/sdk/ios/user/friend-applications/refuse-friend-application", + "openimPath": "/sdk/ios/user/friend-applications/refuse-friend-application", + "title": "Reject a friend application", "context": "chat/sdk/ios", "template": "guide", - "contentFile": "content/docs/chat/sdk/ios/group/retrieving-groups/search-groups.mdx" + "contentFile": "content/docs/chat/sdk/ios/user/friend-applications/refuse-friend-application.mdx" }, { - "sourcePath": "/sdk/ios/group/group-applications/overview-group-applications", - "openimPath": "/sdk/ios/group/group-applications/overview-group-applications", - "title": "Group applications overview", + "sourcePath": "/sdk/ios/user/friend-applications/delete-friend-requests", + "openimPath": "/sdk/ios/user/friend-applications/delete-friend-requests", + "title": "Delete friend applications", "context": "chat/sdk/ios", "template": "guide", - "contentFile": "content/docs/chat/sdk/ios/group/group-applications/overview-group-applications.mdx" + "contentFile": "content/docs/chat/sdk/ios/user/friend-applications/delete-friend-requests.mdx" }, { - "sourcePath": "/sdk/ios/group/group-applications/get-group-application-list-as-recipient", - "openimPath": "/sdk/ios/group/group-applications/get-group-application-list-as-recipient", - "title": "Get received group applications", + "sourcePath": "/sdk/ios/user/moderating-a-user/retrieve-a-list-of-blocked-users", + "openimPath": "/sdk/ios/user/moderating-a-user/retrieve-a-list-of-blocked-users", + "title": "Retrieve a list of blocked users", "context": "chat/sdk/ios", "template": "guide", - "contentFile": "content/docs/chat/sdk/ios/group/group-applications/get-group-application-list-as-recipient.mdx" + "contentFile": "content/docs/chat/sdk/ios/user/moderating-a-user/retrieve-a-list-of-blocked-users.mdx" }, { - "sourcePath": "/sdk/ios/group/group-applications/get-group-application-list-as-applicant", - "openimPath": "/sdk/ios/group/group-applications/get-group-application-list-as-applicant", - "title": "Get sent group applications", + "sourcePath": "/sdk/ios/user/moderating-a-user/block-user", + "openimPath": "/sdk/ios/user/moderating-a-user/block-user", + "title": "Block a user", "context": "chat/sdk/ios", "template": "guide", - "contentFile": "content/docs/chat/sdk/ios/group/group-applications/get-group-application-list-as-applicant.mdx" + "contentFile": "content/docs/chat/sdk/ios/user/moderating-a-user/block-user.mdx" }, { - "sourcePath": "/sdk/ios/group/group-applications/get-group-application-unhandled-count", - "openimPath": "/sdk/ios/group/group-applications/get-group-application-unhandled-count", - "title": "Get pending group application count", + "sourcePath": "/sdk/ios/user/moderating-a-user/unblock-user", + "openimPath": "/sdk/ios/user/moderating-a-user/unblock-user", + "title": "Unblock a user", "context": "chat/sdk/ios", "template": "guide", - "contentFile": "content/docs/chat/sdk/ios/group/group-applications/get-group-application-unhandled-count.mdx" + "contentFile": "content/docs/chat/sdk/ios/user/moderating-a-user/unblock-user.mdx" }, { - "sourcePath": "/sdk/ios/group/group-applications/accept-group-application", - "openimPath": "/sdk/ios/group/group-applications/accept-group-application", - "title": "Accept a group application", + "sourcePath": "/sdk/ios/conversation/overview-conversation", + "openimPath": "/sdk/ios/conversation/overview-conversation", + "title": "Conversation overview", "context": "chat/sdk/ios", "template": "guide", - "contentFile": "content/docs/chat/sdk/ios/group/group-applications/accept-group-application.mdx" + "contentFile": "content/docs/chat/sdk/ios/conversation/overview-conversation.mdx" }, { - "sourcePath": "/sdk/ios/group/group-applications/refuse-group-application", - "openimPath": "/sdk/ios/group/group-applications/refuse-group-application", - "title": "Reject a group application", + "sourcePath": "/sdk/ios/conversation/retrieving-conversations/get-conversation-by-target", + "openimPath": "/sdk/ios/conversation/retrieving-conversations/get-conversation-by-target", + "title": "Open a conversation", "context": "chat/sdk/ios", "template": "guide", - "contentFile": "content/docs/chat/sdk/ios/group/group-applications/refuse-group-application.mdx" + "contentFile": "content/docs/chat/sdk/ios/conversation/retrieving-conversations/get-conversation-by-target.mdx" }, { - "sourcePath": "/sdk/ios/group/group-applications/delete-group-requests", - "openimPath": "/sdk/ios/group/group-applications/delete-group-requests", - "title": "Delete group applications", + "sourcePath": "/sdk/ios/conversation/retrieving-conversations/get-conversation-id", + "openimPath": "/sdk/ios/conversation/retrieving-conversations/get-conversation-id", + "title": "Resolve a conversation ID", "context": "chat/sdk/ios", "template": "guide", - "contentFile": "content/docs/chat/sdk/ios/group/group-applications/delete-group-requests.mdx" + "contentFile": "content/docs/chat/sdk/ios/conversation/retrieving-conversations/get-conversation-id.mdx" }, { - "sourcePath": "/sdk/ios/group/retrieving-group-members/overview-retrieving-group-members", - "openimPath": "/sdk/ios/group/retrieving-group-members/overview-retrieving-group-members", - "title": "Group member queries overview", + "sourcePath": "/sdk/ios/conversation/retrieving-conversations/get-conversations-by-id", + "openimPath": "/sdk/ios/conversation/retrieving-conversations/get-conversations-by-id", + "title": "Get conversations by ID", "context": "chat/sdk/ios", "template": "guide", - "contentFile": "content/docs/chat/sdk/ios/group/retrieving-group-members/overview-retrieving-group-members.mdx" + "contentFile": "content/docs/chat/sdk/ios/conversation/retrieving-conversations/get-conversations-by-id.mdx" }, { - "sourcePath": "/sdk/ios/group/retrieving-group-members/get-group-member-list", - "openimPath": "/sdk/ios/group/retrieving-group-members/get-group-member-list", - "title": "Get group members", + "sourcePath": "/sdk/ios/conversation/retrieving-conversations/retrieve-conversation-list", + "openimPath": "/sdk/ios/conversation/retrieving-conversations/retrieve-conversation-list", + "title": "Retrieve a conversation list", "context": "chat/sdk/ios", "template": "guide", - "contentFile": "content/docs/chat/sdk/ios/group/retrieving-group-members/get-group-member-list.mdx" + "contentFile": "content/docs/chat/sdk/ios/conversation/retrieving-conversations/retrieve-conversation-list.mdx" }, { - "sourcePath": "/sdk/ios/group/retrieving-group-members/get-specified-group-members-info", - "openimPath": "/sdk/ios/group/retrieving-group-members/get-specified-group-members-info", - "title": "Get group member profiles", + "sourcePath": "/sdk/ios/conversation/managing-conversations/pin-conversation", + "openimPath": "/sdk/ios/conversation/managing-conversations/pin-conversation", + "title": "Pin or unpin a conversation", "context": "chat/sdk/ios", "template": "guide", - "contentFile": "content/docs/chat/sdk/ios/group/retrieving-group-members/get-specified-group-members-info.mdx" + "contentFile": "content/docs/chat/sdk/ios/conversation/managing-conversations/pin-conversation.mdx" }, { - "sourcePath": "/sdk/ios/group/retrieving-group-members/get-users-in-group", - "openimPath": "/sdk/ios/group/retrieving-group-members/get-users-in-group", - "title": "Check users in a group", + "sourcePath": "/sdk/ios/conversation/managing-conversations/set-conversation-extension", + "openimPath": "/sdk/ios/conversation/managing-conversations/set-conversation-extension", + "title": "Set conversation extra data", "context": "chat/sdk/ios", "template": "guide", - "contentFile": "content/docs/chat/sdk/ios/group/retrieving-group-members/get-users-in-group.mdx" + "contentFile": "content/docs/chat/sdk/ios/conversation/managing-conversations/set-conversation-extension.mdx" }, { - "sourcePath": "/sdk/ios/group/retrieving-group-members/get-group-member-owner-and-admin", - "openimPath": "/sdk/ios/group/retrieving-group-members/get-group-member-owner-and-admin", - "title": "Get group owners and admins", + "sourcePath": "/sdk/ios/conversation/managing-conversations/set-conversation-draft", + "openimPath": "/sdk/ios/conversation/managing-conversations/set-conversation-draft", + "title": "Set a conversation draft", "context": "chat/sdk/ios", "template": "guide", - "contentFile": "content/docs/chat/sdk/ios/group/retrieving-group-members/get-group-member-owner-and-admin.mdx" + "contentFile": "content/docs/chat/sdk/ios/conversation/managing-conversations/set-conversation-draft.mdx" }, { - "sourcePath": "/sdk/ios/group/retrieving-group-members/search-group-members", - "openimPath": "/sdk/ios/group/retrieving-group-members/search-group-members", - "title": "Search group members", + "sourcePath": "/sdk/ios/conversation/managing-conversations/set-message-receive-option", + "openimPath": "/sdk/ios/conversation/managing-conversations/set-message-receive-option", + "title": "Set message reception", "context": "chat/sdk/ios", "template": "guide", - "contentFile": "content/docs/chat/sdk/ios/group/retrieving-group-members/search-group-members.mdx" + "contentFile": "content/docs/chat/sdk/ios/conversation/managing-conversations/set-message-receive-option.mdx" }, { - "sourcePath": "/sdk/ios/group/managing-group-members/invite-user-to-group", - "openimPath": "/sdk/ios/group/managing-group-members/invite-user-to-group", - "title": "Invite users to a group", + "sourcePath": "/sdk/ios/conversation/managing-conversations/clear-group-mentions", + "openimPath": "/sdk/ios/conversation/managing-conversations/clear-group-mentions", + "title": "Reset group mention status", "context": "chat/sdk/ios", "template": "guide", - "contentFile": "content/docs/chat/sdk/ios/group/managing-group-members/invite-user-to-group.mdx" + "contentFile": "content/docs/chat/sdk/ios/conversation/managing-conversations/clear-group-mentions.mdx" }, { - "sourcePath": "/sdk/ios/group/managing-group-members/kick-group-member", - "openimPath": "/sdk/ios/group/managing-group-members/kick-group-member", - "title": "Remove group members", + "sourcePath": "/sdk/ios/conversation/managing-conversations/mark-conversation-read", + "openimPath": "/sdk/ios/conversation/managing-conversations/mark-conversation-read", + "title": "Mark a conversation as read", "context": "chat/sdk/ios", "template": "guide", - "contentFile": "content/docs/chat/sdk/ios/group/managing-group-members/kick-group-member.mdx" + "contentFile": "content/docs/chat/sdk/ios/conversation/managing-conversations/mark-conversation-read.mdx" }, { - "sourcePath": "/sdk/ios/group/managing-group-members/set-group-member-nickname", - "openimPath": "/sdk/ios/group/managing-group-members/set-group-member-nickname", - "title": "Update a group nickname", + "sourcePath": "/sdk/ios/conversation/managing-conversations/get-total-unread-count", + "openimPath": "/sdk/ios/conversation/managing-conversations/get-total-unread-count", + "title": "Track the total unread count", "context": "chat/sdk/ios", "template": "guide", - "contentFile": "content/docs/chat/sdk/ios/group/managing-group-members/set-group-member-nickname.mdx" + "contentFile": "content/docs/chat/sdk/ios/conversation/managing-conversations/get-total-unread-count.mdx" }, { - "sourcePath": "/sdk/ios/group/managing-group-members/set-group-member-role-level", - "openimPath": "/sdk/ios/group/managing-group-members/set-group-member-role-level", - "title": "Manage group administrators", + "sourcePath": "/sdk/ios/conversation/managing-conversations/set-private-chat", + "openimPath": "/sdk/ios/conversation/managing-conversations/set-private-chat", + "title": "Set private chat", "context": "chat/sdk/ios", "template": "guide", - "contentFile": "content/docs/chat/sdk/ios/group/managing-group-members/set-group-member-role-level.mdx" + "contentFile": "content/docs/chat/sdk/ios/conversation/managing-conversations/set-private-chat.mdx" }, { - "sourcePath": "/sdk/ios/group/managing-group-members/set-group-member-avatar", - "openimPath": "/sdk/ios/group/managing-group-members/set-group-member-avatar", - "title": "Update a group member avatar", + "sourcePath": "/sdk/ios/conversation/managing-conversations/set-burn-duration", + "openimPath": "/sdk/ios/conversation/managing-conversations/set-burn-duration", + "title": "Set the burn duration", "context": "chat/sdk/ios", - "template": "overview", - "contentFile": "content/docs/chat/sdk/ios/group/managing-group-members/set-group-member-avatar.mdx" + "template": "guide", + "contentFile": "content/docs/chat/sdk/ios/conversation/managing-conversations/set-burn-duration.mdx" }, { - "sourcePath": "/sdk/ios/group/managing-group-members/set-group-member-extension", - "openimPath": "/sdk/ios/group/managing-group-members/set-group-member-extension", - "title": "Set group member extra data", + "sourcePath": "/sdk/ios/conversation/managing-conversations/set-message-destruct", + "openimPath": "/sdk/ios/conversation/managing-conversations/set-message-destruct", + "title": "Schedule server message deletion", "context": "chat/sdk/ios", - "template": "overview", - "contentFile": "content/docs/chat/sdk/ios/group/managing-group-members/set-group-member-extension.mdx" + "template": "guide", + "contentFile": "content/docs/chat/sdk/ios/conversation/managing-conversations/set-message-destruct.mdx" }, { - "sourcePath": "/sdk/ios/group/managing-group-members/transfer-group-owner", - "openimPath": "/sdk/ios/group/managing-group-members/transfer-group-owner", - "title": "Transfer group owner", + "sourcePath": "/sdk/ios/conversation/managing-conversations/set-message-destruct-time", + "openimPath": "/sdk/ios/conversation/managing-conversations/set-message-destruct-time", + "title": "Set server message deletion period", "context": "chat/sdk/ios", "template": "guide", - "contentFile": "content/docs/chat/sdk/ios/group/managing-group-members/transfer-group-owner.mdx" + "contentFile": "content/docs/chat/sdk/ios/conversation/managing-conversations/set-message-destruct-time.mdx" }, { - "sourcePath": "/sdk/ios/group/managing-group-members/change-group-member-mute", - "openimPath": "/sdk/ios/group/managing-group-members/change-group-member-mute", - "title": "Mute or unmute a group member", + "sourcePath": "/sdk/ios/conversation/managing-conversations/hide-a-conversation", + "openimPath": "/sdk/ios/conversation/managing-conversations/hide-a-conversation", + "title": "Hide a conversation", "context": "chat/sdk/ios", "template": "guide", - "contentFile": "content/docs/chat/sdk/ios/group/managing-group-members/change-group-member-mute.mdx" + "contentFile": "content/docs/chat/sdk/ios/conversation/managing-conversations/hide-a-conversation.mdx" }, { - "sourcePath": "/sdk/ios/message/overview-message", - "openimPath": "/sdk/ios/message/overview-message", - "title": "Overview", + "sourcePath": "/sdk/ios/conversation/managing-conversations/delete-conversation-with-messages", + "openimPath": "/sdk/ios/conversation/managing-conversations/delete-conversation-with-messages", + "title": "Delete a conversation and its messages", "context": "chat/sdk/ios", "template": "guide", - "contentFile": "content/docs/chat/sdk/ios/message/overview-message.mdx" + "contentFile": "content/docs/chat/sdk/ios/conversation/managing-conversations/delete-conversation-with-messages.mdx" }, { - "sourcePath": "/sdk/ios/message/creating-messages/create-text-message", - "openimPath": "/sdk/ios/message/creating-messages/create-text-message", - "title": "Create a text message", + "sourcePath": "/sdk/ios/conversation/managing-conversations/clear-conversation-messages", + "openimPath": "/sdk/ios/conversation/managing-conversations/clear-conversation-messages", + "title": "Clear messages in a conversation", "context": "chat/sdk/ios", "template": "guide", - "contentFile": "content/docs/chat/sdk/ios/message/creating-messages/create-text-message.mdx" + "contentFile": "content/docs/chat/sdk/ios/conversation/managing-conversations/clear-conversation-messages.mdx" }, { - "sourcePath": "/sdk/ios/message/creating-messages/create-text-at-message", - "openimPath": "/sdk/ios/message/creating-messages/create-text-at-message", - "title": "Create a mention message", + "sourcePath": "/sdk/ios/conversation/managing-conversations/hide-all-conversations", + "openimPath": "/sdk/ios/conversation/managing-conversations/hide-all-conversations", + "title": "Hide all conversations", "context": "chat/sdk/ios", "template": "guide", - "contentFile": "content/docs/chat/sdk/ios/message/creating-messages/create-text-at-message.mdx" + "contentFile": "content/docs/chat/sdk/ios/conversation/managing-conversations/hide-all-conversations.mdx" }, { - "sourcePath": "/sdk/ios/message/creating-messages/create-text-at-all-message", - "openimPath": "/sdk/ios/message/creating-messages/create-text-at-all-message", - "title": "Create an @all message", + "sourcePath": "/sdk/ios/conversation/managing-conversation-groups/overview-conversation-groups", + "openimPath": "/sdk/ios/conversation/managing-conversation-groups/overview-conversation-groups", + "title": "Conversation group overview", "context": "chat/sdk/ios", "template": "guide", - "contentFile": "content/docs/chat/sdk/ios/message/creating-messages/create-text-at-all-message.mdx" + "contentFile": "content/docs/chat/sdk/ios/conversation/managing-conversation-groups/overview-conversation-groups.mdx" }, { - "sourcePath": "/sdk/ios/message/creating-messages/create-at-all-flag", - "openimPath": "/sdk/ios/message/creating-messages/create-at-all-flag", - "title": "Create an @all marker", + "sourcePath": "/sdk/ios/conversation/managing-conversation-groups/create-conversation-group", + "openimPath": "/sdk/ios/conversation/managing-conversation-groups/create-conversation-group", + "title": "Open_im_sdkCreateConversationGroup", "context": "chat/sdk/ios", "template": "guide", - "contentFile": "content/docs/chat/sdk/ios/message/creating-messages/create-at-all-flag.mdx" + "contentFile": "content/docs/chat/sdk/ios/conversation/managing-conversation-groups/create-conversation-group.mdx" }, { - "sourcePath": "/sdk/ios/message/creating-messages/get-at-all-tag", - "openimPath": "/sdk/ios/message/creating-messages/get-at-all-tag", - "title": "Get the @all tag", + "sourcePath": "/sdk/ios/conversation/managing-conversation-groups/get-conversation-groups", + "openimPath": "/sdk/ios/conversation/managing-conversation-groups/get-conversation-groups", + "title": "Open_im_sdkGetConversationGroups", "context": "chat/sdk/ios", "template": "guide", - "contentFile": "content/docs/chat/sdk/ios/message/creating-messages/get-at-all-tag.mdx" + "contentFile": "content/docs/chat/sdk/ios/conversation/managing-conversation-groups/get-conversation-groups.mdx" }, { - "sourcePath": "/sdk/ios/message/creating-messages/create-custom-message", - "openimPath": "/sdk/ios/message/creating-messages/create-custom-message", - "title": "Create a custom message", + "sourcePath": "/sdk/ios/conversation/managing-conversation-groups/get-conversation-group-info-with-conversations", + "openimPath": "/sdk/ios/conversation/managing-conversation-groups/get-conversation-group-info-with-conversations", + "title": "Open_im_sdkGetConversationGroupInfoWithConversations", "context": "chat/sdk/ios", "template": "guide", - "contentFile": "content/docs/chat/sdk/ios/message/creating-messages/create-custom-message.mdx" + "contentFile": "content/docs/chat/sdk/ios/conversation/managing-conversation-groups/get-conversation-group-info-with-conversations.mdx" }, { - "sourcePath": "/sdk/ios/message/creating-messages/create-image-message-from-full-path", - "openimPath": "/sdk/ios/message/creating-messages/create-image-message-from-full-path", - "title": "Create an image message from a path", + "sourcePath": "/sdk/ios/conversation/managing-conversation-groups/get-conversation-group-ids-by-conversation-id", + "openimPath": "/sdk/ios/conversation/managing-conversation-groups/get-conversation-group-ids-by-conversation-id", + "title": "Open_im_sdkGetConversationGroupByConversationID", "context": "chat/sdk/ios", "template": "guide", - "contentFile": "content/docs/chat/sdk/ios/message/creating-messages/create-image-message-from-full-path.mdx" + "contentFile": "content/docs/chat/sdk/ios/conversation/managing-conversation-groups/get-conversation-group-ids-by-conversation-id.mdx" }, { - "sourcePath": "/sdk/ios/message/creating-messages/create-image-message-by-url", - "openimPath": "/sdk/ios/message/creating-messages/create-image-message-by-url", - "title": "Create an image message from a URL", + "sourcePath": "/sdk/ios/conversation/managing-conversation-groups/update-conversation-group", + "openimPath": "/sdk/ios/conversation/managing-conversation-groups/update-conversation-group", + "title": "Open_im_sdkUpdateConversationGroup", "context": "chat/sdk/ios", "template": "guide", - "contentFile": "content/docs/chat/sdk/ios/message/creating-messages/create-image-message-by-url.mdx" + "contentFile": "content/docs/chat/sdk/ios/conversation/managing-conversation-groups/update-conversation-group.mdx" }, { - "sourcePath": "/sdk/ios/message/creating-messages/create-sound-message-from-full-path", - "openimPath": "/sdk/ios/message/creating-messages/create-sound-message-from-full-path", - "title": "Create an audio message from a path", + "sourcePath": "/sdk/ios/conversation/managing-conversation-groups/set-conversation-group-order", + "openimPath": "/sdk/ios/conversation/managing-conversation-groups/set-conversation-group-order", + "title": "Open_im_sdkSetConversationGroupOrder", "context": "chat/sdk/ios", "template": "guide", - "contentFile": "content/docs/chat/sdk/ios/message/creating-messages/create-sound-message-from-full-path.mdx" + "contentFile": "content/docs/chat/sdk/ios/conversation/managing-conversation-groups/set-conversation-group-order.mdx" }, { - "sourcePath": "/sdk/ios/message/creating-messages/create-sound-message-by-url", - "openimPath": "/sdk/ios/message/creating-messages/create-sound-message-by-url", - "title": "Create an audio message from a URL", + "sourcePath": "/sdk/ios/conversation/managing-conversation-groups/add-conversations-to-groups", + "openimPath": "/sdk/ios/conversation/managing-conversation-groups/add-conversations-to-groups", + "title": "Open_im_sdkAddConversationsToGroups", "context": "chat/sdk/ios", "template": "guide", - "contentFile": "content/docs/chat/sdk/ios/message/creating-messages/create-sound-message-by-url.mdx" + "contentFile": "content/docs/chat/sdk/ios/conversation/managing-conversation-groups/add-conversations-to-groups.mdx" }, { - "sourcePath": "/sdk/ios/message/creating-messages/create-video-message-from-full-path", - "openimPath": "/sdk/ios/message/creating-messages/create-video-message-from-full-path", - "title": "Create a video message from a path", + "sourcePath": "/sdk/ios/conversation/managing-conversation-groups/remove-conversations-from-groups", + "openimPath": "/sdk/ios/conversation/managing-conversation-groups/remove-conversations-from-groups", + "title": "Open_im_sdkRemoveConversationsFromGroups", "context": "chat/sdk/ios", "template": "guide", - "contentFile": "content/docs/chat/sdk/ios/message/creating-messages/create-video-message-from-full-path.mdx" + "contentFile": "content/docs/chat/sdk/ios/conversation/managing-conversation-groups/remove-conversations-from-groups.mdx" }, { - "sourcePath": "/sdk/ios/message/creating-messages/create-video-message-by-url", - "openimPath": "/sdk/ios/message/creating-messages/create-video-message-by-url", - "title": "Create a video message from a URL", + "sourcePath": "/sdk/ios/conversation/managing-conversation-groups/delete-conversation-group", + "openimPath": "/sdk/ios/conversation/managing-conversation-groups/delete-conversation-group", + "title": "Open_im_sdkDeleteConversationGroup", "context": "chat/sdk/ios", "template": "guide", - "contentFile": "content/docs/chat/sdk/ios/message/creating-messages/create-video-message-by-url.mdx" + "contentFile": "content/docs/chat/sdk/ios/conversation/managing-conversation-groups/delete-conversation-group.mdx" }, { - "sourcePath": "/sdk/ios/message/creating-messages/create-file-message-from-full-path", - "openimPath": "/sdk/ios/message/creating-messages/create-file-message-from-full-path", - "title": "Create a file message from a path", + "sourcePath": "/sdk/ios/group/overview-group", + "openimPath": "/sdk/ios/group/overview-group", + "title": "Group overview", "context": "chat/sdk/ios", "template": "guide", - "contentFile": "content/docs/chat/sdk/ios/message/creating-messages/create-file-message-from-full-path.mdx" + "contentFile": "content/docs/chat/sdk/ios/group/overview-group.mdx" }, { - "sourcePath": "/sdk/ios/message/creating-messages/create-file-message-by-url", - "openimPath": "/sdk/ios/message/creating-messages/create-file-message-by-url", - "title": "Create a file message from a URL", + "sourcePath": "/sdk/ios/group/create-group", + "openimPath": "/sdk/ios/group/create-group", + "title": "Create a group", "context": "chat/sdk/ios", "template": "guide", - "contentFile": "content/docs/chat/sdk/ios/message/creating-messages/create-file-message-by-url.mdx" + "contentFile": "content/docs/chat/sdk/ios/group/create-group.mdx" }, { - "sourcePath": "/sdk/ios/message/creating-messages/create-card-message", - "openimPath": "/sdk/ios/message/creating-messages/create-card-message", - "title": "Create a contact card message", + "sourcePath": "/sdk/ios/group/update-group-profile", + "openimPath": "/sdk/ios/group/update-group-profile", + "title": "Update group profile", "context": "chat/sdk/ios", - "template": "guide", - "contentFile": "content/docs/chat/sdk/ios/message/creating-messages/create-card-message.mdx" + "template": "overview", + "contentFile": "content/docs/chat/sdk/ios/group/update-group-profile.mdx" }, { - "sourcePath": "/sdk/ios/message/creating-messages/create-location-message", - "openimPath": "/sdk/ios/message/creating-messages/create-location-message", - "title": "Create a location message", + "sourcePath": "/sdk/ios/group/set-group-announcement", + "openimPath": "/sdk/ios/group/set-group-announcement", + "title": "Publish a group announcement", "context": "chat/sdk/ios", - "template": "guide", - "contentFile": "content/docs/chat/sdk/ios/message/creating-messages/create-location-message.mdx" + "template": "overview", + "contentFile": "content/docs/chat/sdk/ios/group/set-group-announcement.mdx" }, { - "sourcePath": "/sdk/ios/message/creating-messages/create-face-message", - "openimPath": "/sdk/ios/message/creating-messages/create-face-message", - "title": "Create an emoji message", + "sourcePath": "/sdk/ios/group/set-group-extension", + "openimPath": "/sdk/ios/group/set-group-extension", + "title": "Set group extra data", "context": "chat/sdk/ios", - "template": "guide", - "contentFile": "content/docs/chat/sdk/ios/message/creating-messages/create-face-message.mdx" + "template": "overview", + "contentFile": "content/docs/chat/sdk/ios/group/set-group-extension.mdx" }, { - "sourcePath": "/sdk/ios/message/creating-messages/create-quote-message", - "openimPath": "/sdk/ios/message/creating-messages/create-quote-message", - "title": "Create a reply message", + "sourcePath": "/sdk/ios/group/set-group-join-verification", + "openimPath": "/sdk/ios/group/set-group-join-verification", + "title": "Set group join verification", "context": "chat/sdk/ios", - "template": "guide", - "contentFile": "content/docs/chat/sdk/ios/message/creating-messages/create-quote-message.mdx" + "template": "overview", + "contentFile": "content/docs/chat/sdk/ios/group/set-group-join-verification.mdx" }, { - "sourcePath": "/sdk/ios/message/creating-messages/create-advanced-text-message", - "openimPath": "/sdk/ios/message/creating-messages/create-advanced-text-message", - "title": "Create rich text", + "sourcePath": "/sdk/ios/group/set-group-member-profile-access", + "openimPath": "/sdk/ios/group/set-group-member-profile-access", + "title": "Set member profile access", "context": "chat/sdk/ios", - "template": "guide", - "contentFile": "content/docs/chat/sdk/ios/message/creating-messages/create-advanced-text-message.mdx" + "template": "overview", + "contentFile": "content/docs/chat/sdk/ios/group/set-group-member-profile-access.mdx" }, { - "sourcePath": "/sdk/ios/message/creating-messages/create-markdown-message", - "openimPath": "/sdk/ios/message/creating-messages/create-markdown-message", - "title": "Create a Markdown message", + "sourcePath": "/sdk/ios/group/set-group-member-friend-permission", + "openimPath": "/sdk/ios/group/set-group-member-friend-permission", + "title": "Set member friend request permission", "context": "chat/sdk/ios", - "template": "guide", - "contentFile": "content/docs/chat/sdk/ios/message/creating-messages/create-markdown-message.mdx" + "template": "overview", + "contentFile": "content/docs/chat/sdk/ios/group/set-group-member-friend-permission.mdx" }, { - "sourcePath": "/sdk/ios/message/creating-messages/create-forward-message", - "openimPath": "/sdk/ios/message/creating-messages/create-forward-message", - "title": "Create a forwarded message", + "sourcePath": "/sdk/ios/group/change-group-mute", + "openimPath": "/sdk/ios/group/change-group-mute", + "title": "Change group mute status", "context": "chat/sdk/ios", "template": "guide", - "contentFile": "content/docs/chat/sdk/ios/message/creating-messages/create-forward-message.mdx" + "contentFile": "content/docs/chat/sdk/ios/group/change-group-mute.mdx" }, { - "sourcePath": "/sdk/ios/message/creating-messages/create-merge-message", - "openimPath": "/sdk/ios/message/creating-messages/create-merge-message", - "title": "Create a merged message", + "sourcePath": "/sdk/ios/group/join-group", + "openimPath": "/sdk/ios/group/join-group", + "title": "Apply to join a group", "context": "chat/sdk/ios", "template": "guide", - "contentFile": "content/docs/chat/sdk/ios/message/creating-messages/create-merge-message.mdx" + "contentFile": "content/docs/chat/sdk/ios/group/join-group.mdx" }, { - "sourcePath": "/sdk/ios/message/sending-messages/send-message", - "openimPath": "/sdk/ios/message/sending-messages/send-message", - "title": "Send a message", + "sourcePath": "/sdk/ios/group/quit-group", + "openimPath": "/sdk/ios/group/quit-group", + "title": "Leave a group", "context": "chat/sdk/ios", "template": "guide", - "contentFile": "content/docs/chat/sdk/ios/message/sending-messages/send-message.mdx" + "contentFile": "content/docs/chat/sdk/ios/group/quit-group.mdx" }, { - "sourcePath": "/sdk/ios/message/sending-messages/send-message-not-oss", - "openimPath": "/sdk/ios/message/sending-messages/send-message-not-oss", - "title": "Send a message without OSS", + "sourcePath": "/sdk/ios/group/dismiss-group", + "openimPath": "/sdk/ios/group/dismiss-group", + "title": "Dismiss a group", "context": "chat/sdk/ios", "template": "guide", - "contentFile": "content/docs/chat/sdk/ios/message/sending-messages/send-message-not-oss.mdx" + "contentFile": "content/docs/chat/sdk/ios/group/dismiss-group.mdx" }, { - "sourcePath": "/sdk/ios/message/receiving-messages/receive-messages", - "openimPath": "/sdk/ios/message/receiving-messages/receive-messages", - "title": "Receive messages", + "sourcePath": "/sdk/ios/group/retrieving-groups/get-specified-groups-info", + "openimPath": "/sdk/ios/group/retrieving-groups/get-specified-groups-info", + "title": "Get group information", "context": "chat/sdk/ios", "template": "guide", - "contentFile": "content/docs/chat/sdk/ios/message/receiving-messages/receive-messages.mdx" + "contentFile": "content/docs/chat/sdk/ios/group/retrieving-groups/get-specified-groups-info.mdx" }, { - "sourcePath": "/sdk/ios/message/receiving-messages/custom-business-listener", - "openimPath": "/sdk/ios/message/receiving-messages/custom-business-listener", - "title": "Receive custom business messages", + "sourcePath": "/sdk/ios/group/retrieving-groups/get-joined-group-list", + "openimPath": "/sdk/ios/group/retrieving-groups/get-joined-group-list", + "title": "Get joined groups", "context": "chat/sdk/ios", "template": "guide", - "contentFile": "content/docs/chat/sdk/ios/message/receiving-messages/custom-business-listener.mdx" + "contentFile": "content/docs/chat/sdk/ios/group/retrieving-groups/get-joined-group-list.mdx" }, { - "sourcePath": "/sdk/ios/message/retrieving-messages/load-older-messages", - "openimPath": "/sdk/ios/message/retrieving-messages/load-older-messages", - "title": "Load older messages", + "sourcePath": "/sdk/ios/group/retrieving-groups/get-joined-group-list-page", + "openimPath": "/sdk/ios/group/retrieving-groups/get-joined-group-list-page", + "title": "Get joined groups by page", "context": "chat/sdk/ios", "template": "guide", - "contentFile": "content/docs/chat/sdk/ios/message/retrieving-messages/load-older-messages.mdx" + "contentFile": "content/docs/chat/sdk/ios/group/retrieving-groups/get-joined-group-list-page.mdx" }, { - "sourcePath": "/sdk/ios/message/retrieving-messages/load-newer-messages", - "openimPath": "/sdk/ios/message/retrieving-messages/load-newer-messages", - "title": "Load newer messages", + "sourcePath": "/sdk/ios/group/retrieving-groups/is-join-group", + "openimPath": "/sdk/ios/group/retrieving-groups/is-join-group", + "title": "Check group membership", "context": "chat/sdk/ios", "template": "guide", - "contentFile": "content/docs/chat/sdk/ios/message/retrieving-messages/load-newer-messages.mdx" + "contentFile": "content/docs/chat/sdk/ios/group/retrieving-groups/is-join-group.mdx" }, { - "sourcePath": "/sdk/ios/message/retrieving-messages/find-messages-by-id", - "openimPath": "/sdk/ios/message/retrieving-messages/find-messages-by-id", - "title": "Find messages by ID", + "sourcePath": "/sdk/ios/group/retrieving-groups/search-groups", + "openimPath": "/sdk/ios/group/retrieving-groups/search-groups", + "title": "Search groups", "context": "chat/sdk/ios", "template": "guide", - "contentFile": "content/docs/chat/sdk/ios/message/retrieving-messages/find-messages-by-id.mdx" + "contentFile": "content/docs/chat/sdk/ios/group/retrieving-groups/search-groups.mdx" }, { - "sourcePath": "/sdk/ios/message/retrieving-messages/load-message-context", - "openimPath": "/sdk/ios/message/retrieving-messages/load-message-context", - "title": "Load message context", + "sourcePath": "/sdk/ios/group/group-applications/overview-group-applications", + "openimPath": "/sdk/ios/group/group-applications/overview-group-applications", + "title": "Group applications overview", "context": "chat/sdk/ios", "template": "guide", - "contentFile": "content/docs/chat/sdk/ios/message/retrieving-messages/load-message-context.mdx" + "contentFile": "content/docs/chat/sdk/ios/group/group-applications/overview-group-applications.mdx" }, { - "sourcePath": "/sdk/ios/message/searching-messages/search-messages", - "openimPath": "/sdk/ios/message/searching-messages/search-messages", - "title": "Search messages", + "sourcePath": "/sdk/ios/group/group-applications/get-group-application-list-as-recipient", + "openimPath": "/sdk/ios/group/group-applications/get-group-application-list-as-recipient", + "title": "Get received group applications", "context": "chat/sdk/ios", "template": "guide", - "contentFile": "content/docs/chat/sdk/ios/message/searching-messages/search-messages.mdx" + "contentFile": "content/docs/chat/sdk/ios/group/group-applications/get-group-application-list-as-recipient.mdx" }, { - "sourcePath": "/sdk/ios/message/composing-messages/update-typing-status", - "openimPath": "/sdk/ios/message/composing-messages/update-typing-status", - "title": "Update typing status", + "sourcePath": "/sdk/ios/group/group-applications/get-group-application-list-as-applicant", + "openimPath": "/sdk/ios/group/group-applications/get-group-application-list-as-applicant", + "title": "Get sent group applications", "context": "chat/sdk/ios", "template": "guide", - "contentFile": "content/docs/chat/sdk/ios/message/composing-messages/update-typing-status.mdx" + "contentFile": "content/docs/chat/sdk/ios/group/group-applications/get-group-application-list-as-applicant.mdx" }, { - "sourcePath": "/sdk/ios/message/composing-messages/get-typing-status", - "openimPath": "/sdk/ios/message/composing-messages/get-typing-status", - "title": "Get typing status", + "sourcePath": "/sdk/ios/group/group-applications/get-group-application-unhandled-count", + "openimPath": "/sdk/ios/group/group-applications/get-group-application-unhandled-count", + "title": "Get pending group application count", "context": "chat/sdk/ios", "template": "guide", - "contentFile": "content/docs/chat/sdk/ios/message/composing-messages/get-typing-status.mdx" + "contentFile": "content/docs/chat/sdk/ios/group/group-applications/get-group-application-unhandled-count.mdx" }, { - "sourcePath": "/sdk/ios/message/composing-messages/check-speech-to-text", - "openimPath": "/sdk/ios/message/composing-messages/check-speech-to-text", - "title": "Check speech recognition support", + "sourcePath": "/sdk/ios/group/group-applications/accept-group-application", + "openimPath": "/sdk/ios/group/group-applications/accept-group-application", + "title": "Accept a group application", "context": "chat/sdk/ios", "template": "guide", - "contentFile": "content/docs/chat/sdk/ios/message/composing-messages/check-speech-to-text.mdx" + "contentFile": "content/docs/chat/sdk/ios/group/group-applications/accept-group-application.mdx" }, { - "sourcePath": "/sdk/ios/message/composing-messages/transcribe-audio", - "openimPath": "/sdk/ios/message/composing-messages/transcribe-audio", - "title": "Transcribe audio", + "sourcePath": "/sdk/ios/group/group-applications/refuse-group-application", + "openimPath": "/sdk/ios/group/group-applications/refuse-group-application", + "title": "Reject a group application", "context": "chat/sdk/ios", "template": "guide", - "contentFile": "content/docs/chat/sdk/ios/message/composing-messages/transcribe-audio.mdx" + "contentFile": "content/docs/chat/sdk/ios/group/group-applications/refuse-group-application.mdx" }, { - "sourcePath": "/sdk/ios/message/composing-messages/save-local-transcript", - "openimPath": "/sdk/ios/message/composing-messages/save-local-transcript", - "title": "Save a local transcript", + "sourcePath": "/sdk/ios/group/group-applications/delete-group-requests", + "openimPath": "/sdk/ios/group/group-applications/delete-group-requests", + "title": "Delete group applications", "context": "chat/sdk/ios", "template": "guide", - "contentFile": "content/docs/chat/sdk/ios/message/composing-messages/save-local-transcript.mdx" + "contentFile": "content/docs/chat/sdk/ios/group/group-applications/delete-group-requests.mdx" }, { - "sourcePath": "/sdk/ios/message/managing-messages/delete-local-message", - "openimPath": "/sdk/ios/message/managing-messages/delete-local-message", - "title": "Delete a local message", + "sourcePath": "/sdk/ios/group/retrieving-group-members/overview-retrieving-group-members", + "openimPath": "/sdk/ios/group/retrieving-group-members/overview-retrieving-group-members", + "title": "Group member queries overview", "context": "chat/sdk/ios", "template": "guide", - "contentFile": "content/docs/chat/sdk/ios/message/managing-messages/delete-local-message.mdx" + "contentFile": "content/docs/chat/sdk/ios/group/retrieving-group-members/overview-retrieving-group-members.mdx" }, { - "sourcePath": "/sdk/ios/message/managing-messages/delete-saved-message", - "openimPath": "/sdk/ios/message/managing-messages/delete-saved-message", - "title": "Delete a saved message", + "sourcePath": "/sdk/ios/group/retrieving-group-members/get-group-member-list", + "openimPath": "/sdk/ios/group/retrieving-group-members/get-group-member-list", + "title": "Get group members", "context": "chat/sdk/ios", "template": "guide", - "contentFile": "content/docs/chat/sdk/ios/message/managing-messages/delete-saved-message.mdx" + "contentFile": "content/docs/chat/sdk/ios/group/retrieving-group-members/get-group-member-list.mdx" }, { - "sourcePath": "/sdk/ios/message/managing-messages/delete-saved-messages", - "openimPath": "/sdk/ios/message/managing-messages/delete-saved-messages", - "title": "Delete saved messages", + "sourcePath": "/sdk/ios/group/retrieving-group-members/get-specified-group-members-info", + "openimPath": "/sdk/ios/group/retrieving-group-members/get-specified-group-members-info", + "title": "Get group member profiles", "context": "chat/sdk/ios", "template": "guide", - "contentFile": "content/docs/chat/sdk/ios/message/managing-messages/delete-saved-messages.mdx" + "contentFile": "content/docs/chat/sdk/ios/group/retrieving-group-members/get-specified-group-members-info.mdx" }, { - "sourcePath": "/sdk/ios/message/managing-messages/delete-user-messages", - "openimPath": "/sdk/ios/message/managing-messages/delete-user-messages", - "title": "Delete messages from a user", + "sourcePath": "/sdk/ios/group/retrieving-group-members/get-users-in-group", + "openimPath": "/sdk/ios/group/retrieving-group-members/get-users-in-group", + "title": "Check users in a group", "context": "chat/sdk/ios", "template": "guide", - "contentFile": "content/docs/chat/sdk/ios/message/managing-messages/delete-user-messages.mdx" + "contentFile": "content/docs/chat/sdk/ios/group/retrieving-group-members/get-users-in-group.mdx" }, { - "sourcePath": "/sdk/ios/message/managing-messages/revoke-a-message", - "openimPath": "/sdk/ios/message/managing-messages/revoke-a-message", - "title": "Revoke a message", + "sourcePath": "/sdk/ios/group/retrieving-group-members/get-group-member-owner-and-admin", + "openimPath": "/sdk/ios/group/retrieving-group-members/get-group-member-owner-and-admin", + "title": "Get group owners and admins", "context": "chat/sdk/ios", "template": "guide", - "contentFile": "content/docs/chat/sdk/ios/message/managing-messages/revoke-a-message.mdx" + "contentFile": "content/docs/chat/sdk/ios/group/retrieving-group-members/get-group-member-owner-and-admin.mdx" }, { - "sourcePath": "/sdk/ios/message/managing-messages/modify-a-message", - "openimPath": "/sdk/ios/message/managing-messages/modify-a-message", - "title": "Modify a message", + "sourcePath": "/sdk/ios/group/retrieving-group-members/search-group-members", + "openimPath": "/sdk/ios/group/retrieving-group-members/search-group-members", + "title": "Search group members", "context": "chat/sdk/ios", "template": "guide", - "contentFile": "content/docs/chat/sdk/ios/message/managing-messages/modify-a-message.mdx" + "contentFile": "content/docs/chat/sdk/ios/group/retrieving-group-members/search-group-members.mdx" }, { - "sourcePath": "/sdk/ios/message/managing-messages/get-pinned-messages", - "openimPath": "/sdk/ios/message/managing-messages/get-pinned-messages", - "title": "View pinned messages", + "sourcePath": "/sdk/ios/group/managing-group-members/invite-user-to-group", + "openimPath": "/sdk/ios/group/managing-group-members/invite-user-to-group", + "title": "Invite users to a group", "context": "chat/sdk/ios", "template": "guide", - "contentFile": "content/docs/chat/sdk/ios/message/managing-messages/get-pinned-messages.mdx" + "contentFile": "content/docs/chat/sdk/ios/group/managing-group-members/invite-user-to-group.mdx" }, { - "sourcePath": "/sdk/ios/message/managing-messages/set-message-pinned", - "openimPath": "/sdk/ios/message/managing-messages/set-message-pinned", - "title": "Pin or unpin a message", + "sourcePath": "/sdk/ios/group/managing-group-members/kick-group-member", + "openimPath": "/sdk/ios/group/managing-group-members/kick-group-member", + "title": "Remove group members", "context": "chat/sdk/ios", "template": "guide", - "contentFile": "content/docs/chat/sdk/ios/message/managing-messages/set-message-pinned.mdx" + "contentFile": "content/docs/chat/sdk/ios/group/managing-group-members/kick-group-member.mdx" }, { - "sourcePath": "/sdk/ios/message/managing-messages/insert-local-single-message", - "openimPath": "/sdk/ios/message/managing-messages/insert-local-single-message", - "title": "Insert a local direct message", + "sourcePath": "/sdk/ios/group/managing-group-members/set-group-member-nickname", + "openimPath": "/sdk/ios/group/managing-group-members/set-group-member-nickname", + "title": "Update a group nickname", "context": "chat/sdk/ios", "template": "guide", - "contentFile": "content/docs/chat/sdk/ios/message/managing-messages/insert-local-single-message.mdx" + "contentFile": "content/docs/chat/sdk/ios/group/managing-group-members/set-group-member-nickname.mdx" }, { - "sourcePath": "/sdk/ios/message/managing-messages/insert-local-group-message", - "openimPath": "/sdk/ios/message/managing-messages/insert-local-group-message", - "title": "Insert a local group message", + "sourcePath": "/sdk/ios/group/managing-group-members/set-group-member-role-level", + "openimPath": "/sdk/ios/group/managing-group-members/set-group-member-role-level", + "title": "Manage group administrators", "context": "chat/sdk/ios", "template": "guide", - "contentFile": "content/docs/chat/sdk/ios/message/managing-messages/insert-local-group-message.mdx" + "contentFile": "content/docs/chat/sdk/ios/group/managing-group-members/set-group-member-role-level.mdx" }, { - "sourcePath": "/sdk/ios/message/managing-messages/clear-all-local-messages", - "openimPath": "/sdk/ios/message/managing-messages/clear-all-local-messages", - "title": "Clear all local messages", + "sourcePath": "/sdk/ios/group/managing-group-members/set-group-member-avatar", + "openimPath": "/sdk/ios/group/managing-group-members/set-group-member-avatar", + "title": "Update a group member avatar", "context": "chat/sdk/ios", - "template": "guide", - "contentFile": "content/docs/chat/sdk/ios/message/managing-messages/clear-all-local-messages.mdx" + "template": "overview", + "contentFile": "content/docs/chat/sdk/ios/group/managing-group-members/set-group-member-avatar.mdx" }, { - "sourcePath": "/sdk/ios/message/managing-messages/clear-all-messages", - "openimPath": "/sdk/ios/message/managing-messages/clear-all-messages", - "title": "Clear all saved messages", + "sourcePath": "/sdk/ios/group/managing-group-members/set-group-member-extension", + "openimPath": "/sdk/ios/group/managing-group-members/set-group-member-extension", + "title": "Set group member extra data", "context": "chat/sdk/ios", - "template": "guide", - "contentFile": "content/docs/chat/sdk/ios/message/managing-messages/clear-all-messages.mdx" + "template": "overview", + "contentFile": "content/docs/chat/sdk/ios/group/managing-group-members/set-group-member-extension.mdx" }, { - "sourcePath": "/sdk/ios/message/managing-messages/set-message-local-ex", - "openimPath": "/sdk/ios/message/managing-messages/set-message-local-ex", - "title": "Set local message extensions", + "sourcePath": "/sdk/ios/group/managing-group-members/transfer-group-owner", + "openimPath": "/sdk/ios/group/managing-group-members/transfer-group-owner", + "title": "Transfer group owner", "context": "chat/sdk/ios", "template": "guide", - "contentFile": "content/docs/chat/sdk/ios/message/managing-messages/set-message-local-ex.mdx" + "contentFile": "content/docs/chat/sdk/ios/group/managing-group-members/transfer-group-owner.mdx" }, { - "sourcePath": "/sdk/ios/message/managing-read-status/get-group-message-readers", - "openimPath": "/sdk/ios/message/managing-read-status/get-group-message-readers", - "title": "View group message readers", + "sourcePath": "/sdk/ios/group/managing-group-members/change-group-member-mute", + "openimPath": "/sdk/ios/group/managing-group-members/change-group-member-mute", + "title": "Mute or unmute a group member", "context": "chat/sdk/ios", "template": "guide", - "contentFile": "content/docs/chat/sdk/ios/message/managing-read-status/get-group-message-readers.mdx" + "contentFile": "content/docs/chat/sdk/ios/group/managing-group-members/change-group-member-mute.mdx" }, { - "sourcePath": "/sdk/ios/message/managing-read-status/send-group-read-receipts", - "openimPath": "/sdk/ios/message/managing-read-status/send-group-read-receipts", - "title": "Send group read receipts", + "sourcePath": "/sdk/ios/message/overview-message", + "openimPath": "/sdk/ios/message/overview-message", + "title": "Overview", "context": "chat/sdk/ios", "template": "guide", - "contentFile": "content/docs/chat/sdk/ios/message/managing-read-status/send-group-read-receipts.mdx" + "contentFile": "content/docs/chat/sdk/ios/message/overview-message.mdx" }, { - "sourcePath": "/sdk/ios/file-uploads/upload-file", - "openimPath": "/sdk/ios/file-uploads/upload-file", - "title": "Upload a file", + "sourcePath": "/sdk/ios/message/creating-messages/create-text-message", + "openimPath": "/sdk/ios/message/creating-messages/create-text-message", + "title": "Create a text message", "context": "chat/sdk/ios", "template": "guide", - "contentFile": "content/docs/chat/sdk/ios/file-uploads/upload-file.mdx" + "contentFile": "content/docs/chat/sdk/ios/message/creating-messages/create-text-message.mdx" }, { - "sourcePath": "/sdk/ios/calling/overview-calling", - "openimPath": "/sdk/ios/calling/overview-calling", - "title": "Calling overview", + "sourcePath": "/sdk/ios/message/creating-messages/create-text-at-message", + "openimPath": "/sdk/ios/message/creating-messages/create-text-at-message", + "title": "Create a mention message", "context": "chat/sdk/ios", "template": "guide", - "contentFile": "content/docs/chat/sdk/ios/calling/overview-calling.mdx" + "contentFile": "content/docs/chat/sdk/ios/message/creating-messages/create-text-at-message.mdx" }, { - "sourcePath": "/sdk/ios/calling/managing-calls/start-single-call", - "openimPath": "/sdk/ios/calling/managing-calls/start-single-call", - "title": "Start a one-to-one call", + "sourcePath": "/sdk/ios/message/creating-messages/create-text-at-all-message", + "openimPath": "/sdk/ios/message/creating-messages/create-text-at-all-message", + "title": "Create an @all message", "context": "chat/sdk/ios", "template": "guide", - "contentFile": "content/docs/chat/sdk/ios/calling/managing-calls/start-single-call.mdx" + "contentFile": "content/docs/chat/sdk/ios/message/creating-messages/create-text-at-all-message.mdx" }, { - "sourcePath": "/sdk/ios/calling/managing-calls/start-group-call", - "openimPath": "/sdk/ios/calling/managing-calls/start-group-call", - "title": "Start a group call", + "sourcePath": "/sdk/ios/message/creating-messages/create-at-all-flag", + "openimPath": "/sdk/ios/message/creating-messages/create-at-all-flag", + "title": "Create an @all marker", "context": "chat/sdk/ios", "template": "guide", - "contentFile": "content/docs/chat/sdk/ios/calling/managing-calls/start-group-call.mdx" + "contentFile": "content/docs/chat/sdk/ios/message/creating-messages/create-at-all-flag.mdx" }, { - "sourcePath": "/sdk/ios/calling/managing-calls/accept-call", - "openimPath": "/sdk/ios/calling/managing-calls/accept-call", - "title": "Accept a call", + "sourcePath": "/sdk/ios/message/creating-messages/get-at-all-tag", + "openimPath": "/sdk/ios/message/creating-messages/get-at-all-tag", + "title": "Get the @all tag", "context": "chat/sdk/ios", "template": "guide", - "contentFile": "content/docs/chat/sdk/ios/calling/managing-calls/accept-call.mdx" + "contentFile": "content/docs/chat/sdk/ios/message/creating-messages/get-at-all-tag.mdx" }, { - "sourcePath": "/sdk/ios/calling/managing-calls/reject-call", - "openimPath": "/sdk/ios/calling/managing-calls/reject-call", - "title": "Reject a call", + "sourcePath": "/sdk/ios/message/creating-messages/create-custom-message", + "openimPath": "/sdk/ios/message/creating-messages/create-custom-message", + "title": "Create a custom message", "context": "chat/sdk/ios", "template": "guide", - "contentFile": "content/docs/chat/sdk/ios/calling/managing-calls/reject-call.mdx" + "contentFile": "content/docs/chat/sdk/ios/message/creating-messages/create-custom-message.mdx" }, { - "sourcePath": "/sdk/ios/calling/managing-calls/cancel-call", - "openimPath": "/sdk/ios/calling/managing-calls/cancel-call", - "title": "Cancel a call invitation", + "sourcePath": "/sdk/ios/message/creating-messages/create-image-message-from-full-path", + "openimPath": "/sdk/ios/message/creating-messages/create-image-message-from-full-path", + "title": "Create an image message from a path", "context": "chat/sdk/ios", "template": "guide", - "contentFile": "content/docs/chat/sdk/ios/calling/managing-calls/cancel-call.mdx" + "contentFile": "content/docs/chat/sdk/ios/message/creating-messages/create-image-message-from-full-path.mdx" }, { - "sourcePath": "/sdk/ios/calling/managing-calls/hang-up-call", - "openimPath": "/sdk/ios/calling/managing-calls/hang-up-call", - "title": "Hang up a call", + "sourcePath": "/sdk/ios/message/creating-messages/create-image-message-by-url", + "openimPath": "/sdk/ios/message/creating-messages/create-image-message-by-url", + "title": "Create an image message from a URL", "context": "chat/sdk/ios", "template": "guide", - "contentFile": "content/docs/chat/sdk/ios/calling/managing-calls/hang-up-call.mdx" + "contentFile": "content/docs/chat/sdk/ios/message/creating-messages/create-image-message-by-url.mdx" }, { - "sourcePath": "/sdk/ios/calling/managing-calls/handle-call-events", - "openimPath": "/sdk/ios/calling/managing-calls/handle-call-events", - "title": "Handle call events", + "sourcePath": "/sdk/ios/message/creating-messages/create-sound-message-from-full-path", + "openimPath": "/sdk/ios/message/creating-messages/create-sound-message-from-full-path", + "title": "Create an audio message from a path", "context": "chat/sdk/ios", "template": "guide", - "contentFile": "content/docs/chat/sdk/ios/calling/managing-calls/handle-call-events.mdx" + "contentFile": "content/docs/chat/sdk/ios/message/creating-messages/create-sound-message-from-full-path.mdx" }, { - "sourcePath": "/sdk/ios/calling/retrieving-call-information/restore-pending-invitation", - "openimPath": "/sdk/ios/calling/retrieving-call-information/restore-pending-invitation", - "title": "Restore a pending invitation", + "sourcePath": "/sdk/ios/message/creating-messages/create-sound-message-by-url", + "openimPath": "/sdk/ios/message/creating-messages/create-sound-message-by-url", + "title": "Create an audio message from a URL", "context": "chat/sdk/ios", "template": "guide", - "contentFile": "content/docs/chat/sdk/ios/calling/retrieving-call-information/restore-pending-invitation.mdx" + "contentFile": "content/docs/chat/sdk/ios/message/creating-messages/create-sound-message-by-url.mdx" }, { - "sourcePath": "/sdk/ios/calling/retrieving-call-information/get-room-by-group-id", - "openimPath": "/sdk/ios/calling/retrieving-call-information/get-room-by-group-id", - "title": "Get a group call room", + "sourcePath": "/sdk/ios/message/creating-messages/create-video-message-from-full-path", + "openimPath": "/sdk/ios/message/creating-messages/create-video-message-from-full-path", + "title": "Create a video message from a path", "context": "chat/sdk/ios", "template": "guide", - "contentFile": "content/docs/chat/sdk/ios/calling/retrieving-call-information/get-room-by-group-id.mdx" + "contentFile": "content/docs/chat/sdk/ios/message/creating-messages/create-video-message-from-full-path.mdx" }, { - "sourcePath": "/sdk/ios/calling/retrieving-call-information/get-token-by-room-id", - "openimPath": "/sdk/ios/calling/retrieving-call-information/get-token-by-room-id", - "title": "Get room credentials", + "sourcePath": "/sdk/ios/message/creating-messages/create-video-message-by-url", + "openimPath": "/sdk/ios/message/creating-messages/create-video-message-by-url", + "title": "Create a video message from a URL", "context": "chat/sdk/ios", "template": "guide", - "contentFile": "content/docs/chat/sdk/ios/calling/retrieving-call-information/get-token-by-room-id.mdx" + "contentFile": "content/docs/chat/sdk/ios/message/creating-messages/create-video-message-by-url.mdx" }, { - "sourcePath": "/sdk/ios/calling/sending-custom-signals/send-a-custom-signal", - "openimPath": "/sdk/ios/calling/sending-custom-signals/send-a-custom-signal", - "title": "Send a custom signal", + "sourcePath": "/sdk/ios/message/creating-messages/create-file-message-from-full-path", + "openimPath": "/sdk/ios/message/creating-messages/create-file-message-from-full-path", + "title": "Create a file message from a path", "context": "chat/sdk/ios", "template": "guide", - "contentFile": "content/docs/chat/sdk/ios/calling/sending-custom-signals/send-a-custom-signal.mdx" + "contentFile": "content/docs/chat/sdk/ios/message/creating-messages/create-file-message-from-full-path.mdx" }, { - "sourcePath": "/sdk/ios/events/overview-events", - "openimPath": "/sdk/ios/events/overview-events", - "title": "Events overview", + "sourcePath": "/sdk/ios/message/creating-messages/create-file-message-by-url", + "openimPath": "/sdk/ios/message/creating-messages/create-file-message-by-url", + "title": "Create a file message from a URL", "context": "chat/sdk/ios", "template": "guide", - "contentFile": "content/docs/chat/sdk/ios/events/overview-events.mdx" + "contentFile": "content/docs/chat/sdk/ios/message/creating-messages/create-file-message-by-url.mdx" }, { - "sourcePath": "/sdk/ios/logger", - "openimPath": "/sdk/ios/logger", - "title": "Logger", + "sourcePath": "/sdk/ios/message/creating-messages/create-card-message", + "openimPath": "/sdk/ios/message/creating-messages/create-card-message", + "title": "Create a contact card message", "context": "chat/sdk/ios", "template": "guide", - "contentFile": "content/docs/chat/sdk/ios/logger.mdx" + "contentFile": "content/docs/chat/sdk/ios/message/creating-messages/create-card-message.mdx" }, { - "sourcePath": "/sdk/android/channel/moderating-a-channel/freeze-and-unfreeze-a-channel", - "openimPath": "/sdk/android/channel/moderating-a-channel/freeze-and-unfreeze-a-channel", - "title": "Freeze and unfreeze a channel", - "context": "chat/sdk/android", + "sourcePath": "/sdk/ios/message/creating-messages/create-location-message", + "openimPath": "/sdk/ios/message/creating-messages/create-location-message", + "title": "Create a location message", + "context": "chat/sdk/ios", "template": "guide", - "contentFile": "content/docs/chat/sdk/android/channel/moderating-a-channel/freeze-and-unfreeze-a-channel.mdx" + "contentFile": "content/docs/chat/sdk/ios/message/creating-messages/create-location-message.mdx" }, { - "sourcePath": "/sdk/android/channel/overview-channel", - "openimPath": "/sdk/android/channel/overview-channel", - "title": "Overview", - "context": "chat/sdk/android", + "sourcePath": "/sdk/ios/message/creating-messages/create-face-message", + "openimPath": "/sdk/ios/message/creating-messages/create-face-message", + "title": "Create an emoji message", + "context": "chat/sdk/ios", "template": "guide", - "contentFile": "content/docs/chat/sdk/android/channel/overview-channel.mdx" + "contentFile": "content/docs/chat/sdk/ios/message/creating-messages/create-face-message.mdx" }, { - "sourcePath": "/sdk/android/getting-started/send-first-message", - "openimPath": "/sdk/android/getting-started/send-first-message", - "title": "Send your first message", - "context": "chat/sdk/android", + "sourcePath": "/sdk/ios/message/creating-messages/create-quote-message", + "openimPath": "/sdk/ios/message/creating-messages/create-quote-message", + "title": "Create a reply message", + "context": "chat/sdk/ios", "template": "guide", - "contentFile": "content/docs/chat/sdk/android/getting-started/send-first-message.mdx" + "contentFile": "content/docs/chat/sdk/ios/message/creating-messages/create-quote-message.mdx" }, { - "sourcePath": "/sdk/android/message/adding-extra-data-to-a-message/add-extra-data-to-a-message", - "openimPath": "/sdk/android/message/adding-extra-data-to-a-message/add-extra-data-to-a-message", - "title": "Add extra data to a message", - "context": "chat/sdk/android", + "sourcePath": "/sdk/ios/message/creating-messages/create-advanced-text-message", + "openimPath": "/sdk/ios/message/creating-messages/create-advanced-text-message", + "title": "Create rich text", + "context": "chat/sdk/ios", "template": "guide", - "contentFile": "content/docs/chat/sdk/android/message/adding-extra-data-to-a-message/add-extra-data-to-a-message.mdx" + "contentFile": "content/docs/chat/sdk/ios/message/creating-messages/create-advanced-text-message.mdx" }, { - "sourcePath": "/sdk/android/message/managing-a-message/generate-thumbnails-of-a-file-message", - "openimPath": "/sdk/android/message/managing-a-message/generate-thumbnails-of-a-file-message", - "title": "Generate thumbnails of a file message", - "context": "chat/sdk/android", + "sourcePath": "/sdk/ios/message/creating-messages/create-markdown-message", + "openimPath": "/sdk/ios/message/creating-messages/create-markdown-message", + "title": "Create a Markdown message", + "context": "chat/sdk/ios", "template": "guide", - "contentFile": "content/docs/chat/sdk/android/message/managing-a-message/generate-thumbnails-of-a-file-message.mdx" + "contentFile": "content/docs/chat/sdk/ios/message/creating-messages/create-markdown-message.mdx" }, { - "sourcePath": "/sdk/android/message/managing-a-message/react-to-a-message-in-a-group-channel", - "openimPath": "/sdk/android/message/managing-a-message/react-to-a-message-in-a-group-channel", - "title": "React to a message in a group channel", - "context": "chat/sdk/android", + "sourcePath": "/sdk/ios/message/creating-messages/create-forward-message", + "openimPath": "/sdk/ios/message/creating-messages/create-forward-message", + "title": "Create a forwarded message", + "context": "chat/sdk/ios", "template": "guide", - "contentFile": "content/docs/chat/sdk/android/message/managing-a-message/react-to-a-message-in-a-group-channel.mdx" + "contentFile": "content/docs/chat/sdk/ios/message/creating-messages/create-forward-message.mdx" }, { - "sourcePath": "/sdk/android/message/managing-a-message/send-typing-indicators-to-other-members", - "openimPath": "/sdk/android/message/managing-a-message/send-typing-indicators-to-other-members", - "title": "Send typing indicators to other members", - "context": "chat/sdk/android", + "sourcePath": "/sdk/ios/message/creating-messages/create-merge-message", + "openimPath": "/sdk/ios/message/creating-messages/create-merge-message", + "title": "Create a merged message", + "context": "chat/sdk/ios", "template": "guide", - "contentFile": "content/docs/chat/sdk/android/message/managing-a-message/send-typing-indicators-to-other-members.mdx" + "contentFile": "content/docs/chat/sdk/ios/message/creating-messages/create-merge-message.mdx" }, { - "sourcePath": "/sdk/android/message/managing-pinned-messages-in-group-channels/pin-a-message", - "openimPath": "/sdk/android/message/managing-pinned-messages-in-group-channels/pin-a-message", - "title": "Pin a message", - "context": "chat/sdk/android", + "sourcePath": "/sdk/ios/message/sending-messages/send-message", + "openimPath": "/sdk/ios/message/sending-messages/send-message", + "title": "Send a message", + "context": "chat/sdk/ios", "template": "guide", - "contentFile": "content/docs/chat/sdk/android/message/managing-pinned-messages-in-group-channels/pin-a-message.mdx" + "contentFile": "content/docs/chat/sdk/ios/message/sending-messages/send-message.mdx" }, { - "sourcePath": "/sdk/android/message/managing-polls/create-a-poll", - "openimPath": "/sdk/android/message/managing-polls/create-a-poll", - "title": "Create a poll", - "context": "chat/sdk/android", + "sourcePath": "/sdk/ios/message/sending-messages/send-message-not-oss", + "openimPath": "/sdk/ios/message/sending-messages/send-message-not-oss", + "title": "Send a message without OSS", + "context": "chat/sdk/ios", "template": "guide", - "contentFile": "content/docs/chat/sdk/android/message/managing-polls/create-a-poll.mdx" + "contentFile": "content/docs/chat/sdk/ios/message/sending-messages/send-message-not-oss.mdx" }, { - "sourcePath": "/sdk/android/message/managing-scheduled-messages-in-group-channel/create-a-scheduled-message", - "openimPath": "/sdk/android/message/managing-scheduled-messages-in-group-channel/create-a-scheduled-message", - "title": "Create a scheduled message", - "context": "chat/sdk/android", + "sourcePath": "/sdk/ios/message/receiving-messages/receive-messages", + "openimPath": "/sdk/ios/message/receiving-messages/receive-messages", + "title": "Receive messages", + "context": "chat/sdk/ios", "template": "guide", - "contentFile": "content/docs/chat/sdk/android/message/managing-scheduled-messages-in-group-channel/create-a-scheduled-message.mdx" + "contentFile": "content/docs/chat/sdk/ios/message/receiving-messages/receive-messages.mdx" }, { - "sourcePath": "/sdk/android/message/marking-messages-as-delivered-in-a-group-channel/mark-messages-as-delivered", - "openimPath": "/sdk/android/message/marking-messages-as-delivered-in-a-group-channel/mark-messages-as-delivered", - "title": "Mark messages as delivered", - "context": "chat/sdk/android", + "sourcePath": "/sdk/ios/message/receiving-messages/custom-business-listener", + "openimPath": "/sdk/ios/message/receiving-messages/custom-business-listener", + "title": "Receive custom business messages", + "context": "chat/sdk/ios", "template": "guide", - "contentFile": "content/docs/chat/sdk/android/message/marking-messages-as-delivered-in-a-group-channel/mark-messages-as-delivered.mdx" + "contentFile": "content/docs/chat/sdk/ios/message/receiving-messages/custom-business-listener.mdx" }, { - "sourcePath": "/sdk/android/message/mentioning-other-users-in-a-message/mention-other-users-in-a-message", - "openimPath": "/sdk/android/message/mentioning-other-users-in-a-message/mention-other-users-in-a-message", - "title": "Mention other users in a message", - "context": "chat/sdk/android", + "sourcePath": "/sdk/ios/message/retrieving-messages/load-older-messages", + "openimPath": "/sdk/ios/message/retrieving-messages/load-older-messages", + "title": "Load older messages", + "context": "chat/sdk/ios", "template": "guide", - "contentFile": "content/docs/chat/sdk/android/message/mentioning-other-users-in-a-message/mention-other-users-in-a-message.mdx" + "contentFile": "content/docs/chat/sdk/ios/message/retrieving-messages/load-older-messages.mdx" }, { - "sourcePath": "/sdk/android/message/overview-message", - "openimPath": "/sdk/android/message/overview-message", - "title": "Overview", - "context": "chat/sdk/android", + "sourcePath": "/sdk/ios/message/retrieving-messages/load-newer-messages", + "openimPath": "/sdk/ios/message/retrieving-messages/load-newer-messages", + "title": "Load newer messages", + "context": "chat/sdk/ios", "template": "guide", - "contentFile": "content/docs/chat/sdk/android/message/overview-message.mdx" + "contentFile": "content/docs/chat/sdk/ios/message/retrieving-messages/load-newer-messages.mdx" }, { - "sourcePath": "/sdk/android/message/retrieving-messages/retrieve-a-message", - "openimPath": "/sdk/android/message/retrieving-messages/retrieve-a-message", - "title": "Retrieve a message", - "context": "chat/sdk/android", + "sourcePath": "/sdk/ios/message/retrieving-messages/find-messages-by-id", + "openimPath": "/sdk/ios/message/retrieving-messages/find-messages-by-id", + "title": "Find messages by ID", + "context": "chat/sdk/ios", "template": "guide", - "contentFile": "content/docs/chat/sdk/android/message/retrieving-messages/retrieve-a-message.mdx" + "contentFile": "content/docs/chat/sdk/ios/message/retrieving-messages/find-messages-by-id.mdx" }, { - "sourcePath": "/sdk/android/message/searching-messages-in-a-group-channel/search-messages-by-a-keyword", - "openimPath": "/sdk/android/message/searching-messages-in-a-group-channel/search-messages-by-a-keyword", - "title": "Search messages by a keyword", - "context": "chat/sdk/android", + "sourcePath": "/sdk/ios/message/retrieving-messages/load-message-context", + "openimPath": "/sdk/ios/message/retrieving-messages/load-message-context", + "title": "Load message context", + "context": "chat/sdk/ios", "template": "guide", - "contentFile": "content/docs/chat/sdk/android/message/searching-messages-in-a-group-channel/search-messages-by-a-keyword.mdx" + "contentFile": "content/docs/chat/sdk/ios/message/retrieving-messages/load-message-context.mdx" }, { - "sourcePath": "/sdk/android/message/sending-a-message/share-an-encrypted-file", - "openimPath": "/sdk/android/message/sending-a-message/share-an-encrypted-file", - "title": "Share an encrypted file", - "context": "chat/sdk/android", + "sourcePath": "/sdk/ios/message/searching-messages/search-messages", + "openimPath": "/sdk/ios/message/searching-messages/search-messages", + "title": "Search messages", + "context": "chat/sdk/ios", "template": "guide", - "contentFile": "content/docs/chat/sdk/android/message/sending-a-message/share-an-encrypted-file.mdx" + "contentFile": "content/docs/chat/sdk/ios/message/searching-messages/search-messages.mdx" }, { - "sourcePath": "/sdk/android/message/sending-a-message/smart-throttling", - "openimPath": "/sdk/android/message/sending-a-message/smart-throttling", - "title": "Smart throttling", - "context": "chat/sdk/android", + "sourcePath": "/sdk/ios/message/composing-messages/update-typing-status", + "openimPath": "/sdk/ios/message/composing-messages/update-typing-status", + "title": "Update typing status", + "context": "chat/sdk/ios", "template": "guide", - "contentFile": "content/docs/chat/sdk/android/message/sending-a-message/smart-throttling.mdx" + "contentFile": "content/docs/chat/sdk/ios/message/composing-messages/update-typing-status.mdx" }, { - "sourcePath": "/sdk/android/message/translating-messages/auto-translate-messages", - "openimPath": "/sdk/android/message/translating-messages/auto-translate-messages", - "title": "Auto-translate messages", - "context": "chat/sdk/android", + "sourcePath": "/sdk/ios/message/composing-messages/get-typing-status", + "openimPath": "/sdk/ios/message/composing-messages/get-typing-status", + "title": "Get typing status", + "context": "chat/sdk/ios", "template": "guide", - "contentFile": "content/docs/chat/sdk/android/message/translating-messages/auto-translate-messages.mdx" + "contentFile": "content/docs/chat/sdk/ios/message/composing-messages/get-typing-status.mdx" }, { - "sourcePath": "/sdk/android/message/translating-messages/translate-messages-on-demand", - "openimPath": "/sdk/android/message/translating-messages/translate-messages-on-demand", - "title": "Translate messages on-demand", - "context": "chat/sdk/android", + "sourcePath": "/sdk/ios/message/composing-messages/check-speech-to-text", + "openimPath": "/sdk/ios/message/composing-messages/check-speech-to-text", + "title": "Check speech recognition support", + "context": "chat/sdk/ios", "template": "guide", - "contentFile": "content/docs/chat/sdk/android/message/translating-messages/translate-messages-on-demand.mdx" + "contentFile": "content/docs/chat/sdk/ios/message/composing-messages/check-speech-to-text.mdx" }, { - "sourcePath": "/sdk/android/message/using-message-threading/create-a-message-thread", - "openimPath": "/sdk/android/message/using-message-threading/create-a-message-thread", - "title": "Create a message thread", - "context": "chat/sdk/android", + "sourcePath": "/sdk/ios/message/composing-messages/transcribe-audio", + "openimPath": "/sdk/ios/message/composing-messages/transcribe-audio", + "title": "Transcribe audio", + "context": "chat/sdk/ios", "template": "guide", - "contentFile": "content/docs/chat/sdk/android/message/using-message-threading/create-a-message-thread.mdx" + "contentFile": "content/docs/chat/sdk/ios/message/composing-messages/transcribe-audio.mdx" }, { - "sourcePath": "/sdk/android/overview", - "openimPath": "/sdk/android/overview", - "title": "OpenIM SDK for Android", - "context": "chat/sdk/android", - "template": "overview", - "contentFile": "content/docs/chat/sdk/android/overview.mdx" + "sourcePath": "/sdk/ios/message/composing-messages/save-local-transcript", + "openimPath": "/sdk/ios/message/composing-messages/save-local-transcript", + "title": "Save a local transcript", + "context": "chat/sdk/ios", + "template": "guide", + "contentFile": "content/docs/chat/sdk/ios/message/composing-messages/save-local-transcript.mdx" }, { - "sourcePath": "/sdk/android/push-notifications/managing-push-notifications/configure-push-notification-preferences", - "openimPath": "/sdk/android/push-notifications/managing-push-notifications/configure-push-notification-preferences", - "title": "Configure push notification preferences", - "context": "chat/sdk/android", + "sourcePath": "/sdk/ios/message/managing-messages/delete-local-message", + "openimPath": "/sdk/ios/message/managing-messages/delete-local-message", + "title": "Delete a local message", + "context": "chat/sdk/ios", "template": "guide", - "contentFile": "content/docs/chat/sdk/android/push-notifications/managing-push-notifications/configure-push-notification-preferences.mdx" + "contentFile": "content/docs/chat/sdk/ios/message/managing-messages/delete-local-message.mdx" }, { - "sourcePath": "/sdk/android/push-notifications/managing-push-notifications/push-notification-translation", - "openimPath": "/sdk/android/push-notifications/managing-push-notifications/push-notification-translation", - "title": "Push notification translation", - "context": "chat/sdk/android", + "sourcePath": "/sdk/ios/message/managing-messages/delete-saved-message", + "openimPath": "/sdk/ios/message/managing-messages/delete-saved-message", + "title": "Delete a saved message", + "context": "chat/sdk/ios", "template": "guide", - "contentFile": "content/docs/chat/sdk/android/push-notifications/managing-push-notifications/push-notification-translation.mdx" + "contentFile": "content/docs/chat/sdk/ios/message/managing-messages/delete-saved-message.mdx" }, { - "sourcePath": "/sdk/android/push-notifications/overview-push-notifications", - "openimPath": "/sdk/android/push-notifications/overview-push-notifications", - "title": "Overview", - "context": "chat/sdk/android", + "sourcePath": "/sdk/ios/message/managing-messages/delete-saved-messages", + "openimPath": "/sdk/ios/message/managing-messages/delete-saved-messages", + "title": "Delete saved messages", + "context": "chat/sdk/ios", "template": "guide", - "contentFile": "content/docs/chat/sdk/android/push-notifications/overview-push-notifications.mdx" + "contentFile": "content/docs/chat/sdk/ios/message/managing-messages/delete-saved-messages.mdx" }, { - "sourcePath": "/sdk/android/report/overview-report", - "openimPath": "/sdk/android/report/overview-report", - "title": "Overview", - "context": "chat/sdk/android", + "sourcePath": "/sdk/ios/message/managing-messages/delete-user-messages", + "openimPath": "/sdk/ios/message/managing-messages/delete-user-messages", + "title": "Delete messages from a user", + "context": "chat/sdk/ios", "template": "guide", - "contentFile": "content/docs/chat/sdk/android/report/overview-report.mdx" + "contentFile": "content/docs/chat/sdk/ios/message/managing-messages/delete-user-messages.mdx" }, { - "sourcePath": "/sdk/android/user/moderating-a-user/block-and-unblock-other-members", - "openimPath": "/sdk/android/user/moderating-a-user/block-and-unblock-other-members", - "title": "Block and unblock other members", - "context": "chat/sdk/android", + "sourcePath": "/sdk/ios/message/managing-messages/revoke-a-message", + "openimPath": "/sdk/ios/message/managing-messages/revoke-a-message", + "title": "Revoke a message", + "context": "chat/sdk/ios", "template": "guide", - "contentFile": "content/docs/chat/sdk/android/user/moderating-a-user/block-and-unblock-other-members.mdx" + "contentFile": "content/docs/chat/sdk/ios/message/managing-messages/revoke-a-message.mdx" }, { - "sourcePath": "/sdk/android/user/moderating-a-user/mute-and-unmute-a-user", - "openimPath": "/sdk/android/user/moderating-a-user/mute-and-unmute-a-user", - "title": "Mute and unmute a user", - "context": "chat/sdk/android", + "sourcePath": "/sdk/ios/message/managing-messages/modify-a-message", + "openimPath": "/sdk/ios/message/managing-messages/modify-a-message", + "title": "Modify a message", + "context": "chat/sdk/ios", "template": "guide", - "contentFile": "content/docs/chat/sdk/android/user/moderating-a-user/mute-and-unmute-a-user.mdx" + "contentFile": "content/docs/chat/sdk/ios/message/managing-messages/modify-a-message.mdx" }, { - "sourcePath": "/sdk/android/user/retrieving-and-updating-user-information/retrieve-the-online-status-of-a-user", - "openimPath": "/sdk/android/user/retrieving-and-updating-user-information/retrieve-the-online-status-of-a-user", - "title": "Retrieve the online status of a user", - "context": "chat/sdk/android", + "sourcePath": "/sdk/ios/message/managing-messages/get-pinned-messages", + "openimPath": "/sdk/ios/message/managing-messages/get-pinned-messages", + "title": "View pinned messages", + "context": "chat/sdk/ios", "template": "guide", - "contentFile": "content/docs/chat/sdk/android/user/retrieving-and-updating-user-information/retrieve-the-online-status-of-a-user.mdx" + "contentFile": "content/docs/chat/sdk/ios/message/managing-messages/get-pinned-messages.mdx" }, { - "sourcePath": "/sdk/android/user/retrieving-users/retrieve-members-who-have-read-a-message", - "openimPath": "/sdk/android/user/retrieving-users/retrieve-members-who-have-read-a-message", - "title": "Retrieve members who have read a message", - "context": "chat/sdk/android", + "sourcePath": "/sdk/ios/message/managing-messages/set-message-pinned", + "openimPath": "/sdk/ios/message/managing-messages/set-message-pinned", + "title": "Pin or unpin a message", + "context": "chat/sdk/ios", "template": "guide", - "contentFile": "content/docs/chat/sdk/android/user/retrieving-users/retrieve-members-who-have-read-a-message.mdx" + "contentFile": "content/docs/chat/sdk/ios/message/managing-messages/set-message-pinned.mdx" }, { - "sourcePath": "/sdk/android/application/authenticating-a-user/authentication", - "openimPath": "/sdk/android/application/authenticating-a-user/authentication", - "title": "Authentication", - "context": "chat/sdk/android", + "sourcePath": "/sdk/ios/message/managing-messages/insert-local-single-message", + "openimPath": "/sdk/ios/message/managing-messages/insert-local-single-message", + "title": "Insert a local direct message", + "context": "chat/sdk/ios", "template": "guide", - "contentFile": "content/docs/chat/sdk/android/application/authenticating-a-user/authentication.mdx" + "contentFile": "content/docs/chat/sdk/ios/message/managing-messages/insert-local-single-message.mdx" }, { - "sourcePath": "/sdk/android/application/overview-application", - "openimPath": "/sdk/android/application/overview-application", - "title": "Overview", - "context": "chat/sdk/android", + "sourcePath": "/sdk/ios/message/managing-messages/insert-local-group-message", + "openimPath": "/sdk/ios/message/managing-messages/insert-local-group-message", + "title": "Insert a local group message", + "context": "chat/sdk/ios", "template": "guide", - "contentFile": "content/docs/chat/sdk/android/application/overview-application.mdx" + "contentFile": "content/docs/chat/sdk/ios/message/managing-messages/insert-local-group-message.mdx" }, { - "sourcePath": "/sdk/android/application/understanding-rate-limits/rate-limits", - "openimPath": "/sdk/android/application/understanding-rate-limits/rate-limits", - "title": "Rate limits", - "context": "chat/sdk/android", + "sourcePath": "/sdk/ios/message/managing-messages/clear-all-local-messages", + "openimPath": "/sdk/ios/message/managing-messages/clear-all-local-messages", + "title": "Clear all local messages", + "context": "chat/sdk/ios", "template": "guide", - "contentFile": "content/docs/chat/sdk/android/application/understanding-rate-limits/rate-limits.mdx" + "contentFile": "content/docs/chat/sdk/ios/message/managing-messages/clear-all-local-messages.mdx" }, { - "sourcePath": "/sdk/android/channel/categorizing-channels/categorize-channels-by-custom-type", - "openimPath": "/sdk/android/channel/categorizing-channels/categorize-channels-by-custom-type", - "title": "Categorize channels by custom type", - "context": "chat/sdk/android", + "sourcePath": "/sdk/ios/message/managing-messages/clear-all-messages", + "openimPath": "/sdk/ios/message/managing-messages/clear-all-messages", + "title": "Clear all saved messages", + "context": "chat/sdk/ios", "template": "guide", - "contentFile": "content/docs/chat/sdk/android/channel/categorizing-channels/categorize-channels-by-custom-type.mdx" + "contentFile": "content/docs/chat/sdk/ios/message/managing-messages/clear-all-messages.mdx" }, { - "sourcePath": "/sdk/android/channel/creating-a-channel/create-a-channel", - "openimPath": "/sdk/android/channel/creating-a-channel/create-a-channel", - "title": "Create a channel", - "context": "chat/sdk/android", + "sourcePath": "/sdk/ios/message/managing-messages/set-message-local-ex", + "openimPath": "/sdk/ios/message/managing-messages/set-message-local-ex", + "title": "Set local message extensions", + "context": "chat/sdk/ios", "template": "guide", - "contentFile": "content/docs/chat/sdk/android/channel/creating-a-channel/create-a-channel.mdx" + "contentFile": "content/docs/chat/sdk/ios/message/managing-messages/set-message-local-ex.mdx" }, { - "sourcePath": "/sdk/android/channel/inviting-users-to-a-group-channel/accept-or-decline-an-invitation", - "openimPath": "/sdk/android/channel/inviting-users-to-a-group-channel/accept-or-decline-an-invitation", - "title": "Accept or decline an invitation", - "context": "chat/sdk/android", + "sourcePath": "/sdk/ios/message/managing-read-status/get-group-message-readers", + "openimPath": "/sdk/ios/message/managing-read-status/get-group-message-readers", + "title": "View group message readers", + "context": "chat/sdk/ios", "template": "guide", - "contentFile": "content/docs/chat/sdk/android/channel/inviting-users-to-a-group-channel/accept-or-decline-an-invitation.mdx" + "contentFile": "content/docs/chat/sdk/ios/message/managing-read-status/get-group-message-readers.mdx" }, { - "sourcePath": "/sdk/android/channel/inviting-users-to-a-group-channel/invite-users-as-members", - "openimPath": "/sdk/android/channel/inviting-users-to-a-group-channel/invite-users-as-members", - "title": "Invite users as members", - "context": "chat/sdk/android", + "sourcePath": "/sdk/ios/message/managing-read-status/send-group-read-receipts", + "openimPath": "/sdk/ios/message/managing-read-status/send-group-read-receipts", + "title": "Send group read receipts", + "context": "chat/sdk/ios", "template": "guide", - "contentFile": "content/docs/chat/sdk/android/channel/inviting-users-to-a-group-channel/invite-users-as-members.mdx" + "contentFile": "content/docs/chat/sdk/ios/message/managing-read-status/send-group-read-receipts.mdx" }, { - "sourcePath": "/sdk/android/channel/joining-and-leaving-a-channel/enter-and-exit-an-open-channel", - "openimPath": "/sdk/android/channel/joining-and-leaving-a-channel/enter-and-exit-an-open-channel", - "title": "Enter and exit an open channel", - "context": "chat/sdk/android", + "sourcePath": "/sdk/ios/file-uploads/upload-file", + "openimPath": "/sdk/ios/file-uploads/upload-file", + "title": "Upload a file", + "context": "chat/sdk/ios", "template": "guide", - "contentFile": "content/docs/chat/sdk/android/channel/joining-and-leaving-a-channel/enter-and-exit-an-open-channel.mdx" + "contentFile": "content/docs/chat/sdk/ios/file-uploads/upload-file.mdx" }, { - "sourcePath": "/sdk/android/channel/joining-and-leaving-a-channel/join-and-leave-a-group-channel", - "openimPath": "/sdk/android/channel/joining-and-leaving-a-channel/join-and-leave-a-group-channel", - "title": "Join and leave a group channel", - "context": "chat/sdk/android", + "sourcePath": "/sdk/ios/calling/overview-calling", + "openimPath": "/sdk/ios/calling/overview-calling", + "title": "Calling overview", + "context": "chat/sdk/ios", "template": "guide", - "contentFile": "content/docs/chat/sdk/android/channel/joining-and-leaving-a-channel/join-and-leave-a-group-channel.mdx" + "contentFile": "content/docs/chat/sdk/ios/calling/overview-calling.mdx" }, { - "sourcePath": "/sdk/android/channel/managing-channel-metacounters/manage-channel-metacounters", - "openimPath": "/sdk/android/channel/managing-channel-metacounters/manage-channel-metacounters", - "title": "Manage channel metacounters", - "context": "chat/sdk/android", + "sourcePath": "/sdk/ios/calling/managing-calls/start-single-call", + "openimPath": "/sdk/ios/calling/managing-calls/start-single-call", + "title": "Start a one-to-one call", + "context": "chat/sdk/ios", "template": "guide", - "contentFile": "content/docs/chat/sdk/android/channel/managing-channel-metacounters/manage-channel-metacounters.mdx" + "contentFile": "content/docs/chat/sdk/ios/calling/managing-calls/start-single-call.mdx" }, { - "sourcePath": "/sdk/android/channel/managing-channel-metadata/manage-channel-metadata", - "openimPath": "/sdk/android/channel/managing-channel-metadata/manage-channel-metadata", - "title": "Manage channel metadata", - "context": "chat/sdk/android", + "sourcePath": "/sdk/ios/calling/managing-calls/start-group-call", + "openimPath": "/sdk/ios/calling/managing-calls/start-group-call", + "title": "Start a group call", + "context": "chat/sdk/ios", "template": "guide", - "contentFile": "content/docs/chat/sdk/android/channel/managing-channel-metadata/manage-channel-metadata.mdx" + "contentFile": "content/docs/chat/sdk/ios/calling/managing-calls/start-group-call.mdx" }, { - "sourcePath": "/sdk/android/channel/managing-channels/delete-a-channel", - "openimPath": "/sdk/android/channel/managing-channels/delete-a-channel", - "title": "Delete a channel", - "context": "chat/sdk/android", + "sourcePath": "/sdk/ios/calling/managing-calls/accept-call", + "openimPath": "/sdk/ios/calling/managing-calls/accept-call", + "title": "Accept a call", + "context": "chat/sdk/ios", "template": "guide", - "contentFile": "content/docs/chat/sdk/android/channel/managing-channels/delete-a-channel.mdx" + "contentFile": "content/docs/chat/sdk/ios/calling/managing-calls/accept-call.mdx" }, { - "sourcePath": "/sdk/android/channel/managing-channels/hide-or-archive-a-group-channel", - "openimPath": "/sdk/android/channel/managing-channels/hide-or-archive-a-group-channel", - "title": "Hide or archive a group channel", - "context": "chat/sdk/android", + "sourcePath": "/sdk/ios/calling/managing-calls/reject-call", + "openimPath": "/sdk/ios/calling/managing-calls/reject-call", + "title": "Reject a call", + "context": "chat/sdk/ios", "template": "guide", - "contentFile": "content/docs/chat/sdk/android/channel/managing-channels/hide-or-archive-a-group-channel.mdx" + "contentFile": "content/docs/chat/sdk/ios/calling/managing-calls/reject-call.mdx" }, { - "sourcePath": "/sdk/android/channel/managing-channels/refresh-all-data-related-to-a-group-channel", - "openimPath": "/sdk/android/channel/managing-channels/refresh-all-data-related-to-a-group-channel", - "title": "Refresh all data related to a group channel", - "context": "chat/sdk/android", + "sourcePath": "/sdk/ios/calling/managing-calls/cancel-call", + "openimPath": "/sdk/ios/calling/managing-calls/cancel-call", + "title": "Cancel a call invitation", + "context": "chat/sdk/ios", "template": "guide", - "contentFile": "content/docs/chat/sdk/android/channel/managing-channels/refresh-all-data-related-to-a-group-channel.mdx" + "contentFile": "content/docs/chat/sdk/ios/calling/managing-calls/cancel-call.mdx" }, { - "sourcePath": "/sdk/android/channel/managing-operators/register-and-remove-operators", - "openimPath": "/sdk/android/channel/managing-operators/register-and-remove-operators", - "title": "Register and remove operators", - "context": "chat/sdk/android", + "sourcePath": "/sdk/ios/calling/managing-calls/hang-up-call", + "openimPath": "/sdk/ios/calling/managing-calls/hang-up-call", + "title": "Hang up a call", + "context": "chat/sdk/ios", "template": "guide", - "contentFile": "content/docs/chat/sdk/android/channel/managing-operators/register-and-remove-operators.mdx" + "contentFile": "content/docs/chat/sdk/ios/calling/managing-calls/hang-up-call.mdx" }, { - "sourcePath": "/sdk/android/channel/retrieving-channels/retrieve-a-channel-by-url", - "openimPath": "/sdk/android/channel/retrieving-channels/retrieve-a-channel-by-url", - "title": "Retrieve a channel by URL", - "context": "chat/sdk/android", + "sourcePath": "/sdk/ios/calling/managing-calls/handle-call-events", + "openimPath": "/sdk/ios/calling/managing-calls/handle-call-events", + "title": "Handle call events", + "context": "chat/sdk/ios", "template": "guide", - "contentFile": "content/docs/chat/sdk/android/channel/retrieving-channels/retrieve-a-channel-by-url.mdx" + "contentFile": "content/docs/chat/sdk/ios/calling/managing-calls/handle-call-events.mdx" }, { - "sourcePath": "/sdk/android/channel/retrieving-channels/retrieve-a-list-of-channels", - "openimPath": "/sdk/android/channel/retrieving-channels/retrieve-a-list-of-channels", - "title": "Retrieve a list of channels", - "context": "chat/sdk/android", + "sourcePath": "/sdk/ios/calling/retrieving-call-information/restore-pending-invitation", + "openimPath": "/sdk/ios/calling/retrieving-call-information/restore-pending-invitation", + "title": "Restore a pending invitation", + "context": "chat/sdk/ios", "template": "guide", - "contentFile": "content/docs/chat/sdk/android/channel/retrieving-channels/retrieve-a-list-of-channels.mdx" + "contentFile": "content/docs/chat/sdk/ios/calling/retrieving-call-information/restore-pending-invitation.mdx" }, { - "sourcePath": "/sdk/android/channel/searching-channels/filter-group-channels-by-user-ids", - "openimPath": "/sdk/android/channel/searching-channels/filter-group-channels-by-user-ids", - "title": "Filter group channels by user IDs", - "context": "chat/sdk/android", + "sourcePath": "/sdk/ios/calling/retrieving-call-information/get-room-by-group-id", + "openimPath": "/sdk/ios/calling/retrieving-call-information/get-room-by-group-id", + "title": "Get a group call room", + "context": "chat/sdk/ios", "template": "guide", - "contentFile": "content/docs/chat/sdk/android/channel/searching-channels/filter-group-channels-by-user-ids.mdx" + "contentFile": "content/docs/chat/sdk/ios/calling/retrieving-call-information/get-room-by-group-id.mdx" }, { - "sourcePath": "/sdk/android/channel/searching-channels/search-group-channels-by-name-url-or-other-filters", - "openimPath": "/sdk/android/channel/searching-channels/search-group-channels-by-name-url-or-other-filters", - "title": "Search group channels by name, URL, or other filters", - "context": "chat/sdk/android", + "sourcePath": "/sdk/ios/calling/retrieving-call-information/get-token-by-room-id", + "openimPath": "/sdk/ios/calling/retrieving-call-information/get-token-by-room-id", + "title": "Get room credentials", + "context": "chat/sdk/ios", "template": "guide", - "contentFile": "content/docs/chat/sdk/android/channel/searching-channels/search-group-channels-by-name-url-or-other-filters.mdx" + "contentFile": "content/docs/chat/sdk/ios/calling/retrieving-call-information/get-token-by-room-id.mdx" }, { - "sourcePath": "/sdk/android/channel/searching-channels/search-open-channels-by-name-url-or-custom-types", - "openimPath": "/sdk/android/channel/searching-channels/search-open-channels-by-name-url-or-custom-types", - "title": "Search open channels by name, URL, or custom type", - "context": "chat/sdk/android", + "sourcePath": "/sdk/ios/calling/sending-custom-signals/send-a-custom-signal", + "openimPath": "/sdk/ios/calling/sending-custom-signals/send-a-custom-signal", + "title": "Send a custom signal", + "context": "chat/sdk/ios", "template": "guide", - "contentFile": "content/docs/chat/sdk/android/channel/searching-channels/search-open-channels-by-name-url-or-custom-types.mdx" + "contentFile": "content/docs/chat/sdk/ios/calling/sending-custom-signals/send-a-custom-signal.mdx" }, { - "sourcePath": "/sdk/android/deprecated", - "openimPath": "/sdk/android/deprecated", - "title": "Deprecated", - "context": "chat/sdk/android", + "sourcePath": "/sdk/ios/events/overview-events", + "openimPath": "/sdk/ios/events/overview-events", + "title": "Events overview", + "context": "chat/sdk/ios", "template": "guide", - "contentFile": "content/docs/chat/sdk/android/deprecated.mdx" + "contentFile": "content/docs/chat/sdk/ios/events/overview-events.mdx" }, { - "sourcePath": "/sdk/android/event-handler/managing-channel-event-handlers/add-or-remove-a-channel-event-handler", - "openimPath": "/sdk/android/event-handler/managing-channel-event-handlers/add-or-remove-a-channel-event-handler", - "title": "Add or remove a channel event handler", - "context": "chat/sdk/android", + "sourcePath": "/sdk/ios/logger", + "openimPath": "/sdk/ios/logger", + "title": "Logger", + "context": "chat/sdk/ios", "template": "guide", - "contentFile": "content/docs/chat/sdk/android/event-handler/managing-channel-event-handlers/add-or-remove-a-channel-event-handler.mdx" + "contentFile": "content/docs/chat/sdk/ios/logger.mdx" }, { - "sourcePath": "/sdk/android/event-handler/managing-connection-event-handlers/add-or-remove-a-connection-event-handler", - "openimPath": "/sdk/android/event-handler/managing-connection-event-handlers/add-or-remove-a-connection-event-handler", - "title": "Add or remove a connection event handler", + "sourcePath": "/sdk/android/overview", + "openimPath": "/sdk/android/overview", + "title": "OpenIM Android SDK overview", "context": "chat/sdk/android", - "template": "guide", - "contentFile": "content/docs/chat/sdk/android/event-handler/managing-connection-event-handlers/add-or-remove-a-connection-event-handler.mdx" + "template": "overview", + "contentFile": "content/docs/chat/sdk/android/overview.mdx" }, { - "sourcePath": "/sdk/android/event-handler/managing-user-event-handlers/add-or-remove-a-user-event-handler", - "openimPath": "/sdk/android/event-handler/managing-user-event-handlers/add-or-remove-a-user-event-handler", - "title": "Add or remove a user event handler", + "sourcePath": "/sdk/android/getting-started/before-you-start", + "openimPath": "/sdk/android/getting-started/before-you-start", + "title": "Before you start", "context": "chat/sdk/android", "template": "guide", - "contentFile": "content/docs/chat/sdk/android/event-handler/managing-user-event-handlers/add-or-remove-a-user-event-handler.mdx" + "contentFile": "content/docs/chat/sdk/android/getting-started/before-you-start.mdx" }, { - "sourcePath": "/sdk/android/event-handler/overview-event-handler", - "openimPath": "/sdk/android/event-handler/overview-event-handler", - "title": "Event handler", + "sourcePath": "/sdk/android/getting-started/environment-specific-implementation", + "openimPath": "/sdk/android/getting-started/environment-specific-implementation", + "title": "Integrate for Android", "context": "chat/sdk/android", "template": "guide", - "contentFile": "content/docs/chat/sdk/android/event-handler/overview-event-handler.mdx" + "contentFile": "content/docs/chat/sdk/android/getting-started/environment-specific-implementation.mdx" }, { - "sourcePath": "/sdk/android/getting-started/collection-migration-guide", - "openimPath": "/sdk/android/getting-started/collection-migration-guide", - "title": "Collection migration guide", + "sourcePath": "/sdk/android/getting-started/authenticate-and-manage-session", + "openimPath": "/sdk/android/getting-started/authenticate-and-manage-session", + "title": "Authenticate and manage a session", "context": "chat/sdk/android", "template": "guide", - "contentFile": "content/docs/chat/sdk/android/getting-started/collection-migration-guide.mdx" + "contentFile": "content/docs/chat/sdk/android/getting-started/authenticate-and-manage-session.mdx" }, { - "sourcePath": "/sdk/android/getting-started/kotlin-extension", - "openimPath": "/sdk/android/getting-started/kotlin-extension", - "title": "Kotlin extension (KTX)", + "sourcePath": "/sdk/android/getting-started/send-first-message", + "openimPath": "/sdk/android/getting-started/send-first-message", + "title": "Send your first message", "context": "chat/sdk/android", "template": "guide", - "contentFile": "content/docs/chat/sdk/android/getting-started/kotlin-extension.mdx" + "contentFile": "content/docs/chat/sdk/android/getting-started/send-first-message.mdx" }, { - "sourcePath": "/sdk/android/getting-started/migration-guide", - "openimPath": "/sdk/android/getting-started/migration-guide", - "title": "Migration guide", + "sourcePath": "/sdk/android/user/overview-user", + "openimPath": "/sdk/android/user/overview-user", + "title": "User overview", "context": "chat/sdk/android", "template": "guide", - "contentFile": "content/docs/chat/sdk/android/getting-started/migration-guide.mdx" + "contentFile": "content/docs/chat/sdk/android/user/overview-user.mdx" }, { - "sourcePath": "/sdk/android/local-caching/overview-local-caching", - "openimPath": "/sdk/android/local-caching/overview-local-caching", - "title": "Local caching", + "sourcePath": "/sdk/android/user/user-profile/get-users-info", + "openimPath": "/sdk/android/user/user-profile/get-users-info", + "title": "Get specified user profiles", "context": "chat/sdk/android", "template": "guide", - "contentFile": "content/docs/chat/sdk/android/local-caching/overview-local-caching.mdx" + "contentFile": "content/docs/chat/sdk/android/user/user-profile/get-users-info.mdx" }, { - "sourcePath": "/sdk/android/local-caching/using-group-channel-collection/group-channel-collection", - "openimPath": "/sdk/android/local-caching/using-group-channel-collection/group-channel-collection", - "title": "Group channel collection", + "sourcePath": "/sdk/android/user/user-profile/get-self-local-user-info", + "openimPath": "/sdk/android/user/user-profile/get-self-local-user-info", + "title": "Get the current user profile", "context": "chat/sdk/android", "template": "guide", - "contentFile": "content/docs/chat/sdk/android/local-caching/using-group-channel-collection/group-channel-collection.mdx" + "contentFile": "content/docs/chat/sdk/android/user/user-profile/get-self-local-user-info.mdx" }, { - "sourcePath": "/sdk/android/local-caching/using-message-collection/message-collection", - "openimPath": "/sdk/android/local-caching/using-message-collection/message-collection", - "title": "Message collection", + "sourcePath": "/sdk/android/user/user-profile/set-self-info", + "openimPath": "/sdk/android/user/user-profile/set-self-info", + "title": "Update your profile", "context": "chat/sdk/android", "template": "guide", - "contentFile": "content/docs/chat/sdk/android/local-caching/using-message-collection/message-collection.mdx" + "contentFile": "content/docs/chat/sdk/android/user/user-profile/set-self-info.mdx" }, { - "sourcePath": "/sdk/android/logger", - "openimPath": "/sdk/android/logger", - "title": "Logger", + "sourcePath": "/sdk/android/user/user-profile/set-global-message-reception", + "openimPath": "/sdk/android/user/user-profile/set-global-message-reception", + "title": "Set global message reception", "context": "chat/sdk/android", "template": "guide", - "contentFile": "content/docs/chat/sdk/android/logger.mdx" + "contentFile": "content/docs/chat/sdk/android/user/user-profile/set-global-message-reception.mdx" }, { - "sourcePath": "/sdk/android/message/categorizing-messages/categorize-messages-by-custom-type", - "openimPath": "/sdk/android/message/categorizing-messages/categorize-messages-by-custom-type", - "title": "Categorize messages by custom type", + "sourcePath": "/sdk/android/user/online-status/subscribe-users-online-status", + "openimPath": "/sdk/android/user/online-status/subscribe-users-online-status", + "title": "Subscribe to user online status", "context": "chat/sdk/android", "template": "guide", - "contentFile": "content/docs/chat/sdk/android/message/categorizing-messages/categorize-messages-by-custom-type.mdx" + "contentFile": "content/docs/chat/sdk/android/user/online-status/subscribe-users-online-status.mdx" }, { - "sourcePath": "/sdk/android/message/listing-changelogs/list-changelogs-of-messages", - "openimPath": "/sdk/android/message/listing-changelogs/list-changelogs-of-messages", - "title": "List changelogs of messages", + "sourcePath": "/sdk/android/user/online-status/get-subscribe-online-users-status", + "openimPath": "/sdk/android/user/online-status/get-subscribe-online-users-status", + "title": "Get subscribed user online status", "context": "chat/sdk/android", "template": "guide", - "contentFile": "content/docs/chat/sdk/android/message/listing-changelogs/list-changelogs-of-messages.mdx" + "contentFile": "content/docs/chat/sdk/android/user/online-status/get-subscribe-online-users-status.mdx" }, { - "sourcePath": "/sdk/android/message/managing-a-message/clear-the-chat-history-in-a-group-channel", - "openimPath": "/sdk/android/message/managing-a-message/clear-the-chat-history-in-a-group-channel", - "title": "Clear the chat history in a group channel", + "sourcePath": "/sdk/android/user/online-status/unsubscribe-users-online-status", + "openimPath": "/sdk/android/user/online-status/unsubscribe-users-online-status", + "title": "Unsubscribe from user status", "context": "chat/sdk/android", "template": "guide", - "contentFile": "content/docs/chat/sdk/android/message/managing-a-message/clear-the-chat-history-in-a-group-channel.mdx" + "contentFile": "content/docs/chat/sdk/android/user/online-status/unsubscribe-users-online-status.mdx" }, { - "sourcePath": "/sdk/android/message/managing-a-message/copy-a-message", - "openimPath": "/sdk/android/message/managing-a-message/copy-a-message", - "title": "Copy a message", + "sourcePath": "/sdk/android/user/friends/get-friend-list-page", + "openimPath": "/sdk/android/user/friends/get-friend-list-page", + "title": "Get the friend list by page", "context": "chat/sdk/android", "template": "guide", - "contentFile": "content/docs/chat/sdk/android/message/managing-a-message/copy-a-message.mdx" + "contentFile": "content/docs/chat/sdk/android/user/friends/get-friend-list-page.mdx" }, { - "sourcePath": "/sdk/android/message/managing-a-message/delete-a-message", - "openimPath": "/sdk/android/message/managing-a-message/delete-a-message", - "title": "Delete a message", + "sourcePath": "/sdk/android/user/friends/search-friends", + "openimPath": "/sdk/android/user/friends/search-friends", + "title": "Search friends", "context": "chat/sdk/android", "template": "guide", - "contentFile": "content/docs/chat/sdk/android/message/managing-a-message/delete-a-message.mdx" + "contentFile": "content/docs/chat/sdk/android/user/friends/search-friends.mdx" }, { - "sourcePath": "/sdk/android/message/managing-a-message/display-open-graph-tags-in-a-message", - "openimPath": "/sdk/android/message/managing-a-message/display-open-graph-tags-in-a-message", - "title": "Display Open Graph tags in a message", + "sourcePath": "/sdk/android/user/friends/get-friends-info", + "openimPath": "/sdk/android/user/friends/get-friends-info", + "title": "Get specified friend profiles", "context": "chat/sdk/android", "template": "guide", - "contentFile": "content/docs/chat/sdk/android/message/managing-a-message/display-open-graph-tags-in-a-message.mdx" + "contentFile": "content/docs/chat/sdk/android/user/friends/get-friends-info.mdx" }, { - "sourcePath": "/sdk/android/message/managing-a-message/update-a-message", - "openimPath": "/sdk/android/message/managing-a-message/update-a-message", - "title": "Update a message", + "sourcePath": "/sdk/android/user/friends/check-friend", + "openimPath": "/sdk/android/user/friends/check-friend", + "title": "Check friendship", "context": "chat/sdk/android", "template": "guide", - "contentFile": "content/docs/chat/sdk/android/message/managing-a-message/update-a-message.mdx" + "contentFile": "content/docs/chat/sdk/android/user/friends/check-friend.mdx" }, { - "sourcePath": "/sdk/android/message/managing-pinned-messages-in-group-channels/list-pinned-messages", - "openimPath": "/sdk/android/message/managing-pinned-messages-in-group-channels/list-pinned-messages", - "title": "List pinned messages", + "sourcePath": "/sdk/android/user/friends/update-friends", + "openimPath": "/sdk/android/user/friends/update-friends", + "title": "Update friend profiles", "context": "chat/sdk/android", "template": "guide", - "contentFile": "content/docs/chat/sdk/android/message/managing-pinned-messages-in-group-channels/list-pinned-messages.mdx" + "contentFile": "content/docs/chat/sdk/android/user/friends/update-friends.mdx" }, { - "sourcePath": "/sdk/android/message/managing-pinned-messages-in-group-channels/unpin-a-message", - "openimPath": "/sdk/android/message/managing-pinned-messages-in-group-channels/unpin-a-message", - "title": "Unpin a message", + "sourcePath": "/sdk/android/user/friends/delete-friend", + "openimPath": "/sdk/android/user/friends/delete-friend", + "title": "Delete a friend", "context": "chat/sdk/android", "template": "guide", - "contentFile": "content/docs/chat/sdk/android/message/managing-pinned-messages-in-group-channels/unpin-a-message.mdx" + "contentFile": "content/docs/chat/sdk/android/user/friends/delete-friend.mdx" }, { - "sourcePath": "/sdk/android/message/managing-polls/add-a-poll-option", - "openimPath": "/sdk/android/message/managing-polls/add-a-poll-option", - "title": "Add a poll option", + "sourcePath": "/sdk/android/user/friend-applications/add-friend", + "openimPath": "/sdk/android/user/friend-applications/add-friend", + "title": "Send a friend request", "context": "chat/sdk/android", "template": "guide", - "contentFile": "content/docs/chat/sdk/android/message/managing-polls/add-a-poll-option.mdx" + "contentFile": "content/docs/chat/sdk/android/user/friend-applications/add-friend.mdx" }, { - "sourcePath": "/sdk/android/message/managing-polls/cast-or-cancel-a-vote", - "openimPath": "/sdk/android/message/managing-polls/cast-or-cancel-a-vote", - "title": "Cast or cancel a vote", + "sourcePath": "/sdk/android/user/friend-applications/get-recv-friend-application-list", + "openimPath": "/sdk/android/user/friend-applications/get-recv-friend-application-list", + "title": "Get received friend requests", "context": "chat/sdk/android", "template": "guide", - "contentFile": "content/docs/chat/sdk/android/message/managing-polls/cast-or-cancel-a-vote.mdx" + "contentFile": "content/docs/chat/sdk/android/user/friend-applications/get-recv-friend-application-list.mdx" }, { - "sourcePath": "/sdk/android/message/managing-polls/close-a-poll", - "openimPath": "/sdk/android/message/managing-polls/close-a-poll", - "title": "Close a poll", + "sourcePath": "/sdk/android/user/friend-applications/get-send-friend-application-list", + "openimPath": "/sdk/android/user/friend-applications/get-send-friend-application-list", + "title": "Get sent friend requests", "context": "chat/sdk/android", "template": "guide", - "contentFile": "content/docs/chat/sdk/android/message/managing-polls/close-a-poll.mdx" + "contentFile": "content/docs/chat/sdk/android/user/friend-applications/get-send-friend-application-list.mdx" }, { - "sourcePath": "/sdk/android/message/managing-polls/delete-a-poll", - "openimPath": "/sdk/android/message/managing-polls/delete-a-poll", - "title": "Delete a poll", + "sourcePath": "/sdk/android/user/friend-applications/accept-friend-application", + "openimPath": "/sdk/android/user/friend-applications/accept-friend-application", + "title": "Accept a friend request", "context": "chat/sdk/android", "template": "guide", - "contentFile": "content/docs/chat/sdk/android/message/managing-polls/delete-a-poll.mdx" + "contentFile": "content/docs/chat/sdk/android/user/friend-applications/accept-friend-application.mdx" }, { - "sourcePath": "/sdk/android/message/managing-polls/delete-a-poll-option", - "openimPath": "/sdk/android/message/managing-polls/delete-a-poll-option", - "title": "Delete a poll option", + "sourcePath": "/sdk/android/user/friend-applications/refuse-friend-application", + "openimPath": "/sdk/android/user/friend-applications/refuse-friend-application", + "title": "Reject a friend request", "context": "chat/sdk/android", "template": "guide", - "contentFile": "content/docs/chat/sdk/android/message/managing-polls/delete-a-poll-option.mdx" + "contentFile": "content/docs/chat/sdk/android/user/friend-applications/refuse-friend-application.mdx" }, { - "sourcePath": "/sdk/android/message/managing-polls/list-changelogs-of-polls", - "openimPath": "/sdk/android/message/managing-polls/list-changelogs-of-polls", - "title": "List changelogs of polls", + "sourcePath": "/sdk/android/user/blacklist/get-blacklist", + "openimPath": "/sdk/android/user/blacklist/get-blacklist", + "title": "Get the blacklist", "context": "chat/sdk/android", "template": "guide", - "contentFile": "content/docs/chat/sdk/android/message/managing-polls/list-changelogs-of-polls.mdx" + "contentFile": "content/docs/chat/sdk/android/user/blacklist/get-blacklist.mdx" }, { - "sourcePath": "/sdk/android/message/managing-polls/retrieve-a-list-of-polls", - "openimPath": "/sdk/android/message/managing-polls/retrieve-a-list-of-polls", - "title": "Retrieve a list of polls", + "sourcePath": "/sdk/android/user/blacklist/add-blacklist", + "openimPath": "/sdk/android/user/blacklist/add-blacklist", + "title": "Block a user", "context": "chat/sdk/android", "template": "guide", - "contentFile": "content/docs/chat/sdk/android/message/managing-polls/retrieve-a-list-of-polls.mdx" + "contentFile": "content/docs/chat/sdk/android/user/blacklist/add-blacklist.mdx" }, { - "sourcePath": "/sdk/android/message/managing-polls/retrieve-a-list-of-voters", - "openimPath": "/sdk/android/message/managing-polls/retrieve-a-list-of-voters", - "title": "Retrieve a list of voters", + "sourcePath": "/sdk/android/user/blacklist/remove-blacklist", + "openimPath": "/sdk/android/user/blacklist/remove-blacklist", + "title": "Unblock a user", "context": "chat/sdk/android", "template": "guide", - "contentFile": "content/docs/chat/sdk/android/message/managing-polls/retrieve-a-list-of-voters.mdx" + "contentFile": "content/docs/chat/sdk/android/user/blacklist/remove-blacklist.mdx" }, { - "sourcePath": "/sdk/android/message/managing-polls/retrieve-a-poll", - "openimPath": "/sdk/android/message/managing-polls/retrieve-a-poll", - "title": "Retrieve a poll", + "sourcePath": "/sdk/android/conversation/overview-conversation", + "openimPath": "/sdk/android/conversation/overview-conversation", + "title": "Conversation overview", "context": "chat/sdk/android", "template": "guide", - "contentFile": "content/docs/chat/sdk/android/message/managing-polls/retrieve-a-poll.mdx" + "contentFile": "content/docs/chat/sdk/android/conversation/overview-conversation.mdx" }, { - "sourcePath": "/sdk/android/message/managing-polls/retrieve-a-poll-option", - "openimPath": "/sdk/android/message/managing-polls/retrieve-a-poll-option", - "title": "Retrieve a poll option", + "sourcePath": "/sdk/android/conversation/retrieving-conversations/get-conversation-by-target", + "openimPath": "/sdk/android/conversation/retrieving-conversations/get-conversation-by-target", + "title": "Open a conversation", "context": "chat/sdk/android", "template": "guide", - "contentFile": "content/docs/chat/sdk/android/message/managing-polls/retrieve-a-poll-option.mdx" + "contentFile": "content/docs/chat/sdk/android/conversation/retrieving-conversations/get-conversation-by-target.mdx" }, { - "sourcePath": "/sdk/android/message/managing-polls/update-a-poll", - "openimPath": "/sdk/android/message/managing-polls/update-a-poll", - "title": "Update a poll", + "sourcePath": "/sdk/android/conversation/retrieving-conversations/get-conversation-id", + "openimPath": "/sdk/android/conversation/retrieving-conversations/get-conversation-id", + "title": "Resolve a conversation ID", "context": "chat/sdk/android", "template": "guide", - "contentFile": "content/docs/chat/sdk/android/message/managing-polls/update-a-poll.mdx" + "contentFile": "content/docs/chat/sdk/android/conversation/retrieving-conversations/get-conversation-id.mdx" }, { - "sourcePath": "/sdk/android/message/managing-polls/update-a-poll-option", - "openimPath": "/sdk/android/message/managing-polls/update-a-poll-option", - "title": "Update a poll option", + "sourcePath": "/sdk/android/conversation/retrieving-conversations/get-conversations-by-id", + "openimPath": "/sdk/android/conversation/retrieving-conversations/get-conversations-by-id", + "title": "Get conversations by ID", "context": "chat/sdk/android", "template": "guide", - "contentFile": "content/docs/chat/sdk/android/message/managing-polls/update-a-poll-option.mdx" + "contentFile": "content/docs/chat/sdk/android/conversation/retrieving-conversations/get-conversations-by-id.mdx" }, { - "sourcePath": "/sdk/android/message/managing-read-status-in-a-group-channel/get-read-status", - "openimPath": "/sdk/android/message/managing-read-status-in-a-group-channel/get-read-status", - "title": "Get read status of a message", + "sourcePath": "/sdk/android/conversation/retrieving-conversations/retrieve-conversation-list", + "openimPath": "/sdk/android/conversation/retrieving-conversations/retrieve-conversation-list", + "title": "Get the conversation list", "context": "chat/sdk/android", "template": "guide", - "contentFile": "content/docs/chat/sdk/android/message/managing-read-status-in-a-group-channel/get-read-status.mdx" + "contentFile": "content/docs/chat/sdk/android/conversation/retrieving-conversations/retrieve-conversation-list.mdx" }, { - "sourcePath": "/sdk/android/message/managing-read-status-in-a-group-channel/mark-messages-as-read", - "openimPath": "/sdk/android/message/managing-read-status-in-a-group-channel/mark-messages-as-read", - "title": "Mark messages as read", + "sourcePath": "/sdk/android/conversation/managing-conversations/pin-conversation", + "openimPath": "/sdk/android/conversation/managing-conversations/pin-conversation", + "title": "Pin or unpin a conversation", "context": "chat/sdk/android", "template": "guide", - "contentFile": "content/docs/chat/sdk/android/message/managing-read-status-in-a-group-channel/mark-messages-as-read.mdx" + "contentFile": "content/docs/chat/sdk/android/conversation/managing-conversations/pin-conversation.mdx" }, { - "sourcePath": "/sdk/android/message/managing-read-status-in-a-group-channel/mark-messages-as-unread", - "openimPath": "/sdk/android/message/managing-read-status-in-a-group-channel/mark-messages-as-unread", - "title": "Mark messages as unread", + "sourcePath": "/sdk/android/conversation/managing-conversations/set-conversation-extension", + "openimPath": "/sdk/android/conversation/managing-conversations/set-conversation-extension", + "title": "Set conversation extra data", "context": "chat/sdk/android", "template": "guide", - "contentFile": "content/docs/chat/sdk/android/message/managing-read-status-in-a-group-channel/mark-messages-as-unread.mdx" + "contentFile": "content/docs/chat/sdk/android/conversation/managing-conversations/set-conversation-extension.mdx" }, { - "sourcePath": "/sdk/android/message/managing-scheduled-messages-in-group-channel/cancel-a-scheduled-message", - "openimPath": "/sdk/android/message/managing-scheduled-messages-in-group-channel/cancel-a-scheduled-message", - "title": "Cancel a scheduled message", + "sourcePath": "/sdk/android/conversation/managing-conversations/set-conversation-draft", + "openimPath": "/sdk/android/conversation/managing-conversations/set-conversation-draft", + "title": "Set a conversation draft", "context": "chat/sdk/android", "template": "guide", - "contentFile": "content/docs/chat/sdk/android/message/managing-scheduled-messages-in-group-channel/cancel-a-scheduled-message.mdx" + "contentFile": "content/docs/chat/sdk/android/conversation/managing-conversations/set-conversation-draft.mdx" }, { - "sourcePath": "/sdk/android/message/managing-scheduled-messages-in-group-channel/list-all-scheduled-messages", - "openimPath": "/sdk/android/message/managing-scheduled-messages-in-group-channel/list-all-scheduled-messages", - "title": "List all scheduled messages", + "sourcePath": "/sdk/android/conversation/managing-conversations/set-message-receive-option", + "openimPath": "/sdk/android/conversation/managing-conversations/set-message-receive-option", + "title": "Set conversation message reception", "context": "chat/sdk/android", "template": "guide", - "contentFile": "content/docs/chat/sdk/android/message/managing-scheduled-messages-in-group-channel/list-all-scheduled-messages.mdx" + "contentFile": "content/docs/chat/sdk/android/conversation/managing-conversations/set-message-receive-option.mdx" }, { - "sourcePath": "/sdk/android/message/managing-scheduled-messages-in-group-channel/retrieve-a-scheduled-message", - "openimPath": "/sdk/android/message/managing-scheduled-messages-in-group-channel/retrieve-a-scheduled-message", - "title": "Retrieve a scheduled message", + "sourcePath": "/sdk/android/conversation/managing-conversations/clear-group-mentions", + "openimPath": "/sdk/android/conversation/managing-conversations/clear-group-mentions", + "title": "Reset group mention status", "context": "chat/sdk/android", "template": "guide", - "contentFile": "content/docs/chat/sdk/android/message/managing-scheduled-messages-in-group-channel/retrieve-a-scheduled-message.mdx" + "contentFile": "content/docs/chat/sdk/android/conversation/managing-conversations/clear-group-mentions.mdx" }, { - "sourcePath": "/sdk/android/message/managing-scheduled-messages-in-group-channel/retrieve-the-total-number-of-scheduled-messages", - "openimPath": "/sdk/android/message/managing-scheduled-messages-in-group-channel/retrieve-the-total-number-of-scheduled-messages", - "title": "Retrieve the total number of scheduled messages", + "sourcePath": "/sdk/android/conversation/managing-conversations/mark-conversation-read", + "openimPath": "/sdk/android/conversation/managing-conversations/mark-conversation-read", + "title": "Mark a conversation as read", "context": "chat/sdk/android", "template": "guide", - "contentFile": "content/docs/chat/sdk/android/message/managing-scheduled-messages-in-group-channel/retrieve-the-total-number-of-scheduled-messages.mdx" + "contentFile": "content/docs/chat/sdk/android/conversation/managing-conversations/mark-conversation-read.mdx" }, { - "sourcePath": "/sdk/android/message/managing-scheduled-messages-in-group-channel/send-a-scheduled-message-immediately", - "openimPath": "/sdk/android/message/managing-scheduled-messages-in-group-channel/send-a-scheduled-message-immediately", - "title": "Send scheduled message immediately", + "sourcePath": "/sdk/android/conversation/managing-conversations/get-total-unread-count", + "openimPath": "/sdk/android/conversation/managing-conversations/get-total-unread-count", + "title": "Track the total unread count", "context": "chat/sdk/android", "template": "guide", - "contentFile": "content/docs/chat/sdk/android/message/managing-scheduled-messages-in-group-channel/send-a-scheduled-message-immediately.mdx" + "contentFile": "content/docs/chat/sdk/android/conversation/managing-conversations/get-total-unread-count.mdx" }, { - "sourcePath": "/sdk/android/message/managing-scheduled-messages-in-group-channel/update-a-scheduled-message", - "openimPath": "/sdk/android/message/managing-scheduled-messages-in-group-channel/update-a-scheduled-message", - "title": "Update a scheduled message", + "sourcePath": "/sdk/android/conversation/managing-conversations/set-private-chat", + "openimPath": "/sdk/android/conversation/managing-conversations/set-private-chat", + "title": "Enable or disable burn after reading", "context": "chat/sdk/android", "template": "guide", - "contentFile": "content/docs/chat/sdk/android/message/managing-scheduled-messages-in-group-channel/update-a-scheduled-message.mdx" + "contentFile": "content/docs/chat/sdk/android/conversation/managing-conversations/set-private-chat.mdx" }, { - "sourcePath": "/sdk/android/message/receiving-messages-through-event-handler/receive-messages-in-a-group-channel", - "openimPath": "/sdk/android/message/receiving-messages-through-event-handler/receive-messages-in-a-group-channel", - "title": "Receive messages in a group channel", + "sourcePath": "/sdk/android/conversation/managing-conversations/set-burn-duration", + "openimPath": "/sdk/android/conversation/managing-conversations/set-burn-duration", + "title": "Set the burn duration", "context": "chat/sdk/android", "template": "guide", - "contentFile": "content/docs/chat/sdk/android/message/receiving-messages-through-event-handler/receive-messages-in-a-group-channel.mdx" + "contentFile": "content/docs/chat/sdk/android/conversation/managing-conversations/set-burn-duration.mdx" }, { - "sourcePath": "/sdk/android/message/receiving-messages-through-event-handler/receive-messages-in-an-open-channel", - "openimPath": "/sdk/android/message/receiving-messages-through-event-handler/receive-messages-in-an-open-channel", - "title": "Receive messages in an open channel", + "sourcePath": "/sdk/android/conversation/managing-conversations/set-message-destruct", + "openimPath": "/sdk/android/conversation/managing-conversations/set-message-destruct", + "title": "Schedule server message deletion", "context": "chat/sdk/android", "template": "guide", - "contentFile": "content/docs/chat/sdk/android/message/receiving-messages-through-event-handler/receive-messages-in-an-open-channel.mdx" + "contentFile": "content/docs/chat/sdk/android/conversation/managing-conversations/set-message-destruct.mdx" }, { - "sourcePath": "/sdk/android/message/retrieving-messages/retrieve-a-list-of-messages", - "openimPath": "/sdk/android/message/retrieving-messages/retrieve-a-list-of-messages", - "title": "Retrieve a list of messages", + "sourcePath": "/sdk/android/conversation/managing-conversations/hide-a-conversation", + "openimPath": "/sdk/android/conversation/managing-conversations/hide-a-conversation", + "title": "Hide a conversation", "context": "chat/sdk/android", "template": "guide", - "contentFile": "content/docs/chat/sdk/android/message/retrieving-messages/retrieve-a-list-of-messages.mdx" + "contentFile": "content/docs/chat/sdk/android/conversation/managing-conversations/hide-a-conversation.mdx" }, { - "sourcePath": "/sdk/android/message/retrieving-unread-count-in-a-group-channel/members-who-havent-read-a-message", - "openimPath": "/sdk/android/message/retrieving-unread-count-in-a-group-channel/members-who-havent-read-a-message", - "title": "Retrieve number of members who haven't read a message", + "sourcePath": "/sdk/android/conversation/managing-conversations/delete-conversation-with-messages", + "openimPath": "/sdk/android/conversation/managing-conversations/delete-conversation-with-messages", + "title": "Delete a conversation and its messages", "context": "chat/sdk/android", "template": "guide", - "contentFile": "content/docs/chat/sdk/android/message/retrieving-unread-count-in-a-group-channel/members-who-havent-read-a-message.mdx" + "contentFile": "content/docs/chat/sdk/android/conversation/managing-conversations/delete-conversation-with-messages.mdx" }, { - "sourcePath": "/sdk/android/message/retrieving-unread-count-in-a-group-channel/members-who-havent-received-a-message", - "openimPath": "/sdk/android/message/retrieving-unread-count-in-a-group-channel/members-who-havent-received-a-message", - "title": "Retrieve number of members who haven't received a message", + "sourcePath": "/sdk/android/conversation/managing-conversations/clear-conversation-messages", + "openimPath": "/sdk/android/conversation/managing-conversations/clear-conversation-messages", + "title": "Clear messages in a conversation", "context": "chat/sdk/android", "template": "guide", - "contentFile": "content/docs/chat/sdk/android/message/retrieving-unread-count-in-a-group-channel/members-who-havent-received-a-message.mdx" + "contentFile": "content/docs/chat/sdk/android/conversation/managing-conversations/clear-conversation-messages.mdx" }, { - "sourcePath": "/sdk/android/message/retrieving-unread-count-in-a-group-channel/unread-channels", - "openimPath": "/sdk/android/message/retrieving-unread-count-in-a-group-channel/unread-channels", - "title": "Retrieve number of channels with unread messages", + "sourcePath": "/sdk/android/group/overview-group", + "openimPath": "/sdk/android/group/overview-group", + "title": "Group overview", "context": "chat/sdk/android", "template": "guide", - "contentFile": "content/docs/chat/sdk/android/message/retrieving-unread-count-in-a-group-channel/unread-channels.mdx" + "contentFile": "content/docs/chat/sdk/android/group/overview-group.mdx" }, { - "sourcePath": "/sdk/android/message/retrieving-unread-count-in-a-group-channel/unread-items", - "openimPath": "/sdk/android/message/retrieving-unread-count-in-a-group-channel/unread-items", - "title": "Retrieve number of unread items", + "sourcePath": "/sdk/android/group/create-group", + "openimPath": "/sdk/android/group/create-group", + "title": "Create a group", "context": "chat/sdk/android", "template": "guide", - "contentFile": "content/docs/chat/sdk/android/message/retrieving-unread-count-in-a-group-channel/unread-items.mdx" + "contentFile": "content/docs/chat/sdk/android/group/create-group.mdx" }, { - "sourcePath": "/sdk/android/message/retrieving-unread-count-in-a-group-channel/unread-messages-in-a-channel", - "openimPath": "/sdk/android/message/retrieving-unread-count-in-a-group-channel/unread-messages-in-a-channel", - "title": "Retrieve number of unread messages in a channel", + "sourcePath": "/sdk/android/group/update-group-profile", + "openimPath": "/sdk/android/group/update-group-profile", + "title": "Update group profile", "context": "chat/sdk/android", "template": "guide", - "contentFile": "content/docs/chat/sdk/android/message/retrieving-unread-count-in-a-group-channel/unread-messages-in-a-channel.mdx" + "contentFile": "content/docs/chat/sdk/android/group/update-group-profile.mdx" }, { - "sourcePath": "/sdk/android/message/retrieving-unread-count-in-a-group-channel/unread-messages-in-all-channels", - "openimPath": "/sdk/android/message/retrieving-unread-count-in-a-group-channel/unread-messages-in-all-channels", - "title": "Retrieve number of unread messages in all channels", + "sourcePath": "/sdk/android/group/set-group-announcement", + "openimPath": "/sdk/android/group/set-group-announcement", + "title": "Publish a group announcement", "context": "chat/sdk/android", "template": "guide", - "contentFile": "content/docs/chat/sdk/android/message/retrieving-unread-count-in-a-group-channel/unread-messages-in-all-channels.mdx" + "contentFile": "content/docs/chat/sdk/android/group/set-group-announcement.mdx" }, { - "sourcePath": "/sdk/android/message/sending-a-message/cancel-an-in-progress-file-upload", - "openimPath": "/sdk/android/message/sending-a-message/cancel-an-in-progress-file-upload", - "title": "Cancel an in-progress file upload", + "sourcePath": "/sdk/android/group/set-group-extension", + "openimPath": "/sdk/android/group/set-group-extension", + "title": "Set group extra data", "context": "chat/sdk/android", "template": "guide", - "contentFile": "content/docs/chat/sdk/android/message/sending-a-message/cancel-an-in-progress-file-upload.mdx" + "contentFile": "content/docs/chat/sdk/android/group/set-group-extension.mdx" }, { - "sourcePath": "/sdk/android/message/sending-a-message/send-a-critical-alert-message-to-ios-device-users", - "openimPath": "/sdk/android/message/sending-a-message/send-a-critical-alert-message-to-ios-device-users", - "title": "Send a critical alert message to iOS device users", + "sourcePath": "/sdk/android/group/set-group-join-verification", + "openimPath": "/sdk/android/group/set-group-join-verification", + "title": "Set group join verification", "context": "chat/sdk/android", "template": "guide", - "contentFile": "content/docs/chat/sdk/android/message/sending-a-message/send-a-critical-alert-message-to-ios-device-users.mdx" + "contentFile": "content/docs/chat/sdk/android/group/set-group-join-verification.mdx" }, { - "sourcePath": "/sdk/android/message/sending-a-message/send-a-message", - "openimPath": "/sdk/android/message/sending-a-message/send-a-message", - "title": "Send a message", + "sourcePath": "/sdk/android/group/set-group-member-profile-access", + "openimPath": "/sdk/android/group/set-group-member-profile-access", + "title": "Set member profile access", "context": "chat/sdk/android", "template": "guide", - "contentFile": "content/docs/chat/sdk/android/message/sending-a-message/send-a-message.mdx" + "contentFile": "content/docs/chat/sdk/android/group/set-group-member-profile-access.mdx" }, { - "sourcePath": "/sdk/android/message/sending-a-message/send-an-admin-message", - "openimPath": "/sdk/android/message/sending-a-message/send-an-admin-message", - "title": "Send an admin message", + "sourcePath": "/sdk/android/group/set-group-member-friend-permission", + "openimPath": "/sdk/android/group/set-group-member-friend-permission", + "title": "Set member friend request permission", "context": "chat/sdk/android", "template": "guide", - "contentFile": "content/docs/chat/sdk/android/message/sending-a-message/send-an-admin-message.mdx" + "contentFile": "content/docs/chat/sdk/android/group/set-group-member-friend-permission.mdx" }, { - "sourcePath": "/sdk/android/message/sending-a-message/spam-flood-protection", - "openimPath": "/sdk/android/message/sending-a-message/spam-flood-protection", - "title": "Spam flood protection", + "sourcePath": "/sdk/android/group/change-group-mute", + "openimPath": "/sdk/android/group/change-group-mute", + "title": "Change group mute status", "context": "chat/sdk/android", "template": "guide", - "contentFile": "content/docs/chat/sdk/android/message/sending-a-message/spam-flood-protection.mdx" + "contentFile": "content/docs/chat/sdk/android/group/change-group-mute.mdx" }, { - "sourcePath": "/sdk/android/message/sending-a-message/track-file-upload-progress-using-a-handler", - "openimPath": "/sdk/android/message/sending-a-message/track-file-upload-progress-using-a-handler", - "title": "Track file upload progress using a handler", + "sourcePath": "/sdk/android/group/join-group", + "openimPath": "/sdk/android/group/join-group", + "title": "Apply to join a group", "context": "chat/sdk/android", "template": "guide", - "contentFile": "content/docs/chat/sdk/android/message/sending-a-message/track-file-upload-progress-using-a-handler.mdx" + "contentFile": "content/docs/chat/sdk/android/group/join-group.mdx" }, { - "sourcePath": "/sdk/android/message/translating-messages/translation-engine", - "openimPath": "/sdk/android/message/translating-messages/translation-engine", - "title": "Translation engine", + "sourcePath": "/sdk/android/group/quit-group", + "openimPath": "/sdk/android/group/quit-group", + "title": "Leave a group", "context": "chat/sdk/android", "template": "guide", - "contentFile": "content/docs/chat/sdk/android/message/translating-messages/translation-engine.mdx" + "contentFile": "content/docs/chat/sdk/android/group/quit-group.mdx" }, { - "sourcePath": "/sdk/android/message/using-message-threading/list-replies-in-a-message-thread", - "openimPath": "/sdk/android/message/using-message-threading/list-replies-in-a-message-thread", - "title": "List replies in a message thread", + "sourcePath": "/sdk/android/group/dismiss-group", + "openimPath": "/sdk/android/group/dismiss-group", + "title": "Dismiss a group", "context": "chat/sdk/android", "template": "guide", - "contentFile": "content/docs/chat/sdk/android/message/using-message-threading/list-replies-in-a-message-thread.mdx" + "contentFile": "content/docs/chat/sdk/android/group/dismiss-group.mdx" }, { - "sourcePath": "/sdk/android/migrating-to-sendbird", - "openimPath": "/sdk/android/migrating-to-openim", - "title": "Migrating to OpenIM", + "sourcePath": "/sdk/android/group/retrieving-groups/get-specified-groups-info", + "openimPath": "/sdk/android/group/retrieving-groups/get-specified-groups-info", + "title": "Get group information", "context": "chat/sdk/android", "template": "guide", - "contentFile": "content/docs/chat/sdk/android/migrating-to-openim.mdx" + "contentFile": "content/docs/chat/sdk/android/group/retrieving-groups/get-specified-groups-info.mdx" }, { - "sourcePath": "/sdk/android/push-notifications/managing-push-notifications/push-notification-content-templates", - "openimPath": "/sdk/android/push-notifications/managing-push-notifications/push-notification-content-templates", - "title": "Push notification content templates", + "sourcePath": "/sdk/android/group/retrieving-groups/get-joined-group-list-page", + "openimPath": "/sdk/android/group/retrieving-groups/get-joined-group-list-page", + "title": "Get joined groups by page", "context": "chat/sdk/android", "template": "guide", - "contentFile": "content/docs/chat/sdk/android/push-notifications/managing-push-notifications/push-notification-content-templates.mdx" + "contentFile": "content/docs/chat/sdk/android/group/retrieving-groups/get-joined-group-list-page.mdx" }, { - "sourcePath": "/sdk/android/push-notifications/managing-push-notifications/push-notification-tester", - "openimPath": "/sdk/android/push-notifications/managing-push-notifications/push-notification-tester", - "title": "Push notification tester", + "sourcePath": "/sdk/android/group/retrieving-groups/is-join-group", + "openimPath": "/sdk/android/group/retrieving-groups/is-join-group", + "title": "Check group membership", "context": "chat/sdk/android", "template": "guide", - "contentFile": "content/docs/chat/sdk/android/push-notifications/managing-push-notifications/push-notification-tester.mdx" + "contentFile": "content/docs/chat/sdk/android/group/retrieving-groups/is-join-group.mdx" }, { - "sourcePath": "/sdk/android/push-notifications/managing-push-notifications/set-up-push-notifications-for-fcm", - "openimPath": "/sdk/android/push-notifications/managing-push-notifications/set-up-push-notifications-for-fcm", - "title": "Set up push notifications for FCM", + "sourcePath": "/sdk/android/group/retrieving-groups/search-groups", + "openimPath": "/sdk/android/group/retrieving-groups/search-groups", + "title": "Search groups", "context": "chat/sdk/android", "template": "guide", - "contentFile": "content/docs/chat/sdk/android/push-notifications/managing-push-notifications/set-up-push-notifications-for-fcm.mdx" + "contentFile": "content/docs/chat/sdk/android/group/retrieving-groups/search-groups.mdx" }, { - "sourcePath": "/sdk/android/push-notifications/managing-push-notifications/set-up-push-notifications-for-hms", - "openimPath": "/sdk/android/push-notifications/managing-push-notifications/set-up-push-notifications-for-hms", - "title": "Set up push notifications for HMS", + "sourcePath": "/sdk/android/group/group-applications/overview-group-applications", + "openimPath": "/sdk/android/group/group-applications/overview-group-applications", + "title": "Group applications overview", "context": "chat/sdk/android", "template": "guide", - "contentFile": "content/docs/chat/sdk/android/push-notifications/managing-push-notifications/set-up-push-notifications-for-hms.mdx" + "contentFile": "content/docs/chat/sdk/android/group/group-applications/overview-group-applications.mdx" }, { - "sourcePath": "/sdk/android/push-notifications/marking-push-notifications-as-delivered/mark-push-notifications-as-delivered", - "openimPath": "/sdk/android/push-notifications/marking-push-notifications-as-delivered/mark-push-notifications-as-delivered", - "title": "Mark push notifications as delivered", + "sourcePath": "/sdk/android/group/group-applications/get-group-application-list-as-recipient", + "openimPath": "/sdk/android/group/group-applications/get-group-application-list-as-recipient", + "title": "Get received group applications", "context": "chat/sdk/android", "template": "guide", - "contentFile": "content/docs/chat/sdk/android/push-notifications/marking-push-notifications-as-delivered/mark-push-notifications-as-delivered.mdx" + "contentFile": "content/docs/chat/sdk/android/group/group-applications/get-group-application-list-as-recipient.mdx" }, { - "sourcePath": "/sdk/android/push-notifications/multi-device-support/set-up-push-notifications-for-fcm", - "openimPath": "/sdk/android/push-notifications/multi-device-support/set-up-push-notifications-for-fcm", - "title": "Set up push notifications for FCM", + "sourcePath": "/sdk/android/group/group-applications/get-group-application-list-as-applicant", + "openimPath": "/sdk/android/group/group-applications/get-group-application-list-as-applicant", + "title": "Get sent group applications", "context": "chat/sdk/android", "template": "guide", - "contentFile": "content/docs/chat/sdk/android/push-notifications/multi-device-support/set-up-push-notifications-for-fcm.mdx" + "contentFile": "content/docs/chat/sdk/android/group/group-applications/get-group-application-list-as-applicant.mdx" }, { - "sourcePath": "/sdk/android/push-notifications/multi-device-support/set-up-push-notifications-for-hms", - "openimPath": "/sdk/android/push-notifications/multi-device-support/set-up-push-notifications-for-hms", - "title": "Set up push notifications for HMS", + "sourcePath": "/sdk/android/group/group-applications/accept-group-application", + "openimPath": "/sdk/android/group/group-applications/accept-group-application", + "title": "Accept a group application", "context": "chat/sdk/android", "template": "guide", - "contentFile": "content/docs/chat/sdk/android/push-notifications/multi-device-support/set-up-push-notifications-for-hms.mdx" + "contentFile": "content/docs/chat/sdk/android/group/group-applications/accept-group-application.mdx" }, { - "sourcePath": "/sdk/android/report/creating-a-report/report-a-message-user-or-channel", - "openimPath": "/sdk/android/report/creating-a-report/report-a-message-user-or-channel", - "title": "Report a message, user, or channel", + "sourcePath": "/sdk/android/group/group-applications/refuse-group-application", + "openimPath": "/sdk/android/group/group-applications/refuse-group-application", + "title": "Reject a group application", "context": "chat/sdk/android", "template": "guide", - "contentFile": "content/docs/chat/sdk/android/report/creating-a-report/report-a-message-user-or-channel.mdx" + "contentFile": "content/docs/chat/sdk/android/group/group-applications/refuse-group-application.mdx" }, { - "sourcePath": "/sdk/android/user/managing-user-metadata/manage-user-metadata", - "openimPath": "/sdk/android/user/managing-user-metadata/manage-user-metadata", - "title": "Manage user metadata", + "sourcePath": "/sdk/android/group/retrieving-group-members/overview-retrieving-group-members", + "openimPath": "/sdk/android/group/retrieving-group-members/overview-retrieving-group-members", + "title": "Group member queries overview", "context": "chat/sdk/android", "template": "guide", - "contentFile": "content/docs/chat/sdk/android/user/managing-user-metadata/manage-user-metadata.mdx" + "contentFile": "content/docs/chat/sdk/android/group/retrieving-group-members/overview-retrieving-group-members.mdx" }, { - "sourcePath": "/sdk/android/user/moderating-a-user/retrieve-a-list-of-blocked-users", - "openimPath": "/sdk/android/user/moderating-a-user/retrieve-a-list-of-blocked-users", - "title": "Retrieve a list of blocked users", + "sourcePath": "/sdk/android/group/retrieving-group-members/get-group-member-list", + "openimPath": "/sdk/android/group/retrieving-group-members/get-group-member-list", + "title": "Get group members", "context": "chat/sdk/android", "template": "guide", - "contentFile": "content/docs/chat/sdk/android/user/moderating-a-user/retrieve-a-list-of-blocked-users.mdx" + "contentFile": "content/docs/chat/sdk/android/group/retrieving-group-members/get-group-member-list.mdx" }, { - "sourcePath": "/sdk/android/user/moderating-a-user/retrieve-a-list-of-muted-users", - "openimPath": "/sdk/android/user/moderating-a-user/retrieve-a-list-of-muted-users", - "title": "Retrieve a list of muted users", + "sourcePath": "/sdk/android/group/retrieving-group-members/get-specified-group-members-info", + "openimPath": "/sdk/android/group/retrieving-group-members/get-specified-group-members-info", + "title": "Get group member profiles", "context": "chat/sdk/android", "template": "guide", - "contentFile": "content/docs/chat/sdk/android/user/moderating-a-user/retrieve-a-list-of-muted-users.mdx" + "contentFile": "content/docs/chat/sdk/android/group/retrieving-group-members/get-specified-group-members-info.mdx" }, { - "sourcePath": "/sdk/android/user/overview-user", - "openimPath": "/sdk/android/user/overview-user", - "title": "Overview", + "sourcePath": "/sdk/android/group/retrieving-group-members/get-users-in-group", + "openimPath": "/sdk/android/group/retrieving-group-members/get-users-in-group", + "title": "Check users in a group", "context": "chat/sdk/android", "template": "guide", - "contentFile": "content/docs/chat/sdk/android/user/overview-user.mdx" + "contentFile": "content/docs/chat/sdk/android/group/retrieving-group-members/get-users-in-group.mdx" }, { - "sourcePath": "/sdk/android/user/retrieving-and-updating-user-information/retrieve-the-latest-information-on-participants", - "openimPath": "/sdk/android/user/retrieving-and-updating-user-information/retrieve-the-latest-information-on-participants", - "title": "Retrieve the latest information on participants", + "sourcePath": "/sdk/android/group/retrieving-group-members/get-group-member-owner-and-admin", + "openimPath": "/sdk/android/group/retrieving-group-members/get-group-member-owner-and-admin", + "title": "Get group owners and admins", "context": "chat/sdk/android", "template": "guide", - "contentFile": "content/docs/chat/sdk/android/user/retrieving-and-updating-user-information/retrieve-the-latest-information-on-participants.mdx" + "contentFile": "content/docs/chat/sdk/android/group/retrieving-group-members/get-group-member-owner-and-admin.mdx" }, { - "sourcePath": "/sdk/android/user/retrieving-and-updating-user-information/update-user-profile", - "openimPath": "/sdk/android/user/retrieving-and-updating-user-information/update-user-profile", - "title": "Update user profile", + "sourcePath": "/sdk/android/group/retrieving-group-members/search-group-members", + "openimPath": "/sdk/android/group/retrieving-group-members/search-group-members", + "title": "Search group members", "context": "chat/sdk/android", "template": "guide", - "contentFile": "content/docs/chat/sdk/android/user/retrieving-and-updating-user-information/update-user-profile.mdx" + "contentFile": "content/docs/chat/sdk/android/group/retrieving-group-members/search-group-members.mdx" }, { - "sourcePath": "/sdk/android/user/retrieving-users/retrieve-a-list-of-members-and-operators-in-a-specific-order", - "openimPath": "/sdk/android/user/retrieving-users/retrieve-a-list-of-members-and-operators-in-a-specific-order", - "title": "Retrieve a list of members and operators in a specific order", + "sourcePath": "/sdk/android/group/managing-group-members/invite-user-to-group", + "openimPath": "/sdk/android/group/managing-group-members/invite-user-to-group", + "title": "Invite users to a group", "context": "chat/sdk/android", "template": "guide", - "contentFile": "content/docs/chat/sdk/android/user/retrieving-users/retrieve-a-list-of-members-and-operators-in-a-specific-order.mdx" + "contentFile": "content/docs/chat/sdk/android/group/managing-group-members/invite-user-to-group.mdx" }, { - "sourcePath": "/sdk/android/user/retrieving-users/retrieve-a-list-of-operators", - "openimPath": "/sdk/android/user/retrieving-users/retrieve-a-list-of-operators", - "title": "Retrieve a list of operators", + "sourcePath": "/sdk/android/group/managing-group-members/kick-group-member", + "openimPath": "/sdk/android/group/managing-group-members/kick-group-member", + "title": "Remove group members", "context": "chat/sdk/android", "template": "guide", - "contentFile": "content/docs/chat/sdk/android/user/retrieving-users/retrieve-a-list-of-operators.mdx" + "contentFile": "content/docs/chat/sdk/android/group/managing-group-members/kick-group-member.mdx" }, { - "sourcePath": "/sdk/android/user/retrieving-users/retrieve-a-list-of-users-in-a-channel", - "openimPath": "/sdk/android/user/retrieving-users/retrieve-a-list-of-users-in-a-channel", - "title": "Retrieve a list of users in a channel", + "sourcePath": "/sdk/android/group/managing-group-members/set-group-member-nickname", + "openimPath": "/sdk/android/group/managing-group-members/set-group-member-nickname", + "title": "Update a group nickname", "context": "chat/sdk/android", "template": "guide", - "contentFile": "content/docs/chat/sdk/android/user/retrieving-users/retrieve-a-list-of-users-in-a-channel.mdx" + "contentFile": "content/docs/chat/sdk/android/group/managing-group-members/set-group-member-nickname.mdx" }, { - "sourcePath": "/sdk/android/user/retrieving-users/retrieve-a-list-of-users-in-an-application", - "openimPath": "/sdk/android/user/retrieving-users/retrieve-a-list-of-users-in-an-application", - "title": "Retrieve a list of users in an application", + "sourcePath": "/sdk/android/group/managing-group-members/set-group-member-role-level", + "openimPath": "/sdk/android/group/managing-group-members/set-group-member-role-level", + "title": "Manage group administrators", "context": "chat/sdk/android", "template": "guide", - "contentFile": "content/docs/chat/sdk/android/user/retrieving-users/retrieve-a-list-of-users-in-an-application.mdx" + "contentFile": "content/docs/chat/sdk/android/group/managing-group-members/set-group-member-role-level.mdx" }, { - "sourcePath": "/sdk/android/message/marking-messages-as-read-in-a-group-channel/mark-messages-as-read", - "openimPath": "/sdk/android/message/marking-messages-as-read-in-a-group-channel/mark-messages-as-read", - "title": "Mark messages as read", + "sourcePath": "/sdk/android/group/managing-group-members/set-group-member-avatar", + "openimPath": "/sdk/android/group/managing-group-members/set-group-member-avatar", + "title": "Update a group member avatar", "context": "chat/sdk/android", "template": "guide", - "contentFile": "content/docs/chat/sdk/android/message/marking-messages-as-read-in-a-group-channel/mark-messages-as-read.mdx" - }, - { - "sourcePath": "/sdk/flutter/overview", - "openimPath": "/sdk/flutter/overview", - "title": "OpenIM SDK for Flutter", - "context": "chat/sdk/flutter", - "template": "overview", - "contentFile": "content/docs/chat/sdk/flutter/overview.mdx" - }, - { - "sourcePath": "/sdk/flutter/getting-started/before-you-start", - "openimPath": "/sdk/flutter/getting-started/before-you-start", - "title": "Before you start", - "context": "chat/sdk/flutter", - "template": "guide", - "contentFile": "content/docs/chat/sdk/flutter/getting-started/before-you-start.mdx" + "contentFile": "content/docs/chat/sdk/android/group/managing-group-members/set-group-member-avatar.mdx" }, { - "sourcePath": "/sdk/flutter/getting-started/environment-specific-implementation", - "openimPath": "/sdk/flutter/getting-started/environment-specific-implementation", - "title": "Environment-specific implementation", - "context": "chat/sdk/flutter", + "sourcePath": "/sdk/android/group/managing-group-members/set-group-member-extension", + "openimPath": "/sdk/android/group/managing-group-members/set-group-member-extension", + "title": "Set group member extra data", + "context": "chat/sdk/android", "template": "guide", - "contentFile": "content/docs/chat/sdk/flutter/getting-started/environment-specific-implementation.mdx" + "contentFile": "content/docs/chat/sdk/android/group/managing-group-members/set-group-member-extension.mdx" }, { - "sourcePath": "/sdk/flutter/getting-started/authenticate-and-manage-session", - "openimPath": "/sdk/flutter/getting-started/authenticate-and-manage-session", - "title": "Authenticate and manage a session", - "context": "chat/sdk/flutter", + "sourcePath": "/sdk/android/group/managing-group-members/transfer-group-owner", + "openimPath": "/sdk/android/group/managing-group-members/transfer-group-owner", + "title": "Transfer group ownership", + "context": "chat/sdk/android", "template": "guide", - "contentFile": "content/docs/chat/sdk/flutter/getting-started/authenticate-and-manage-session.mdx" + "contentFile": "content/docs/chat/sdk/android/group/managing-group-members/transfer-group-owner.mdx" }, { - "sourcePath": "/sdk/flutter/getting-started/send-first-message", - "openimPath": "/sdk/flutter/getting-started/send-first-message", - "title": "Send your first message", - "context": "chat/sdk/flutter", + "sourcePath": "/sdk/android/group/managing-group-members/change-group-member-mute", + "openimPath": "/sdk/android/group/managing-group-members/change-group-member-mute", + "title": "Mute or unmute a group member", + "context": "chat/sdk/android", "template": "guide", - "contentFile": "content/docs/chat/sdk/flutter/getting-started/send-first-message.mdx" + "contentFile": "content/docs/chat/sdk/android/group/managing-group-members/change-group-member-mute.mdx" }, { - "sourcePath": "/sdk/flutter/user/overview-user", - "openimPath": "/sdk/flutter/user/overview-user", - "title": "Overview", - "context": "chat/sdk/flutter", + "sourcePath": "/sdk/android/message/overview-message", + "openimPath": "/sdk/android/message/overview-message", + "title": "Message overview", + "context": "chat/sdk/android", "template": "guide", - "contentFile": "content/docs/chat/sdk/flutter/user/overview-user.mdx" + "contentFile": "content/docs/chat/sdk/android/message/overview-message.mdx" }, { - "sourcePath": "/sdk/flutter/user/retrieving-users/retrieve-users", - "openimPath": "/sdk/flutter/user/retrieving-users/retrieve-users", - "title": "Retrieve users", - "context": "chat/sdk/flutter", + "sourcePath": "/sdk/android/message/creating-messages/create-text-message", + "openimPath": "/sdk/android/message/creating-messages/create-text-message", + "title": "Create a text message", + "context": "chat/sdk/android", "template": "guide", - "contentFile": "content/docs/chat/sdk/flutter/user/retrieving-users/retrieve-users.mdx" + "contentFile": "content/docs/chat/sdk/android/message/creating-messages/create-text-message.mdx" }, { - "sourcePath": "/sdk/flutter/user/retrieving-and-updating-user-information/get-self-profile", - "openimPath": "/sdk/flutter/user/retrieving-and-updating-user-information/get-self-profile", - "title": "View your profile", - "context": "chat/sdk/flutter", + "sourcePath": "/sdk/android/message/creating-messages/create-text-at-message", + "openimPath": "/sdk/android/message/creating-messages/create-text-at-message", + "title": "Create a mention message", + "context": "chat/sdk/android", "template": "guide", - "contentFile": "content/docs/chat/sdk/flutter/user/retrieving-and-updating-user-information/get-self-profile.mdx" + "contentFile": "content/docs/chat/sdk/android/message/creating-messages/create-text-at-message.mdx" }, { - "sourcePath": "/sdk/flutter/user/retrieving-and-updating-user-information/update-self-profile", - "openimPath": "/sdk/flutter/user/retrieving-and-updating-user-information/update-self-profile", - "title": "Update your profile", - "context": "chat/sdk/flutter", + "sourcePath": "/sdk/android/message/creating-messages/create-custom-message", + "openimPath": "/sdk/android/message/creating-messages/create-custom-message", + "title": "Create a custom message", + "context": "chat/sdk/android", "template": "guide", - "contentFile": "content/docs/chat/sdk/flutter/user/retrieving-and-updating-user-information/update-self-profile.mdx" + "contentFile": "content/docs/chat/sdk/android/message/creating-messages/create-custom-message.mdx" }, { - "sourcePath": "/sdk/flutter/user/retrieving-and-updating-user-information/set-global-message-reception", - "openimPath": "/sdk/flutter/user/retrieving-and-updating-user-information/set-global-message-reception", - "title": "Set global message reception", - "context": "chat/sdk/flutter", - "template": "overview", - "contentFile": "content/docs/chat/sdk/flutter/user/retrieving-and-updating-user-information/set-global-message-reception.mdx" + "sourcePath": "/sdk/android/message/creating-messages/create-image-message", + "openimPath": "/sdk/android/message/creating-messages/create-image-message", + "title": "Create an image message", + "context": "chat/sdk/android", + "template": "guide", + "contentFile": "content/docs/chat/sdk/android/message/creating-messages/create-image-message.mdx" }, { - "sourcePath": "/sdk/flutter/user/retrieving-and-updating-user-information/subscribe-user-status", - "openimPath": "/sdk/flutter/user/retrieving-and-updating-user-information/subscribe-user-status", - "title": "Subscribe to user status", - "context": "chat/sdk/flutter", + "sourcePath": "/sdk/android/message/creating-messages/create-image-message-by-file", + "openimPath": "/sdk/android/message/creating-messages/create-image-message-by-file", + "title": "Create an image message from a local path", + "context": "chat/sdk/android", "template": "guide", - "contentFile": "content/docs/chat/sdk/flutter/user/retrieving-and-updating-user-information/subscribe-user-status.mdx" + "contentFile": "content/docs/chat/sdk/android/message/creating-messages/create-image-message-by-file.mdx" }, { - "sourcePath": "/sdk/flutter/user/retrieving-and-updating-user-information/get-subscribed-user-status", - "openimPath": "/sdk/flutter/user/retrieving-and-updating-user-information/get-subscribed-user-status", - "title": "Refresh subscribed user status", - "context": "chat/sdk/flutter", + "sourcePath": "/sdk/android/message/creating-messages/create-image-message-by-url", + "openimPath": "/sdk/android/message/creating-messages/create-image-message-by-url", + "title": "Create an image message from URLs", + "context": "chat/sdk/android", "template": "guide", - "contentFile": "content/docs/chat/sdk/flutter/user/retrieving-and-updating-user-information/get-subscribed-user-status.mdx" + "contentFile": "content/docs/chat/sdk/android/message/creating-messages/create-image-message-by-url.mdx" }, { - "sourcePath": "/sdk/flutter/user/retrieving-and-updating-user-information/unsubscribe-user-status", - "openimPath": "/sdk/flutter/user/retrieving-and-updating-user-information/unsubscribe-user-status", - "title": "Unsubscribe from user status", - "context": "chat/sdk/flutter", + "sourcePath": "/sdk/android/message/creating-messages/create-sound-message", + "openimPath": "/sdk/android/message/creating-messages/create-sound-message", + "title": "Create an audio message", + "context": "chat/sdk/android", "template": "guide", - "contentFile": "content/docs/chat/sdk/flutter/user/retrieving-and-updating-user-information/unsubscribe-user-status.mdx" + "contentFile": "content/docs/chat/sdk/android/message/creating-messages/create-sound-message.mdx" }, { - "sourcePath": "/sdk/flutter/user/friends/get-friend-list-page", - "openimPath": "/sdk/flutter/user/friends/get-friend-list-page", - "title": "Get the friend list", - "context": "chat/sdk/flutter", + "sourcePath": "/sdk/android/message/creating-messages/create-sound-message-by-file", + "openimPath": "/sdk/android/message/creating-messages/create-sound-message-by-file", + "title": "Create an audio message from a local path", + "context": "chat/sdk/android", "template": "guide", - "contentFile": "content/docs/chat/sdk/flutter/user/friends/get-friend-list-page.mdx" + "contentFile": "content/docs/chat/sdk/android/message/creating-messages/create-sound-message-by-file.mdx" }, { - "sourcePath": "/sdk/flutter/user/friends/search-friends", - "openimPath": "/sdk/flutter/user/friends/search-friends", - "title": "Search friends", - "context": "chat/sdk/flutter", + "sourcePath": "/sdk/android/message/creating-messages/create-sound-message-by-url", + "openimPath": "/sdk/android/message/creating-messages/create-sound-message-by-url", + "title": "Create an audio message from a URL", + "context": "chat/sdk/android", "template": "guide", - "contentFile": "content/docs/chat/sdk/flutter/user/friends/search-friends.mdx" + "contentFile": "content/docs/chat/sdk/android/message/creating-messages/create-sound-message-by-url.mdx" }, { - "sourcePath": "/sdk/flutter/user/friends/get-friends-info", - "openimPath": "/sdk/flutter/user/friends/get-friends-info", - "title": "Get friend profiles", - "context": "chat/sdk/flutter", + "sourcePath": "/sdk/android/message/creating-messages/create-video-message", + "openimPath": "/sdk/android/message/creating-messages/create-video-message", + "title": "Create a video message", + "context": "chat/sdk/android", "template": "guide", - "contentFile": "content/docs/chat/sdk/flutter/user/friends/get-friends-info.mdx" + "contentFile": "content/docs/chat/sdk/android/message/creating-messages/create-video-message.mdx" }, { - "sourcePath": "/sdk/flutter/user/friends/check-friend", - "openimPath": "/sdk/flutter/user/friends/check-friend", - "title": "Check friendship status", - "context": "chat/sdk/flutter", + "sourcePath": "/sdk/android/message/creating-messages/create-video-message-by-file", + "openimPath": "/sdk/android/message/creating-messages/create-video-message-by-file", + "title": "Create a video message from local paths", + "context": "chat/sdk/android", "template": "guide", - "contentFile": "content/docs/chat/sdk/flutter/user/friends/check-friend.mdx" + "contentFile": "content/docs/chat/sdk/android/message/creating-messages/create-video-message-by-file.mdx" }, { - "sourcePath": "/sdk/flutter/user/friends/update-friends", - "openimPath": "/sdk/flutter/user/friends/update-friends", - "title": "Update friend information", - "context": "chat/sdk/flutter", + "sourcePath": "/sdk/android/message/creating-messages/create-video-message-by-url", + "openimPath": "/sdk/android/message/creating-messages/create-video-message-by-url", + "title": "Create a video message from URLs", + "context": "chat/sdk/android", "template": "guide", - "contentFile": "content/docs/chat/sdk/flutter/user/friends/update-friends.mdx" + "contentFile": "content/docs/chat/sdk/android/message/creating-messages/create-video-message-by-url.mdx" }, { - "sourcePath": "/sdk/flutter/user/friends/delete-friend", - "openimPath": "/sdk/flutter/user/friends/delete-friend", - "title": "Delete a friend", - "context": "chat/sdk/flutter", + "sourcePath": "/sdk/android/message/creating-messages/create-file-message", + "openimPath": "/sdk/android/message/creating-messages/create-file-message", + "title": "Create a file message", + "context": "chat/sdk/android", "template": "guide", - "contentFile": "content/docs/chat/sdk/flutter/user/friends/delete-friend.mdx" + "contentFile": "content/docs/chat/sdk/android/message/creating-messages/create-file-message.mdx" }, { - "sourcePath": "/sdk/flutter/user/friend-applications/add-friend", - "openimPath": "/sdk/flutter/user/friend-applications/add-friend", - "title": "Send a friend application", - "context": "chat/sdk/flutter", + "sourcePath": "/sdk/android/message/creating-messages/create-file-message-by-file", + "openimPath": "/sdk/android/message/creating-messages/create-file-message-by-file", + "title": "Create a file message from a local path", + "context": "chat/sdk/android", "template": "guide", - "contentFile": "content/docs/chat/sdk/flutter/user/friend-applications/add-friend.mdx" + "contentFile": "content/docs/chat/sdk/android/message/creating-messages/create-file-message-by-file.mdx" }, { - "sourcePath": "/sdk/flutter/user/friend-applications/get-friend-application-list-as-recipient", - "openimPath": "/sdk/flutter/user/friend-applications/get-friend-application-list-as-recipient", - "title": "Get received friend applications", - "context": "chat/sdk/flutter", + "sourcePath": "/sdk/android/message/creating-messages/create-file-message-by-url", + "openimPath": "/sdk/android/message/creating-messages/create-file-message-by-url", + "title": "Create a file message from a URL", + "context": "chat/sdk/android", "template": "guide", - "contentFile": "content/docs/chat/sdk/flutter/user/friend-applications/get-friend-application-list-as-recipient.mdx" + "contentFile": "content/docs/chat/sdk/android/message/creating-messages/create-file-message-by-url.mdx" }, { - "sourcePath": "/sdk/flutter/user/friend-applications/get-friend-application-list-as-applicant", - "openimPath": "/sdk/flutter/user/friend-applications/get-friend-application-list-as-applicant", - "title": "Get sent friend applications", - "context": "chat/sdk/flutter", + "sourcePath": "/sdk/android/message/creating-messages/create-card-message", + "openimPath": "/sdk/android/message/creating-messages/create-card-message", + "title": "Create a contact card message", + "context": "chat/sdk/android", "template": "guide", - "contentFile": "content/docs/chat/sdk/flutter/user/friend-applications/get-friend-application-list-as-applicant.mdx" + "contentFile": "content/docs/chat/sdk/android/message/creating-messages/create-card-message.mdx" }, { - "sourcePath": "/sdk/flutter/user/friend-applications/get-friend-application-unhandled-count", - "openimPath": "/sdk/flutter/user/friend-applications/get-friend-application-unhandled-count", - "title": "Get pending application count", - "context": "chat/sdk/flutter", + "sourcePath": "/sdk/android/message/creating-messages/create-location-message", + "openimPath": "/sdk/android/message/creating-messages/create-location-message", + "title": "Create a location message", + "context": "chat/sdk/android", "template": "guide", - "contentFile": "content/docs/chat/sdk/flutter/user/friend-applications/get-friend-application-unhandled-count.mdx" + "contentFile": "content/docs/chat/sdk/android/message/creating-messages/create-location-message.mdx" }, { - "sourcePath": "/sdk/flutter/user/friend-applications/accept-friend-application", - "openimPath": "/sdk/flutter/user/friend-applications/accept-friend-application", - "title": "Accept a friend application", - "context": "chat/sdk/flutter", + "sourcePath": "/sdk/android/message/creating-messages/create-face-message", + "openimPath": "/sdk/android/message/creating-messages/create-face-message", + "title": "Create an emoji message", + "context": "chat/sdk/android", "template": "guide", - "contentFile": "content/docs/chat/sdk/flutter/user/friend-applications/accept-friend-application.mdx" + "contentFile": "content/docs/chat/sdk/android/message/creating-messages/create-face-message.mdx" }, { - "sourcePath": "/sdk/flutter/user/friend-applications/refuse-friend-application", - "openimPath": "/sdk/flutter/user/friend-applications/refuse-friend-application", - "title": "Reject a friend application", - "context": "chat/sdk/flutter", + "sourcePath": "/sdk/android/message/creating-messages/create-quote-message", + "openimPath": "/sdk/android/message/creating-messages/create-quote-message", + "title": "Create a reply message", + "context": "chat/sdk/android", "template": "guide", - "contentFile": "content/docs/chat/sdk/flutter/user/friend-applications/refuse-friend-application.mdx" + "contentFile": "content/docs/chat/sdk/android/message/creating-messages/create-quote-message.mdx" }, { - "sourcePath": "/sdk/flutter/user/moderating-a-user/retrieve-a-list-of-blocked-users", - "openimPath": "/sdk/flutter/user/moderating-a-user/retrieve-a-list-of-blocked-users", - "title": "Retrieve a list of blocked users", - "context": "chat/sdk/flutter", + "sourcePath": "/sdk/android/message/creating-messages/create-advanced-text-message", + "openimPath": "/sdk/android/message/creating-messages/create-advanced-text-message", + "title": "Create a rich-text message", + "context": "chat/sdk/android", "template": "guide", - "contentFile": "content/docs/chat/sdk/flutter/user/moderating-a-user/retrieve-a-list-of-blocked-users.mdx" + "contentFile": "content/docs/chat/sdk/android/message/creating-messages/create-advanced-text-message.mdx" }, { - "sourcePath": "/sdk/flutter/user/moderating-a-user/block-user", - "openimPath": "/sdk/flutter/user/moderating-a-user/block-user", - "title": "Block a user", - "context": "chat/sdk/flutter", + "sourcePath": "/sdk/android/message/creating-messages/create-advanced-quote-message", + "openimPath": "/sdk/android/message/creating-messages/create-advanced-quote-message", + "title": "Create a rich-text reply", + "context": "chat/sdk/android", "template": "guide", - "contentFile": "content/docs/chat/sdk/flutter/user/moderating-a-user/block-user.mdx" + "contentFile": "content/docs/chat/sdk/android/message/creating-messages/create-advanced-quote-message.mdx" }, { - "sourcePath": "/sdk/flutter/user/moderating-a-user/unblock-user", - "openimPath": "/sdk/flutter/user/moderating-a-user/unblock-user", - "title": "Unblock a user", - "context": "chat/sdk/flutter", + "sourcePath": "/sdk/android/message/creating-messages/create-forward-message", + "openimPath": "/sdk/android/message/creating-messages/create-forward-message", + "title": "Create a forwarded message", + "context": "chat/sdk/android", "template": "guide", - "contentFile": "content/docs/chat/sdk/flutter/user/moderating-a-user/unblock-user.mdx" + "contentFile": "content/docs/chat/sdk/android/message/creating-messages/create-forward-message.mdx" }, { - "sourcePath": "/sdk/flutter/conversation/overview-conversation", - "openimPath": "/sdk/flutter/conversation/overview-conversation", - "title": "Conversation overview", - "context": "chat/sdk/flutter", + "sourcePath": "/sdk/android/message/creating-messages/create-merger-message", + "openimPath": "/sdk/android/message/creating-messages/create-merger-message", + "title": "Create a merged message", + "context": "chat/sdk/android", "template": "guide", - "contentFile": "content/docs/chat/sdk/flutter/conversation/overview-conversation.mdx" + "contentFile": "content/docs/chat/sdk/android/message/creating-messages/create-merger-message.mdx" }, { - "sourcePath": "/sdk/flutter/conversation/retrieving-conversations/get-conversation-by-target", - "openimPath": "/sdk/flutter/conversation/retrieving-conversations/get-conversation-by-target", - "title": "Open a conversation", - "context": "chat/sdk/flutter", + "sourcePath": "/sdk/android/message/sending-messages/send-message", + "openimPath": "/sdk/android/message/sending-messages/send-message", + "title": "Send a message", + "context": "chat/sdk/android", "template": "guide", - "contentFile": "content/docs/chat/sdk/flutter/conversation/retrieving-conversations/get-conversation-by-target.mdx" + "contentFile": "content/docs/chat/sdk/android/message/sending-messages/send-message.mdx" }, { - "sourcePath": "/sdk/flutter/conversation/retrieving-conversations/get-conversation-id", - "openimPath": "/sdk/flutter/conversation/retrieving-conversations/get-conversation-id", - "title": "Resolve a conversation ID", - "context": "chat/sdk/flutter", + "sourcePath": "/sdk/android/message/sending-messages/send-message-not-oss", + "openimPath": "/sdk/android/message/sending-messages/send-message-not-oss", + "title": "Send a message without OSS", + "context": "chat/sdk/android", "template": "guide", - "contentFile": "content/docs/chat/sdk/flutter/conversation/retrieving-conversations/get-conversation-id.mdx" + "contentFile": "content/docs/chat/sdk/android/message/sending-messages/send-message-not-oss.mdx" }, { - "sourcePath": "/sdk/flutter/conversation/retrieving-conversations/get-conversations-by-id", - "openimPath": "/sdk/flutter/conversation/retrieving-conversations/get-conversations-by-id", - "title": "Get conversations by ID", - "context": "chat/sdk/flutter", + "sourcePath": "/sdk/android/message/sending-messages/set-msg-send-progress-listener", + "openimPath": "/sdk/android/message/sending-messages/set-msg-send-progress-listener", + "title": "Track message sending progress", + "context": "chat/sdk/android", "template": "guide", - "contentFile": "content/docs/chat/sdk/flutter/conversation/retrieving-conversations/get-conversations-by-id.mdx" + "contentFile": "content/docs/chat/sdk/android/message/sending-messages/set-msg-send-progress-listener.mdx" }, { - "sourcePath": "/sdk/flutter/conversation/retrieving-conversations/retrieve-conversation-list", - "openimPath": "/sdk/flutter/conversation/retrieving-conversations/retrieve-conversation-list", - "title": "Retrieve a conversation list", - "context": "chat/sdk/flutter", + "sourcePath": "/sdk/android/message/receiving-messages/receive-messages", + "openimPath": "/sdk/android/message/receiving-messages/receive-messages", + "title": "Receive messages", + "context": "chat/sdk/android", "template": "guide", - "contentFile": "content/docs/chat/sdk/flutter/conversation/retrieving-conversations/retrieve-conversation-list.mdx" + "contentFile": "content/docs/chat/sdk/android/message/receiving-messages/receive-messages.mdx" }, { - "sourcePath": "/sdk/flutter/conversation/managing-conversations/pin-conversation", - "openimPath": "/sdk/flutter/conversation/managing-conversations/pin-conversation", - "title": "Pin or unpin a conversation", - "context": "chat/sdk/flutter", - "template": "overview", - "contentFile": "content/docs/chat/sdk/flutter/conversation/managing-conversations/pin-conversation.mdx" + "sourcePath": "/sdk/android/message/receiving-messages/receive-custom-business-messages", + "openimPath": "/sdk/android/message/receiving-messages/receive-custom-business-messages", + "title": "Receive custom business messages", + "context": "chat/sdk/android", + "template": "guide", + "contentFile": "content/docs/chat/sdk/android/message/receiving-messages/receive-custom-business-messages.mdx" }, { - "sourcePath": "/sdk/flutter/conversation/managing-conversations/set-conversation-extension", - "openimPath": "/sdk/flutter/conversation/managing-conversations/set-conversation-extension", - "title": "Set conversation extra data", - "context": "chat/sdk/flutter", - "template": "overview", - "contentFile": "content/docs/chat/sdk/flutter/conversation/managing-conversations/set-conversation-extension.mdx" + "sourcePath": "/sdk/android/message/retrieving-messages/load-older-messages", + "openimPath": "/sdk/android/message/retrieving-messages/load-older-messages", + "title": "Load older messages", + "context": "chat/sdk/android", + "template": "guide", + "contentFile": "content/docs/chat/sdk/android/message/retrieving-messages/load-older-messages.mdx" }, { - "sourcePath": "/sdk/flutter/conversation/managing-conversations/set-conversation-draft", - "openimPath": "/sdk/flutter/conversation/managing-conversations/set-conversation-draft", - "title": "Set a conversation draft", - "context": "chat/sdk/flutter", + "sourcePath": "/sdk/android/message/retrieving-messages/load-newer-messages", + "openimPath": "/sdk/android/message/retrieving-messages/load-newer-messages", + "title": "Load newer messages", + "context": "chat/sdk/android", "template": "guide", - "contentFile": "content/docs/chat/sdk/flutter/conversation/managing-conversations/set-conversation-draft.mdx" + "contentFile": "content/docs/chat/sdk/android/message/retrieving-messages/load-newer-messages.mdx" }, { - "sourcePath": "/sdk/flutter/conversation/managing-conversations/set-message-receive-option", - "openimPath": "/sdk/flutter/conversation/managing-conversations/set-message-receive-option", - "title": "Set conversation message reception", - "context": "chat/sdk/flutter", - "template": "overview", - "contentFile": "content/docs/chat/sdk/flutter/conversation/managing-conversations/set-message-receive-option.mdx" + "sourcePath": "/sdk/android/message/retrieving-messages/find-messages-by-id", + "openimPath": "/sdk/android/message/retrieving-messages/find-messages-by-id", + "title": "Find messages by ID", + "context": "chat/sdk/android", + "template": "guide", + "contentFile": "content/docs/chat/sdk/android/message/retrieving-messages/find-messages-by-id.mdx" }, { - "sourcePath": "/sdk/flutter/conversation/managing-conversations/clear-group-mentions", - "openimPath": "/sdk/flutter/conversation/managing-conversations/clear-group-mentions", - "title": "Reset group mention status", - "context": "chat/sdk/flutter", - "template": "overview", - "contentFile": "content/docs/chat/sdk/flutter/conversation/managing-conversations/clear-group-mentions.mdx" + "sourcePath": "/sdk/android/message/retrieving-messages/load-message-context", + "openimPath": "/sdk/android/message/retrieving-messages/load-message-context", + "title": "Load message context", + "context": "chat/sdk/android", + "template": "guide", + "contentFile": "content/docs/chat/sdk/android/message/retrieving-messages/load-message-context.mdx" }, { - "sourcePath": "/sdk/flutter/conversation/managing-conversations/mark-conversation-read", - "openimPath": "/sdk/flutter/conversation/managing-conversations/mark-conversation-read", - "title": "Mark a conversation as read", - "context": "chat/sdk/flutter", + "sourcePath": "/sdk/android/message/searching-messages/search-messages", + "openimPath": "/sdk/android/message/searching-messages/search-messages", + "title": "Search messages", + "context": "chat/sdk/android", "template": "guide", - "contentFile": "content/docs/chat/sdk/flutter/conversation/managing-conversations/mark-conversation-read.mdx" + "contentFile": "content/docs/chat/sdk/android/message/searching-messages/search-messages.mdx" }, { - "sourcePath": "/sdk/flutter/conversation/managing-conversations/get-total-unread-count", - "openimPath": "/sdk/flutter/conversation/managing-conversations/get-total-unread-count", - "title": "Track the total unread count", - "context": "chat/sdk/flutter", + "sourcePath": "/sdk/android/message/composing-messages/update-typing-status", + "openimPath": "/sdk/android/message/composing-messages/update-typing-status", + "title": "Update typing status", + "context": "chat/sdk/android", "template": "guide", - "contentFile": "content/docs/chat/sdk/flutter/conversation/managing-conversations/get-total-unread-count.mdx" + "contentFile": "content/docs/chat/sdk/android/message/composing-messages/update-typing-status.mdx" }, { - "sourcePath": "/sdk/flutter/conversation/managing-conversations/set-private-chat", - "openimPath": "/sdk/flutter/conversation/managing-conversations/set-private-chat", - "title": "Enable or disable burn after reading", - "context": "chat/sdk/flutter", - "template": "overview", - "contentFile": "content/docs/chat/sdk/flutter/conversation/managing-conversations/set-private-chat.mdx" + "sourcePath": "/sdk/android/message/composing-messages/get-typing-status", + "openimPath": "/sdk/android/message/composing-messages/get-typing-status", + "title": "Retrieve typing status", + "context": "chat/sdk/android", + "template": "guide", + "contentFile": "content/docs/chat/sdk/android/message/composing-messages/get-typing-status.mdx" }, { - "sourcePath": "/sdk/flutter/conversation/managing-conversations/set-burn-duration", - "openimPath": "/sdk/flutter/conversation/managing-conversations/set-burn-duration", - "title": "Set the burn duration", - "context": "chat/sdk/flutter", - "template": "overview", - "contentFile": "content/docs/chat/sdk/flutter/conversation/managing-conversations/set-burn-duration.mdx" + "sourcePath": "/sdk/android/message/managing-messages/delete-local-message", + "openimPath": "/sdk/android/message/managing-messages/delete-local-message", + "title": "Delete a local message", + "context": "chat/sdk/android", + "template": "guide", + "contentFile": "content/docs/chat/sdk/android/message/managing-messages/delete-local-message.mdx" }, { - "sourcePath": "/sdk/flutter/conversation/managing-conversations/set-message-destruct", - "openimPath": "/sdk/flutter/conversation/managing-conversations/set-message-destruct", - "title": "Schedule server message deletion", - "context": "chat/sdk/flutter", - "template": "overview", - "contentFile": "content/docs/chat/sdk/flutter/conversation/managing-conversations/set-message-destruct.mdx" + "sourcePath": "/sdk/android/message/managing-messages/delete-saved-messages", + "openimPath": "/sdk/android/message/managing-messages/delete-saved-messages", + "title": "Delete messages in a batch", + "context": "chat/sdk/android", + "template": "guide", + "contentFile": "content/docs/chat/sdk/android/message/managing-messages/delete-saved-messages.mdx" }, { - "sourcePath": "/sdk/flutter/conversation/managing-conversations/hide-a-conversation", - "openimPath": "/sdk/flutter/conversation/managing-conversations/hide-a-conversation", - "title": "Hide a conversation", - "context": "chat/sdk/flutter", + "sourcePath": "/sdk/android/message/managing-messages/delete-user-messages", + "openimPath": "/sdk/android/message/managing-messages/delete-user-messages", + "title": "Delete all messages from a user in a group chat", + "context": "chat/sdk/android", "template": "guide", - "contentFile": "content/docs/chat/sdk/flutter/conversation/managing-conversations/hide-a-conversation.mdx" + "contentFile": "content/docs/chat/sdk/android/message/managing-messages/delete-user-messages.mdx" }, { - "sourcePath": "/sdk/flutter/conversation/managing-conversations/delete-conversation-with-messages", - "openimPath": "/sdk/flutter/conversation/managing-conversations/delete-conversation-with-messages", - "title": "Delete a conversation and its messages", - "context": "chat/sdk/flutter", + "sourcePath": "/sdk/android/message/managing-messages/revoke-a-message", + "openimPath": "/sdk/android/message/managing-messages/revoke-a-message", + "title": "Revoke a message", + "context": "chat/sdk/android", "template": "guide", - "contentFile": "content/docs/chat/sdk/flutter/conversation/managing-conversations/delete-conversation-with-messages.mdx" + "contentFile": "content/docs/chat/sdk/android/message/managing-messages/revoke-a-message.mdx" }, { - "sourcePath": "/sdk/flutter/conversation/managing-conversations/clear-conversation-messages", - "openimPath": "/sdk/flutter/conversation/managing-conversations/clear-conversation-messages", - "title": "Clear messages in a conversation", - "context": "chat/sdk/flutter", + "sourcePath": "/sdk/android/message/managing-messages/modify-a-message", + "openimPath": "/sdk/android/message/managing-messages/modify-a-message", + "title": "Modify a message", + "context": "chat/sdk/android", "template": "guide", - "contentFile": "content/docs/chat/sdk/flutter/conversation/managing-conversations/clear-conversation-messages.mdx" + "contentFile": "content/docs/chat/sdk/android/message/managing-messages/modify-a-message.mdx" }, { - "sourcePath": "/sdk/flutter/conversation/managing-conversation-groups/overview-conversation-groups", - "openimPath": "/sdk/flutter/conversation/managing-conversation-groups/overview-conversation-groups", - "title": "Conversation group overview", - "context": "chat/sdk/flutter", + "sourcePath": "/sdk/android/message/managing-messages/get-pinned-messages", + "openimPath": "/sdk/android/message/managing-messages/get-pinned-messages", + "title": "View pinned messages", + "context": "chat/sdk/android", "template": "guide", - "contentFile": "content/docs/chat/sdk/flutter/conversation/managing-conversation-groups/overview-conversation-groups.mdx" + "contentFile": "content/docs/chat/sdk/android/message/managing-messages/get-pinned-messages.mdx" }, { - "sourcePath": "/sdk/flutter/conversation/managing-conversation-groups/create-conversation-group", - "openimPath": "/sdk/flutter/conversation/managing-conversation-groups/create-conversation-group", - "title": "createConversationGroup", - "context": "chat/sdk/flutter", + "sourcePath": "/sdk/android/message/managing-messages/set-message-pinned", + "openimPath": "/sdk/android/message/managing-messages/set-message-pinned", + "title": "Pin or unpin a message", + "context": "chat/sdk/android", "template": "guide", - "contentFile": "content/docs/chat/sdk/flutter/conversation/managing-conversation-groups/create-conversation-group.mdx" + "contentFile": "content/docs/chat/sdk/android/message/managing-messages/set-message-pinned.mdx" }, { - "sourcePath": "/sdk/flutter/conversation/managing-conversation-groups/get-conversation-groups", - "openimPath": "/sdk/flutter/conversation/managing-conversation-groups/get-conversation-groups", - "title": "getConversationGroups", - "context": "chat/sdk/flutter", + "sourcePath": "/sdk/android/message/managing-messages/insert-local-single-message", + "openimPath": "/sdk/android/message/managing-messages/insert-local-single-message", + "title": "Insert a local direct message", + "context": "chat/sdk/android", "template": "guide", - "contentFile": "content/docs/chat/sdk/flutter/conversation/managing-conversation-groups/get-conversation-groups.mdx" + "contentFile": "content/docs/chat/sdk/android/message/managing-messages/insert-local-single-message.mdx" }, { - "sourcePath": "/sdk/flutter/conversation/managing-conversation-groups/get-conversation-group-info-with-conversations", - "openimPath": "/sdk/flutter/conversation/managing-conversation-groups/get-conversation-group-info-with-conversations", - "title": "getConversationGroupInfoWithConversations", - "context": "chat/sdk/flutter", + "sourcePath": "/sdk/android/message/managing-messages/insert-local-group-message", + "openimPath": "/sdk/android/message/managing-messages/insert-local-group-message", + "title": "Insert a local group message", + "context": "chat/sdk/android", "template": "guide", - "contentFile": "content/docs/chat/sdk/flutter/conversation/managing-conversation-groups/get-conversation-group-info-with-conversations.mdx" + "contentFile": "content/docs/chat/sdk/android/message/managing-messages/insert-local-group-message.mdx" }, { - "sourcePath": "/sdk/flutter/conversation/managing-conversation-groups/get-conversation-group-ids-by-conversation-id", - "openimPath": "/sdk/flutter/conversation/managing-conversation-groups/get-conversation-group-ids-by-conversation-id", - "title": "getConversationGroupByConversationID", - "context": "chat/sdk/flutter", + "sourcePath": "/sdk/android/message/managing-messages/clear-all-local-messages", + "openimPath": "/sdk/android/message/managing-messages/clear-all-local-messages", + "title": "Clear all local messages", + "context": "chat/sdk/android", "template": "guide", - "contentFile": "content/docs/chat/sdk/flutter/conversation/managing-conversation-groups/get-conversation-group-ids-by-conversation-id.mdx" + "contentFile": "content/docs/chat/sdk/android/message/managing-messages/clear-all-local-messages.mdx" }, { - "sourcePath": "/sdk/flutter/conversation/managing-conversation-groups/update-conversation-group", - "openimPath": "/sdk/flutter/conversation/managing-conversation-groups/update-conversation-group", - "title": "updateConversationGroup", - "context": "chat/sdk/flutter", + "sourcePath": "/sdk/android/message/managing-messages/clear-all-messages", + "openimPath": "/sdk/android/message/managing-messages/clear-all-messages", + "title": "Clear all saved messages", + "context": "chat/sdk/android", "template": "guide", - "contentFile": "content/docs/chat/sdk/flutter/conversation/managing-conversation-groups/update-conversation-group.mdx" + "contentFile": "content/docs/chat/sdk/android/message/managing-messages/clear-all-messages.mdx" }, { - "sourcePath": "/sdk/flutter/conversation/managing-conversation-groups/set-conversation-group-order", - "openimPath": "/sdk/flutter/conversation/managing-conversation-groups/set-conversation-group-order", - "title": "setConversationGroupOrder", - "context": "chat/sdk/flutter", + "sourcePath": "/sdk/android/message/managing-messages/set-message-local-ex", + "openimPath": "/sdk/android/message/managing-messages/set-message-local-ex", + "title": "Set local message extensions", + "context": "chat/sdk/android", "template": "guide", - "contentFile": "content/docs/chat/sdk/flutter/conversation/managing-conversation-groups/set-conversation-group-order.mdx" + "contentFile": "content/docs/chat/sdk/android/message/managing-messages/set-message-local-ex.mdx" }, { - "sourcePath": "/sdk/flutter/conversation/managing-conversation-groups/add-conversations-to-groups", - "openimPath": "/sdk/flutter/conversation/managing-conversation-groups/add-conversations-to-groups", - "title": "addConversationsToGroups", - "context": "chat/sdk/flutter", + "sourcePath": "/sdk/android/message/managing-read-status/send-group-read-receipts", + "openimPath": "/sdk/android/message/managing-read-status/send-group-read-receipts", + "title": "Report group messages as read", + "context": "chat/sdk/android", "template": "guide", - "contentFile": "content/docs/chat/sdk/flutter/conversation/managing-conversation-groups/add-conversations-to-groups.mdx" + "contentFile": "content/docs/chat/sdk/android/message/managing-read-status/send-group-read-receipts.mdx" }, { - "sourcePath": "/sdk/flutter/conversation/managing-conversation-groups/remove-conversations-from-groups", - "openimPath": "/sdk/flutter/conversation/managing-conversation-groups/remove-conversations-from-groups", - "title": "removeConversationsFromGroups", - "context": "chat/sdk/flutter", + "sourcePath": "/sdk/android/message/managing-read-status/get-group-message-readers", + "openimPath": "/sdk/android/message/managing-read-status/get-group-message-readers", + "title": "Get members who read a group message", + "context": "chat/sdk/android", "template": "guide", - "contentFile": "content/docs/chat/sdk/flutter/conversation/managing-conversation-groups/remove-conversations-from-groups.mdx" + "contentFile": "content/docs/chat/sdk/android/message/managing-read-status/get-group-message-readers.mdx" }, { - "sourcePath": "/sdk/flutter/conversation/managing-conversation-groups/delete-conversation-group", - "openimPath": "/sdk/flutter/conversation/managing-conversation-groups/delete-conversation-group", - "title": "deleteConversationGroup", - "context": "chat/sdk/flutter", + "sourcePath": "/sdk/android/file-uploads/track-file-upload-progress", + "openimPath": "/sdk/android/file-uploads/track-file-upload-progress", + "title": "Track file upload progress", + "context": "chat/sdk/android", "template": "guide", - "contentFile": "content/docs/chat/sdk/flutter/conversation/managing-conversation-groups/delete-conversation-group.mdx" + "contentFile": "content/docs/chat/sdk/android/file-uploads/track-file-upload-progress.mdx" }, { - "sourcePath": "/sdk/flutter/group/overview-group", - "openimPath": "/sdk/flutter/group/overview-group", - "title": "Group overview", - "context": "chat/sdk/flutter", + "sourcePath": "/sdk/android/file-uploads/upload-file", + "openimPath": "/sdk/android/file-uploads/upload-file", + "title": "Upload a file", + "context": "chat/sdk/android", "template": "guide", - "contentFile": "content/docs/chat/sdk/flutter/group/overview-group.mdx" + "contentFile": "content/docs/chat/sdk/android/file-uploads/upload-file.mdx" }, { - "sourcePath": "/sdk/flutter/group/create-group", - "openimPath": "/sdk/flutter/group/create-group", - "title": "Create a group", - "context": "chat/sdk/flutter", + "sourcePath": "/sdk/android/calling/overview-calling", + "openimPath": "/sdk/android/calling/overview-calling", + "title": "Audio and video calling overview", + "context": "chat/sdk/android", "template": "guide", - "contentFile": "content/docs/chat/sdk/flutter/group/create-group.mdx" + "contentFile": "content/docs/chat/sdk/android/calling/overview-calling.mdx" }, { - "sourcePath": "/sdk/flutter/group/update-group-profile", - "openimPath": "/sdk/flutter/group/update-group-profile", - "title": "Update group profile", - "context": "chat/sdk/flutter", - "template": "overview", - "contentFile": "content/docs/chat/sdk/flutter/group/update-group-profile.mdx" + "sourcePath": "/sdk/android/calling/managing-calls/start-single-call", + "openimPath": "/sdk/android/calling/managing-calls/start-single-call", + "title": "Start a one-to-one call", + "context": "chat/sdk/android", + "template": "guide", + "contentFile": "content/docs/chat/sdk/android/calling/managing-calls/start-single-call.mdx" }, { - "sourcePath": "/sdk/flutter/group/set-group-announcement", - "openimPath": "/sdk/flutter/group/set-group-announcement", - "title": "Publish a group announcement", - "context": "chat/sdk/flutter", - "template": "overview", - "contentFile": "content/docs/chat/sdk/flutter/group/set-group-announcement.mdx" + "sourcePath": "/sdk/android/calling/managing-calls/start-group-call", + "openimPath": "/sdk/android/calling/managing-calls/start-group-call", + "title": "Start a group call", + "context": "chat/sdk/android", + "template": "guide", + "contentFile": "content/docs/chat/sdk/android/calling/managing-calls/start-group-call.mdx" }, { - "sourcePath": "/sdk/flutter/group/set-group-extension", - "openimPath": "/sdk/flutter/group/set-group-extension", - "title": "Set group extra data", - "context": "chat/sdk/flutter", - "template": "overview", - "contentFile": "content/docs/chat/sdk/flutter/group/set-group-extension.mdx" + "sourcePath": "/sdk/android/calling/managing-calls/accept-call", + "openimPath": "/sdk/android/calling/managing-calls/accept-call", + "title": "Accept a call", + "context": "chat/sdk/android", + "template": "guide", + "contentFile": "content/docs/chat/sdk/android/calling/managing-calls/accept-call.mdx" }, { - "sourcePath": "/sdk/flutter/group/set-group-join-verification", - "openimPath": "/sdk/flutter/group/set-group-join-verification", - "title": "Set group join verification", - "context": "chat/sdk/flutter", - "template": "overview", - "contentFile": "content/docs/chat/sdk/flutter/group/set-group-join-verification.mdx" + "sourcePath": "/sdk/android/calling/managing-calls/reject-call", + "openimPath": "/sdk/android/calling/managing-calls/reject-call", + "title": "Reject a call", + "context": "chat/sdk/android", + "template": "guide", + "contentFile": "content/docs/chat/sdk/android/calling/managing-calls/reject-call.mdx" }, { - "sourcePath": "/sdk/flutter/group/set-group-member-profile-access", - "openimPath": "/sdk/flutter/group/set-group-member-profile-access", - "title": "Set member profile access", - "context": "chat/sdk/flutter", - "template": "overview", - "contentFile": "content/docs/chat/sdk/flutter/group/set-group-member-profile-access.mdx" + "sourcePath": "/sdk/android/calling/managing-calls/cancel-call", + "openimPath": "/sdk/android/calling/managing-calls/cancel-call", + "title": "Cancel a call invitation", + "context": "chat/sdk/android", + "template": "guide", + "contentFile": "content/docs/chat/sdk/android/calling/managing-calls/cancel-call.mdx" }, { - "sourcePath": "/sdk/flutter/group/set-group-member-friend-permission", - "openimPath": "/sdk/flutter/group/set-group-member-friend-permission", - "title": "Set member friend request permission", - "context": "chat/sdk/flutter", - "template": "overview", - "contentFile": "content/docs/chat/sdk/flutter/group/set-group-member-friend-permission.mdx" + "sourcePath": "/sdk/android/calling/managing-calls/hang-up-call", + "openimPath": "/sdk/android/calling/managing-calls/hang-up-call", + "title": "Hang up a call", + "context": "chat/sdk/android", + "template": "guide", + "contentFile": "content/docs/chat/sdk/android/calling/managing-calls/hang-up-call.mdx" }, { - "sourcePath": "/sdk/flutter/group/change-group-mute", - "openimPath": "/sdk/flutter/group/change-group-mute", - "title": "Change group mute status", - "context": "chat/sdk/flutter", + "sourcePath": "/sdk/android/calling/managing-calls/handle-call-events", + "openimPath": "/sdk/android/calling/managing-calls/handle-call-events", + "title": "Handle call events", + "context": "chat/sdk/android", "template": "guide", - "contentFile": "content/docs/chat/sdk/flutter/group/change-group-mute.mdx" + "contentFile": "content/docs/chat/sdk/android/calling/managing-calls/handle-call-events.mdx" }, { - "sourcePath": "/sdk/flutter/group/join-group", - "openimPath": "/sdk/flutter/group/join-group", - "title": "Apply to join a group", - "context": "chat/sdk/flutter", + "sourcePath": "/sdk/android/calling/retrieving-call-information/restore-pending-invitation", + "openimPath": "/sdk/android/calling/retrieving-call-information/restore-pending-invitation", + "title": "Restore a pending invitation", + "context": "chat/sdk/android", "template": "guide", - "contentFile": "content/docs/chat/sdk/flutter/group/join-group.mdx" + "contentFile": "content/docs/chat/sdk/android/calling/retrieving-call-information/restore-pending-invitation.mdx" }, { - "sourcePath": "/sdk/flutter/group/quit-group", - "openimPath": "/sdk/flutter/group/quit-group", - "title": "Leave a group", - "context": "chat/sdk/flutter", + "sourcePath": "/sdk/android/calling/retrieving-call-information/get-room-by-group-id", + "openimPath": "/sdk/android/calling/retrieving-call-information/get-room-by-group-id", + "title": "Get a group call room", + "context": "chat/sdk/android", "template": "guide", - "contentFile": "content/docs/chat/sdk/flutter/group/quit-group.mdx" + "contentFile": "content/docs/chat/sdk/android/calling/retrieving-call-information/get-room-by-group-id.mdx" }, { - "sourcePath": "/sdk/flutter/group/dismiss-group", - "openimPath": "/sdk/flutter/group/dismiss-group", - "title": "Dismiss a group", - "context": "chat/sdk/flutter", + "sourcePath": "/sdk/android/calling/retrieving-call-information/get-token-by-room-id", + "openimPath": "/sdk/android/calling/retrieving-call-information/get-token-by-room-id", + "title": "Get room credentials", + "context": "chat/sdk/android", "template": "guide", - "contentFile": "content/docs/chat/sdk/flutter/group/dismiss-group.mdx" + "contentFile": "content/docs/chat/sdk/android/calling/retrieving-call-information/get-token-by-room-id.mdx" }, { - "sourcePath": "/sdk/flutter/group/retrieving-groups/get-specified-groups-info", - "openimPath": "/sdk/flutter/group/retrieving-groups/get-specified-groups-info", - "title": "Get group information", - "context": "chat/sdk/flutter", + "sourcePath": "/sdk/android/calling/sending-custom-signals/send-a-custom-signal", + "openimPath": "/sdk/android/calling/sending-custom-signals/send-a-custom-signal", + "title": "Send a custom signal", + "context": "chat/sdk/android", "template": "guide", - "contentFile": "content/docs/chat/sdk/flutter/group/retrieving-groups/get-specified-groups-info.mdx" + "contentFile": "content/docs/chat/sdk/android/calling/sending-custom-signals/send-a-custom-signal.mdx" }, { - "sourcePath": "/sdk/flutter/group/retrieving-groups/get-joined-group-list", - "openimPath": "/sdk/flutter/group/retrieving-groups/get-joined-group-list", - "title": "Get joined groups", - "context": "chat/sdk/flutter", + "sourcePath": "/sdk/android/events/overview-events", + "openimPath": "/sdk/android/events/overview-events", + "title": "Events overview", + "context": "chat/sdk/android", "template": "guide", - "contentFile": "content/docs/chat/sdk/flutter/group/retrieving-groups/get-joined-group-list.mdx" + "contentFile": "content/docs/chat/sdk/android/events/overview-events.mdx" }, { - "sourcePath": "/sdk/flutter/group/retrieving-groups/get-joined-group-list-page", - "openimPath": "/sdk/flutter/group/retrieving-groups/get-joined-group-list-page", - "title": "Get joined groups by page", - "context": "chat/sdk/flutter", + "sourcePath": "/sdk/android/logger", + "openimPath": "/sdk/android/logger", + "title": "Logging", + "context": "chat/sdk/android", "template": "guide", - "contentFile": "content/docs/chat/sdk/flutter/group/retrieving-groups/get-joined-group-list-page.mdx" + "contentFile": "content/docs/chat/sdk/android/logger.mdx" }, { - "sourcePath": "/sdk/flutter/group/retrieving-groups/is-join-group", - "openimPath": "/sdk/flutter/group/retrieving-groups/is-join-group", - "title": "Check group membership", + "sourcePath": "/sdk/flutter/overview", + "openimPath": "/sdk/flutter/overview", + "title": "OpenIM SDK for Flutter", "context": "chat/sdk/flutter", - "template": "guide", - "contentFile": "content/docs/chat/sdk/flutter/group/retrieving-groups/is-join-group.mdx" + "template": "overview", + "contentFile": "content/docs/chat/sdk/flutter/overview.mdx" }, { - "sourcePath": "/sdk/flutter/group/retrieving-groups/search-groups", - "openimPath": "/sdk/flutter/group/retrieving-groups/search-groups", - "title": "Search groups", + "sourcePath": "/sdk/flutter/getting-started/before-you-start", + "openimPath": "/sdk/flutter/getting-started/before-you-start", + "title": "Before you start", "context": "chat/sdk/flutter", "template": "guide", - "contentFile": "content/docs/chat/sdk/flutter/group/retrieving-groups/search-groups.mdx" + "contentFile": "content/docs/chat/sdk/flutter/getting-started/before-you-start.mdx" }, { - "sourcePath": "/sdk/flutter/group/group-applications/overview-group-applications", - "openimPath": "/sdk/flutter/group/group-applications/overview-group-applications", - "title": "Group applications overview", + "sourcePath": "/sdk/flutter/getting-started/environment-specific-implementation", + "openimPath": "/sdk/flutter/getting-started/environment-specific-implementation", + "title": "Environment-specific implementation", "context": "chat/sdk/flutter", "template": "guide", - "contentFile": "content/docs/chat/sdk/flutter/group/group-applications/overview-group-applications.mdx" + "contentFile": "content/docs/chat/sdk/flutter/getting-started/environment-specific-implementation.mdx" }, { - "sourcePath": "/sdk/flutter/group/group-applications/get-group-application-list-as-recipient", - "openimPath": "/sdk/flutter/group/group-applications/get-group-application-list-as-recipient", - "title": "Get received group applications", + "sourcePath": "/sdk/flutter/getting-started/authenticate-and-manage-session", + "openimPath": "/sdk/flutter/getting-started/authenticate-and-manage-session", + "title": "Authenticate and manage a session", "context": "chat/sdk/flutter", "template": "guide", - "contentFile": "content/docs/chat/sdk/flutter/group/group-applications/get-group-application-list-as-recipient.mdx" + "contentFile": "content/docs/chat/sdk/flutter/getting-started/authenticate-and-manage-session.mdx" }, { - "sourcePath": "/sdk/flutter/group/group-applications/get-group-application-list-as-applicant", - "openimPath": "/sdk/flutter/group/group-applications/get-group-application-list-as-applicant", - "title": "Get sent group applications", + "sourcePath": "/sdk/flutter/getting-started/send-first-message", + "openimPath": "/sdk/flutter/getting-started/send-first-message", + "title": "Send your first message", "context": "chat/sdk/flutter", "template": "guide", - "contentFile": "content/docs/chat/sdk/flutter/group/group-applications/get-group-application-list-as-applicant.mdx" + "contentFile": "content/docs/chat/sdk/flutter/getting-started/send-first-message.mdx" }, { - "sourcePath": "/sdk/flutter/group/group-applications/get-group-application-unhandled-count", - "openimPath": "/sdk/flutter/group/group-applications/get-group-application-unhandled-count", - "title": "Get pending group application count", + "sourcePath": "/sdk/flutter/user/overview-user", + "openimPath": "/sdk/flutter/user/overview-user", + "title": "Overview", "context": "chat/sdk/flutter", "template": "guide", - "contentFile": "content/docs/chat/sdk/flutter/group/group-applications/get-group-application-unhandled-count.mdx" + "contentFile": "content/docs/chat/sdk/flutter/user/overview-user.mdx" }, { - "sourcePath": "/sdk/flutter/group/group-applications/accept-group-application", - "openimPath": "/sdk/flutter/group/group-applications/accept-group-application", - "title": "Accept a group application", + "sourcePath": "/sdk/flutter/user/retrieving-users/retrieve-users", + "openimPath": "/sdk/flutter/user/retrieving-users/retrieve-users", + "title": "Retrieve users", "context": "chat/sdk/flutter", "template": "guide", - "contentFile": "content/docs/chat/sdk/flutter/group/group-applications/accept-group-application.mdx" + "contentFile": "content/docs/chat/sdk/flutter/user/retrieving-users/retrieve-users.mdx" }, { - "sourcePath": "/sdk/flutter/group/group-applications/refuse-group-application", - "openimPath": "/sdk/flutter/group/group-applications/refuse-group-application", - "title": "Reject a group application", + "sourcePath": "/sdk/flutter/user/retrieving-and-updating-user-information/get-self-profile", + "openimPath": "/sdk/flutter/user/retrieving-and-updating-user-information/get-self-profile", + "title": "View your profile", "context": "chat/sdk/flutter", "template": "guide", - "contentFile": "content/docs/chat/sdk/flutter/group/group-applications/refuse-group-application.mdx" + "contentFile": "content/docs/chat/sdk/flutter/user/retrieving-and-updating-user-information/get-self-profile.mdx" }, { - "sourcePath": "/sdk/flutter/group/retrieving-group-members/overview-retrieving-group-members", - "openimPath": "/sdk/flutter/group/retrieving-group-members/overview-retrieving-group-members", - "title": "Group member queries overview", + "sourcePath": "/sdk/flutter/user/retrieving-and-updating-user-information/update-self-profile", + "openimPath": "/sdk/flutter/user/retrieving-and-updating-user-information/update-self-profile", + "title": "Update your profile", "context": "chat/sdk/flutter", "template": "guide", - "contentFile": "content/docs/chat/sdk/flutter/group/retrieving-group-members/overview-retrieving-group-members.mdx" + "contentFile": "content/docs/chat/sdk/flutter/user/retrieving-and-updating-user-information/update-self-profile.mdx" }, { - "sourcePath": "/sdk/flutter/group/retrieving-group-members/get-group-member-list", - "openimPath": "/sdk/flutter/group/retrieving-group-members/get-group-member-list", - "title": "Get group members", + "sourcePath": "/sdk/flutter/user/retrieving-and-updating-user-information/set-global-message-reception", + "openimPath": "/sdk/flutter/user/retrieving-and-updating-user-information/set-global-message-reception", + "title": "Set global message reception", "context": "chat/sdk/flutter", - "template": "guide", - "contentFile": "content/docs/chat/sdk/flutter/group/retrieving-group-members/get-group-member-list.mdx" + "template": "overview", + "contentFile": "content/docs/chat/sdk/flutter/user/retrieving-and-updating-user-information/set-global-message-reception.mdx" }, { - "sourcePath": "/sdk/flutter/group/retrieving-group-members/get-group-members-info", - "openimPath": "/sdk/flutter/group/retrieving-group-members/get-group-members-info", - "title": "Get group member profiles", + "sourcePath": "/sdk/flutter/user/retrieving-and-updating-user-information/subscribe-user-status", + "openimPath": "/sdk/flutter/user/retrieving-and-updating-user-information/subscribe-user-status", + "title": "Subscribe to user status", "context": "chat/sdk/flutter", "template": "guide", - "contentFile": "content/docs/chat/sdk/flutter/group/retrieving-group-members/get-group-members-info.mdx" + "contentFile": "content/docs/chat/sdk/flutter/user/retrieving-and-updating-user-information/subscribe-user-status.mdx" }, { - "sourcePath": "/sdk/flutter/group/retrieving-group-members/get-users-in-group", - "openimPath": "/sdk/flutter/group/retrieving-group-members/get-users-in-group", - "title": "Check users in a group", + "sourcePath": "/sdk/flutter/user/retrieving-and-updating-user-information/get-subscribed-user-status", + "openimPath": "/sdk/flutter/user/retrieving-and-updating-user-information/get-subscribed-user-status", + "title": "Refresh subscribed user status", "context": "chat/sdk/flutter", "template": "guide", - "contentFile": "content/docs/chat/sdk/flutter/group/retrieving-group-members/get-users-in-group.mdx" + "contentFile": "content/docs/chat/sdk/flutter/user/retrieving-and-updating-user-information/get-subscribed-user-status.mdx" }, { - "sourcePath": "/sdk/flutter/group/retrieving-group-members/get-group-owner-and-admin", - "openimPath": "/sdk/flutter/group/retrieving-group-members/get-group-owner-and-admin", - "title": "Get group owners and admins", + "sourcePath": "/sdk/flutter/user/retrieving-and-updating-user-information/unsubscribe-user-status", + "openimPath": "/sdk/flutter/user/retrieving-and-updating-user-information/unsubscribe-user-status", + "title": "Unsubscribe from user status", "context": "chat/sdk/flutter", "template": "guide", - "contentFile": "content/docs/chat/sdk/flutter/group/retrieving-group-members/get-group-owner-and-admin.mdx" + "contentFile": "content/docs/chat/sdk/flutter/user/retrieving-and-updating-user-information/unsubscribe-user-status.mdx" }, { - "sourcePath": "/sdk/flutter/group/retrieving-group-members/search-group-members", - "openimPath": "/sdk/flutter/group/retrieving-group-members/search-group-members", - "title": "Search group members", + "sourcePath": "/sdk/flutter/user/friends/get-friend-list-page", + "openimPath": "/sdk/flutter/user/friends/get-friend-list-page", + "title": "Get the friend list", "context": "chat/sdk/flutter", "template": "guide", - "contentFile": "content/docs/chat/sdk/flutter/group/retrieving-group-members/search-group-members.mdx" + "contentFile": "content/docs/chat/sdk/flutter/user/friends/get-friend-list-page.mdx" }, { - "sourcePath": "/sdk/flutter/group/managing-group-members/invite-user-to-group", - "openimPath": "/sdk/flutter/group/managing-group-members/invite-user-to-group", - "title": "Invite users to a group", + "sourcePath": "/sdk/flutter/user/friends/search-friends", + "openimPath": "/sdk/flutter/user/friends/search-friends", + "title": "Search friends", "context": "chat/sdk/flutter", "template": "guide", - "contentFile": "content/docs/chat/sdk/flutter/group/managing-group-members/invite-user-to-group.mdx" + "contentFile": "content/docs/chat/sdk/flutter/user/friends/search-friends.mdx" }, { - "sourcePath": "/sdk/flutter/group/managing-group-members/kick-group-member", - "openimPath": "/sdk/flutter/group/managing-group-members/kick-group-member", - "title": "Remove group members", + "sourcePath": "/sdk/flutter/user/friends/get-friends-info", + "openimPath": "/sdk/flutter/user/friends/get-friends-info", + "title": "Get friend profiles", "context": "chat/sdk/flutter", "template": "guide", - "contentFile": "content/docs/chat/sdk/flutter/group/managing-group-members/kick-group-member.mdx" + "contentFile": "content/docs/chat/sdk/flutter/user/friends/get-friends-info.mdx" }, { - "sourcePath": "/sdk/flutter/group/managing-group-members/set-group-member-nickname", - "openimPath": "/sdk/flutter/group/managing-group-members/set-group-member-nickname", - "title": "Update a group nickname", + "sourcePath": "/sdk/flutter/user/friends/check-friend", + "openimPath": "/sdk/flutter/user/friends/check-friend", + "title": "Check friendship status", "context": "chat/sdk/flutter", - "template": "overview", - "contentFile": "content/docs/chat/sdk/flutter/group/managing-group-members/set-group-member-nickname.mdx" + "template": "guide", + "contentFile": "content/docs/chat/sdk/flutter/user/friends/check-friend.mdx" }, { - "sourcePath": "/sdk/flutter/group/managing-group-members/set-group-member-role-level", - "openimPath": "/sdk/flutter/group/managing-group-members/set-group-member-role-level", - "title": "Manage group administrators", + "sourcePath": "/sdk/flutter/user/friends/update-friends", + "openimPath": "/sdk/flutter/user/friends/update-friends", + "title": "Update friend information", "context": "chat/sdk/flutter", - "template": "overview", - "contentFile": "content/docs/chat/sdk/flutter/group/managing-group-members/set-group-member-role-level.mdx" + "template": "guide", + "contentFile": "content/docs/chat/sdk/flutter/user/friends/update-friends.mdx" }, { - "sourcePath": "/sdk/flutter/group/managing-group-members/set-group-member-avatar", - "openimPath": "/sdk/flutter/group/managing-group-members/set-group-member-avatar", - "title": "Update a group member avatar", + "sourcePath": "/sdk/flutter/user/friends/delete-friend", + "openimPath": "/sdk/flutter/user/friends/delete-friend", + "title": "Delete a friend", "context": "chat/sdk/flutter", - "template": "overview", - "contentFile": "content/docs/chat/sdk/flutter/group/managing-group-members/set-group-member-avatar.mdx" + "template": "guide", + "contentFile": "content/docs/chat/sdk/flutter/user/friends/delete-friend.mdx" }, { - "sourcePath": "/sdk/flutter/group/managing-group-members/set-group-member-extension", - "openimPath": "/sdk/flutter/group/managing-group-members/set-group-member-extension", - "title": "Set group member extra data", + "sourcePath": "/sdk/flutter/user/friend-applications/add-friend", + "openimPath": "/sdk/flutter/user/friend-applications/add-friend", + "title": "Send a friend application", "context": "chat/sdk/flutter", - "template": "overview", - "contentFile": "content/docs/chat/sdk/flutter/group/managing-group-members/set-group-member-extension.mdx" + "template": "guide", + "contentFile": "content/docs/chat/sdk/flutter/user/friend-applications/add-friend.mdx" }, { - "sourcePath": "/sdk/flutter/group/managing-group-members/transfer-group-owner", - "openimPath": "/sdk/flutter/group/managing-group-members/transfer-group-owner", - "title": "Transfer group owner", + "sourcePath": "/sdk/flutter/user/friend-applications/get-friend-application-list-as-recipient", + "openimPath": "/sdk/flutter/user/friend-applications/get-friend-application-list-as-recipient", + "title": "Get received friend applications", "context": "chat/sdk/flutter", "template": "guide", - "contentFile": "content/docs/chat/sdk/flutter/group/managing-group-members/transfer-group-owner.mdx" + "contentFile": "content/docs/chat/sdk/flutter/user/friend-applications/get-friend-application-list-as-recipient.mdx" }, { - "sourcePath": "/sdk/flutter/group/managing-group-members/change-group-member-mute", - "openimPath": "/sdk/flutter/group/managing-group-members/change-group-member-mute", - "title": "Mute or unmute a group member", + "sourcePath": "/sdk/flutter/user/friend-applications/get-friend-application-list-as-applicant", + "openimPath": "/sdk/flutter/user/friend-applications/get-friend-application-list-as-applicant", + "title": "Get sent friend applications", "context": "chat/sdk/flutter", "template": "guide", - "contentFile": "content/docs/chat/sdk/flutter/group/managing-group-members/change-group-member-mute.mdx" + "contentFile": "content/docs/chat/sdk/flutter/user/friend-applications/get-friend-application-list-as-applicant.mdx" }, { - "sourcePath": "/sdk/flutter/message/overview-message", - "openimPath": "/sdk/flutter/message/overview-message", - "title": "Overview", + "sourcePath": "/sdk/flutter/user/friend-applications/get-friend-application-unhandled-count", + "openimPath": "/sdk/flutter/user/friend-applications/get-friend-application-unhandled-count", + "title": "Get pending application count", "context": "chat/sdk/flutter", "template": "guide", - "contentFile": "content/docs/chat/sdk/flutter/message/overview-message.mdx" + "contentFile": "content/docs/chat/sdk/flutter/user/friend-applications/get-friend-application-unhandled-count.mdx" }, { - "sourcePath": "/sdk/flutter/message/creating-messages/create-text-message", - "openimPath": "/sdk/flutter/message/creating-messages/create-text-message", - "title": "Create a text message", + "sourcePath": "/sdk/flutter/user/friend-applications/accept-friend-application", + "openimPath": "/sdk/flutter/user/friend-applications/accept-friend-application", + "title": "Accept a friend application", "context": "chat/sdk/flutter", "template": "guide", - "contentFile": "content/docs/chat/sdk/flutter/message/creating-messages/create-text-message.mdx" + "contentFile": "content/docs/chat/sdk/flutter/user/friend-applications/accept-friend-application.mdx" }, { - "sourcePath": "/sdk/flutter/message/creating-messages/create-text-at-message", - "openimPath": "/sdk/flutter/message/creating-messages/create-text-at-message", - "title": "Create a mention message", + "sourcePath": "/sdk/flutter/user/friend-applications/refuse-friend-application", + "openimPath": "/sdk/flutter/user/friend-applications/refuse-friend-application", + "title": "Reject a friend application", "context": "chat/sdk/flutter", "template": "guide", - "contentFile": "content/docs/chat/sdk/flutter/message/creating-messages/create-text-at-message.mdx" + "contentFile": "content/docs/chat/sdk/flutter/user/friend-applications/refuse-friend-application.mdx" }, { - "sourcePath": "/sdk/flutter/message/creating-messages/create-custom-message", - "openimPath": "/sdk/flutter/message/creating-messages/create-custom-message", - "title": "Create a custom message", + "sourcePath": "/sdk/flutter/user/moderating-a-user/retrieve-a-list-of-blocked-users", + "openimPath": "/sdk/flutter/user/moderating-a-user/retrieve-a-list-of-blocked-users", + "title": "Retrieve a list of blocked users", "context": "chat/sdk/flutter", "template": "guide", - "contentFile": "content/docs/chat/sdk/flutter/message/creating-messages/create-custom-message.mdx" + "contentFile": "content/docs/chat/sdk/flutter/user/moderating-a-user/retrieve-a-list-of-blocked-users.mdx" }, { - "sourcePath": "/sdk/flutter/message/creating-messages/create-image-message", - "openimPath": "/sdk/flutter/message/creating-messages/create-image-message", - "title": "Create an image message", + "sourcePath": "/sdk/flutter/user/moderating-a-user/block-user", + "openimPath": "/sdk/flutter/user/moderating-a-user/block-user", + "title": "Block a user", "context": "chat/sdk/flutter", "template": "guide", - "contentFile": "content/docs/chat/sdk/flutter/message/creating-messages/create-image-message.mdx" + "contentFile": "content/docs/chat/sdk/flutter/user/moderating-a-user/block-user.mdx" }, { - "sourcePath": "/sdk/flutter/message/creating-messages/create-image-message-from-full-path", - "openimPath": "/sdk/flutter/message/creating-messages/create-image-message-from-full-path", - "title": "Create an image message from a path", + "sourcePath": "/sdk/flutter/user/moderating-a-user/unblock-user", + "openimPath": "/sdk/flutter/user/moderating-a-user/unblock-user", + "title": "Unblock a user", "context": "chat/sdk/flutter", "template": "guide", - "contentFile": "content/docs/chat/sdk/flutter/message/creating-messages/create-image-message-from-full-path.mdx" + "contentFile": "content/docs/chat/sdk/flutter/user/moderating-a-user/unblock-user.mdx" }, { - "sourcePath": "/sdk/flutter/message/creating-messages/create-image-message-by-url", - "openimPath": "/sdk/flutter/message/creating-messages/create-image-message-by-url", - "title": "Create an image message from a URL", + "sourcePath": "/sdk/flutter/conversation/overview-conversation", + "openimPath": "/sdk/flutter/conversation/overview-conversation", + "title": "Conversation overview", "context": "chat/sdk/flutter", "template": "guide", - "contentFile": "content/docs/chat/sdk/flutter/message/creating-messages/create-image-message-by-url.mdx" + "contentFile": "content/docs/chat/sdk/flutter/conversation/overview-conversation.mdx" }, { - "sourcePath": "/sdk/flutter/message/creating-messages/create-sound-message", - "openimPath": "/sdk/flutter/message/creating-messages/create-sound-message", - "title": "Create an audio message", + "sourcePath": "/sdk/flutter/conversation/retrieving-conversations/get-conversation-by-target", + "openimPath": "/sdk/flutter/conversation/retrieving-conversations/get-conversation-by-target", + "title": "Open a conversation", "context": "chat/sdk/flutter", "template": "guide", - "contentFile": "content/docs/chat/sdk/flutter/message/creating-messages/create-sound-message.mdx" + "contentFile": "content/docs/chat/sdk/flutter/conversation/retrieving-conversations/get-conversation-by-target.mdx" }, { - "sourcePath": "/sdk/flutter/message/creating-messages/create-sound-message-from-full-path", - "openimPath": "/sdk/flutter/message/creating-messages/create-sound-message-from-full-path", - "title": "Create an audio message from a path", + "sourcePath": "/sdk/flutter/conversation/retrieving-conversations/get-conversation-id", + "openimPath": "/sdk/flutter/conversation/retrieving-conversations/get-conversation-id", + "title": "Resolve a conversation ID", "context": "chat/sdk/flutter", "template": "guide", - "contentFile": "content/docs/chat/sdk/flutter/message/creating-messages/create-sound-message-from-full-path.mdx" + "contentFile": "content/docs/chat/sdk/flutter/conversation/retrieving-conversations/get-conversation-id.mdx" }, { - "sourcePath": "/sdk/flutter/message/creating-messages/create-sound-message-by-url", - "openimPath": "/sdk/flutter/message/creating-messages/create-sound-message-by-url", - "title": "Create an audio message from a URL", + "sourcePath": "/sdk/flutter/conversation/retrieving-conversations/get-conversations-by-id", + "openimPath": "/sdk/flutter/conversation/retrieving-conversations/get-conversations-by-id", + "title": "Get conversations by ID", "context": "chat/sdk/flutter", "template": "guide", - "contentFile": "content/docs/chat/sdk/flutter/message/creating-messages/create-sound-message-by-url.mdx" + "contentFile": "content/docs/chat/sdk/flutter/conversation/retrieving-conversations/get-conversations-by-id.mdx" }, { - "sourcePath": "/sdk/flutter/message/creating-messages/create-video-message", - "openimPath": "/sdk/flutter/message/creating-messages/create-video-message", - "title": "Create a video message", + "sourcePath": "/sdk/flutter/conversation/retrieving-conversations/retrieve-conversation-list", + "openimPath": "/sdk/flutter/conversation/retrieving-conversations/retrieve-conversation-list", + "title": "Retrieve a conversation list", "context": "chat/sdk/flutter", "template": "guide", - "contentFile": "content/docs/chat/sdk/flutter/message/creating-messages/create-video-message.mdx" + "contentFile": "content/docs/chat/sdk/flutter/conversation/retrieving-conversations/retrieve-conversation-list.mdx" }, { - "sourcePath": "/sdk/flutter/message/creating-messages/create-video-message-from-full-path", - "openimPath": "/sdk/flutter/message/creating-messages/create-video-message-from-full-path", - "title": "Create a video message from a path", + "sourcePath": "/sdk/flutter/conversation/managing-conversations/pin-conversation", + "openimPath": "/sdk/flutter/conversation/managing-conversations/pin-conversation", + "title": "Pin or unpin a conversation", "context": "chat/sdk/flutter", - "template": "guide", - "contentFile": "content/docs/chat/sdk/flutter/message/creating-messages/create-video-message-from-full-path.mdx" + "template": "overview", + "contentFile": "content/docs/chat/sdk/flutter/conversation/managing-conversations/pin-conversation.mdx" }, { - "sourcePath": "/sdk/flutter/message/creating-messages/create-video-message-by-url", - "openimPath": "/sdk/flutter/message/creating-messages/create-video-message-by-url", - "title": "Create a video message from a URL", + "sourcePath": "/sdk/flutter/conversation/managing-conversations/set-conversation-extension", + "openimPath": "/sdk/flutter/conversation/managing-conversations/set-conversation-extension", + "title": "Set conversation extra data", "context": "chat/sdk/flutter", - "template": "guide", - "contentFile": "content/docs/chat/sdk/flutter/message/creating-messages/create-video-message-by-url.mdx" + "template": "overview", + "contentFile": "content/docs/chat/sdk/flutter/conversation/managing-conversations/set-conversation-extension.mdx" }, { - "sourcePath": "/sdk/flutter/message/creating-messages/create-file-message", - "openimPath": "/sdk/flutter/message/creating-messages/create-file-message", - "title": "Create a file message", + "sourcePath": "/sdk/flutter/conversation/managing-conversations/set-conversation-draft", + "openimPath": "/sdk/flutter/conversation/managing-conversations/set-conversation-draft", + "title": "Set a conversation draft", "context": "chat/sdk/flutter", "template": "guide", - "contentFile": "content/docs/chat/sdk/flutter/message/creating-messages/create-file-message.mdx" + "contentFile": "content/docs/chat/sdk/flutter/conversation/managing-conversations/set-conversation-draft.mdx" }, { - "sourcePath": "/sdk/flutter/message/creating-messages/create-file-message-from-full-path", - "openimPath": "/sdk/flutter/message/creating-messages/create-file-message-from-full-path", - "title": "Create a file message from a path", + "sourcePath": "/sdk/flutter/conversation/managing-conversations/set-message-receive-option", + "openimPath": "/sdk/flutter/conversation/managing-conversations/set-message-receive-option", + "title": "Set conversation message reception", "context": "chat/sdk/flutter", - "template": "guide", - "contentFile": "content/docs/chat/sdk/flutter/message/creating-messages/create-file-message-from-full-path.mdx" + "template": "overview", + "contentFile": "content/docs/chat/sdk/flutter/conversation/managing-conversations/set-message-receive-option.mdx" }, { - "sourcePath": "/sdk/flutter/message/creating-messages/create-file-message-by-url", - "openimPath": "/sdk/flutter/message/creating-messages/create-file-message-by-url", - "title": "Create a file message from a URL", + "sourcePath": "/sdk/flutter/conversation/managing-conversations/clear-group-mentions", + "openimPath": "/sdk/flutter/conversation/managing-conversations/clear-group-mentions", + "title": "Reset group mention status", "context": "chat/sdk/flutter", - "template": "guide", - "contentFile": "content/docs/chat/sdk/flutter/message/creating-messages/create-file-message-by-url.mdx" + "template": "overview", + "contentFile": "content/docs/chat/sdk/flutter/conversation/managing-conversations/clear-group-mentions.mdx" }, { - "sourcePath": "/sdk/flutter/message/creating-messages/create-location-message", - "openimPath": "/sdk/flutter/message/creating-messages/create-location-message", - "title": "Create a location message", + "sourcePath": "/sdk/flutter/conversation/managing-conversations/mark-conversation-read", + "openimPath": "/sdk/flutter/conversation/managing-conversations/mark-conversation-read", + "title": "Mark a conversation as read", "context": "chat/sdk/flutter", "template": "guide", - "contentFile": "content/docs/chat/sdk/flutter/message/creating-messages/create-location-message.mdx" + "contentFile": "content/docs/chat/sdk/flutter/conversation/managing-conversations/mark-conversation-read.mdx" }, { - "sourcePath": "/sdk/flutter/message/creating-messages/create-card-message", - "openimPath": "/sdk/flutter/message/creating-messages/create-card-message", - "title": "Create a contact card message", + "sourcePath": "/sdk/flutter/conversation/managing-conversations/get-total-unread-count", + "openimPath": "/sdk/flutter/conversation/managing-conversations/get-total-unread-count", + "title": "Track the total unread count", "context": "chat/sdk/flutter", "template": "guide", - "contentFile": "content/docs/chat/sdk/flutter/message/creating-messages/create-card-message.mdx" + "contentFile": "content/docs/chat/sdk/flutter/conversation/managing-conversations/get-total-unread-count.mdx" }, { - "sourcePath": "/sdk/flutter/message/creating-messages/create-face-message", - "openimPath": "/sdk/flutter/message/creating-messages/create-face-message", - "title": "Create an emoji message", + "sourcePath": "/sdk/flutter/conversation/managing-conversations/set-private-chat", + "openimPath": "/sdk/flutter/conversation/managing-conversations/set-private-chat", + "title": "Enable or disable burn after reading", "context": "chat/sdk/flutter", - "template": "guide", - "contentFile": "content/docs/chat/sdk/flutter/message/creating-messages/create-face-message.mdx" + "template": "overview", + "contentFile": "content/docs/chat/sdk/flutter/conversation/managing-conversations/set-private-chat.mdx" }, { - "sourcePath": "/sdk/flutter/message/creating-messages/create-quote-message", - "openimPath": "/sdk/flutter/message/creating-messages/create-quote-message", - "title": "Create a reply message", + "sourcePath": "/sdk/flutter/conversation/managing-conversations/set-burn-duration", + "openimPath": "/sdk/flutter/conversation/managing-conversations/set-burn-duration", + "title": "Set the burn duration", "context": "chat/sdk/flutter", - "template": "guide", - "contentFile": "content/docs/chat/sdk/flutter/message/creating-messages/create-quote-message.mdx" + "template": "overview", + "contentFile": "content/docs/chat/sdk/flutter/conversation/managing-conversations/set-burn-duration.mdx" }, { - "sourcePath": "/sdk/flutter/message/creating-messages/create-advanced-text-message", - "openimPath": "/sdk/flutter/message/creating-messages/create-advanced-text-message", - "title": "Create rich text", + "sourcePath": "/sdk/flutter/conversation/managing-conversations/set-message-destruct", + "openimPath": "/sdk/flutter/conversation/managing-conversations/set-message-destruct", + "title": "Schedule server message deletion", "context": "chat/sdk/flutter", - "template": "guide", - "contentFile": "content/docs/chat/sdk/flutter/message/creating-messages/create-advanced-text-message.mdx" + "template": "overview", + "contentFile": "content/docs/chat/sdk/flutter/conversation/managing-conversations/set-message-destruct.mdx" }, { - "sourcePath": "/sdk/flutter/message/creating-messages/create-advanced-quote-message", - "openimPath": "/sdk/flutter/message/creating-messages/create-advanced-quote-message", - "title": "Create a rich reply", + "sourcePath": "/sdk/flutter/conversation/managing-conversations/hide-a-conversation", + "openimPath": "/sdk/flutter/conversation/managing-conversations/hide-a-conversation", + "title": "Hide a conversation", "context": "chat/sdk/flutter", "template": "guide", - "contentFile": "content/docs/chat/sdk/flutter/message/creating-messages/create-advanced-quote-message.mdx" + "contentFile": "content/docs/chat/sdk/flutter/conversation/managing-conversations/hide-a-conversation.mdx" }, { - "sourcePath": "/sdk/flutter/message/creating-messages/create-forward-message", - "openimPath": "/sdk/flutter/message/creating-messages/create-forward-message", - "title": "Create a forwarded message", + "sourcePath": "/sdk/flutter/conversation/managing-conversations/delete-conversation-with-messages", + "openimPath": "/sdk/flutter/conversation/managing-conversations/delete-conversation-with-messages", + "title": "Delete a conversation and its messages", "context": "chat/sdk/flutter", "template": "guide", - "contentFile": "content/docs/chat/sdk/flutter/message/creating-messages/create-forward-message.mdx" + "contentFile": "content/docs/chat/sdk/flutter/conversation/managing-conversations/delete-conversation-with-messages.mdx" }, { - "sourcePath": "/sdk/flutter/message/creating-messages/create-merger-message", - "openimPath": "/sdk/flutter/message/creating-messages/create-merger-message", - "title": "Create a merged message", + "sourcePath": "/sdk/flutter/conversation/managing-conversations/clear-conversation-messages", + "openimPath": "/sdk/flutter/conversation/managing-conversations/clear-conversation-messages", + "title": "Clear messages in a conversation", "context": "chat/sdk/flutter", "template": "guide", - "contentFile": "content/docs/chat/sdk/flutter/message/creating-messages/create-merger-message.mdx" + "contentFile": "content/docs/chat/sdk/flutter/conversation/managing-conversations/clear-conversation-messages.mdx" }, { - "sourcePath": "/sdk/flutter/message/sending-messages/send-message", - "openimPath": "/sdk/flutter/message/sending-messages/send-message", - "title": "Send a message", + "sourcePath": "/sdk/flutter/conversation/managing-conversation-groups/overview-conversation-groups", + "openimPath": "/sdk/flutter/conversation/managing-conversation-groups/overview-conversation-groups", + "title": "Conversation group overview", "context": "chat/sdk/flutter", "template": "guide", - "contentFile": "content/docs/chat/sdk/flutter/message/sending-messages/send-message.mdx" + "contentFile": "content/docs/chat/sdk/flutter/conversation/managing-conversation-groups/overview-conversation-groups.mdx" }, { - "sourcePath": "/sdk/flutter/message/sending-messages/send-message-not-oss", - "openimPath": "/sdk/flutter/message/sending-messages/send-message-not-oss", - "title": "Send a message without OSS", + "sourcePath": "/sdk/flutter/conversation/managing-conversation-groups/create-conversation-group", + "openimPath": "/sdk/flutter/conversation/managing-conversation-groups/create-conversation-group", + "title": "createConversationGroup", "context": "chat/sdk/flutter", "template": "guide", - "contentFile": "content/docs/chat/sdk/flutter/message/sending-messages/send-message-not-oss.mdx" + "contentFile": "content/docs/chat/sdk/flutter/conversation/managing-conversation-groups/create-conversation-group.mdx" }, { - "sourcePath": "/sdk/flutter/message/sending-messages/set-msg-send-progress-listener", - "openimPath": "/sdk/flutter/message/sending-messages/set-msg-send-progress-listener", - "title": "Track message sending progress", + "sourcePath": "/sdk/flutter/conversation/managing-conversation-groups/get-conversation-groups", + "openimPath": "/sdk/flutter/conversation/managing-conversation-groups/get-conversation-groups", + "title": "getConversationGroups", "context": "chat/sdk/flutter", "template": "guide", - "contentFile": "content/docs/chat/sdk/flutter/message/sending-messages/set-msg-send-progress-listener.mdx" + "contentFile": "content/docs/chat/sdk/flutter/conversation/managing-conversation-groups/get-conversation-groups.mdx" }, { - "sourcePath": "/sdk/flutter/message/receiving-messages/receive-messages", - "openimPath": "/sdk/flutter/message/receiving-messages/receive-messages", - "title": "Receive messages", + "sourcePath": "/sdk/flutter/conversation/managing-conversation-groups/get-conversation-group-info-with-conversations", + "openimPath": "/sdk/flutter/conversation/managing-conversation-groups/get-conversation-group-info-with-conversations", + "title": "getConversationGroupInfoWithConversations", "context": "chat/sdk/flutter", "template": "guide", - "contentFile": "content/docs/chat/sdk/flutter/message/receiving-messages/receive-messages.mdx" + "contentFile": "content/docs/chat/sdk/flutter/conversation/managing-conversation-groups/get-conversation-group-info-with-conversations.mdx" }, { - "sourcePath": "/sdk/flutter/message/receiving-messages/custom-business-listener", - "openimPath": "/sdk/flutter/message/receiving-messages/custom-business-listener", - "title": "Receive custom business messages", + "sourcePath": "/sdk/flutter/conversation/managing-conversation-groups/get-conversation-group-ids-by-conversation-id", + "openimPath": "/sdk/flutter/conversation/managing-conversation-groups/get-conversation-group-ids-by-conversation-id", + "title": "getConversationGroupByConversationID", "context": "chat/sdk/flutter", "template": "guide", - "contentFile": "content/docs/chat/sdk/flutter/message/receiving-messages/custom-business-listener.mdx" + "contentFile": "content/docs/chat/sdk/flutter/conversation/managing-conversation-groups/get-conversation-group-ids-by-conversation-id.mdx" }, { - "sourcePath": "/sdk/flutter/message/retrieving-messages/load-older-messages", - "openimPath": "/sdk/flutter/message/retrieving-messages/load-older-messages", - "title": "Load older messages", + "sourcePath": "/sdk/flutter/conversation/managing-conversation-groups/update-conversation-group", + "openimPath": "/sdk/flutter/conversation/managing-conversation-groups/update-conversation-group", + "title": "updateConversationGroup", "context": "chat/sdk/flutter", "template": "guide", - "contentFile": "content/docs/chat/sdk/flutter/message/retrieving-messages/load-older-messages.mdx" + "contentFile": "content/docs/chat/sdk/flutter/conversation/managing-conversation-groups/update-conversation-group.mdx" }, { - "sourcePath": "/sdk/flutter/message/retrieving-messages/load-newer-messages", - "openimPath": "/sdk/flutter/message/retrieving-messages/load-newer-messages", - "title": "Load newer messages", + "sourcePath": "/sdk/flutter/conversation/managing-conversation-groups/set-conversation-group-order", + "openimPath": "/sdk/flutter/conversation/managing-conversation-groups/set-conversation-group-order", + "title": "setConversationGroupOrder", "context": "chat/sdk/flutter", "template": "guide", - "contentFile": "content/docs/chat/sdk/flutter/message/retrieving-messages/load-newer-messages.mdx" + "contentFile": "content/docs/chat/sdk/flutter/conversation/managing-conversation-groups/set-conversation-group-order.mdx" }, { - "sourcePath": "/sdk/flutter/message/retrieving-messages/locate-messages-by-id", - "openimPath": "/sdk/flutter/message/retrieving-messages/locate-messages-by-id", - "title": "Locate messages by ID", + "sourcePath": "/sdk/flutter/conversation/managing-conversation-groups/add-conversations-to-groups", + "openimPath": "/sdk/flutter/conversation/managing-conversation-groups/add-conversations-to-groups", + "title": "addConversationsToGroups", "context": "chat/sdk/flutter", "template": "guide", - "contentFile": "content/docs/chat/sdk/flutter/message/retrieving-messages/locate-messages-by-id.mdx" + "contentFile": "content/docs/chat/sdk/flutter/conversation/managing-conversation-groups/add-conversations-to-groups.mdx" }, { - "sourcePath": "/sdk/flutter/message/searching-messages/search-messages", - "openimPath": "/sdk/flutter/message/searching-messages/search-messages", - "title": "Search messages", + "sourcePath": "/sdk/flutter/conversation/managing-conversation-groups/remove-conversations-from-groups", + "openimPath": "/sdk/flutter/conversation/managing-conversation-groups/remove-conversations-from-groups", + "title": "removeConversationsFromGroups", "context": "chat/sdk/flutter", "template": "guide", - "contentFile": "content/docs/chat/sdk/flutter/message/searching-messages/search-messages.mdx" + "contentFile": "content/docs/chat/sdk/flutter/conversation/managing-conversation-groups/remove-conversations-from-groups.mdx" }, { - "sourcePath": "/sdk/flutter/message/composing-messages/update-typing-status", - "openimPath": "/sdk/flutter/message/composing-messages/update-typing-status", - "title": "Update typing status", + "sourcePath": "/sdk/flutter/conversation/managing-conversation-groups/delete-conversation-group", + "openimPath": "/sdk/flutter/conversation/managing-conversation-groups/delete-conversation-group", + "title": "deleteConversationGroup", "context": "chat/sdk/flutter", "template": "guide", - "contentFile": "content/docs/chat/sdk/flutter/message/composing-messages/update-typing-status.mdx" + "contentFile": "content/docs/chat/sdk/flutter/conversation/managing-conversation-groups/delete-conversation-group.mdx" }, { - "sourcePath": "/sdk/flutter/message/composing-messages/get-typing-status", - "openimPath": "/sdk/flutter/message/composing-messages/get-typing-status", - "title": "Get typing status", + "sourcePath": "/sdk/flutter/group/overview-group", + "openimPath": "/sdk/flutter/group/overview-group", + "title": "Group overview", "context": "chat/sdk/flutter", "template": "guide", - "contentFile": "content/docs/chat/sdk/flutter/message/composing-messages/get-typing-status.mdx" + "contentFile": "content/docs/chat/sdk/flutter/group/overview-group.mdx" }, { - "sourcePath": "/sdk/flutter/message/composing-messages/check-speech-to-text", - "openimPath": "/sdk/flutter/message/composing-messages/check-speech-to-text", - "title": "Check speech recognition support", + "sourcePath": "/sdk/flutter/group/create-group", + "openimPath": "/sdk/flutter/group/create-group", + "title": "Create a group", "context": "chat/sdk/flutter", "template": "guide", - "contentFile": "content/docs/chat/sdk/flutter/message/composing-messages/check-speech-to-text.mdx" + "contentFile": "content/docs/chat/sdk/flutter/group/create-group.mdx" }, { - "sourcePath": "/sdk/flutter/message/composing-messages/transcribe-audio", - "openimPath": "/sdk/flutter/message/composing-messages/transcribe-audio", - "title": "Transcribe audio", + "sourcePath": "/sdk/flutter/group/update-group-profile", + "openimPath": "/sdk/flutter/group/update-group-profile", + "title": "Update group profile", "context": "chat/sdk/flutter", - "template": "guide", - "contentFile": "content/docs/chat/sdk/flutter/message/composing-messages/transcribe-audio.mdx" + "template": "overview", + "contentFile": "content/docs/chat/sdk/flutter/group/update-group-profile.mdx" }, { - "sourcePath": "/sdk/flutter/message/composing-messages/save-local-transcript", - "openimPath": "/sdk/flutter/message/composing-messages/save-local-transcript", - "title": "Save a local transcript", + "sourcePath": "/sdk/flutter/group/set-group-announcement", + "openimPath": "/sdk/flutter/group/set-group-announcement", + "title": "Publish a group announcement", "context": "chat/sdk/flutter", - "template": "guide", - "contentFile": "content/docs/chat/sdk/flutter/message/composing-messages/save-local-transcript.mdx" + "template": "overview", + "contentFile": "content/docs/chat/sdk/flutter/group/set-group-announcement.mdx" }, { - "sourcePath": "/sdk/flutter/message/managing-messages/delete-local-message", - "openimPath": "/sdk/flutter/message/managing-messages/delete-local-message", - "title": "Delete a local message", + "sourcePath": "/sdk/flutter/group/set-group-extension", + "openimPath": "/sdk/flutter/group/set-group-extension", + "title": "Set group extra data", "context": "chat/sdk/flutter", - "template": "guide", - "contentFile": "content/docs/chat/sdk/flutter/message/managing-messages/delete-local-message.mdx" + "template": "overview", + "contentFile": "content/docs/chat/sdk/flutter/group/set-group-extension.mdx" }, { - "sourcePath": "/sdk/flutter/message/managing-messages/delete-saved-message", - "openimPath": "/sdk/flutter/message/managing-messages/delete-saved-message", - "title": "Delete a saved message", + "sourcePath": "/sdk/flutter/group/set-group-join-verification", + "openimPath": "/sdk/flutter/group/set-group-join-verification", + "title": "Set group join verification", "context": "chat/sdk/flutter", - "template": "guide", - "contentFile": "content/docs/chat/sdk/flutter/message/managing-messages/delete-saved-message.mdx" + "template": "overview", + "contentFile": "content/docs/chat/sdk/flutter/group/set-group-join-verification.mdx" }, { - "sourcePath": "/sdk/flutter/message/managing-messages/revoke-a-message", - "openimPath": "/sdk/flutter/message/managing-messages/revoke-a-message", - "title": "Revoke a message", + "sourcePath": "/sdk/flutter/group/set-group-member-profile-access", + "openimPath": "/sdk/flutter/group/set-group-member-profile-access", + "title": "Set member profile access", "context": "chat/sdk/flutter", - "template": "guide", - "contentFile": "content/docs/chat/sdk/flutter/message/managing-messages/revoke-a-message.mdx" + "template": "overview", + "contentFile": "content/docs/chat/sdk/flutter/group/set-group-member-profile-access.mdx" }, { - "sourcePath": "/sdk/flutter/message/managing-messages/modify-a-message", - "openimPath": "/sdk/flutter/message/managing-messages/modify-a-message", - "title": "Modify a message", + "sourcePath": "/sdk/flutter/group/set-group-member-friend-permission", + "openimPath": "/sdk/flutter/group/set-group-member-friend-permission", + "title": "Set member friend request permission", "context": "chat/sdk/flutter", - "template": "guide", - "contentFile": "content/docs/chat/sdk/flutter/message/managing-messages/modify-a-message.mdx" + "template": "overview", + "contentFile": "content/docs/chat/sdk/flutter/group/set-group-member-friend-permission.mdx" }, { - "sourcePath": "/sdk/flutter/message/managing-messages/get-pinned-messages", - "openimPath": "/sdk/flutter/message/managing-messages/get-pinned-messages", - "title": "View pinned messages", + "sourcePath": "/sdk/flutter/group/change-group-mute", + "openimPath": "/sdk/flutter/group/change-group-mute", + "title": "Change group mute status", "context": "chat/sdk/flutter", "template": "guide", - "contentFile": "content/docs/chat/sdk/flutter/message/managing-messages/get-pinned-messages.mdx" + "contentFile": "content/docs/chat/sdk/flutter/group/change-group-mute.mdx" }, { - "sourcePath": "/sdk/flutter/message/managing-messages/set-message-pinned", - "openimPath": "/sdk/flutter/message/managing-messages/set-message-pinned", - "title": "Pin or unpin a message", + "sourcePath": "/sdk/flutter/group/join-group", + "openimPath": "/sdk/flutter/group/join-group", + "title": "Apply to join a group", "context": "chat/sdk/flutter", "template": "guide", - "contentFile": "content/docs/chat/sdk/flutter/message/managing-messages/set-message-pinned.mdx" + "contentFile": "content/docs/chat/sdk/flutter/group/join-group.mdx" }, { - "sourcePath": "/sdk/flutter/message/managing-messages/insert-local-single-message", - "openimPath": "/sdk/flutter/message/managing-messages/insert-local-single-message", - "title": "Insert a local direct message", + "sourcePath": "/sdk/flutter/group/quit-group", + "openimPath": "/sdk/flutter/group/quit-group", + "title": "Leave a group", "context": "chat/sdk/flutter", "template": "guide", - "contentFile": "content/docs/chat/sdk/flutter/message/managing-messages/insert-local-single-message.mdx" + "contentFile": "content/docs/chat/sdk/flutter/group/quit-group.mdx" }, { - "sourcePath": "/sdk/flutter/message/managing-messages/insert-local-group-message", - "openimPath": "/sdk/flutter/message/managing-messages/insert-local-group-message", - "title": "Insert a local group message", + "sourcePath": "/sdk/flutter/group/dismiss-group", + "openimPath": "/sdk/flutter/group/dismiss-group", + "title": "Dismiss a group", "context": "chat/sdk/flutter", "template": "guide", - "contentFile": "content/docs/chat/sdk/flutter/message/managing-messages/insert-local-group-message.mdx" + "contentFile": "content/docs/chat/sdk/flutter/group/dismiss-group.mdx" }, { - "sourcePath": "/sdk/flutter/message/managing-messages/clear-all-local-messages", - "openimPath": "/sdk/flutter/message/managing-messages/clear-all-local-messages", - "title": "Clear all local messages", + "sourcePath": "/sdk/flutter/group/retrieving-groups/get-specified-groups-info", + "openimPath": "/sdk/flutter/group/retrieving-groups/get-specified-groups-info", + "title": "Get group information", "context": "chat/sdk/flutter", "template": "guide", - "contentFile": "content/docs/chat/sdk/flutter/message/managing-messages/clear-all-local-messages.mdx" + "contentFile": "content/docs/chat/sdk/flutter/group/retrieving-groups/get-specified-groups-info.mdx" }, { - "sourcePath": "/sdk/flutter/message/managing-messages/clear-all-messages", - "openimPath": "/sdk/flutter/message/managing-messages/clear-all-messages", - "title": "Clear all saved messages", + "sourcePath": "/sdk/flutter/group/retrieving-groups/get-joined-group-list", + "openimPath": "/sdk/flutter/group/retrieving-groups/get-joined-group-list", + "title": "Get joined groups", "context": "chat/sdk/flutter", "template": "guide", - "contentFile": "content/docs/chat/sdk/flutter/message/managing-messages/clear-all-messages.mdx" + "contentFile": "content/docs/chat/sdk/flutter/group/retrieving-groups/get-joined-group-list.mdx" }, { - "sourcePath": "/sdk/flutter/message/managing-messages/set-message-local-ex", - "openimPath": "/sdk/flutter/message/managing-messages/set-message-local-ex", - "title": "Set local message extensions", + "sourcePath": "/sdk/flutter/group/retrieving-groups/get-joined-group-list-page", + "openimPath": "/sdk/flutter/group/retrieving-groups/get-joined-group-list-page", + "title": "Get joined groups by page", "context": "chat/sdk/flutter", "template": "guide", - "contentFile": "content/docs/chat/sdk/flutter/message/managing-messages/set-message-local-ex.mdx" + "contentFile": "content/docs/chat/sdk/flutter/group/retrieving-groups/get-joined-group-list-page.mdx" }, { - "sourcePath": "/sdk/flutter/file-uploads/set-upload-file-listener", - "openimPath": "/sdk/flutter/file-uploads/set-upload-file-listener", - "title": "Track file upload progress", + "sourcePath": "/sdk/flutter/group/retrieving-groups/is-join-group", + "openimPath": "/sdk/flutter/group/retrieving-groups/is-join-group", + "title": "Check group membership", "context": "chat/sdk/flutter", "template": "guide", - "contentFile": "content/docs/chat/sdk/flutter/file-uploads/set-upload-file-listener.mdx" + "contentFile": "content/docs/chat/sdk/flutter/group/retrieving-groups/is-join-group.mdx" }, { - "sourcePath": "/sdk/flutter/file-uploads/upload-file", - "openimPath": "/sdk/flutter/file-uploads/upload-file", - "title": "Upload a file", + "sourcePath": "/sdk/flutter/group/retrieving-groups/search-groups", + "openimPath": "/sdk/flutter/group/retrieving-groups/search-groups", + "title": "Search groups", "context": "chat/sdk/flutter", "template": "guide", - "contentFile": "content/docs/chat/sdk/flutter/file-uploads/upload-file.mdx" + "contentFile": "content/docs/chat/sdk/flutter/group/retrieving-groups/search-groups.mdx" }, { - "sourcePath": "/sdk/flutter/calling/overview-calling", - "openimPath": "/sdk/flutter/calling/overview-calling", - "title": "Calling overview", + "sourcePath": "/sdk/flutter/group/group-applications/overview-group-applications", + "openimPath": "/sdk/flutter/group/group-applications/overview-group-applications", + "title": "Group applications overview", "context": "chat/sdk/flutter", "template": "guide", - "contentFile": "content/docs/chat/sdk/flutter/calling/overview-calling.mdx" + "contentFile": "content/docs/chat/sdk/flutter/group/group-applications/overview-group-applications.mdx" }, { - "sourcePath": "/sdk/flutter/calling/managing-calls/start-single-call", - "openimPath": "/sdk/flutter/calling/managing-calls/start-single-call", - "title": "Start a one-to-one call", + "sourcePath": "/sdk/flutter/group/group-applications/get-group-application-list-as-recipient", + "openimPath": "/sdk/flutter/group/group-applications/get-group-application-list-as-recipient", + "title": "Get received group applications", "context": "chat/sdk/flutter", "template": "guide", - "contentFile": "content/docs/chat/sdk/flutter/calling/managing-calls/start-single-call.mdx" + "contentFile": "content/docs/chat/sdk/flutter/group/group-applications/get-group-application-list-as-recipient.mdx" }, { - "sourcePath": "/sdk/flutter/calling/managing-calls/start-group-call", - "openimPath": "/sdk/flutter/calling/managing-calls/start-group-call", - "title": "Start a group call", + "sourcePath": "/sdk/flutter/group/group-applications/get-group-application-list-as-applicant", + "openimPath": "/sdk/flutter/group/group-applications/get-group-application-list-as-applicant", + "title": "Get sent group applications", "context": "chat/sdk/flutter", "template": "guide", - "contentFile": "content/docs/chat/sdk/flutter/calling/managing-calls/start-group-call.mdx" + "contentFile": "content/docs/chat/sdk/flutter/group/group-applications/get-group-application-list-as-applicant.mdx" }, { - "sourcePath": "/sdk/flutter/calling/managing-calls/accept-call", - "openimPath": "/sdk/flutter/calling/managing-calls/accept-call", - "title": "Accept a call", + "sourcePath": "/sdk/flutter/group/group-applications/get-group-application-unhandled-count", + "openimPath": "/sdk/flutter/group/group-applications/get-group-application-unhandled-count", + "title": "Get pending group application count", "context": "chat/sdk/flutter", "template": "guide", - "contentFile": "content/docs/chat/sdk/flutter/calling/managing-calls/accept-call.mdx" + "contentFile": "content/docs/chat/sdk/flutter/group/group-applications/get-group-application-unhandled-count.mdx" }, { - "sourcePath": "/sdk/flutter/calling/managing-calls/reject-call", - "openimPath": "/sdk/flutter/calling/managing-calls/reject-call", - "title": "Reject a call", + "sourcePath": "/sdk/flutter/group/group-applications/accept-group-application", + "openimPath": "/sdk/flutter/group/group-applications/accept-group-application", + "title": "Accept a group application", "context": "chat/sdk/flutter", "template": "guide", - "contentFile": "content/docs/chat/sdk/flutter/calling/managing-calls/reject-call.mdx" + "contentFile": "content/docs/chat/sdk/flutter/group/group-applications/accept-group-application.mdx" }, { - "sourcePath": "/sdk/flutter/calling/managing-calls/cancel-call", - "openimPath": "/sdk/flutter/calling/managing-calls/cancel-call", - "title": "Cancel a call invitation", + "sourcePath": "/sdk/flutter/group/group-applications/refuse-group-application", + "openimPath": "/sdk/flutter/group/group-applications/refuse-group-application", + "title": "Reject a group application", "context": "chat/sdk/flutter", "template": "guide", - "contentFile": "content/docs/chat/sdk/flutter/calling/managing-calls/cancel-call.mdx" + "contentFile": "content/docs/chat/sdk/flutter/group/group-applications/refuse-group-application.mdx" }, { - "sourcePath": "/sdk/flutter/calling/managing-calls/hang-up-call", - "openimPath": "/sdk/flutter/calling/managing-calls/hang-up-call", - "title": "Hang up a call", + "sourcePath": "/sdk/flutter/group/retrieving-group-members/overview-retrieving-group-members", + "openimPath": "/sdk/flutter/group/retrieving-group-members/overview-retrieving-group-members", + "title": "Group member queries overview", "context": "chat/sdk/flutter", "template": "guide", - "contentFile": "content/docs/chat/sdk/flutter/calling/managing-calls/hang-up-call.mdx" + "contentFile": "content/docs/chat/sdk/flutter/group/retrieving-group-members/overview-retrieving-group-members.mdx" }, { - "sourcePath": "/sdk/flutter/calling/managing-calls/handle-call-events", - "openimPath": "/sdk/flutter/calling/managing-calls/handle-call-events", - "title": "Handle call events", + "sourcePath": "/sdk/flutter/group/retrieving-group-members/get-group-member-list", + "openimPath": "/sdk/flutter/group/retrieving-group-members/get-group-member-list", + "title": "Get group members", "context": "chat/sdk/flutter", "template": "guide", - "contentFile": "content/docs/chat/sdk/flutter/calling/managing-calls/handle-call-events.mdx" + "contentFile": "content/docs/chat/sdk/flutter/group/retrieving-group-members/get-group-member-list.mdx" }, { - "sourcePath": "/sdk/flutter/calling/retrieving-call-information/restore-pending-invitation", - "openimPath": "/sdk/flutter/calling/retrieving-call-information/restore-pending-invitation", - "title": "Restore a pending invitation", + "sourcePath": "/sdk/flutter/group/retrieving-group-members/get-group-members-info", + "openimPath": "/sdk/flutter/group/retrieving-group-members/get-group-members-info", + "title": "Get group member profiles", "context": "chat/sdk/flutter", "template": "guide", - "contentFile": "content/docs/chat/sdk/flutter/calling/retrieving-call-information/restore-pending-invitation.mdx" + "contentFile": "content/docs/chat/sdk/flutter/group/retrieving-group-members/get-group-members-info.mdx" }, { - "sourcePath": "/sdk/flutter/calling/retrieving-call-information/get-room-by-group-id", - "openimPath": "/sdk/flutter/calling/retrieving-call-information/get-room-by-group-id", - "title": "Get a group call room", + "sourcePath": "/sdk/flutter/group/retrieving-group-members/get-users-in-group", + "openimPath": "/sdk/flutter/group/retrieving-group-members/get-users-in-group", + "title": "Check users in a group", "context": "chat/sdk/flutter", "template": "guide", - "contentFile": "content/docs/chat/sdk/flutter/calling/retrieving-call-information/get-room-by-group-id.mdx" + "contentFile": "content/docs/chat/sdk/flutter/group/retrieving-group-members/get-users-in-group.mdx" }, { - "sourcePath": "/sdk/flutter/calling/retrieving-call-information/get-token-by-room-id", - "openimPath": "/sdk/flutter/calling/retrieving-call-information/get-token-by-room-id", - "title": "Get room credentials", + "sourcePath": "/sdk/flutter/group/retrieving-group-members/get-group-owner-and-admin", + "openimPath": "/sdk/flutter/group/retrieving-group-members/get-group-owner-and-admin", + "title": "Get group owners and admins", "context": "chat/sdk/flutter", "template": "guide", - "contentFile": "content/docs/chat/sdk/flutter/calling/retrieving-call-information/get-token-by-room-id.mdx" + "contentFile": "content/docs/chat/sdk/flutter/group/retrieving-group-members/get-group-owner-and-admin.mdx" }, { - "sourcePath": "/sdk/flutter/calling/sending-custom-signals/send-a-custom-signal", - "openimPath": "/sdk/flutter/calling/sending-custom-signals/send-a-custom-signal", - "title": "Send a custom signal", + "sourcePath": "/sdk/flutter/group/retrieving-group-members/search-group-members", + "openimPath": "/sdk/flutter/group/retrieving-group-members/search-group-members", + "title": "Search group members", "context": "chat/sdk/flutter", "template": "guide", - "contentFile": "content/docs/chat/sdk/flutter/calling/sending-custom-signals/send-a-custom-signal.mdx" + "contentFile": "content/docs/chat/sdk/flutter/group/retrieving-group-members/search-group-members.mdx" }, { - "sourcePath": "/sdk/flutter/events/overview-events", - "openimPath": "/sdk/flutter/events/overview-events", - "title": "Events overview", + "sourcePath": "/sdk/flutter/group/managing-group-members/invite-user-to-group", + "openimPath": "/sdk/flutter/group/managing-group-members/invite-user-to-group", + "title": "Invite users to a group", "context": "chat/sdk/flutter", "template": "guide", - "contentFile": "content/docs/chat/sdk/flutter/events/overview-events.mdx" + "contentFile": "content/docs/chat/sdk/flutter/group/managing-group-members/invite-user-to-group.mdx" }, { - "sourcePath": "/sdk/flutter/logger", - "openimPath": "/sdk/flutter/logger", - "title": "Logger", + "sourcePath": "/sdk/flutter/group/managing-group-members/kick-group-member", + "openimPath": "/sdk/flutter/group/managing-group-members/kick-group-member", + "title": "Remove group members", "context": "chat/sdk/flutter", "template": "guide", - "contentFile": "content/docs/chat/sdk/flutter/logger.mdx" + "contentFile": "content/docs/chat/sdk/flutter/group/managing-group-members/kick-group-member.mdx" }, { - "sourcePath": "/sdk/uniapp/overview", - "openimPath": "/sdk/uniapp/overview", - "title": "OpenIM SDK for uni-app", - "context": "chat/sdk/uniapp", + "sourcePath": "/sdk/flutter/group/managing-group-members/set-group-member-nickname", + "openimPath": "/sdk/flutter/group/managing-group-members/set-group-member-nickname", + "title": "Update a group nickname", + "context": "chat/sdk/flutter", "template": "overview", - "contentFile": "content/docs/chat/sdk/uniapp/overview.mdx" + "contentFile": "content/docs/chat/sdk/flutter/group/managing-group-members/set-group-member-nickname.mdx" }, { - "sourcePath": "/sdk/electron/overview", - "openimPath": "/sdk/electron/overview", - "title": "OpenIM SDK for Electron", - "context": "chat/sdk/electron", + "sourcePath": "/sdk/flutter/group/managing-group-members/set-group-member-role-level", + "openimPath": "/sdk/flutter/group/managing-group-members/set-group-member-role-level", + "title": "Manage group administrators", + "context": "chat/sdk/flutter", "template": "overview", - "contentFile": "content/docs/chat/sdk/electron/overview.mdx" - }, - { - "sourcePath": "/sdk/electron/getting-started/authenticate-and-init", - "openimPath": "/sdk/electron/getting-started/authenticate-and-init", - "title": "Authenticate and init", - "context": "chat/sdk/electron", - "template": "guide", - "contentFile": "content/docs/chat/sdk/electron/getting-started/authenticate-and-init.mdx" - }, - { - "sourcePath": "/sdk/electron/message/create-media-from-full-path", - "openimPath": "/sdk/electron/message/create-media-from-full-path", - "title": "Create media from full path", - "context": "chat/sdk/electron", - "template": "guide", - "contentFile": "content/docs/chat/sdk/electron/message/create-media-from-full-path.mdx" + "contentFile": "content/docs/chat/sdk/flutter/group/managing-group-members/set-group-member-role-level.mdx" }, { - "sourcePath": "/sdk/electron/logger/upload-logs", - "openimPath": "/sdk/electron/logger/upload-logs", - "title": "Upload logs", - "context": "chat/sdk/electron", - "template": "guide", - "contentFile": "content/docs/chat/sdk/electron/logger/upload-logs.mdx" + "sourcePath": "/sdk/flutter/group/managing-group-members/set-group-member-avatar", + "openimPath": "/sdk/flutter/group/managing-group-members/set-group-member-avatar", + "title": "Update a group member avatar", + "context": "chat/sdk/flutter", + "template": "overview", + "contentFile": "content/docs/chat/sdk/flutter/group/managing-group-members/set-group-member-avatar.mdx" }, { - "sourcePath": "/sdk/miniprogram/overview", - "openimPath": "/sdk/miniprogram/overview", - "title": "OpenIM SDK for Mini Program", - "context": "chat/sdk/miniprogram", + "sourcePath": "/sdk/flutter/group/managing-group-members/set-group-member-extension", + "openimPath": "/sdk/flutter/group/managing-group-members/set-group-member-extension", + "title": "Set group member extra data", + "context": "chat/sdk/flutter", "template": "overview", - "contentFile": "content/docs/chat/sdk/miniprogram/overview.mdx" + "contentFile": "content/docs/chat/sdk/flutter/group/managing-group-members/set-group-member-extension.mdx" }, { - "sourcePath": "/sdk/react-native/overview", - "openimPath": "/sdk/react-native/overview", - "title": "OpenIM SDK for React Native", - "context": "chat/sdk/react-native", - "template": "overview", - "contentFile": "content/docs/chat/sdk/react-native/overview.mdx" + "sourcePath": "/sdk/flutter/group/managing-group-members/transfer-group-owner", + "openimPath": "/sdk/flutter/group/managing-group-members/transfer-group-owner", + "title": "Transfer group owner", + "context": "chat/sdk/flutter", + "template": "guide", + "contentFile": "content/docs/chat/sdk/flutter/group/managing-group-members/transfer-group-owner.mdx" }, { - "sourcePath": "/sdk/wasm/overview", - "openimPath": "/sdk/wasm/overview", - "title": "OpenIM SDK for WASM", - "context": "chat/sdk/wasm", - "template": "overview", - "contentFile": "content/docs/chat/sdk/wasm/overview.mdx" + "sourcePath": "/sdk/flutter/group/managing-group-members/change-group-member-mute", + "openimPath": "/sdk/flutter/group/managing-group-members/change-group-member-mute", + "title": "Mute or unmute a group member", + "context": "chat/sdk/flutter", + "template": "guide", + "contentFile": "content/docs/chat/sdk/flutter/group/managing-group-members/change-group-member-mute.mdx" }, { - "sourcePath": "/sdk/wasm/getting-started/before-you-start", - "openimPath": "/sdk/wasm/getting-started/before-you-start", - "title": "Before you start", - "context": "chat/sdk/wasm", + "sourcePath": "/sdk/flutter/message/overview-message", + "openimPath": "/sdk/flutter/message/overview-message", + "title": "Overview", + "context": "chat/sdk/flutter", "template": "guide", - "contentFile": "content/docs/chat/sdk/wasm/getting-started/before-you-start.mdx" + "contentFile": "content/docs/chat/sdk/flutter/message/overview-message.mdx" }, { - "sourcePath": "/sdk/wasm/getting-started/environment-specific-implementation", - "openimPath": "/sdk/wasm/getting-started/environment-specific-implementation", - "title": "Environment-specific implementation", - "context": "chat/sdk/wasm", + "sourcePath": "/sdk/flutter/message/creating-messages/create-text-message", + "openimPath": "/sdk/flutter/message/creating-messages/create-text-message", + "title": "Create a text message", + "context": "chat/sdk/flutter", "template": "guide", - "contentFile": "content/docs/chat/sdk/wasm/getting-started/environment-specific-implementation.mdx" + "contentFile": "content/docs/chat/sdk/flutter/message/creating-messages/create-text-message.mdx" }, { - "sourcePath": "/sdk/wasm/getting-started/authenticate-and-manage-session", - "openimPath": "/sdk/wasm/getting-started/authenticate-and-manage-session", - "title": "Authenticate and manage a session", - "context": "chat/sdk/wasm", + "sourcePath": "/sdk/flutter/message/creating-messages/create-text-at-message", + "openimPath": "/sdk/flutter/message/creating-messages/create-text-at-message", + "title": "Create a mention message", + "context": "chat/sdk/flutter", "template": "guide", - "contentFile": "content/docs/chat/sdk/wasm/getting-started/authenticate-and-manage-session.mdx" + "contentFile": "content/docs/chat/sdk/flutter/message/creating-messages/create-text-at-message.mdx" }, { - "sourcePath": "/sdk/wasm/getting-started/send-first-message", - "openimPath": "/sdk/wasm/getting-started/send-first-message", - "title": "Send your first message", - "context": "chat/sdk/wasm", + "sourcePath": "/sdk/flutter/message/creating-messages/create-custom-message", + "openimPath": "/sdk/flutter/message/creating-messages/create-custom-message", + "title": "Create a custom message", + "context": "chat/sdk/flutter", "template": "guide", - "contentFile": "content/docs/chat/sdk/wasm/getting-started/send-first-message.mdx" + "contentFile": "content/docs/chat/sdk/flutter/message/creating-messages/create-custom-message.mdx" }, { - "sourcePath": "/sdk/wasm/user/overview-user", - "openimPath": "/sdk/wasm/user/overview-user", - "title": "User overview", - "context": "chat/sdk/wasm", + "sourcePath": "/sdk/flutter/message/creating-messages/create-image-message", + "openimPath": "/sdk/flutter/message/creating-messages/create-image-message", + "title": "Create an image message", + "context": "chat/sdk/flutter", "template": "guide", - "contentFile": "content/docs/chat/sdk/wasm/user/overview-user.mdx" + "contentFile": "content/docs/chat/sdk/flutter/message/creating-messages/create-image-message.mdx" }, { - "sourcePath": "/sdk/wasm/user/profile/get-users-info", - "openimPath": "/sdk/wasm/user/profile/get-users-info", - "title": "Get user profiles", - "context": "chat/sdk/wasm", + "sourcePath": "/sdk/flutter/message/creating-messages/create-image-message-from-full-path", + "openimPath": "/sdk/flutter/message/creating-messages/create-image-message-from-full-path", + "title": "Create an image message from a path", + "context": "chat/sdk/flutter", "template": "guide", - "contentFile": "content/docs/chat/sdk/wasm/user/profile/get-users-info.mdx" + "contentFile": "content/docs/chat/sdk/flutter/message/creating-messages/create-image-message-from-full-path.mdx" }, { - "sourcePath": "/sdk/wasm/user/profile/get-self-user-info", - "openimPath": "/sdk/wasm/user/profile/get-self-user-info", - "title": "Get your profile", - "context": "chat/sdk/wasm", + "sourcePath": "/sdk/flutter/message/creating-messages/create-image-message-by-url", + "openimPath": "/sdk/flutter/message/creating-messages/create-image-message-by-url", + "title": "Create an image message from a URL", + "context": "chat/sdk/flutter", "template": "guide", - "contentFile": "content/docs/chat/sdk/wasm/user/profile/get-self-user-info.mdx" + "contentFile": "content/docs/chat/sdk/flutter/message/creating-messages/create-image-message-by-url.mdx" }, { - "sourcePath": "/sdk/wasm/user/profile/set-self-info", - "openimPath": "/sdk/wasm/user/profile/set-self-info", - "title": "Update your profile", - "context": "chat/sdk/wasm", + "sourcePath": "/sdk/flutter/message/creating-messages/create-sound-message", + "openimPath": "/sdk/flutter/message/creating-messages/create-sound-message", + "title": "Create an audio message", + "context": "chat/sdk/flutter", "template": "guide", - "contentFile": "content/docs/chat/sdk/wasm/user/profile/set-self-info.mdx" + "contentFile": "content/docs/chat/sdk/flutter/message/creating-messages/create-sound-message.mdx" }, { - "sourcePath": "/sdk/wasm/user/profile/set-global-message-reception", - "openimPath": "/sdk/wasm/user/profile/set-global-message-reception", - "title": "Set global message reception", - "context": "chat/sdk/wasm", - "template": "overview", - "contentFile": "content/docs/chat/sdk/wasm/user/profile/set-global-message-reception.mdx" + "sourcePath": "/sdk/flutter/message/creating-messages/create-sound-message-from-full-path", + "openimPath": "/sdk/flutter/message/creating-messages/create-sound-message-from-full-path", + "title": "Create an audio message from a path", + "context": "chat/sdk/flutter", + "template": "guide", + "contentFile": "content/docs/chat/sdk/flutter/message/creating-messages/create-sound-message-from-full-path.mdx" }, { - "sourcePath": "/sdk/wasm/user/online-status/subscribe-users-status", - "openimPath": "/sdk/wasm/user/online-status/subscribe-users-status", - "title": "Subscribe to online status", - "context": "chat/sdk/wasm", + "sourcePath": "/sdk/flutter/message/creating-messages/create-sound-message-by-url", + "openimPath": "/sdk/flutter/message/creating-messages/create-sound-message-by-url", + "title": "Create an audio message from a URL", + "context": "chat/sdk/flutter", "template": "guide", - "contentFile": "content/docs/chat/sdk/wasm/user/online-status/subscribe-users-status.mdx" + "contentFile": "content/docs/chat/sdk/flutter/message/creating-messages/create-sound-message-by-url.mdx" }, { - "sourcePath": "/sdk/wasm/user/online-status/get-subscribe-users-status", - "openimPath": "/sdk/wasm/user/online-status/get-subscribe-users-status", - "title": "Get subscribed user status", - "context": "chat/sdk/wasm", + "sourcePath": "/sdk/flutter/message/creating-messages/create-video-message", + "openimPath": "/sdk/flutter/message/creating-messages/create-video-message", + "title": "Create a video message", + "context": "chat/sdk/flutter", "template": "guide", - "contentFile": "content/docs/chat/sdk/wasm/user/online-status/get-subscribe-users-status.mdx" + "contentFile": "content/docs/chat/sdk/flutter/message/creating-messages/create-video-message.mdx" }, { - "sourcePath": "/sdk/wasm/user/online-status/unsubscribe-users-status", - "openimPath": "/sdk/wasm/user/online-status/unsubscribe-users-status", - "title": "Unsubscribe from online status", - "context": "chat/sdk/wasm", + "sourcePath": "/sdk/flutter/message/creating-messages/create-video-message-from-full-path", + "openimPath": "/sdk/flutter/message/creating-messages/create-video-message-from-full-path", + "title": "Create a video message from a path", + "context": "chat/sdk/flutter", "template": "guide", - "contentFile": "content/docs/chat/sdk/wasm/user/online-status/unsubscribe-users-status.mdx" + "contentFile": "content/docs/chat/sdk/flutter/message/creating-messages/create-video-message-from-full-path.mdx" }, { - "sourcePath": "/sdk/wasm/user/friends/get-friend-list-page", - "openimPath": "/sdk/wasm/user/friends/get-friend-list-page", - "title": "Get the friend list", - "context": "chat/sdk/wasm", + "sourcePath": "/sdk/flutter/message/creating-messages/create-video-message-by-url", + "openimPath": "/sdk/flutter/message/creating-messages/create-video-message-by-url", + "title": "Create a video message from a URL", + "context": "chat/sdk/flutter", "template": "guide", - "contentFile": "content/docs/chat/sdk/wasm/user/friends/get-friend-list-page.mdx" + "contentFile": "content/docs/chat/sdk/flutter/message/creating-messages/create-video-message-by-url.mdx" }, { - "sourcePath": "/sdk/wasm/user/friends/search-friends", - "openimPath": "/sdk/wasm/user/friends/search-friends", - "title": "Search friends", - "context": "chat/sdk/wasm", + "sourcePath": "/sdk/flutter/message/creating-messages/create-file-message", + "openimPath": "/sdk/flutter/message/creating-messages/create-file-message", + "title": "Create a file message", + "context": "chat/sdk/flutter", "template": "guide", - "contentFile": "content/docs/chat/sdk/wasm/user/friends/search-friends.mdx" + "contentFile": "content/docs/chat/sdk/flutter/message/creating-messages/create-file-message.mdx" }, { - "sourcePath": "/sdk/wasm/user/friends/get-specified-friends-info", - "openimPath": "/sdk/wasm/user/friends/get-specified-friends-info", - "title": "Get friend profiles", - "context": "chat/sdk/wasm", + "sourcePath": "/sdk/flutter/message/creating-messages/create-file-message-from-full-path", + "openimPath": "/sdk/flutter/message/creating-messages/create-file-message-from-full-path", + "title": "Create a file message from a path", + "context": "chat/sdk/flutter", "template": "guide", - "contentFile": "content/docs/chat/sdk/wasm/user/friends/get-specified-friends-info.mdx" + "contentFile": "content/docs/chat/sdk/flutter/message/creating-messages/create-file-message-from-full-path.mdx" }, { - "sourcePath": "/sdk/wasm/user/friends/check-friend", - "openimPath": "/sdk/wasm/user/friends/check-friend", - "title": "Check friendship status", - "context": "chat/sdk/wasm", + "sourcePath": "/sdk/flutter/message/creating-messages/create-file-message-by-url", + "openimPath": "/sdk/flutter/message/creating-messages/create-file-message-by-url", + "title": "Create a file message from a URL", + "context": "chat/sdk/flutter", "template": "guide", - "contentFile": "content/docs/chat/sdk/wasm/user/friends/check-friend.mdx" + "contentFile": "content/docs/chat/sdk/flutter/message/creating-messages/create-file-message-by-url.mdx" }, { - "sourcePath": "/sdk/wasm/user/friends/update-friends", - "openimPath": "/sdk/wasm/user/friends/update-friends", - "title": "Update friend information", - "context": "chat/sdk/wasm", + "sourcePath": "/sdk/flutter/message/creating-messages/create-location-message", + "openimPath": "/sdk/flutter/message/creating-messages/create-location-message", + "title": "Create a location message", + "context": "chat/sdk/flutter", "template": "guide", - "contentFile": "content/docs/chat/sdk/wasm/user/friends/update-friends.mdx" + "contentFile": "content/docs/chat/sdk/flutter/message/creating-messages/create-location-message.mdx" }, { - "sourcePath": "/sdk/wasm/user/friends/delete-friend", - "openimPath": "/sdk/wasm/user/friends/delete-friend", - "title": "Delete a friend", - "context": "chat/sdk/wasm", + "sourcePath": "/sdk/flutter/message/creating-messages/create-card-message", + "openimPath": "/sdk/flutter/message/creating-messages/create-card-message", + "title": "Create a contact card message", + "context": "chat/sdk/flutter", "template": "guide", - "contentFile": "content/docs/chat/sdk/wasm/user/friends/delete-friend.mdx" + "contentFile": "content/docs/chat/sdk/flutter/message/creating-messages/create-card-message.mdx" }, { - "sourcePath": "/sdk/wasm/user/friend-applications/add-friend", - "openimPath": "/sdk/wasm/user/friend-applications/add-friend", - "title": "Send a friend application", - "context": "chat/sdk/wasm", + "sourcePath": "/sdk/flutter/message/creating-messages/create-face-message", + "openimPath": "/sdk/flutter/message/creating-messages/create-face-message", + "title": "Create an emoji message", + "context": "chat/sdk/flutter", "template": "guide", - "contentFile": "content/docs/chat/sdk/wasm/user/friend-applications/add-friend.mdx" + "contentFile": "content/docs/chat/sdk/flutter/message/creating-messages/create-face-message.mdx" }, { - "sourcePath": "/sdk/wasm/user/friend-applications/get-friend-application-list-as-recipient", - "openimPath": "/sdk/wasm/user/friend-applications/get-friend-application-list-as-recipient", - "title": "Get received friend applications", - "context": "chat/sdk/wasm", + "sourcePath": "/sdk/flutter/message/creating-messages/create-quote-message", + "openimPath": "/sdk/flutter/message/creating-messages/create-quote-message", + "title": "Create a reply message", + "context": "chat/sdk/flutter", "template": "guide", - "contentFile": "content/docs/chat/sdk/wasm/user/friend-applications/get-friend-application-list-as-recipient.mdx" + "contentFile": "content/docs/chat/sdk/flutter/message/creating-messages/create-quote-message.mdx" }, { - "sourcePath": "/sdk/wasm/user/friend-applications/get-friend-application-list-as-applicant", - "openimPath": "/sdk/wasm/user/friend-applications/get-friend-application-list-as-applicant", - "title": "Get sent friend applications", - "context": "chat/sdk/wasm", + "sourcePath": "/sdk/flutter/message/creating-messages/create-advanced-text-message", + "openimPath": "/sdk/flutter/message/creating-messages/create-advanced-text-message", + "title": "Create rich text", + "context": "chat/sdk/flutter", "template": "guide", - "contentFile": "content/docs/chat/sdk/wasm/user/friend-applications/get-friend-application-list-as-applicant.mdx" + "contentFile": "content/docs/chat/sdk/flutter/message/creating-messages/create-advanced-text-message.mdx" }, { - "sourcePath": "/sdk/wasm/user/friend-applications/get-friend-application-unhandled-count", - "openimPath": "/sdk/wasm/user/friend-applications/get-friend-application-unhandled-count", - "title": "Get pending application count", - "context": "chat/sdk/wasm", + "sourcePath": "/sdk/flutter/message/creating-messages/create-advanced-quote-message", + "openimPath": "/sdk/flutter/message/creating-messages/create-advanced-quote-message", + "title": "Create a rich reply", + "context": "chat/sdk/flutter", "template": "guide", - "contentFile": "content/docs/chat/sdk/wasm/user/friend-applications/get-friend-application-unhandled-count.mdx" + "contentFile": "content/docs/chat/sdk/flutter/message/creating-messages/create-advanced-quote-message.mdx" }, { - "sourcePath": "/sdk/wasm/user/friend-applications/accept-friend-application", - "openimPath": "/sdk/wasm/user/friend-applications/accept-friend-application", - "title": "Accept a friend application", - "context": "chat/sdk/wasm", + "sourcePath": "/sdk/flutter/message/creating-messages/create-forward-message", + "openimPath": "/sdk/flutter/message/creating-messages/create-forward-message", + "title": "Create a forwarded message", + "context": "chat/sdk/flutter", "template": "guide", - "contentFile": "content/docs/chat/sdk/wasm/user/friend-applications/accept-friend-application.mdx" + "contentFile": "content/docs/chat/sdk/flutter/message/creating-messages/create-forward-message.mdx" }, { - "sourcePath": "/sdk/wasm/user/friend-applications/refuse-friend-application", - "openimPath": "/sdk/wasm/user/friend-applications/refuse-friend-application", - "title": "Reject a friend application", - "context": "chat/sdk/wasm", + "sourcePath": "/sdk/flutter/message/creating-messages/create-merger-message", + "openimPath": "/sdk/flutter/message/creating-messages/create-merger-message", + "title": "Create a merged message", + "context": "chat/sdk/flutter", "template": "guide", - "contentFile": "content/docs/chat/sdk/wasm/user/friend-applications/refuse-friend-application.mdx" + "contentFile": "content/docs/chat/sdk/flutter/message/creating-messages/create-merger-message.mdx" }, { - "sourcePath": "/sdk/wasm/user/friend-applications/delete-friend-requests", - "openimPath": "/sdk/wasm/user/friend-applications/delete-friend-requests", - "title": "Delete friend applications", - "context": "chat/sdk/wasm", + "sourcePath": "/sdk/flutter/message/sending-messages/send-message", + "openimPath": "/sdk/flutter/message/sending-messages/send-message", + "title": "Send a message", + "context": "chat/sdk/flutter", "template": "guide", - "contentFile": "content/docs/chat/sdk/wasm/user/friend-applications/delete-friend-requests.mdx" + "contentFile": "content/docs/chat/sdk/flutter/message/sending-messages/send-message.mdx" }, { - "sourcePath": "/sdk/wasm/user/blacklist/get-black-list", - "openimPath": "/sdk/wasm/user/blacklist/get-black-list", - "title": "Get the blacklist", - "context": "chat/sdk/wasm", + "sourcePath": "/sdk/flutter/message/sending-messages/send-message-not-oss", + "openimPath": "/sdk/flutter/message/sending-messages/send-message-not-oss", + "title": "Send a message without OSS", + "context": "chat/sdk/flutter", "template": "guide", - "contentFile": "content/docs/chat/sdk/wasm/user/blacklist/get-black-list.mdx" + "contentFile": "content/docs/chat/sdk/flutter/message/sending-messages/send-message-not-oss.mdx" }, { - "sourcePath": "/sdk/wasm/user/blacklist/add-black", - "openimPath": "/sdk/wasm/user/blacklist/add-black", - "title": "Add a user to the blacklist", - "context": "chat/sdk/wasm", + "sourcePath": "/sdk/flutter/message/sending-messages/set-msg-send-progress-listener", + "openimPath": "/sdk/flutter/message/sending-messages/set-msg-send-progress-listener", + "title": "Track message sending progress", + "context": "chat/sdk/flutter", "template": "guide", - "contentFile": "content/docs/chat/sdk/wasm/user/blacklist/add-black.mdx" + "contentFile": "content/docs/chat/sdk/flutter/message/sending-messages/set-msg-send-progress-listener.mdx" }, { - "sourcePath": "/sdk/wasm/user/blacklist/remove-black", - "openimPath": "/sdk/wasm/user/blacklist/remove-black", - "title": "Remove a user from the blacklist", - "context": "chat/sdk/wasm", + "sourcePath": "/sdk/flutter/message/receiving-messages/receive-messages", + "openimPath": "/sdk/flutter/message/receiving-messages/receive-messages", + "title": "Receive messages", + "context": "chat/sdk/flutter", "template": "guide", - "contentFile": "content/docs/chat/sdk/wasm/user/blacklist/remove-black.mdx" + "contentFile": "content/docs/chat/sdk/flutter/message/receiving-messages/receive-messages.mdx" }, { - "sourcePath": "/sdk/wasm/conversation/overview-conversation", - "openimPath": "/sdk/wasm/conversation/overview-conversation", - "title": "Conversation overview", - "context": "chat/sdk/wasm", + "sourcePath": "/sdk/flutter/message/receiving-messages/custom-business-listener", + "openimPath": "/sdk/flutter/message/receiving-messages/custom-business-listener", + "title": "Receive custom business messages", + "context": "chat/sdk/flutter", "template": "guide", - "contentFile": "content/docs/chat/sdk/wasm/conversation/overview-conversation.mdx" + "contentFile": "content/docs/chat/sdk/flutter/message/receiving-messages/custom-business-listener.mdx" }, { - "sourcePath": "/sdk/wasm/conversation/retrieving-conversations/get-conversation-by-target", - "openimPath": "/sdk/wasm/conversation/retrieving-conversations/get-conversation-by-target", - "title": "Open a conversation", - "context": "chat/sdk/wasm", + "sourcePath": "/sdk/flutter/message/retrieving-messages/load-older-messages", + "openimPath": "/sdk/flutter/message/retrieving-messages/load-older-messages", + "title": "Load older messages", + "context": "chat/sdk/flutter", "template": "guide", - "contentFile": "content/docs/chat/sdk/wasm/conversation/retrieving-conversations/get-conversation-by-target.mdx" + "contentFile": "content/docs/chat/sdk/flutter/message/retrieving-messages/load-older-messages.mdx" }, { - "sourcePath": "/sdk/wasm/conversation/retrieving-conversations/get-conversation-id", - "openimPath": "/sdk/wasm/conversation/retrieving-conversations/get-conversation-id", - "title": "Resolve a conversation ID", - "context": "chat/sdk/wasm", + "sourcePath": "/sdk/flutter/message/retrieving-messages/load-newer-messages", + "openimPath": "/sdk/flutter/message/retrieving-messages/load-newer-messages", + "title": "Load newer messages", + "context": "chat/sdk/flutter", "template": "guide", - "contentFile": "content/docs/chat/sdk/wasm/conversation/retrieving-conversations/get-conversation-id.mdx" + "contentFile": "content/docs/chat/sdk/flutter/message/retrieving-messages/load-newer-messages.mdx" }, { - "sourcePath": "/sdk/wasm/conversation/retrieving-conversations/get-conversations-by-id", - "openimPath": "/sdk/wasm/conversation/retrieving-conversations/get-conversations-by-id", - "title": "Get conversations by ID", - "context": "chat/sdk/wasm", + "sourcePath": "/sdk/flutter/message/retrieving-messages/locate-messages-by-id", + "openimPath": "/sdk/flutter/message/retrieving-messages/locate-messages-by-id", + "title": "Locate messages by ID", + "context": "chat/sdk/flutter", "template": "guide", - "contentFile": "content/docs/chat/sdk/wasm/conversation/retrieving-conversations/get-conversations-by-id.mdx" + "contentFile": "content/docs/chat/sdk/flutter/message/retrieving-messages/locate-messages-by-id.mdx" }, { - "sourcePath": "/sdk/wasm/conversation/retrieving-conversations/retrieve-conversation-list", - "openimPath": "/sdk/wasm/conversation/retrieving-conversations/retrieve-conversation-list", - "title": "Retrieve a conversation list", - "context": "chat/sdk/wasm", + "sourcePath": "/sdk/flutter/message/searching-messages/search-messages", + "openimPath": "/sdk/flutter/message/searching-messages/search-messages", + "title": "Search messages", + "context": "chat/sdk/flutter", "template": "guide", - "contentFile": "content/docs/chat/sdk/wasm/conversation/retrieving-conversations/retrieve-conversation-list.mdx" + "contentFile": "content/docs/chat/sdk/flutter/message/searching-messages/search-messages.mdx" }, { - "sourcePath": "/sdk/wasm/conversation/managing-conversations/pin-conversation", - "openimPath": "/sdk/wasm/conversation/managing-conversations/pin-conversation", - "title": "Pin or unpin a conversation", - "context": "chat/sdk/wasm", - "template": "overview", - "contentFile": "content/docs/chat/sdk/wasm/conversation/managing-conversations/pin-conversation.mdx" + "sourcePath": "/sdk/flutter/message/composing-messages/update-typing-status", + "openimPath": "/sdk/flutter/message/composing-messages/update-typing-status", + "title": "Update typing status", + "context": "chat/sdk/flutter", + "template": "guide", + "contentFile": "content/docs/chat/sdk/flutter/message/composing-messages/update-typing-status.mdx" }, { - "sourcePath": "/sdk/wasm/conversation/managing-conversations/mark-conversation", - "openimPath": "/sdk/wasm/conversation/managing-conversations/mark-conversation", - "title": "Mark or unmark a conversation", - "context": "chat/sdk/wasm", - "template": "overview", - "contentFile": "content/docs/chat/sdk/wasm/conversation/managing-conversations/mark-conversation.mdx" + "sourcePath": "/sdk/flutter/message/composing-messages/get-typing-status", + "openimPath": "/sdk/flutter/message/composing-messages/get-typing-status", + "title": "Get typing status", + "context": "chat/sdk/flutter", + "template": "guide", + "contentFile": "content/docs/chat/sdk/flutter/message/composing-messages/get-typing-status.mdx" }, { - "sourcePath": "/sdk/wasm/conversation/managing-conversations/set-conversation-remark", - "openimPath": "/sdk/wasm/conversation/managing-conversations/set-conversation-remark", - "title": "Set a conversation remark", - "context": "chat/sdk/wasm", - "template": "overview", - "contentFile": "content/docs/chat/sdk/wasm/conversation/managing-conversations/set-conversation-remark.mdx" + "sourcePath": "/sdk/flutter/message/composing-messages/check-speech-to-text", + "openimPath": "/sdk/flutter/message/composing-messages/check-speech-to-text", + "title": "Check speech recognition support", + "context": "chat/sdk/flutter", + "template": "guide", + "contentFile": "content/docs/chat/sdk/flutter/message/composing-messages/check-speech-to-text.mdx" }, { - "sourcePath": "/sdk/wasm/conversation/managing-conversations/set-conversation-extension", - "openimPath": "/sdk/wasm/conversation/managing-conversations/set-conversation-extension", - "title": "Set conversation extra data", - "context": "chat/sdk/wasm", - "template": "overview", - "contentFile": "content/docs/chat/sdk/wasm/conversation/managing-conversations/set-conversation-extension.mdx" + "sourcePath": "/sdk/flutter/message/composing-messages/transcribe-audio", + "openimPath": "/sdk/flutter/message/composing-messages/transcribe-audio", + "title": "Transcribe audio", + "context": "chat/sdk/flutter", + "template": "guide", + "contentFile": "content/docs/chat/sdk/flutter/message/composing-messages/transcribe-audio.mdx" }, { - "sourcePath": "/sdk/wasm/conversation/managing-conversations/set-conversation-draft", - "openimPath": "/sdk/wasm/conversation/managing-conversations/set-conversation-draft", - "title": "Set a conversation draft", - "context": "chat/sdk/wasm", + "sourcePath": "/sdk/flutter/message/composing-messages/save-local-transcript", + "openimPath": "/sdk/flutter/message/composing-messages/save-local-transcript", + "title": "Save a local transcript", + "context": "chat/sdk/flutter", "template": "guide", - "contentFile": "content/docs/chat/sdk/wasm/conversation/managing-conversations/set-conversation-draft.mdx" + "contentFile": "content/docs/chat/sdk/flutter/message/composing-messages/save-local-transcript.mdx" }, { - "sourcePath": "/sdk/wasm/conversation/managing-conversations/set-message-receive-option", - "openimPath": "/sdk/wasm/conversation/managing-conversations/set-message-receive-option", - "title": "Set conversation message reception", - "context": "chat/sdk/wasm", - "template": "overview", - "contentFile": "content/docs/chat/sdk/wasm/conversation/managing-conversations/set-message-receive-option.mdx" + "sourcePath": "/sdk/flutter/message/managing-messages/delete-local-message", + "openimPath": "/sdk/flutter/message/managing-messages/delete-local-message", + "title": "Delete a local message", + "context": "chat/sdk/flutter", + "template": "guide", + "contentFile": "content/docs/chat/sdk/flutter/message/managing-messages/delete-local-message.mdx" }, { - "sourcePath": "/sdk/wasm/conversation/managing-conversations/clear-group-mentions", - "openimPath": "/sdk/wasm/conversation/managing-conversations/clear-group-mentions", - "title": "Reset group mention status", - "context": "chat/sdk/wasm", - "template": "overview", - "contentFile": "content/docs/chat/sdk/wasm/conversation/managing-conversations/clear-group-mentions.mdx" + "sourcePath": "/sdk/flutter/message/managing-messages/delete-saved-message", + "openimPath": "/sdk/flutter/message/managing-messages/delete-saved-message", + "title": "Delete a saved message", + "context": "chat/sdk/flutter", + "template": "guide", + "contentFile": "content/docs/chat/sdk/flutter/message/managing-messages/delete-saved-message.mdx" }, { - "sourcePath": "/sdk/wasm/conversation/managing-conversations/mark-conversation-read", - "openimPath": "/sdk/wasm/conversation/managing-conversations/mark-conversation-read", - "title": "Mark a conversation as read", - "context": "chat/sdk/wasm", + "sourcePath": "/sdk/flutter/message/managing-messages/revoke-a-message", + "openimPath": "/sdk/flutter/message/managing-messages/revoke-a-message", + "title": "Revoke a message", + "context": "chat/sdk/flutter", "template": "guide", - "contentFile": "content/docs/chat/sdk/wasm/conversation/managing-conversations/mark-conversation-read.mdx" + "contentFile": "content/docs/chat/sdk/flutter/message/managing-messages/revoke-a-message.mdx" }, { - "sourcePath": "/sdk/wasm/conversation/managing-conversations/get-total-unread-count", - "openimPath": "/sdk/wasm/conversation/managing-conversations/get-total-unread-count", - "title": "Track the total unread count", - "context": "chat/sdk/wasm", + "sourcePath": "/sdk/flutter/message/managing-messages/modify-a-message", + "openimPath": "/sdk/flutter/message/managing-messages/modify-a-message", + "title": "Modify a message", + "context": "chat/sdk/flutter", "template": "guide", - "contentFile": "content/docs/chat/sdk/wasm/conversation/managing-conversations/get-total-unread-count.mdx" + "contentFile": "content/docs/chat/sdk/flutter/message/managing-messages/modify-a-message.mdx" }, { - "sourcePath": "/sdk/wasm/conversation/managing-conversations/set-private-chat", - "openimPath": "/sdk/wasm/conversation/managing-conversations/set-private-chat", - "title": "Enable or disable burn after reading", - "context": "chat/sdk/wasm", - "template": "overview", - "contentFile": "content/docs/chat/sdk/wasm/conversation/managing-conversations/set-private-chat.mdx" + "sourcePath": "/sdk/flutter/message/managing-messages/get-pinned-messages", + "openimPath": "/sdk/flutter/message/managing-messages/get-pinned-messages", + "title": "View pinned messages", + "context": "chat/sdk/flutter", + "template": "guide", + "contentFile": "content/docs/chat/sdk/flutter/message/managing-messages/get-pinned-messages.mdx" }, { - "sourcePath": "/sdk/wasm/conversation/managing-conversations/set-burn-duration", - "openimPath": "/sdk/wasm/conversation/managing-conversations/set-burn-duration", - "title": "Set the burn duration", - "context": "chat/sdk/wasm", - "template": "overview", - "contentFile": "content/docs/chat/sdk/wasm/conversation/managing-conversations/set-burn-duration.mdx" + "sourcePath": "/sdk/flutter/message/managing-messages/set-message-pinned", + "openimPath": "/sdk/flutter/message/managing-messages/set-message-pinned", + "title": "Pin or unpin a message", + "context": "chat/sdk/flutter", + "template": "guide", + "contentFile": "content/docs/chat/sdk/flutter/message/managing-messages/set-message-pinned.mdx" }, { - "sourcePath": "/sdk/wasm/conversation/managing-conversations/set-message-destruct", - "openimPath": "/sdk/wasm/conversation/managing-conversations/set-message-destruct", - "title": "Schedule server message deletion", - "context": "chat/sdk/wasm", - "template": "overview", - "contentFile": "content/docs/chat/sdk/wasm/conversation/managing-conversations/set-message-destruct.mdx" + "sourcePath": "/sdk/flutter/message/managing-messages/insert-local-single-message", + "openimPath": "/sdk/flutter/message/managing-messages/insert-local-single-message", + "title": "Insert a local direct message", + "context": "chat/sdk/flutter", + "template": "guide", + "contentFile": "content/docs/chat/sdk/flutter/message/managing-messages/insert-local-single-message.mdx" }, { - "sourcePath": "/sdk/wasm/conversation/managing-conversations/hide-a-conversation", - "openimPath": "/sdk/wasm/conversation/managing-conversations/hide-a-conversation", - "title": "Hide a conversation", - "context": "chat/sdk/wasm", + "sourcePath": "/sdk/flutter/message/managing-messages/insert-local-group-message", + "openimPath": "/sdk/flutter/message/managing-messages/insert-local-group-message", + "title": "Insert a local group message", + "context": "chat/sdk/flutter", "template": "guide", - "contentFile": "content/docs/chat/sdk/wasm/conversation/managing-conversations/hide-a-conversation.mdx" + "contentFile": "content/docs/chat/sdk/flutter/message/managing-messages/insert-local-group-message.mdx" }, { - "sourcePath": "/sdk/wasm/conversation/managing-conversations/delete-conversation", - "openimPath": "/sdk/wasm/conversation/managing-conversations/delete-conversation", - "title": "Delete a conversation", - "context": "chat/sdk/wasm", + "sourcePath": "/sdk/flutter/message/managing-messages/clear-all-local-messages", + "openimPath": "/sdk/flutter/message/managing-messages/clear-all-local-messages", + "title": "Clear all local messages", + "context": "chat/sdk/flutter", "template": "guide", - "contentFile": "content/docs/chat/sdk/wasm/conversation/managing-conversations/delete-conversation.mdx" + "contentFile": "content/docs/chat/sdk/flutter/message/managing-messages/clear-all-local-messages.mdx" }, { - "sourcePath": "/sdk/wasm/conversation/managing-conversations/delete-conversation-with-messages", - "openimPath": "/sdk/wasm/conversation/managing-conversations/delete-conversation-with-messages", - "title": "Delete a conversation and its messages", - "context": "chat/sdk/wasm", + "sourcePath": "/sdk/flutter/message/managing-messages/clear-all-messages", + "openimPath": "/sdk/flutter/message/managing-messages/clear-all-messages", + "title": "Clear all saved messages", + "context": "chat/sdk/flutter", "template": "guide", - "contentFile": "content/docs/chat/sdk/wasm/conversation/managing-conversations/delete-conversation-with-messages.mdx" + "contentFile": "content/docs/chat/sdk/flutter/message/managing-messages/clear-all-messages.mdx" }, { - "sourcePath": "/sdk/wasm/conversation/managing-conversations/clear-conversation-messages", - "openimPath": "/sdk/wasm/conversation/managing-conversations/clear-conversation-messages", - "title": "Clear messages in a conversation", - "context": "chat/sdk/wasm", + "sourcePath": "/sdk/flutter/message/managing-messages/set-message-local-ex", + "openimPath": "/sdk/flutter/message/managing-messages/set-message-local-ex", + "title": "Set local message extensions", + "context": "chat/sdk/flutter", "template": "guide", - "contentFile": "content/docs/chat/sdk/wasm/conversation/managing-conversations/clear-conversation-messages.mdx" + "contentFile": "content/docs/chat/sdk/flutter/message/managing-messages/set-message-local-ex.mdx" }, { - "sourcePath": "/sdk/wasm/conversation/managing-conversations/clear-local-conversations", - "openimPath": "/sdk/wasm/conversation/managing-conversations/clear-local-conversations", - "title": "Clear all local conversations", - "context": "chat/sdk/wasm", + "sourcePath": "/sdk/flutter/file-uploads/set-upload-file-listener", + "openimPath": "/sdk/flutter/file-uploads/set-upload-file-listener", + "title": "Track file upload progress", + "context": "chat/sdk/flutter", "template": "guide", - "contentFile": "content/docs/chat/sdk/wasm/conversation/managing-conversations/clear-local-conversations.mdx" + "contentFile": "content/docs/chat/sdk/flutter/file-uploads/set-upload-file-listener.mdx" }, { - "sourcePath": "/sdk/wasm/conversation/managing-conversation-groups/overview-conversation-groups", - "openimPath": "/sdk/wasm/conversation/managing-conversation-groups/overview-conversation-groups", - "title": "Conversation group overview", - "context": "chat/sdk/wasm", + "sourcePath": "/sdk/flutter/file-uploads/upload-file", + "openimPath": "/sdk/flutter/file-uploads/upload-file", + "title": "Upload a file", + "context": "chat/sdk/flutter", "template": "guide", - "contentFile": "content/docs/chat/sdk/wasm/conversation/managing-conversation-groups/overview-conversation-groups.mdx" + "contentFile": "content/docs/chat/sdk/flutter/file-uploads/upload-file.mdx" }, { - "sourcePath": "/sdk/wasm/conversation/managing-conversation-groups/create-conversation-group", - "openimPath": "/sdk/wasm/conversation/managing-conversation-groups/create-conversation-group", - "title": "createConversationGroup", - "context": "chat/sdk/wasm", + "sourcePath": "/sdk/flutter/calling/overview-calling", + "openimPath": "/sdk/flutter/calling/overview-calling", + "title": "Calling overview", + "context": "chat/sdk/flutter", "template": "guide", - "contentFile": "content/docs/chat/sdk/wasm/conversation/managing-conversation-groups/create-conversation-group.mdx" + "contentFile": "content/docs/chat/sdk/flutter/calling/overview-calling.mdx" }, { - "sourcePath": "/sdk/wasm/conversation/managing-conversation-groups/get-conversation-groups", - "openimPath": "/sdk/wasm/conversation/managing-conversation-groups/get-conversation-groups", - "title": "getConversationGroups", - "context": "chat/sdk/wasm", + "sourcePath": "/sdk/flutter/calling/managing-calls/start-single-call", + "openimPath": "/sdk/flutter/calling/managing-calls/start-single-call", + "title": "Start a one-to-one call", + "context": "chat/sdk/flutter", "template": "guide", - "contentFile": "content/docs/chat/sdk/wasm/conversation/managing-conversation-groups/get-conversation-groups.mdx" + "contentFile": "content/docs/chat/sdk/flutter/calling/managing-calls/start-single-call.mdx" }, { - "sourcePath": "/sdk/wasm/conversation/managing-conversation-groups/get-conversation-group-info-with-conversations", - "openimPath": "/sdk/wasm/conversation/managing-conversation-groups/get-conversation-group-info-with-conversations", - "title": "getConversationGroupInfoWithConversations", - "context": "chat/sdk/wasm", + "sourcePath": "/sdk/flutter/calling/managing-calls/start-group-call", + "openimPath": "/sdk/flutter/calling/managing-calls/start-group-call", + "title": "Start a group call", + "context": "chat/sdk/flutter", "template": "guide", - "contentFile": "content/docs/chat/sdk/wasm/conversation/managing-conversation-groups/get-conversation-group-info-with-conversations.mdx" + "contentFile": "content/docs/chat/sdk/flutter/calling/managing-calls/start-group-call.mdx" }, { - "sourcePath": "/sdk/wasm/conversation/managing-conversation-groups/get-conversation-group-ids-by-conversation-id", - "openimPath": "/sdk/wasm/conversation/managing-conversation-groups/get-conversation-group-ids-by-conversation-id", - "title": "getConversationGroupIDsByConversationID", - "context": "chat/sdk/wasm", + "sourcePath": "/sdk/flutter/calling/managing-calls/accept-call", + "openimPath": "/sdk/flutter/calling/managing-calls/accept-call", + "title": "Accept a call", + "context": "chat/sdk/flutter", "template": "guide", - "contentFile": "content/docs/chat/sdk/wasm/conversation/managing-conversation-groups/get-conversation-group-ids-by-conversation-id.mdx" + "contentFile": "content/docs/chat/sdk/flutter/calling/managing-calls/accept-call.mdx" }, { - "sourcePath": "/sdk/wasm/conversation/managing-conversation-groups/update-conversation-group", - "openimPath": "/sdk/wasm/conversation/managing-conversation-groups/update-conversation-group", - "title": "updateConversationGroup", - "context": "chat/sdk/wasm", + "sourcePath": "/sdk/flutter/calling/managing-calls/reject-call", + "openimPath": "/sdk/flutter/calling/managing-calls/reject-call", + "title": "Reject a call", + "context": "chat/sdk/flutter", "template": "guide", - "contentFile": "content/docs/chat/sdk/wasm/conversation/managing-conversation-groups/update-conversation-group.mdx" + "contentFile": "content/docs/chat/sdk/flutter/calling/managing-calls/reject-call.mdx" }, { - "sourcePath": "/sdk/wasm/conversation/managing-conversation-groups/set-conversation-group-order", - "openimPath": "/sdk/wasm/conversation/managing-conversation-groups/set-conversation-group-order", - "title": "setConversationGroupOrder", - "context": "chat/sdk/wasm", + "sourcePath": "/sdk/flutter/calling/managing-calls/cancel-call", + "openimPath": "/sdk/flutter/calling/managing-calls/cancel-call", + "title": "Cancel a call invitation", + "context": "chat/sdk/flutter", "template": "guide", - "contentFile": "content/docs/chat/sdk/wasm/conversation/managing-conversation-groups/set-conversation-group-order.mdx" + "contentFile": "content/docs/chat/sdk/flutter/calling/managing-calls/cancel-call.mdx" }, { - "sourcePath": "/sdk/wasm/conversation/managing-conversation-groups/add-conversations-to-groups", - "openimPath": "/sdk/wasm/conversation/managing-conversation-groups/add-conversations-to-groups", - "title": "addConversationsToGroups", - "context": "chat/sdk/wasm", + "sourcePath": "/sdk/flutter/calling/managing-calls/hang-up-call", + "openimPath": "/sdk/flutter/calling/managing-calls/hang-up-call", + "title": "Hang up a call", + "context": "chat/sdk/flutter", "template": "guide", - "contentFile": "content/docs/chat/sdk/wasm/conversation/managing-conversation-groups/add-conversations-to-groups.mdx" + "contentFile": "content/docs/chat/sdk/flutter/calling/managing-calls/hang-up-call.mdx" }, { - "sourcePath": "/sdk/wasm/conversation/managing-conversation-groups/remove-conversations-from-groups", - "openimPath": "/sdk/wasm/conversation/managing-conversation-groups/remove-conversations-from-groups", - "title": "removeConversationsFromGroups", - "context": "chat/sdk/wasm", + "sourcePath": "/sdk/flutter/calling/managing-calls/handle-call-events", + "openimPath": "/sdk/flutter/calling/managing-calls/handle-call-events", + "title": "Handle call events", + "context": "chat/sdk/flutter", "template": "guide", - "contentFile": "content/docs/chat/sdk/wasm/conversation/managing-conversation-groups/remove-conversations-from-groups.mdx" + "contentFile": "content/docs/chat/sdk/flutter/calling/managing-calls/handle-call-events.mdx" }, { - "sourcePath": "/sdk/wasm/conversation/managing-conversation-groups/delete-conversation-group", - "openimPath": "/sdk/wasm/conversation/managing-conversation-groups/delete-conversation-group", - "title": "deleteConversationGroup", - "context": "chat/sdk/wasm", + "sourcePath": "/sdk/flutter/calling/retrieving-call-information/restore-pending-invitation", + "openimPath": "/sdk/flutter/calling/retrieving-call-information/restore-pending-invitation", + "title": "Restore a pending invitation", + "context": "chat/sdk/flutter", "template": "guide", - "contentFile": "content/docs/chat/sdk/wasm/conversation/managing-conversation-groups/delete-conversation-group.mdx" + "contentFile": "content/docs/chat/sdk/flutter/calling/retrieving-call-information/restore-pending-invitation.mdx" }, { - "sourcePath": "/sdk/wasm/group/overview-group", - "openimPath": "/sdk/wasm/group/overview-group", - "title": "Group overview", - "context": "chat/sdk/wasm", + "sourcePath": "/sdk/flutter/calling/retrieving-call-information/get-room-by-group-id", + "openimPath": "/sdk/flutter/calling/retrieving-call-information/get-room-by-group-id", + "title": "Get a group call room", + "context": "chat/sdk/flutter", "template": "guide", - "contentFile": "content/docs/chat/sdk/wasm/group/overview-group.mdx" + "contentFile": "content/docs/chat/sdk/flutter/calling/retrieving-call-information/get-room-by-group-id.mdx" }, { - "sourcePath": "/sdk/wasm/group/create-group", - "openimPath": "/sdk/wasm/group/create-group", - "title": "Create a group", - "context": "chat/sdk/wasm", + "sourcePath": "/sdk/flutter/calling/retrieving-call-information/get-token-by-room-id", + "openimPath": "/sdk/flutter/calling/retrieving-call-information/get-token-by-room-id", + "title": "Get room credentials", + "context": "chat/sdk/flutter", "template": "guide", - "contentFile": "content/docs/chat/sdk/wasm/group/create-group.mdx" - }, - { - "sourcePath": "/sdk/wasm/group/update-group-profile", - "openimPath": "/sdk/wasm/group/update-group-profile", - "title": "Update group profile", - "context": "chat/sdk/wasm", - "template": "overview", - "contentFile": "content/docs/chat/sdk/wasm/group/update-group-profile.mdx" + "contentFile": "content/docs/chat/sdk/flutter/calling/retrieving-call-information/get-token-by-room-id.mdx" }, { - "sourcePath": "/sdk/wasm/group/set-group-announcement", - "openimPath": "/sdk/wasm/group/set-group-announcement", - "title": "Publish a group announcement", - "context": "chat/sdk/wasm", - "template": "overview", - "contentFile": "content/docs/chat/sdk/wasm/group/set-group-announcement.mdx" + "sourcePath": "/sdk/flutter/calling/sending-custom-signals/send-a-custom-signal", + "openimPath": "/sdk/flutter/calling/sending-custom-signals/send-a-custom-signal", + "title": "Send a custom signal", + "context": "chat/sdk/flutter", + "template": "guide", + "contentFile": "content/docs/chat/sdk/flutter/calling/sending-custom-signals/send-a-custom-signal.mdx" }, { - "sourcePath": "/sdk/wasm/group/set-group-extension", - "openimPath": "/sdk/wasm/group/set-group-extension", - "title": "Set group extra data", - "context": "chat/sdk/wasm", - "template": "overview", - "contentFile": "content/docs/chat/sdk/wasm/group/set-group-extension.mdx" + "sourcePath": "/sdk/flutter/events/overview-events", + "openimPath": "/sdk/flutter/events/overview-events", + "title": "Events overview", + "context": "chat/sdk/flutter", + "template": "guide", + "contentFile": "content/docs/chat/sdk/flutter/events/overview-events.mdx" }, { - "sourcePath": "/sdk/wasm/group/set-group-join-verification", - "openimPath": "/sdk/wasm/group/set-group-join-verification", - "title": "Set group join verification", - "context": "chat/sdk/wasm", - "template": "overview", - "contentFile": "content/docs/chat/sdk/wasm/group/set-group-join-verification.mdx" + "sourcePath": "/sdk/flutter/logger", + "openimPath": "/sdk/flutter/logger", + "title": "Logger", + "context": "chat/sdk/flutter", + "template": "guide", + "contentFile": "content/docs/chat/sdk/flutter/logger.mdx" }, { - "sourcePath": "/sdk/wasm/group/set-group-member-profile-access", - "openimPath": "/sdk/wasm/group/set-group-member-profile-access", - "title": "Set member profile access", - "context": "chat/sdk/wasm", + "sourcePath": "/sdk/uniapp/overview", + "openimPath": "/sdk/uniapp/overview", + "title": "OpenIM SDK for uni-app", + "context": "chat/sdk/uniapp", "template": "overview", - "contentFile": "content/docs/chat/sdk/wasm/group/set-group-member-profile-access.mdx" + "contentFile": "content/docs/chat/sdk/uniapp/overview.mdx" }, { - "sourcePath": "/sdk/wasm/group/set-group-member-friend-permission", - "openimPath": "/sdk/wasm/group/set-group-member-friend-permission", - "title": "Set member friend request permission", + "sourcePath": "/sdk/wasm/overview", + "openimPath": "/sdk/wasm/overview", + "title": "OpenIM SDK for WASM", "context": "chat/sdk/wasm", "template": "overview", - "contentFile": "content/docs/chat/sdk/wasm/group/set-group-member-friend-permission.mdx" + "contentFile": "content/docs/chat/sdk/wasm/overview.mdx" }, { - "sourcePath": "/sdk/wasm/group/change-group-mute", - "openimPath": "/sdk/wasm/group/change-group-mute", - "title": "Change group mute status", + "sourcePath": "/sdk/wasm/getting-started/before-you-start", + "openimPath": "/sdk/wasm/getting-started/before-you-start", + "title": "Before you start", "context": "chat/sdk/wasm", "template": "guide", - "contentFile": "content/docs/chat/sdk/wasm/group/change-group-mute.mdx" + "contentFile": "content/docs/chat/sdk/wasm/getting-started/before-you-start.mdx" }, { - "sourcePath": "/sdk/wasm/group/join-group", - "openimPath": "/sdk/wasm/group/join-group", - "title": "Apply to join a group", + "sourcePath": "/sdk/wasm/getting-started/environment-specific-implementation", + "openimPath": "/sdk/wasm/getting-started/environment-specific-implementation", + "title": "Environment-specific implementation", "context": "chat/sdk/wasm", "template": "guide", - "contentFile": "content/docs/chat/sdk/wasm/group/join-group.mdx" + "contentFile": "content/docs/chat/sdk/wasm/getting-started/environment-specific-implementation.mdx" }, { - "sourcePath": "/sdk/wasm/group/quit-group", - "openimPath": "/sdk/wasm/group/quit-group", - "title": "Leave a group", + "sourcePath": "/sdk/wasm/getting-started/authenticate-and-manage-session", + "openimPath": "/sdk/wasm/getting-started/authenticate-and-manage-session", + "title": "Authenticate and manage a session", "context": "chat/sdk/wasm", "template": "guide", - "contentFile": "content/docs/chat/sdk/wasm/group/quit-group.mdx" + "contentFile": "content/docs/chat/sdk/wasm/getting-started/authenticate-and-manage-session.mdx" }, { - "sourcePath": "/sdk/wasm/group/dismiss-group", - "openimPath": "/sdk/wasm/group/dismiss-group", - "title": "Dismiss a group", + "sourcePath": "/sdk/wasm/getting-started/send-first-message", + "openimPath": "/sdk/wasm/getting-started/send-first-message", + "title": "Send your first message", "context": "chat/sdk/wasm", "template": "guide", - "contentFile": "content/docs/chat/sdk/wasm/group/dismiss-group.mdx" + "contentFile": "content/docs/chat/sdk/wasm/getting-started/send-first-message.mdx" }, { - "sourcePath": "/sdk/wasm/group/retrieving-groups/get-specified-groups-info", - "openimPath": "/sdk/wasm/group/retrieving-groups/get-specified-groups-info", - "title": "Get group information", + "sourcePath": "/sdk/wasm/user/overview-user", + "openimPath": "/sdk/wasm/user/overview-user", + "title": "User overview", "context": "chat/sdk/wasm", "template": "guide", - "contentFile": "content/docs/chat/sdk/wasm/group/retrieving-groups/get-specified-groups-info.mdx" + "contentFile": "content/docs/chat/sdk/wasm/user/overview-user.mdx" }, { - "sourcePath": "/sdk/wasm/group/retrieving-groups/get-joined-group-list", - "openimPath": "/sdk/wasm/group/retrieving-groups/get-joined-group-list", - "title": "Get joined groups", + "sourcePath": "/sdk/wasm/user/profile/get-users-info", + "openimPath": "/sdk/wasm/user/profile/get-users-info", + "title": "Get user profiles", "context": "chat/sdk/wasm", "template": "guide", - "contentFile": "content/docs/chat/sdk/wasm/group/retrieving-groups/get-joined-group-list.mdx" + "contentFile": "content/docs/chat/sdk/wasm/user/profile/get-users-info.mdx" }, { - "sourcePath": "/sdk/wasm/group/retrieving-groups/get-joined-group-list-page", - "openimPath": "/sdk/wasm/group/retrieving-groups/get-joined-group-list-page", - "title": "Get joined groups by page", + "sourcePath": "/sdk/wasm/user/profile/get-self-user-info", + "openimPath": "/sdk/wasm/user/profile/get-self-user-info", + "title": "Get your profile", "context": "chat/sdk/wasm", "template": "guide", - "contentFile": "content/docs/chat/sdk/wasm/group/retrieving-groups/get-joined-group-list-page.mdx" + "contentFile": "content/docs/chat/sdk/wasm/user/profile/get-self-user-info.mdx" }, { - "sourcePath": "/sdk/wasm/group/retrieving-groups/is-join-group", - "openimPath": "/sdk/wasm/group/retrieving-groups/is-join-group", - "title": "Check group membership", + "sourcePath": "/sdk/wasm/user/profile/set-self-info", + "openimPath": "/sdk/wasm/user/profile/set-self-info", + "title": "Update your profile", "context": "chat/sdk/wasm", "template": "guide", - "contentFile": "content/docs/chat/sdk/wasm/group/retrieving-groups/is-join-group.mdx" + "contentFile": "content/docs/chat/sdk/wasm/user/profile/set-self-info.mdx" }, { - "sourcePath": "/sdk/wasm/group/retrieving-groups/search-groups", - "openimPath": "/sdk/wasm/group/retrieving-groups/search-groups", - "title": "Search groups", + "sourcePath": "/sdk/wasm/user/profile/set-global-message-reception", + "openimPath": "/sdk/wasm/user/profile/set-global-message-reception", + "title": "Set global message reception", "context": "chat/sdk/wasm", - "template": "guide", - "contentFile": "content/docs/chat/sdk/wasm/group/retrieving-groups/search-groups.mdx" + "template": "overview", + "contentFile": "content/docs/chat/sdk/wasm/user/profile/set-global-message-reception.mdx" }, { - "sourcePath": "/sdk/wasm/group/group-applications/get-group-application-list-as-recipient", - "openimPath": "/sdk/wasm/group/group-applications/get-group-application-list-as-recipient", - "title": "Get received group applications", + "sourcePath": "/sdk/wasm/user/online-status/subscribe-users-status", + "openimPath": "/sdk/wasm/user/online-status/subscribe-users-status", + "title": "Subscribe to online status", "context": "chat/sdk/wasm", "template": "guide", - "contentFile": "content/docs/chat/sdk/wasm/group/group-applications/get-group-application-list-as-recipient.mdx" + "contentFile": "content/docs/chat/sdk/wasm/user/online-status/subscribe-users-status.mdx" }, { - "sourcePath": "/sdk/wasm/group/group-applications/get-group-application-list-as-applicant", - "openimPath": "/sdk/wasm/group/group-applications/get-group-application-list-as-applicant", - "title": "Get sent group applications", + "sourcePath": "/sdk/wasm/user/online-status/get-subscribe-users-status", + "openimPath": "/sdk/wasm/user/online-status/get-subscribe-users-status", + "title": "Get subscribed user status", "context": "chat/sdk/wasm", "template": "guide", - "contentFile": "content/docs/chat/sdk/wasm/group/group-applications/get-group-application-list-as-applicant.mdx" + "contentFile": "content/docs/chat/sdk/wasm/user/online-status/get-subscribe-users-status.mdx" }, { - "sourcePath": "/sdk/wasm/group/group-applications/get-group-application-unhandled-count", - "openimPath": "/sdk/wasm/group/group-applications/get-group-application-unhandled-count", - "title": "Get pending group application count", + "sourcePath": "/sdk/wasm/user/online-status/unsubscribe-users-status", + "openimPath": "/sdk/wasm/user/online-status/unsubscribe-users-status", + "title": "Unsubscribe from online status", "context": "chat/sdk/wasm", "template": "guide", - "contentFile": "content/docs/chat/sdk/wasm/group/group-applications/get-group-application-unhandled-count.mdx" + "contentFile": "content/docs/chat/sdk/wasm/user/online-status/unsubscribe-users-status.mdx" }, { - "sourcePath": "/sdk/wasm/group/group-applications/get-group-application-badge-count", - "openimPath": "/sdk/wasm/group/group-applications/get-group-application-badge-count", - "title": "Get group application badge count", + "sourcePath": "/sdk/wasm/user/friends/get-friend-list-page", + "openimPath": "/sdk/wasm/user/friends/get-friend-list-page", + "title": "Get the friend list", "context": "chat/sdk/wasm", "template": "guide", - "contentFile": "content/docs/chat/sdk/wasm/group/group-applications/get-group-application-badge-count.mdx" + "contentFile": "content/docs/chat/sdk/wasm/user/friends/get-friend-list-page.mdx" }, { - "sourcePath": "/sdk/wasm/group/group-applications/clear-group-application-badge-count", - "openimPath": "/sdk/wasm/group/group-applications/clear-group-application-badge-count", - "title": "Clear the group application badge", + "sourcePath": "/sdk/wasm/user/friends/search-friends", + "openimPath": "/sdk/wasm/user/friends/search-friends", + "title": "Search friends", "context": "chat/sdk/wasm", "template": "guide", - "contentFile": "content/docs/chat/sdk/wasm/group/group-applications/clear-group-application-badge-count.mdx" + "contentFile": "content/docs/chat/sdk/wasm/user/friends/search-friends.mdx" }, { - "sourcePath": "/sdk/wasm/group/group-applications/accept-group-application", - "openimPath": "/sdk/wasm/group/group-applications/accept-group-application", - "title": "Accept a group application", + "sourcePath": "/sdk/wasm/user/friends/get-specified-friends-info", + "openimPath": "/sdk/wasm/user/friends/get-specified-friends-info", + "title": "Get friend profiles", "context": "chat/sdk/wasm", "template": "guide", - "contentFile": "content/docs/chat/sdk/wasm/group/group-applications/accept-group-application.mdx" + "contentFile": "content/docs/chat/sdk/wasm/user/friends/get-specified-friends-info.mdx" }, { - "sourcePath": "/sdk/wasm/group/group-applications/refuse-group-application", - "openimPath": "/sdk/wasm/group/group-applications/refuse-group-application", - "title": "Reject a group application", + "sourcePath": "/sdk/wasm/user/friends/check-friend", + "openimPath": "/sdk/wasm/user/friends/check-friend", + "title": "Check friendship status", "context": "chat/sdk/wasm", "template": "guide", - "contentFile": "content/docs/chat/sdk/wasm/group/group-applications/refuse-group-application.mdx" + "contentFile": "content/docs/chat/sdk/wasm/user/friends/check-friend.mdx" }, { - "sourcePath": "/sdk/wasm/group/group-applications/delete-group-requests", - "openimPath": "/sdk/wasm/group/group-applications/delete-group-requests", - "title": "Delete group applications", + "sourcePath": "/sdk/wasm/user/friends/update-friends", + "openimPath": "/sdk/wasm/user/friends/update-friends", + "title": "Update friend information", "context": "chat/sdk/wasm", "template": "guide", - "contentFile": "content/docs/chat/sdk/wasm/group/group-applications/delete-group-requests.mdx" + "contentFile": "content/docs/chat/sdk/wasm/user/friends/update-friends.mdx" }, { - "sourcePath": "/sdk/wasm/group/retrieving-group-members/get-group-member-list", - "openimPath": "/sdk/wasm/group/retrieving-group-members/get-group-member-list", - "title": "Get group members", + "sourcePath": "/sdk/wasm/user/friends/delete-friend", + "openimPath": "/sdk/wasm/user/friends/delete-friend", + "title": "Delete a friend", "context": "chat/sdk/wasm", "template": "guide", - "contentFile": "content/docs/chat/sdk/wasm/group/retrieving-group-members/get-group-member-list.mdx" + "contentFile": "content/docs/chat/sdk/wasm/user/friends/delete-friend.mdx" }, { - "sourcePath": "/sdk/wasm/group/retrieving-group-members/get-specified-group-members-info", - "openimPath": "/sdk/wasm/group/retrieving-group-members/get-specified-group-members-info", - "title": "Get group member profiles", + "sourcePath": "/sdk/wasm/user/friend-applications/add-friend", + "openimPath": "/sdk/wasm/user/friend-applications/add-friend", + "title": "Send a friend application", "context": "chat/sdk/wasm", "template": "guide", - "contentFile": "content/docs/chat/sdk/wasm/group/retrieving-group-members/get-specified-group-members-info.mdx" + "contentFile": "content/docs/chat/sdk/wasm/user/friend-applications/add-friend.mdx" }, { - "sourcePath": "/sdk/wasm/group/retrieving-group-members/get-users-in-group", - "openimPath": "/sdk/wasm/group/retrieving-group-members/get-users-in-group", - "title": "Check users in a group", + "sourcePath": "/sdk/wasm/user/friend-applications/get-friend-application-list-as-recipient", + "openimPath": "/sdk/wasm/user/friend-applications/get-friend-application-list-as-recipient", + "title": "Get received friend applications", "context": "chat/sdk/wasm", "template": "guide", - "contentFile": "content/docs/chat/sdk/wasm/group/retrieving-group-members/get-users-in-group.mdx" + "contentFile": "content/docs/chat/sdk/wasm/user/friend-applications/get-friend-application-list-as-recipient.mdx" }, { - "sourcePath": "/sdk/wasm/group/retrieving-group-members/get-group-member-owner-and-admin", - "openimPath": "/sdk/wasm/group/retrieving-group-members/get-group-member-owner-and-admin", - "title": "Get group owners and admins", + "sourcePath": "/sdk/wasm/user/friend-applications/get-friend-application-list-as-applicant", + "openimPath": "/sdk/wasm/user/friend-applications/get-friend-application-list-as-applicant", + "title": "Get sent friend applications", "context": "chat/sdk/wasm", "template": "guide", - "contentFile": "content/docs/chat/sdk/wasm/group/retrieving-group-members/get-group-member-owner-and-admin.mdx" + "contentFile": "content/docs/chat/sdk/wasm/user/friend-applications/get-friend-application-list-as-applicant.mdx" }, { - "sourcePath": "/sdk/wasm/group/retrieving-group-members/search-group-members", - "openimPath": "/sdk/wasm/group/retrieving-group-members/search-group-members", - "title": "Search group members", + "sourcePath": "/sdk/wasm/user/friend-applications/get-friend-application-unhandled-count", + "openimPath": "/sdk/wasm/user/friend-applications/get-friend-application-unhandled-count", + "title": "Get pending application count", "context": "chat/sdk/wasm", "template": "guide", - "contentFile": "content/docs/chat/sdk/wasm/group/retrieving-group-members/search-group-members.mdx" + "contentFile": "content/docs/chat/sdk/wasm/user/friend-applications/get-friend-application-unhandled-count.mdx" }, { - "sourcePath": "/sdk/wasm/group/managing-group-members/invite-user-to-group", - "openimPath": "/sdk/wasm/group/managing-group-members/invite-user-to-group", - "title": "Invite users to a group", + "sourcePath": "/sdk/wasm/user/friend-applications/accept-friend-application", + "openimPath": "/sdk/wasm/user/friend-applications/accept-friend-application", + "title": "Accept a friend application", "context": "chat/sdk/wasm", "template": "guide", - "contentFile": "content/docs/chat/sdk/wasm/group/managing-group-members/invite-user-to-group.mdx" + "contentFile": "content/docs/chat/sdk/wasm/user/friend-applications/accept-friend-application.mdx" }, { - "sourcePath": "/sdk/wasm/group/managing-group-members/kick-group-member", - "openimPath": "/sdk/wasm/group/managing-group-members/kick-group-member", - "title": "Remove group members", + "sourcePath": "/sdk/wasm/user/friend-applications/refuse-friend-application", + "openimPath": "/sdk/wasm/user/friend-applications/refuse-friend-application", + "title": "Reject a friend application", "context": "chat/sdk/wasm", "template": "guide", - "contentFile": "content/docs/chat/sdk/wasm/group/managing-group-members/kick-group-member.mdx" + "contentFile": "content/docs/chat/sdk/wasm/user/friend-applications/refuse-friend-application.mdx" }, { - "sourcePath": "/sdk/wasm/group/managing-group-members/set-group-member-nickname", - "openimPath": "/sdk/wasm/group/managing-group-members/set-group-member-nickname", - "title": "Update a group nickname", + "sourcePath": "/sdk/wasm/user/friend-applications/delete-friend-requests", + "openimPath": "/sdk/wasm/user/friend-applications/delete-friend-requests", + "title": "Delete friend applications", "context": "chat/sdk/wasm", - "template": "overview", - "contentFile": "content/docs/chat/sdk/wasm/group/managing-group-members/set-group-member-nickname.mdx" + "template": "guide", + "contentFile": "content/docs/chat/sdk/wasm/user/friend-applications/delete-friend-requests.mdx" }, { - "sourcePath": "/sdk/wasm/group/managing-group-members/set-group-member-role-level", - "openimPath": "/sdk/wasm/group/managing-group-members/set-group-member-role-level", - "title": "Manage group administrators", + "sourcePath": "/sdk/wasm/user/blacklist/get-black-list", + "openimPath": "/sdk/wasm/user/blacklist/get-black-list", + "title": "Get the blacklist", "context": "chat/sdk/wasm", - "template": "overview", - "contentFile": "content/docs/chat/sdk/wasm/group/managing-group-members/set-group-member-role-level.mdx" + "template": "guide", + "contentFile": "content/docs/chat/sdk/wasm/user/blacklist/get-black-list.mdx" }, { - "sourcePath": "/sdk/wasm/group/managing-group-members/set-group-member-avatar", - "openimPath": "/sdk/wasm/group/managing-group-members/set-group-member-avatar", - "title": "Update a group member avatar", + "sourcePath": "/sdk/wasm/user/blacklist/add-black", + "openimPath": "/sdk/wasm/user/blacklist/add-black", + "title": "Add a user to the blacklist", "context": "chat/sdk/wasm", - "template": "overview", - "contentFile": "content/docs/chat/sdk/wasm/group/managing-group-members/set-group-member-avatar.mdx" + "template": "guide", + "contentFile": "content/docs/chat/sdk/wasm/user/blacklist/add-black.mdx" }, { - "sourcePath": "/sdk/wasm/group/managing-group-members/set-group-member-extension", - "openimPath": "/sdk/wasm/group/managing-group-members/set-group-member-extension", - "title": "Set group member extra data", + "sourcePath": "/sdk/wasm/user/blacklist/remove-black", + "openimPath": "/sdk/wasm/user/blacklist/remove-black", + "title": "Remove a user from the blacklist", "context": "chat/sdk/wasm", - "template": "overview", - "contentFile": "content/docs/chat/sdk/wasm/group/managing-group-members/set-group-member-extension.mdx" + "template": "guide", + "contentFile": "content/docs/chat/sdk/wasm/user/blacklist/remove-black.mdx" }, { - "sourcePath": "/sdk/wasm/group/managing-group-members/transfer-group-owner", - "openimPath": "/sdk/wasm/group/managing-group-members/transfer-group-owner", - "title": "Transfer group owner", + "sourcePath": "/sdk/wasm/conversation/overview-conversation", + "openimPath": "/sdk/wasm/conversation/overview-conversation", + "title": "Conversation overview", "context": "chat/sdk/wasm", "template": "guide", - "contentFile": "content/docs/chat/sdk/wasm/group/managing-group-members/transfer-group-owner.mdx" + "contentFile": "content/docs/chat/sdk/wasm/conversation/overview-conversation.mdx" }, { - "sourcePath": "/sdk/wasm/group/managing-group-members/change-group-member-mute", - "openimPath": "/sdk/wasm/group/managing-group-members/change-group-member-mute", - "title": "Mute or unmute a group member", + "sourcePath": "/sdk/wasm/conversation/retrieving-conversations/get-conversation-by-target", + "openimPath": "/sdk/wasm/conversation/retrieving-conversations/get-conversation-by-target", + "title": "Open a conversation", "context": "chat/sdk/wasm", "template": "guide", - "contentFile": "content/docs/chat/sdk/wasm/group/managing-group-members/change-group-member-mute.mdx" + "contentFile": "content/docs/chat/sdk/wasm/conversation/retrieving-conversations/get-conversation-by-target.mdx" }, { - "sourcePath": "/sdk/wasm/message/overview-message", - "openimPath": "/sdk/wasm/message/overview-message", - "title": "Message overview", + "sourcePath": "/sdk/wasm/conversation/retrieving-conversations/get-conversation-id", + "openimPath": "/sdk/wasm/conversation/retrieving-conversations/get-conversation-id", + "title": "Resolve a conversation ID", "context": "chat/sdk/wasm", "template": "guide", - "contentFile": "content/docs/chat/sdk/wasm/message/overview-message.mdx" + "contentFile": "content/docs/chat/sdk/wasm/conversation/retrieving-conversations/get-conversation-id.mdx" }, { - "sourcePath": "/sdk/wasm/message/creating-messages/create-text-message", - "openimPath": "/sdk/wasm/message/creating-messages/create-text-message", - "title": "Create a text message", + "sourcePath": "/sdk/wasm/conversation/retrieving-conversations/get-conversations-by-id", + "openimPath": "/sdk/wasm/conversation/retrieving-conversations/get-conversations-by-id", + "title": "Get conversations by ID", "context": "chat/sdk/wasm", "template": "guide", - "contentFile": "content/docs/chat/sdk/wasm/message/creating-messages/create-text-message.mdx" + "contentFile": "content/docs/chat/sdk/wasm/conversation/retrieving-conversations/get-conversations-by-id.mdx" }, { - "sourcePath": "/sdk/wasm/message/creating-messages/create-text-at-message", - "openimPath": "/sdk/wasm/message/creating-messages/create-text-at-message", - "title": "Create a mention message", + "sourcePath": "/sdk/wasm/conversation/retrieving-conversations/retrieve-conversation-list", + "openimPath": "/sdk/wasm/conversation/retrieving-conversations/retrieve-conversation-list", + "title": "Retrieve a conversation list", "context": "chat/sdk/wasm", "template": "guide", - "contentFile": "content/docs/chat/sdk/wasm/message/creating-messages/create-text-at-message.mdx" + "contentFile": "content/docs/chat/sdk/wasm/conversation/retrieving-conversations/retrieve-conversation-list.mdx" }, { - "sourcePath": "/sdk/wasm/message/creating-messages/create-custom-message", - "openimPath": "/sdk/wasm/message/creating-messages/create-custom-message", - "title": "Create a custom message", + "sourcePath": "/sdk/wasm/conversation/managing-conversations/pin-conversation", + "openimPath": "/sdk/wasm/conversation/managing-conversations/pin-conversation", + "title": "Pin or unpin a conversation", "context": "chat/sdk/wasm", - "template": "guide", - "contentFile": "content/docs/chat/sdk/wasm/message/creating-messages/create-custom-message.mdx" + "template": "overview", + "contentFile": "content/docs/chat/sdk/wasm/conversation/managing-conversations/pin-conversation.mdx" }, { - "sourcePath": "/sdk/wasm/message/creating-messages/create-image-message-by-file", - "openimPath": "/sdk/wasm/message/creating-messages/create-image-message-by-file", - "title": "Create an image message from a file", + "sourcePath": "/sdk/wasm/conversation/managing-conversations/mark-conversation", + "openimPath": "/sdk/wasm/conversation/managing-conversations/mark-conversation", + "title": "Mark or unmark a conversation", "context": "chat/sdk/wasm", - "template": "guide", - "contentFile": "content/docs/chat/sdk/wasm/message/creating-messages/create-image-message-by-file.mdx" + "template": "overview", + "contentFile": "content/docs/chat/sdk/wasm/conversation/managing-conversations/mark-conversation.mdx" }, { - "sourcePath": "/sdk/wasm/message/creating-messages/create-image-message-by-url", - "openimPath": "/sdk/wasm/message/creating-messages/create-image-message-by-url", - "title": "Create an image message from a URL", + "sourcePath": "/sdk/wasm/conversation/managing-conversations/set-conversation-remark", + "openimPath": "/sdk/wasm/conversation/managing-conversations/set-conversation-remark", + "title": "Set a conversation remark", "context": "chat/sdk/wasm", - "template": "guide", - "contentFile": "content/docs/chat/sdk/wasm/message/creating-messages/create-image-message-by-url.mdx" + "template": "overview", + "contentFile": "content/docs/chat/sdk/wasm/conversation/managing-conversations/set-conversation-remark.mdx" }, { - "sourcePath": "/sdk/wasm/message/creating-messages/create-sound-message-by-file", - "openimPath": "/sdk/wasm/message/creating-messages/create-sound-message-by-file", - "title": "Create an audio message from a file", + "sourcePath": "/sdk/wasm/conversation/managing-conversations/set-conversation-extension", + "openimPath": "/sdk/wasm/conversation/managing-conversations/set-conversation-extension", + "title": "Set conversation extra data", "context": "chat/sdk/wasm", - "template": "guide", - "contentFile": "content/docs/chat/sdk/wasm/message/creating-messages/create-sound-message-by-file.mdx" + "template": "overview", + "contentFile": "content/docs/chat/sdk/wasm/conversation/managing-conversations/set-conversation-extension.mdx" }, { - "sourcePath": "/sdk/wasm/message/creating-messages/create-sound-message-by-url", - "openimPath": "/sdk/wasm/message/creating-messages/create-sound-message-by-url", - "title": "Create an audio message from a URL", + "sourcePath": "/sdk/wasm/conversation/managing-conversations/set-conversation-draft", + "openimPath": "/sdk/wasm/conversation/managing-conversations/set-conversation-draft", + "title": "Set a conversation draft", "context": "chat/sdk/wasm", "template": "guide", - "contentFile": "content/docs/chat/sdk/wasm/message/creating-messages/create-sound-message-by-url.mdx" + "contentFile": "content/docs/chat/sdk/wasm/conversation/managing-conversations/set-conversation-draft.mdx" }, { - "sourcePath": "/sdk/wasm/message/creating-messages/create-video-message-by-file", - "openimPath": "/sdk/wasm/message/creating-messages/create-video-message-by-file", - "title": "Create a video message from a file", + "sourcePath": "/sdk/wasm/conversation/managing-conversations/set-message-receive-option", + "openimPath": "/sdk/wasm/conversation/managing-conversations/set-message-receive-option", + "title": "Set conversation message reception", "context": "chat/sdk/wasm", - "template": "guide", - "contentFile": "content/docs/chat/sdk/wasm/message/creating-messages/create-video-message-by-file.mdx" + "template": "overview", + "contentFile": "content/docs/chat/sdk/wasm/conversation/managing-conversations/set-message-receive-option.mdx" }, { - "sourcePath": "/sdk/wasm/message/creating-messages/create-video-message-by-url", - "openimPath": "/sdk/wasm/message/creating-messages/create-video-message-by-url", - "title": "Create a video message from a URL", + "sourcePath": "/sdk/wasm/conversation/managing-conversations/clear-group-mentions", + "openimPath": "/sdk/wasm/conversation/managing-conversations/clear-group-mentions", + "title": "Reset group mention status", "context": "chat/sdk/wasm", - "template": "guide", - "contentFile": "content/docs/chat/sdk/wasm/message/creating-messages/create-video-message-by-url.mdx" + "template": "overview", + "contentFile": "content/docs/chat/sdk/wasm/conversation/managing-conversations/clear-group-mentions.mdx" }, { - "sourcePath": "/sdk/wasm/message/creating-messages/create-file-message-by-file", - "openimPath": "/sdk/wasm/message/creating-messages/create-file-message-by-file", - "title": "Create a file message from a file", + "sourcePath": "/sdk/wasm/conversation/managing-conversations/mark-conversation-read", + "openimPath": "/sdk/wasm/conversation/managing-conversations/mark-conversation-read", + "title": "Mark a conversation as read", "context": "chat/sdk/wasm", "template": "guide", - "contentFile": "content/docs/chat/sdk/wasm/message/creating-messages/create-file-message-by-file.mdx" + "contentFile": "content/docs/chat/sdk/wasm/conversation/managing-conversations/mark-conversation-read.mdx" }, { - "sourcePath": "/sdk/wasm/message/creating-messages/create-file-message-by-url", - "openimPath": "/sdk/wasm/message/creating-messages/create-file-message-by-url", - "title": "Create a file message from a URL", + "sourcePath": "/sdk/wasm/conversation/managing-conversations/get-total-unread-count", + "openimPath": "/sdk/wasm/conversation/managing-conversations/get-total-unread-count", + "title": "Track the total unread count", "context": "chat/sdk/wasm", "template": "guide", - "contentFile": "content/docs/chat/sdk/wasm/message/creating-messages/create-file-message-by-url.mdx" + "contentFile": "content/docs/chat/sdk/wasm/conversation/managing-conversations/get-total-unread-count.mdx" }, { - "sourcePath": "/sdk/wasm/message/creating-messages/create-card-message", - "openimPath": "/sdk/wasm/message/creating-messages/create-card-message", - "title": "Create a contact card message", + "sourcePath": "/sdk/wasm/conversation/managing-conversations/set-private-chat", + "openimPath": "/sdk/wasm/conversation/managing-conversations/set-private-chat", + "title": "Enable or disable burn after reading", "context": "chat/sdk/wasm", - "template": "guide", - "contentFile": "content/docs/chat/sdk/wasm/message/creating-messages/create-card-message.mdx" + "template": "overview", + "contentFile": "content/docs/chat/sdk/wasm/conversation/managing-conversations/set-private-chat.mdx" }, { - "sourcePath": "/sdk/wasm/message/creating-messages/create-location-message", - "openimPath": "/sdk/wasm/message/creating-messages/create-location-message", - "title": "Create a location message", + "sourcePath": "/sdk/wasm/conversation/managing-conversations/set-burn-duration", + "openimPath": "/sdk/wasm/conversation/managing-conversations/set-burn-duration", + "title": "Set the burn duration", "context": "chat/sdk/wasm", - "template": "guide", - "contentFile": "content/docs/chat/sdk/wasm/message/creating-messages/create-location-message.mdx" + "template": "overview", + "contentFile": "content/docs/chat/sdk/wasm/conversation/managing-conversations/set-burn-duration.mdx" }, { - "sourcePath": "/sdk/wasm/message/creating-messages/create-face-message", - "openimPath": "/sdk/wasm/message/creating-messages/create-face-message", - "title": "Create an emoji message", + "sourcePath": "/sdk/wasm/conversation/managing-conversations/set-message-destruct", + "openimPath": "/sdk/wasm/conversation/managing-conversations/set-message-destruct", + "title": "Schedule server message deletion", "context": "chat/sdk/wasm", - "template": "guide", - "contentFile": "content/docs/chat/sdk/wasm/message/creating-messages/create-face-message.mdx" + "template": "overview", + "contentFile": "content/docs/chat/sdk/wasm/conversation/managing-conversations/set-message-destruct.mdx" }, { - "sourcePath": "/sdk/wasm/message/creating-messages/create-quote-message", - "openimPath": "/sdk/wasm/message/creating-messages/create-quote-message", - "title": "Create a reply message", + "sourcePath": "/sdk/wasm/conversation/managing-conversations/hide-a-conversation", + "openimPath": "/sdk/wasm/conversation/managing-conversations/hide-a-conversation", + "title": "Hide a conversation", "context": "chat/sdk/wasm", "template": "guide", - "contentFile": "content/docs/chat/sdk/wasm/message/creating-messages/create-quote-message.mdx" + "contentFile": "content/docs/chat/sdk/wasm/conversation/managing-conversations/hide-a-conversation.mdx" }, { - "sourcePath": "/sdk/wasm/message/creating-messages/create-markdown-message", - "openimPath": "/sdk/wasm/message/creating-messages/create-markdown-message", - "title": "Create a Markdown message", + "sourcePath": "/sdk/wasm/conversation/managing-conversations/delete-conversation", + "openimPath": "/sdk/wasm/conversation/managing-conversations/delete-conversation", + "title": "Delete a conversation", "context": "chat/sdk/wasm", "template": "guide", - "contentFile": "content/docs/chat/sdk/wasm/message/creating-messages/create-markdown-message.mdx" + "contentFile": "content/docs/chat/sdk/wasm/conversation/managing-conversations/delete-conversation.mdx" }, { - "sourcePath": "/sdk/wasm/message/creating-messages/create-forward-message", - "openimPath": "/sdk/wasm/message/creating-messages/create-forward-message", - "title": "Create a forwarded message", + "sourcePath": "/sdk/wasm/conversation/managing-conversations/delete-conversation-with-messages", + "openimPath": "/sdk/wasm/conversation/managing-conversations/delete-conversation-with-messages", + "title": "Delete a conversation and its messages", "context": "chat/sdk/wasm", "template": "guide", - "contentFile": "content/docs/chat/sdk/wasm/message/creating-messages/create-forward-message.mdx" + "contentFile": "content/docs/chat/sdk/wasm/conversation/managing-conversations/delete-conversation-with-messages.mdx" }, { - "sourcePath": "/sdk/wasm/message/creating-messages/create-merger-message", - "openimPath": "/sdk/wasm/message/creating-messages/create-merger-message", - "title": "Create a merged message", + "sourcePath": "/sdk/wasm/conversation/managing-conversations/clear-conversation-messages", + "openimPath": "/sdk/wasm/conversation/managing-conversations/clear-conversation-messages", + "title": "Clear messages in a conversation", "context": "chat/sdk/wasm", "template": "guide", - "contentFile": "content/docs/chat/sdk/wasm/message/creating-messages/create-merger-message.mdx" + "contentFile": "content/docs/chat/sdk/wasm/conversation/managing-conversations/clear-conversation-messages.mdx" }, { - "sourcePath": "/sdk/wasm/message/sending-messages/send-message", - "openimPath": "/sdk/wasm/message/sending-messages/send-message", - "title": "Send a message", + "sourcePath": "/sdk/wasm/conversation/managing-conversations/clear-local-conversations", + "openimPath": "/sdk/wasm/conversation/managing-conversations/clear-local-conversations", + "title": "Clear all local conversations", "context": "chat/sdk/wasm", "template": "guide", - "contentFile": "content/docs/chat/sdk/wasm/message/sending-messages/send-message.mdx" + "contentFile": "content/docs/chat/sdk/wasm/conversation/managing-conversations/clear-local-conversations.mdx" }, { - "sourcePath": "/sdk/wasm/message/sending-messages/send-message-not-oss", - "openimPath": "/sdk/wasm/message/sending-messages/send-message-not-oss", - "title": "Send a message without OSS", + "sourcePath": "/sdk/wasm/conversation/managing-conversation-groups/overview-conversation-groups", + "openimPath": "/sdk/wasm/conversation/managing-conversation-groups/overview-conversation-groups", + "title": "Conversation group overview", "context": "chat/sdk/wasm", "template": "guide", - "contentFile": "content/docs/chat/sdk/wasm/message/sending-messages/send-message-not-oss.mdx" + "contentFile": "content/docs/chat/sdk/wasm/conversation/managing-conversation-groups/overview-conversation-groups.mdx" }, { - "sourcePath": "/sdk/wasm/message/receiving-messages/receive-messages", - "openimPath": "/sdk/wasm/message/receiving-messages/receive-messages", - "title": "Receive messages", + "sourcePath": "/sdk/wasm/conversation/managing-conversation-groups/create-conversation-group", + "openimPath": "/sdk/wasm/conversation/managing-conversation-groups/create-conversation-group", + "title": "createConversationGroup", "context": "chat/sdk/wasm", "template": "guide", - "contentFile": "content/docs/chat/sdk/wasm/message/receiving-messages/receive-messages.mdx" + "contentFile": "content/docs/chat/sdk/wasm/conversation/managing-conversation-groups/create-conversation-group.mdx" }, { - "sourcePath": "/sdk/wasm/message/receiving-messages/receive-custom-business-messages", - "openimPath": "/sdk/wasm/message/receiving-messages/receive-custom-business-messages", - "title": "Receive custom business messages", + "sourcePath": "/sdk/wasm/conversation/managing-conversation-groups/get-conversation-groups", + "openimPath": "/sdk/wasm/conversation/managing-conversation-groups/get-conversation-groups", + "title": "getConversationGroups", "context": "chat/sdk/wasm", "template": "guide", - "contentFile": "content/docs/chat/sdk/wasm/message/receiving-messages/receive-custom-business-messages.mdx" + "contentFile": "content/docs/chat/sdk/wasm/conversation/managing-conversation-groups/get-conversation-groups.mdx" }, { - "sourcePath": "/sdk/wasm/message/retrieving-messages/load-older-messages", - "openimPath": "/sdk/wasm/message/retrieving-messages/load-older-messages", - "title": "Load older messages", + "sourcePath": "/sdk/wasm/conversation/managing-conversation-groups/get-conversation-group-info-with-conversations", + "openimPath": "/sdk/wasm/conversation/managing-conversation-groups/get-conversation-group-info-with-conversations", + "title": "getConversationGroupInfoWithConversations", "context": "chat/sdk/wasm", "template": "guide", - "contentFile": "content/docs/chat/sdk/wasm/message/retrieving-messages/load-older-messages.mdx" + "contentFile": "content/docs/chat/sdk/wasm/conversation/managing-conversation-groups/get-conversation-group-info-with-conversations.mdx" }, { - "sourcePath": "/sdk/wasm/message/retrieving-messages/load-newer-messages", - "openimPath": "/sdk/wasm/message/retrieving-messages/load-newer-messages", - "title": "Load newer messages", + "sourcePath": "/sdk/wasm/conversation/managing-conversation-groups/get-conversation-group-ids-by-conversation-id", + "openimPath": "/sdk/wasm/conversation/managing-conversation-groups/get-conversation-group-ids-by-conversation-id", + "title": "getConversationGroupIDsByConversationID", "context": "chat/sdk/wasm", "template": "guide", - "contentFile": "content/docs/chat/sdk/wasm/message/retrieving-messages/load-newer-messages.mdx" + "contentFile": "content/docs/chat/sdk/wasm/conversation/managing-conversation-groups/get-conversation-group-ids-by-conversation-id.mdx" }, { - "sourcePath": "/sdk/wasm/message/retrieving-messages/find-messages-by-id", - "openimPath": "/sdk/wasm/message/retrieving-messages/find-messages-by-id", - "title": "Find messages by ID", + "sourcePath": "/sdk/wasm/conversation/managing-conversation-groups/update-conversation-group", + "openimPath": "/sdk/wasm/conversation/managing-conversation-groups/update-conversation-group", + "title": "updateConversationGroup", "context": "chat/sdk/wasm", "template": "guide", - "contentFile": "content/docs/chat/sdk/wasm/message/retrieving-messages/find-messages-by-id.mdx" + "contentFile": "content/docs/chat/sdk/wasm/conversation/managing-conversation-groups/update-conversation-group.mdx" }, { - "sourcePath": "/sdk/wasm/message/retrieving-messages/load-message-context", - "openimPath": "/sdk/wasm/message/retrieving-messages/load-message-context", - "title": "Load message context", + "sourcePath": "/sdk/wasm/conversation/managing-conversation-groups/set-conversation-group-order", + "openimPath": "/sdk/wasm/conversation/managing-conversation-groups/set-conversation-group-order", + "title": "setConversationGroupOrder", "context": "chat/sdk/wasm", "template": "guide", - "contentFile": "content/docs/chat/sdk/wasm/message/retrieving-messages/load-message-context.mdx" + "contentFile": "content/docs/chat/sdk/wasm/conversation/managing-conversation-groups/set-conversation-group-order.mdx" }, { - "sourcePath": "/sdk/wasm/message/searching-messages/search-messages", - "openimPath": "/sdk/wasm/message/searching-messages/search-messages", - "title": "Search messages", + "sourcePath": "/sdk/wasm/conversation/managing-conversation-groups/add-conversations-to-groups", + "openimPath": "/sdk/wasm/conversation/managing-conversation-groups/add-conversations-to-groups", + "title": "addConversationsToGroups", "context": "chat/sdk/wasm", "template": "guide", - "contentFile": "content/docs/chat/sdk/wasm/message/searching-messages/search-messages.mdx" + "contentFile": "content/docs/chat/sdk/wasm/conversation/managing-conversation-groups/add-conversations-to-groups.mdx" }, { - "sourcePath": "/sdk/wasm/message/composing-messages/update-typing-status", - "openimPath": "/sdk/wasm/message/composing-messages/update-typing-status", - "title": "Update typing status", + "sourcePath": "/sdk/wasm/conversation/managing-conversation-groups/remove-conversations-from-groups", + "openimPath": "/sdk/wasm/conversation/managing-conversation-groups/remove-conversations-from-groups", + "title": "removeConversationsFromGroups", "context": "chat/sdk/wasm", "template": "guide", - "contentFile": "content/docs/chat/sdk/wasm/message/composing-messages/update-typing-status.mdx" + "contentFile": "content/docs/chat/sdk/wasm/conversation/managing-conversation-groups/remove-conversations-from-groups.mdx" }, { - "sourcePath": "/sdk/wasm/message/composing-messages/get-typing-status", - "openimPath": "/sdk/wasm/message/composing-messages/get-typing-status", - "title": "Get typing status", + "sourcePath": "/sdk/wasm/conversation/managing-conversation-groups/delete-conversation-group", + "openimPath": "/sdk/wasm/conversation/managing-conversation-groups/delete-conversation-group", + "title": "deleteConversationGroup", "context": "chat/sdk/wasm", "template": "guide", - "contentFile": "content/docs/chat/sdk/wasm/message/composing-messages/get-typing-status.mdx" + "contentFile": "content/docs/chat/sdk/wasm/conversation/managing-conversation-groups/delete-conversation-group.mdx" }, { - "sourcePath": "/sdk/wasm/message/composing-messages/check-speech-to-text", - "openimPath": "/sdk/wasm/message/composing-messages/check-speech-to-text", - "title": "Check speech recognition support", + "sourcePath": "/sdk/wasm/group/overview-group", + "openimPath": "/sdk/wasm/group/overview-group", + "title": "Group overview", "context": "chat/sdk/wasm", "template": "guide", - "contentFile": "content/docs/chat/sdk/wasm/message/composing-messages/check-speech-to-text.mdx" + "contentFile": "content/docs/chat/sdk/wasm/group/overview-group.mdx" }, { - "sourcePath": "/sdk/wasm/message/composing-messages/transcribe-audio", - "openimPath": "/sdk/wasm/message/composing-messages/transcribe-audio", - "title": "Transcribe audio", + "sourcePath": "/sdk/wasm/group/create-group", + "openimPath": "/sdk/wasm/group/create-group", + "title": "Create a group", "context": "chat/sdk/wasm", "template": "guide", - "contentFile": "content/docs/chat/sdk/wasm/message/composing-messages/transcribe-audio.mdx" + "contentFile": "content/docs/chat/sdk/wasm/group/create-group.mdx" }, { - "sourcePath": "/sdk/wasm/message/composing-messages/save-local-transcript", - "openimPath": "/sdk/wasm/message/composing-messages/save-local-transcript", - "title": "Save a local transcript", + "sourcePath": "/sdk/wasm/group/update-group-profile", + "openimPath": "/sdk/wasm/group/update-group-profile", + "title": "Update group profile", "context": "chat/sdk/wasm", - "template": "guide", - "contentFile": "content/docs/chat/sdk/wasm/message/composing-messages/save-local-transcript.mdx" + "template": "overview", + "contentFile": "content/docs/chat/sdk/wasm/group/update-group-profile.mdx" }, { - "sourcePath": "/sdk/wasm/message/managing-messages/delete-local-message", - "openimPath": "/sdk/wasm/message/managing-messages/delete-local-message", - "title": "Delete a local message", + "sourcePath": "/sdk/wasm/group/set-group-announcement", + "openimPath": "/sdk/wasm/group/set-group-announcement", + "title": "Publish a group announcement", "context": "chat/sdk/wasm", - "template": "guide", - "contentFile": "content/docs/chat/sdk/wasm/message/managing-messages/delete-local-message.mdx" + "template": "overview", + "contentFile": "content/docs/chat/sdk/wasm/group/set-group-announcement.mdx" }, { - "sourcePath": "/sdk/wasm/message/managing-messages/delete-saved-messages", - "openimPath": "/sdk/wasm/message/managing-messages/delete-saved-messages", - "title": "Delete saved messages", + "sourcePath": "/sdk/wasm/group/set-group-extension", + "openimPath": "/sdk/wasm/group/set-group-extension", + "title": "Set group extra data", "context": "chat/sdk/wasm", - "template": "guide", - "contentFile": "content/docs/chat/sdk/wasm/message/managing-messages/delete-saved-messages.mdx" + "template": "overview", + "contentFile": "content/docs/chat/sdk/wasm/group/set-group-extension.mdx" }, { - "sourcePath": "/sdk/wasm/message/managing-messages/delete-user-messages", - "openimPath": "/sdk/wasm/message/managing-messages/delete-user-messages", - "title": "Delete messages from a user", + "sourcePath": "/sdk/wasm/group/set-group-join-verification", + "openimPath": "/sdk/wasm/group/set-group-join-verification", + "title": "Set group join verification", "context": "chat/sdk/wasm", - "template": "guide", - "contentFile": "content/docs/chat/sdk/wasm/message/managing-messages/delete-user-messages.mdx" + "template": "overview", + "contentFile": "content/docs/chat/sdk/wasm/group/set-group-join-verification.mdx" }, { - "sourcePath": "/sdk/wasm/message/managing-messages/revoke-a-message", - "openimPath": "/sdk/wasm/message/managing-messages/revoke-a-message", - "title": "Revoke a message", + "sourcePath": "/sdk/wasm/group/set-group-member-profile-access", + "openimPath": "/sdk/wasm/group/set-group-member-profile-access", + "title": "Set member profile access", "context": "chat/sdk/wasm", - "template": "guide", - "contentFile": "content/docs/chat/sdk/wasm/message/managing-messages/revoke-a-message.mdx" + "template": "overview", + "contentFile": "content/docs/chat/sdk/wasm/group/set-group-member-profile-access.mdx" }, { - "sourcePath": "/sdk/wasm/message/managing-messages/modify-a-message", - "openimPath": "/sdk/wasm/message/managing-messages/modify-a-message", - "title": "Modify a message", + "sourcePath": "/sdk/wasm/group/set-group-member-friend-permission", + "openimPath": "/sdk/wasm/group/set-group-member-friend-permission", + "title": "Set member friend request permission", "context": "chat/sdk/wasm", - "template": "guide", - "contentFile": "content/docs/chat/sdk/wasm/message/managing-messages/modify-a-message.mdx" + "template": "overview", + "contentFile": "content/docs/chat/sdk/wasm/group/set-group-member-friend-permission.mdx" }, { - "sourcePath": "/sdk/wasm/message/managing-messages/get-pinned-messages", - "openimPath": "/sdk/wasm/message/managing-messages/get-pinned-messages", - "title": "View pinned messages", + "sourcePath": "/sdk/wasm/group/change-group-mute", + "openimPath": "/sdk/wasm/group/change-group-mute", + "title": "Change group mute status", "context": "chat/sdk/wasm", "template": "guide", - "contentFile": "content/docs/chat/sdk/wasm/message/managing-messages/get-pinned-messages.mdx" + "contentFile": "content/docs/chat/sdk/wasm/group/change-group-mute.mdx" }, { - "sourcePath": "/sdk/wasm/message/managing-messages/set-message-pinned", - "openimPath": "/sdk/wasm/message/managing-messages/set-message-pinned", - "title": "Pin or unpin a message", + "sourcePath": "/sdk/wasm/group/join-group", + "openimPath": "/sdk/wasm/group/join-group", + "title": "Apply to join a group", "context": "chat/sdk/wasm", "template": "guide", - "contentFile": "content/docs/chat/sdk/wasm/message/managing-messages/set-message-pinned.mdx" + "contentFile": "content/docs/chat/sdk/wasm/group/join-group.mdx" }, { - "sourcePath": "/sdk/wasm/message/managing-messages/insert-local-single-message", - "openimPath": "/sdk/wasm/message/managing-messages/insert-local-single-message", - "title": "Insert a local direct message", + "sourcePath": "/sdk/wasm/group/quit-group", + "openimPath": "/sdk/wasm/group/quit-group", + "title": "Leave a group", "context": "chat/sdk/wasm", "template": "guide", - "contentFile": "content/docs/chat/sdk/wasm/message/managing-messages/insert-local-single-message.mdx" + "contentFile": "content/docs/chat/sdk/wasm/group/quit-group.mdx" }, { - "sourcePath": "/sdk/wasm/message/managing-messages/insert-local-group-message", - "openimPath": "/sdk/wasm/message/managing-messages/insert-local-group-message", - "title": "Insert a local group message", + "sourcePath": "/sdk/wasm/group/dismiss-group", + "openimPath": "/sdk/wasm/group/dismiss-group", + "title": "Dismiss a group", "context": "chat/sdk/wasm", "template": "guide", - "contentFile": "content/docs/chat/sdk/wasm/message/managing-messages/insert-local-group-message.mdx" + "contentFile": "content/docs/chat/sdk/wasm/group/dismiss-group.mdx" }, { - "sourcePath": "/sdk/wasm/message/managing-messages/clear-all-local-messages", - "openimPath": "/sdk/wasm/message/managing-messages/clear-all-local-messages", - "title": "Clear all local messages", + "sourcePath": "/sdk/wasm/group/retrieving-groups/get-specified-groups-info", + "openimPath": "/sdk/wasm/group/retrieving-groups/get-specified-groups-info", + "title": "Get group information", "context": "chat/sdk/wasm", "template": "guide", - "contentFile": "content/docs/chat/sdk/wasm/message/managing-messages/clear-all-local-messages.mdx" + "contentFile": "content/docs/chat/sdk/wasm/group/retrieving-groups/get-specified-groups-info.mdx" }, { - "sourcePath": "/sdk/wasm/message/managing-messages/clear-all-messages", - "openimPath": "/sdk/wasm/message/managing-messages/clear-all-messages", - "title": "Clear all saved messages", + "sourcePath": "/sdk/wasm/group/retrieving-groups/get-joined-group-list", + "openimPath": "/sdk/wasm/group/retrieving-groups/get-joined-group-list", + "title": "Get joined groups", "context": "chat/sdk/wasm", "template": "guide", - "contentFile": "content/docs/chat/sdk/wasm/message/managing-messages/clear-all-messages.mdx" + "contentFile": "content/docs/chat/sdk/wasm/group/retrieving-groups/get-joined-group-list.mdx" }, { - "sourcePath": "/sdk/wasm/message/managing-messages/set-message-local-ex", - "openimPath": "/sdk/wasm/message/managing-messages/set-message-local-ex", - "title": "Set local message extensions", + "sourcePath": "/sdk/wasm/group/retrieving-groups/get-joined-group-list-page", + "openimPath": "/sdk/wasm/group/retrieving-groups/get-joined-group-list-page", + "title": "Get joined groups by page", "context": "chat/sdk/wasm", "template": "guide", - "contentFile": "content/docs/chat/sdk/wasm/message/managing-messages/set-message-local-ex.mdx" + "contentFile": "content/docs/chat/sdk/wasm/group/retrieving-groups/get-joined-group-list-page.mdx" }, { - "sourcePath": "/sdk/wasm/message/managing-read-status/get-group-message-readers", - "openimPath": "/sdk/wasm/message/managing-read-status/get-group-message-readers", - "title": "View group message readers", + "sourcePath": "/sdk/wasm/group/retrieving-groups/is-join-group", + "openimPath": "/sdk/wasm/group/retrieving-groups/is-join-group", + "title": "Check group membership", "context": "chat/sdk/wasm", "template": "guide", - "contentFile": "content/docs/chat/sdk/wasm/message/managing-read-status/get-group-message-readers.mdx" + "contentFile": "content/docs/chat/sdk/wasm/group/retrieving-groups/is-join-group.mdx" }, { - "sourcePath": "/sdk/wasm/message/managing-read-status/send-group-read-receipts", - "openimPath": "/sdk/wasm/message/managing-read-status/send-group-read-receipts", - "title": "Send group read receipts", + "sourcePath": "/sdk/wasm/group/retrieving-groups/search-groups", + "openimPath": "/sdk/wasm/group/retrieving-groups/search-groups", + "title": "Search groups", "context": "chat/sdk/wasm", "template": "guide", - "contentFile": "content/docs/chat/sdk/wasm/message/managing-read-status/send-group-read-receipts.mdx" + "contentFile": "content/docs/chat/sdk/wasm/group/retrieving-groups/search-groups.mdx" }, { - "sourcePath": "/sdk/wasm/file-uploads/upload-file", - "openimPath": "/sdk/wasm/file-uploads/upload-file", - "title": "Upload a file", + "sourcePath": "/sdk/wasm/group/group-applications/get-group-application-list-as-recipient", + "openimPath": "/sdk/wasm/group/group-applications/get-group-application-list-as-recipient", + "title": "Get received group applications", "context": "chat/sdk/wasm", "template": "guide", - "contentFile": "content/docs/chat/sdk/wasm/file-uploads/upload-file.mdx" + "contentFile": "content/docs/chat/sdk/wasm/group/group-applications/get-group-application-list-as-recipient.mdx" }, { - "sourcePath": "/sdk/wasm/calling/overview-calling", - "openimPath": "/sdk/wasm/calling/overview-calling", - "title": "Calling overview", + "sourcePath": "/sdk/wasm/group/group-applications/get-group-application-list-as-applicant", + "openimPath": "/sdk/wasm/group/group-applications/get-group-application-list-as-applicant", + "title": "Get sent group applications", "context": "chat/sdk/wasm", "template": "guide", - "contentFile": "content/docs/chat/sdk/wasm/calling/overview-calling.mdx" + "contentFile": "content/docs/chat/sdk/wasm/group/group-applications/get-group-application-list-as-applicant.mdx" }, { - "sourcePath": "/sdk/wasm/calling/managing-calls/start-single-call", - "openimPath": "/sdk/wasm/calling/managing-calls/start-single-call", - "title": "Start a one-to-one call", + "sourcePath": "/sdk/wasm/group/group-applications/get-group-application-unhandled-count", + "openimPath": "/sdk/wasm/group/group-applications/get-group-application-unhandled-count", + "title": "Get pending group application count", "context": "chat/sdk/wasm", "template": "guide", - "contentFile": "content/docs/chat/sdk/wasm/calling/managing-calls/start-single-call.mdx" + "contentFile": "content/docs/chat/sdk/wasm/group/group-applications/get-group-application-unhandled-count.mdx" }, { - "sourcePath": "/sdk/wasm/calling/managing-calls/start-group-call", - "openimPath": "/sdk/wasm/calling/managing-calls/start-group-call", - "title": "Start a group call", + "sourcePath": "/sdk/wasm/group/group-applications/get-group-application-badge-count", + "openimPath": "/sdk/wasm/group/group-applications/get-group-application-badge-count", + "title": "Get group application badge count", "context": "chat/sdk/wasm", "template": "guide", - "contentFile": "content/docs/chat/sdk/wasm/calling/managing-calls/start-group-call.mdx" + "contentFile": "content/docs/chat/sdk/wasm/group/group-applications/get-group-application-badge-count.mdx" }, { - "sourcePath": "/sdk/wasm/calling/managing-calls/accept-call", - "openimPath": "/sdk/wasm/calling/managing-calls/accept-call", - "title": "Accept a call", + "sourcePath": "/sdk/wasm/group/group-applications/clear-group-application-badge-count", + "openimPath": "/sdk/wasm/group/group-applications/clear-group-application-badge-count", + "title": "Clear the group application badge", "context": "chat/sdk/wasm", "template": "guide", - "contentFile": "content/docs/chat/sdk/wasm/calling/managing-calls/accept-call.mdx" + "contentFile": "content/docs/chat/sdk/wasm/group/group-applications/clear-group-application-badge-count.mdx" }, { - "sourcePath": "/sdk/wasm/calling/managing-calls/reject-call", - "openimPath": "/sdk/wasm/calling/managing-calls/reject-call", - "title": "Reject a call", + "sourcePath": "/sdk/wasm/group/group-applications/accept-group-application", + "openimPath": "/sdk/wasm/group/group-applications/accept-group-application", + "title": "Accept a group application", "context": "chat/sdk/wasm", "template": "guide", - "contentFile": "content/docs/chat/sdk/wasm/calling/managing-calls/reject-call.mdx" + "contentFile": "content/docs/chat/sdk/wasm/group/group-applications/accept-group-application.mdx" }, { - "sourcePath": "/sdk/wasm/calling/managing-calls/cancel-call", - "openimPath": "/sdk/wasm/calling/managing-calls/cancel-call", - "title": "Cancel a call invitation", + "sourcePath": "/sdk/wasm/group/group-applications/refuse-group-application", + "openimPath": "/sdk/wasm/group/group-applications/refuse-group-application", + "title": "Reject a group application", "context": "chat/sdk/wasm", "template": "guide", - "contentFile": "content/docs/chat/sdk/wasm/calling/managing-calls/cancel-call.mdx" + "contentFile": "content/docs/chat/sdk/wasm/group/group-applications/refuse-group-application.mdx" }, { - "sourcePath": "/sdk/wasm/calling/managing-calls/hang-up-call", - "openimPath": "/sdk/wasm/calling/managing-calls/hang-up-call", - "title": "Hang up a call", + "sourcePath": "/sdk/wasm/group/group-applications/delete-group-requests", + "openimPath": "/sdk/wasm/group/group-applications/delete-group-requests", + "title": "Delete group applications", "context": "chat/sdk/wasm", "template": "guide", - "contentFile": "content/docs/chat/sdk/wasm/calling/managing-calls/hang-up-call.mdx" + "contentFile": "content/docs/chat/sdk/wasm/group/group-applications/delete-group-requests.mdx" }, { - "sourcePath": "/sdk/wasm/calling/managing-calls/handle-call-events", - "openimPath": "/sdk/wasm/calling/managing-calls/handle-call-events", - "title": "Handle call events", + "sourcePath": "/sdk/wasm/group/retrieving-group-members/get-group-member-list", + "openimPath": "/sdk/wasm/group/retrieving-group-members/get-group-member-list", + "title": "Get group members", "context": "chat/sdk/wasm", "template": "guide", - "contentFile": "content/docs/chat/sdk/wasm/calling/managing-calls/handle-call-events.mdx" + "contentFile": "content/docs/chat/sdk/wasm/group/retrieving-group-members/get-group-member-list.mdx" }, { - "sourcePath": "/sdk/wasm/calling/retrieving-call-information/restore-pending-invitation", - "openimPath": "/sdk/wasm/calling/retrieving-call-information/restore-pending-invitation", - "title": "Restore a pending invitation", + "sourcePath": "/sdk/wasm/group/retrieving-group-members/get-specified-group-members-info", + "openimPath": "/sdk/wasm/group/retrieving-group-members/get-specified-group-members-info", + "title": "Get group member profiles", "context": "chat/sdk/wasm", "template": "guide", - "contentFile": "content/docs/chat/sdk/wasm/calling/retrieving-call-information/restore-pending-invitation.mdx" + "contentFile": "content/docs/chat/sdk/wasm/group/retrieving-group-members/get-specified-group-members-info.mdx" }, { - "sourcePath": "/sdk/wasm/calling/retrieving-call-information/get-room-by-group-id", - "openimPath": "/sdk/wasm/calling/retrieving-call-information/get-room-by-group-id", - "title": "Get a group call room", + "sourcePath": "/sdk/wasm/group/retrieving-group-members/get-users-in-group", + "openimPath": "/sdk/wasm/group/retrieving-group-members/get-users-in-group", + "title": "Check users in a group", "context": "chat/sdk/wasm", "template": "guide", - "contentFile": "content/docs/chat/sdk/wasm/calling/retrieving-call-information/get-room-by-group-id.mdx" + "contentFile": "content/docs/chat/sdk/wasm/group/retrieving-group-members/get-users-in-group.mdx" }, { - "sourcePath": "/sdk/wasm/calling/retrieving-call-information/get-token-by-room-id", - "openimPath": "/sdk/wasm/calling/retrieving-call-information/get-token-by-room-id", - "title": "Get room credentials", + "sourcePath": "/sdk/wasm/group/retrieving-group-members/get-group-member-owner-and-admin", + "openimPath": "/sdk/wasm/group/retrieving-group-members/get-group-member-owner-and-admin", + "title": "Get group owners and admins", "context": "chat/sdk/wasm", "template": "guide", - "contentFile": "content/docs/chat/sdk/wasm/calling/retrieving-call-information/get-token-by-room-id.mdx" + "contentFile": "content/docs/chat/sdk/wasm/group/retrieving-group-members/get-group-member-owner-and-admin.mdx" }, { - "sourcePath": "/sdk/wasm/calling/sending-custom-signals/send-a-custom-signal", - "openimPath": "/sdk/wasm/calling/sending-custom-signals/send-a-custom-signal", - "title": "Send a custom signal", + "sourcePath": "/sdk/wasm/group/retrieving-group-members/search-group-members", + "openimPath": "/sdk/wasm/group/retrieving-group-members/search-group-members", + "title": "Search group members", "context": "chat/sdk/wasm", "template": "guide", - "contentFile": "content/docs/chat/sdk/wasm/calling/sending-custom-signals/send-a-custom-signal.mdx" + "contentFile": "content/docs/chat/sdk/wasm/group/retrieving-group-members/search-group-members.mdx" }, { - "sourcePath": "/sdk/wasm/events/overview-events", - "openimPath": "/sdk/wasm/events/overview-events", - "title": "Events overview", + "sourcePath": "/sdk/wasm/group/managing-group-members/invite-user-to-group", + "openimPath": "/sdk/wasm/group/managing-group-members/invite-user-to-group", + "title": "Invite users to a group", "context": "chat/sdk/wasm", "template": "guide", - "contentFile": "content/docs/chat/sdk/wasm/events/overview-events.mdx" + "contentFile": "content/docs/chat/sdk/wasm/group/managing-group-members/invite-user-to-group.mdx" }, { - "sourcePath": "/sdk/wasm/logger", - "openimPath": "/sdk/wasm/logger", - "title": "Logger", + "sourcePath": "/sdk/wasm/group/managing-group-members/kick-group-member", + "openimPath": "/sdk/wasm/group/managing-group-members/kick-group-member", + "title": "Remove group members", "context": "chat/sdk/wasm", "template": "guide", - "contentFile": "content/docs/chat/sdk/wasm/logger.mdx" + "contentFile": "content/docs/chat/sdk/wasm/group/managing-group-members/kick-group-member.mdx" }, { - "sourcePath": "/platform-api/overview", - "openimPath": "/platform-api/overview", - "title": "Overview", - "context": "chat/platform-api", + "sourcePath": "/sdk/wasm/group/managing-group-members/set-group-member-nickname", + "openimPath": "/sdk/wasm/group/managing-group-members/set-group-member-nickname", + "title": "Update a group nickname", + "context": "chat/sdk/wasm", "template": "overview", - "contentFile": "content/docs/chat/platform-api/overview.mdx" + "contentFile": "content/docs/chat/sdk/wasm/group/managing-group-members/set-group-member-nickname.mdx" }, { - "sourcePath": "/platform-api/prepare-to-use-api", - "openimPath": "/platform-api/prepare-to-use-api", - "title": "Prepare to use the API", - "context": "chat/platform-api", + "sourcePath": "/sdk/wasm/group/managing-group-members/set-group-member-role-level", + "openimPath": "/sdk/wasm/group/managing-group-members/set-group-member-role-level", + "title": "Manage group administrators", + "context": "chat/sdk/wasm", "template": "overview", - "contentFile": "content/docs/chat/platform-api/prepare-to-use-api.mdx" + "contentFile": "content/docs/chat/sdk/wasm/group/managing-group-members/set-group-member-role-level.mdx" }, { - "sourcePath": "/platform-api/user/overview", - "openimPath": "/platform-api/user/overview", - "title": "Overview", - "context": "chat/platform-api", + "sourcePath": "/sdk/wasm/group/managing-group-members/set-group-member-avatar", + "openimPath": "/sdk/wasm/group/managing-group-members/set-group-member-avatar", + "title": "Update a group member avatar", + "context": "chat/sdk/wasm", "template": "overview", - "contentFile": "content/docs/chat/platform-api/user/overview.mdx" + "contentFile": "content/docs/chat/sdk/wasm/group/managing-group-members/set-group-member-avatar.mdx" }, { - "sourcePath": "/platform-api/user/listing-users/list-users", - "openimPath": "/platform-api/user/listing-users/list-users", - "title": "List users", - "context": "chat/platform-api", - "template": "api", - "contentFile": "content/docs/chat/platform-api/user/listing-users/list-users.mdx" + "sourcePath": "/sdk/wasm/group/managing-group-members/set-group-member-extension", + "openimPath": "/sdk/wasm/group/managing-group-members/set-group-member-extension", + "title": "Set group member extra data", + "context": "chat/sdk/wasm", + "template": "overview", + "contentFile": "content/docs/chat/sdk/wasm/group/managing-group-members/set-group-member-extension.mdx" }, { - "sourcePath": "/platform-api/user/listing-users/list-all-user-ids", - "openimPath": "/platform-api/user/listing-users/list-all-user-ids", - "title": "List all user IDs", - "context": "chat/platform-api", - "template": "api", - "contentFile": "content/docs/chat/platform-api/user/listing-users/list-all-user-ids.mdx" + "sourcePath": "/sdk/wasm/group/managing-group-members/transfer-group-owner", + "openimPath": "/sdk/wasm/group/managing-group-members/transfer-group-owner", + "title": "Transfer group owner", + "context": "chat/sdk/wasm", + "template": "guide", + "contentFile": "content/docs/chat/sdk/wasm/group/managing-group-members/transfer-group-owner.mdx" }, { - "sourcePath": "/platform-api/user/listing-users/check-user-accounts", - "openimPath": "/platform-api/user/listing-users/check-user-accounts", - "title": "Check user accounts", - "context": "chat/platform-api", - "template": "api", - "contentFile": "content/docs/chat/platform-api/user/listing-users/check-user-accounts.mdx" + "sourcePath": "/sdk/wasm/group/managing-group-members/change-group-member-mute", + "openimPath": "/sdk/wasm/group/managing-group-members/change-group-member-mute", + "title": "Mute or unmute a group member", + "context": "chat/sdk/wasm", + "template": "guide", + "contentFile": "content/docs/chat/sdk/wasm/group/managing-group-members/change-group-member-mute.mdx" }, { - "sourcePath": "/platform-api/user/listing-users/get-a-user", - "openimPath": "/platform-api/user/listing-users/get-a-user", - "title": "Get a user", - "context": "chat/platform-api", - "template": "api", - "contentFile": "content/docs/chat/platform-api/user/listing-users/get-a-user.mdx" + "sourcePath": "/sdk/wasm/message/overview-message", + "openimPath": "/sdk/wasm/message/overview-message", + "title": "Message overview", + "context": "chat/sdk/wasm", + "template": "guide", + "contentFile": "content/docs/chat/sdk/wasm/message/overview-message.mdx" }, { - "sourcePath": "/platform-api/user/creating-users/create-a-user", - "openimPath": "/platform-api/user/creating-users/create-a-user", - "title": "Create a user", - "context": "chat/platform-api", - "template": "api", - "contentFile": "content/docs/chat/platform-api/user/creating-users/create-a-user.mdx" + "sourcePath": "/sdk/wasm/message/creating-messages/create-text-message", + "openimPath": "/sdk/wasm/message/creating-messages/create-text-message", + "title": "Create a text message", + "context": "chat/sdk/wasm", + "template": "guide", + "contentFile": "content/docs/chat/sdk/wasm/message/creating-messages/create-text-message.mdx" }, { - "sourcePath": "/platform-api/user/managing-users/update-a-user", - "openimPath": "/platform-api/user/managing-users/update-a-user", - "title": "Update a user", - "context": "chat/platform-api", - "template": "api", - "contentFile": "content/docs/chat/platform-api/user/managing-users/update-a-user.mdx" + "sourcePath": "/sdk/wasm/message/creating-messages/create-text-at-message", + "openimPath": "/sdk/wasm/message/creating-messages/create-text-at-message", + "title": "Create a mention message", + "context": "chat/sdk/wasm", + "template": "guide", + "contentFile": "content/docs/chat/sdk/wasm/message/creating-messages/create-text-at-message.mdx" }, { - "sourcePath": "/platform-api/user/presence/get-users-online-status", - "openimPath": "/platform-api/user/presence/get-users-online-status", - "title": "Get users' online status", - "context": "chat/platform-api", - "template": "api", - "contentFile": "content/docs/chat/platform-api/user/presence/get-users-online-status.mdx" + "sourcePath": "/sdk/wasm/message/creating-messages/create-custom-message", + "openimPath": "/sdk/wasm/message/creating-messages/create-custom-message", + "title": "Create a custom message", + "context": "chat/sdk/wasm", + "template": "guide", + "contentFile": "content/docs/chat/sdk/wasm/message/creating-messages/create-custom-message.mdx" }, { - "sourcePath": "/platform-api/user/presence/get-users-online-token-detail", - "openimPath": "/platform-api/user/presence/get-users-online-token-detail", - "title": "Get users online token details", - "context": "chat/platform-api", - "template": "api", - "contentFile": "content/docs/chat/platform-api/user/presence/get-users-online-token-detail.mdx" + "sourcePath": "/sdk/wasm/message/creating-messages/create-image-message-by-file", + "openimPath": "/sdk/wasm/message/creating-messages/create-image-message-by-file", + "title": "Create an image message from a file", + "context": "chat/sdk/wasm", + "template": "guide", + "contentFile": "content/docs/chat/sdk/wasm/message/creating-messages/create-image-message-by-file.mdx" }, { - "sourcePath": "/platform-api/user/notification-accounts/add-notification-account", - "openimPath": "/platform-api/user/notification-accounts/add-notification-account", - "title": "Add a notification account", - "context": "chat/platform-api", - "template": "api", - "contentFile": "content/docs/chat/platform-api/user/notification-accounts/add-notification-account.mdx" + "sourcePath": "/sdk/wasm/message/creating-messages/create-image-message-by-url", + "openimPath": "/sdk/wasm/message/creating-messages/create-image-message-by-url", + "title": "Create an image message from a URL", + "context": "chat/sdk/wasm", + "template": "guide", + "contentFile": "content/docs/chat/sdk/wasm/message/creating-messages/create-image-message-by-url.mdx" }, { - "sourcePath": "/platform-api/user/notification-accounts/update-notification-account", - "openimPath": "/platform-api/user/notification-accounts/update-notification-account", - "title": "Update a notification account", - "context": "chat/platform-api", - "template": "api", - "contentFile": "content/docs/chat/platform-api/user/notification-accounts/update-notification-account.mdx" + "sourcePath": "/sdk/wasm/message/creating-messages/create-sound-message-by-file", + "openimPath": "/sdk/wasm/message/creating-messages/create-sound-message-by-file", + "title": "Create an audio message from a file", + "context": "chat/sdk/wasm", + "template": "guide", + "contentFile": "content/docs/chat/sdk/wasm/message/creating-messages/create-sound-message-by-file.mdx" }, { - "sourcePath": "/platform-api/user/notification-accounts/search-notification-account", - "openimPath": "/platform-api/user/notification-accounts/search-notification-account", - "title": "Search notification accounts", - "context": "chat/platform-api", - "template": "api", - "contentFile": "content/docs/chat/platform-api/user/notification-accounts/search-notification-account.mdx" + "sourcePath": "/sdk/wasm/message/creating-messages/create-sound-message-by-url", + "openimPath": "/sdk/wasm/message/creating-messages/create-sound-message-by-url", + "title": "Create an audio message from a URL", + "context": "chat/sdk/wasm", + "template": "guide", + "contentFile": "content/docs/chat/sdk/wasm/message/creating-messages/create-sound-message-by-url.mdx" }, { - "sourcePath": "/platform-api/relation/overview", - "openimPath": "/platform-api/relation/overview", - "title": "Overview", - "context": "chat/platform-api", - "template": "overview", - "contentFile": "content/docs/chat/platform-api/relation/overview.mdx" + "sourcePath": "/sdk/wasm/message/creating-messages/create-video-message-by-file", + "openimPath": "/sdk/wasm/message/creating-messages/create-video-message-by-file", + "title": "Create a video message from a file", + "context": "chat/sdk/wasm", + "template": "guide", + "contentFile": "content/docs/chat/sdk/wasm/message/creating-messages/create-video-message-by-file.mdx" }, { - "sourcePath": "/platform-api/relation/managing-friend-requests/apply-to-add-friend", - "openimPath": "/platform-api/relation/managing-friend-requests/apply-to-add-friend", - "title": "Apply to add a friend", - "context": "chat/platform-api", - "template": "api", - "contentFile": "content/docs/chat/platform-api/relation/managing-friend-requests/apply-to-add-friend.mdx" + "sourcePath": "/sdk/wasm/message/creating-messages/create-video-message-by-url", + "openimPath": "/sdk/wasm/message/creating-messages/create-video-message-by-url", + "title": "Create a video message from a URL", + "context": "chat/sdk/wasm", + "template": "guide", + "contentFile": "content/docs/chat/sdk/wasm/message/creating-messages/create-video-message-by-url.mdx" }, { - "sourcePath": "/platform-api/relation/managing-friend-requests/respond-friend-apply", - "openimPath": "/platform-api/relation/managing-friend-requests/respond-friend-apply", - "title": "Respond to a friend request", - "context": "chat/platform-api", - "template": "api", - "contentFile": "content/docs/chat/platform-api/relation/managing-friend-requests/respond-friend-apply.mdx" + "sourcePath": "/sdk/wasm/message/creating-messages/create-file-message-by-file", + "openimPath": "/sdk/wasm/message/creating-messages/create-file-message-by-file", + "title": "Create a file message from a file", + "context": "chat/sdk/wasm", + "template": "guide", + "contentFile": "content/docs/chat/sdk/wasm/message/creating-messages/create-file-message-by-file.mdx" }, { - "sourcePath": "/platform-api/relation/managing-friend-requests/list-received-friend-requests", - "openimPath": "/platform-api/relation/managing-friend-requests/list-received-friend-requests", - "title": "List received friend requests", - "context": "chat/platform-api", - "template": "api", - "contentFile": "content/docs/chat/platform-api/relation/managing-friend-requests/list-received-friend-requests.mdx" + "sourcePath": "/sdk/wasm/message/creating-messages/create-file-message-by-url", + "openimPath": "/sdk/wasm/message/creating-messages/create-file-message-by-url", + "title": "Create a file message from a URL", + "context": "chat/sdk/wasm", + "template": "guide", + "contentFile": "content/docs/chat/sdk/wasm/message/creating-messages/create-file-message-by-url.mdx" }, { - "sourcePath": "/platform-api/relation/managing-friend-requests/list-sent-friend-requests", - "openimPath": "/platform-api/relation/managing-friend-requests/list-sent-friend-requests", - "title": "List sent friend requests", - "context": "chat/platform-api", - "template": "api", - "contentFile": "content/docs/chat/platform-api/relation/managing-friend-requests/list-sent-friend-requests.mdx" + "sourcePath": "/sdk/wasm/message/creating-messages/create-card-message", + "openimPath": "/sdk/wasm/message/creating-messages/create-card-message", + "title": "Create a contact card message", + "context": "chat/sdk/wasm", + "template": "guide", + "contentFile": "content/docs/chat/sdk/wasm/message/creating-messages/create-card-message.mdx" }, { - "sourcePath": "/platform-api/relation/listing-friends/list-friends", - "openimPath": "/platform-api/relation/listing-friends/list-friends", - "title": "List friends", - "context": "chat/platform-api", - "template": "api", - "contentFile": "content/docs/chat/platform-api/relation/listing-friends/list-friends.mdx" + "sourcePath": "/sdk/wasm/message/creating-messages/create-location-message", + "openimPath": "/sdk/wasm/message/creating-messages/create-location-message", + "title": "Create a location message", + "context": "chat/sdk/wasm", + "template": "guide", + "contentFile": "content/docs/chat/sdk/wasm/message/creating-messages/create-location-message.mdx" }, { - "sourcePath": "/platform-api/relation/listing-friends/get-designated-friends", - "openimPath": "/platform-api/relation/listing-friends/get-designated-friends", - "title": "Get designated friends", - "context": "chat/platform-api", - "template": "api", - "contentFile": "content/docs/chat/platform-api/relation/listing-friends/get-designated-friends.mdx" + "sourcePath": "/sdk/wasm/message/creating-messages/create-face-message", + "openimPath": "/sdk/wasm/message/creating-messages/create-face-message", + "title": "Create an emoji message", + "context": "chat/sdk/wasm", + "template": "guide", + "contentFile": "content/docs/chat/sdk/wasm/message/creating-messages/create-face-message.mdx" }, { - "sourcePath": "/platform-api/relation/managing-friends/delete-friend", - "openimPath": "/platform-api/relation/managing-friends/delete-friend", - "title": "Delete a friend", - "context": "chat/platform-api", - "template": "api", - "contentFile": "content/docs/chat/platform-api/relation/managing-friends/delete-friend.mdx" + "sourcePath": "/sdk/wasm/message/creating-messages/create-quote-message", + "openimPath": "/sdk/wasm/message/creating-messages/create-quote-message", + "title": "Create a reply message", + "context": "chat/sdk/wasm", + "template": "guide", + "contentFile": "content/docs/chat/sdk/wasm/message/creating-messages/create-quote-message.mdx" }, { - "sourcePath": "/platform-api/error-codes", - "openimPath": "/platform-api/error-codes", - "title": "Error codes", - "context": "chat/platform-api", - "template": "overview", - "contentFile": "content/docs/chat/platform-api/error-codes.mdx" + "sourcePath": "/sdk/wasm/message/creating-messages/create-markdown-message", + "openimPath": "/sdk/wasm/message/creating-messages/create-markdown-message", + "title": "Create a Markdown message", + "context": "chat/sdk/wasm", + "template": "guide", + "contentFile": "content/docs/chat/sdk/wasm/message/creating-messages/create-markdown-message.mdx" }, { - "sourcePath": "/platform-api/relation/managing-friends/import-friends", - "openimPath": "/platform-api/relation/managing-friends/import-friends", - "title": "Import friends", - "context": "chat/platform-api", - "template": "api", - "contentFile": "content/docs/chat/platform-api/relation/managing-friends/import-friends.mdx" + "sourcePath": "/sdk/wasm/message/creating-messages/create-forward-message", + "openimPath": "/sdk/wasm/message/creating-messages/create-forward-message", + "title": "Create a forwarded message", + "context": "chat/sdk/wasm", + "template": "guide", + "contentFile": "content/docs/chat/sdk/wasm/message/creating-messages/create-forward-message.mdx" }, { - "sourcePath": "/platform-api/relation/managing-friends/update-friends", - "openimPath": "/platform-api/relation/managing-friends/update-friends", - "title": "Update friends", - "context": "chat/platform-api", - "template": "api", - "contentFile": "content/docs/chat/platform-api/relation/managing-friends/update-friends.mdx" + "sourcePath": "/sdk/wasm/message/creating-messages/create-merger-message", + "openimPath": "/sdk/wasm/message/creating-messages/create-merger-message", + "title": "Create a merged message", + "context": "chat/sdk/wasm", + "template": "guide", + "contentFile": "content/docs/chat/sdk/wasm/message/creating-messages/create-merger-message.mdx" }, { - "sourcePath": "/platform-api/relation/blacklist/add-black", - "openimPath": "/platform-api/relation/blacklist/add-black", - "title": "Add to blacklist", - "context": "chat/platform-api", - "template": "api", - "contentFile": "content/docs/chat/platform-api/relation/blacklist/add-black.mdx" + "sourcePath": "/sdk/wasm/message/sending-messages/send-message", + "openimPath": "/sdk/wasm/message/sending-messages/send-message", + "title": "Send a message", + "context": "chat/sdk/wasm", + "template": "guide", + "contentFile": "content/docs/chat/sdk/wasm/message/sending-messages/send-message.mdx" }, { - "sourcePath": "/platform-api/relation/blacklist/list-blacks", - "openimPath": "/platform-api/relation/blacklist/list-blacks", - "title": "List blacklisted users", - "context": "chat/platform-api", - "template": "api", - "contentFile": "content/docs/chat/platform-api/relation/blacklist/list-blacks.mdx" + "sourcePath": "/sdk/wasm/message/sending-messages/send-message-not-oss", + "openimPath": "/sdk/wasm/message/sending-messages/send-message-not-oss", + "title": "Send a message without OSS", + "context": "chat/sdk/wasm", + "template": "guide", + "contentFile": "content/docs/chat/sdk/wasm/message/sending-messages/send-message-not-oss.mdx" + }, + { + "sourcePath": "/sdk/wasm/message/receiving-messages/receive-messages", + "openimPath": "/sdk/wasm/message/receiving-messages/receive-messages", + "title": "Receive messages", + "context": "chat/sdk/wasm", + "template": "guide", + "contentFile": "content/docs/chat/sdk/wasm/message/receiving-messages/receive-messages.mdx" }, { - "sourcePath": "/platform-api/relation/blacklist/remove-black", - "openimPath": "/platform-api/relation/blacklist/remove-black", - "title": "Remove from blacklist", - "context": "chat/platform-api", - "template": "api", - "contentFile": "content/docs/chat/platform-api/relation/blacklist/remove-black.mdx" + "sourcePath": "/sdk/wasm/message/receiving-messages/receive-custom-business-messages", + "openimPath": "/sdk/wasm/message/receiving-messages/receive-custom-business-messages", + "title": "Receive custom business messages", + "context": "chat/sdk/wasm", + "template": "guide", + "contentFile": "content/docs/chat/sdk/wasm/message/receiving-messages/receive-custom-business-messages.mdx" }, { - "sourcePath": "/platform-api/group/overview", - "openimPath": "/platform-api/group/overview", - "title": "Overview", - "context": "chat/platform-api", - "template": "overview", - "contentFile": "content/docs/chat/platform-api/group/overview.mdx" + "sourcePath": "/sdk/wasm/message/retrieving-messages/load-older-messages", + "openimPath": "/sdk/wasm/message/retrieving-messages/load-older-messages", + "title": "Load older messages", + "context": "chat/sdk/wasm", + "template": "guide", + "contentFile": "content/docs/chat/sdk/wasm/message/retrieving-messages/load-older-messages.mdx" }, { - "sourcePath": "/platform-api/group/managing-groups/create-group", - "openimPath": "/platform-api/group/managing-groups/create-group", - "title": "Create group", - "context": "chat/platform-api", - "template": "api", - "contentFile": "content/docs/chat/platform-api/group/managing-groups/create-group.mdx" + "sourcePath": "/sdk/wasm/message/retrieving-messages/load-newer-messages", + "openimPath": "/sdk/wasm/message/retrieving-messages/load-newer-messages", + "title": "Load newer messages", + "context": "chat/sdk/wasm", + "template": "guide", + "contentFile": "content/docs/chat/sdk/wasm/message/retrieving-messages/load-newer-messages.mdx" }, { - "sourcePath": "/platform-api/group/managing-groups/set-group-info-ex", - "openimPath": "/platform-api/group/managing-groups/set-group-info-ex", - "title": "Set group info extension", - "context": "chat/platform-api", - "template": "api", - "contentFile": "content/docs/chat/platform-api/group/managing-groups/set-group-info-ex.mdx" + "sourcePath": "/sdk/wasm/message/retrieving-messages/find-messages-by-id", + "openimPath": "/sdk/wasm/message/retrieving-messages/find-messages-by-id", + "title": "Find messages by ID", + "context": "chat/sdk/wasm", + "template": "guide", + "contentFile": "content/docs/chat/sdk/wasm/message/retrieving-messages/find-messages-by-id.mdx" }, { - "sourcePath": "/platform-api/group/group-applications/join-group", - "openimPath": "/platform-api/group/group-applications/join-group", - "title": "Join group", - "context": "chat/platform-api", - "template": "api", - "contentFile": "content/docs/chat/platform-api/group/group-applications/join-group.mdx" + "sourcePath": "/sdk/wasm/message/retrieving-messages/load-message-context", + "openimPath": "/sdk/wasm/message/retrieving-messages/load-message-context", + "title": "Load message context", + "context": "chat/sdk/wasm", + "template": "guide", + "contentFile": "content/docs/chat/sdk/wasm/message/retrieving-messages/load-message-context.mdx" }, { - "sourcePath": "/platform-api/group/group-membership/quit-group", - "openimPath": "/platform-api/group/group-membership/quit-group", - "title": "Quit group", - "context": "chat/platform-api", - "template": "api", - "contentFile": "content/docs/chat/platform-api/group/group-membership/quit-group.mdx" + "sourcePath": "/sdk/wasm/message/searching-messages/search-messages", + "openimPath": "/sdk/wasm/message/searching-messages/search-messages", + "title": "Search messages", + "context": "chat/sdk/wasm", + "template": "guide", + "contentFile": "content/docs/chat/sdk/wasm/message/searching-messages/search-messages.mdx" }, { - "sourcePath": "/platform-api/group/group-applications/respond-group-application", - "openimPath": "/platform-api/group/group-applications/respond-group-application", - "title": "Respond to a group application", - "context": "chat/platform-api", - "template": "api", - "contentFile": "content/docs/chat/platform-api/group/group-applications/respond-group-application.mdx" + "sourcePath": "/sdk/wasm/message/composing-messages/update-typing-status", + "openimPath": "/sdk/wasm/message/composing-messages/update-typing-status", + "title": "Update typing status", + "context": "chat/sdk/wasm", + "template": "guide", + "contentFile": "content/docs/chat/sdk/wasm/message/composing-messages/update-typing-status.mdx" }, { - "sourcePath": "/platform-api/group/managing-groups/transfer-group-owner", - "openimPath": "/platform-api/group/managing-groups/transfer-group-owner", - "title": "Transfer group owner", - "context": "chat/platform-api", - "template": "api", - "contentFile": "content/docs/chat/platform-api/group/managing-groups/transfer-group-owner.mdx" + "sourcePath": "/sdk/wasm/message/composing-messages/get-typing-status", + "openimPath": "/sdk/wasm/message/composing-messages/get-typing-status", + "title": "Get typing status", + "context": "chat/sdk/wasm", + "template": "guide", + "contentFile": "content/docs/chat/sdk/wasm/message/composing-messages/get-typing-status.mdx" }, { - "sourcePath": "/platform-api/group/group-applications/list-received-group-applications", - "openimPath": "/platform-api/group/group-applications/list-received-group-applications", - "title": "List received group applications", - "context": "chat/platform-api", - "template": "api", - "contentFile": "content/docs/chat/platform-api/group/group-applications/list-received-group-applications.mdx" + "sourcePath": "/sdk/wasm/message/composing-messages/check-speech-to-text", + "openimPath": "/sdk/wasm/message/composing-messages/check-speech-to-text", + "title": "Check speech recognition support", + "context": "chat/sdk/wasm", + "template": "guide", + "contentFile": "content/docs/chat/sdk/wasm/message/composing-messages/check-speech-to-text.mdx" }, { - "sourcePath": "/platform-api/group/group-applications/list-user-requested-group-applications", - "openimPath": "/platform-api/group/group-applications/list-user-requested-group-applications", - "title": "List user requested group applications", - "context": "chat/platform-api", - "template": "api", - "contentFile": "content/docs/chat/platform-api/group/group-applications/list-user-requested-group-applications.mdx" + "sourcePath": "/sdk/wasm/message/composing-messages/transcribe-audio", + "openimPath": "/sdk/wasm/message/composing-messages/transcribe-audio", + "title": "Transcribe audio", + "context": "chat/sdk/wasm", + "template": "guide", + "contentFile": "content/docs/chat/sdk/wasm/message/composing-messages/transcribe-audio.mdx" }, { - "sourcePath": "/platform-api/group/group-applications/list-group-users-request-applications", - "openimPath": "/platform-api/group/group-applications/list-group-users-request-applications", - "title": "List group users request applications", - "context": "chat/platform-api", - "template": "api", - "contentFile": "content/docs/chat/platform-api/group/group-applications/list-group-users-request-applications.mdx" + "sourcePath": "/sdk/wasm/message/composing-messages/save-local-transcript", + "openimPath": "/sdk/wasm/message/composing-messages/save-local-transcript", + "title": "Save a local transcript", + "context": "chat/sdk/wasm", + "template": "guide", + "contentFile": "content/docs/chat/sdk/wasm/message/composing-messages/save-local-transcript.mdx" }, { - "sourcePath": "/platform-api/group/group-applications/get-specified-user-group-request-info", - "openimPath": "/platform-api/group/group-applications/get-specified-user-group-request-info", - "title": "Get specified user group request info", - "context": "chat/platform-api", - "template": "api", - "contentFile": "content/docs/chat/platform-api/group/group-applications/get-specified-user-group-request-info.mdx" + "sourcePath": "/sdk/wasm/message/managing-messages/delete-local-message", + "openimPath": "/sdk/wasm/message/managing-messages/delete-local-message", + "title": "Delete a local message", + "context": "chat/sdk/wasm", + "template": "guide", + "contentFile": "content/docs/chat/sdk/wasm/message/managing-messages/delete-local-message.mdx" }, { - "sourcePath": "/platform-api/group/managing-groups/get-groups-info", - "openimPath": "/platform-api/group/managing-groups/get-groups-info", - "title": "Get groups info", - "context": "chat/platform-api", - "template": "api", - "contentFile": "content/docs/chat/platform-api/group/managing-groups/get-groups-info.mdx" + "sourcePath": "/sdk/wasm/message/managing-messages/delete-saved-messages", + "openimPath": "/sdk/wasm/message/managing-messages/delete-saved-messages", + "title": "Delete saved messages", + "context": "chat/sdk/wasm", + "template": "guide", + "contentFile": "content/docs/chat/sdk/wasm/message/managing-messages/delete-saved-messages.mdx" }, { - "sourcePath": "/platform-api/group/group-members/kick-group-members", - "openimPath": "/platform-api/group/group-members/kick-group-members", - "title": "Kick group members", - "context": "chat/platform-api", - "template": "api", - "contentFile": "content/docs/chat/platform-api/group/group-members/kick-group-members.mdx" + "sourcePath": "/sdk/wasm/message/managing-messages/delete-user-messages", + "openimPath": "/sdk/wasm/message/managing-messages/delete-user-messages", + "title": "Delete messages from a user", + "context": "chat/sdk/wasm", + "template": "guide", + "contentFile": "content/docs/chat/sdk/wasm/message/managing-messages/delete-user-messages.mdx" }, { - "sourcePath": "/platform-api/group/group-members/get-group-members-info", - "openimPath": "/platform-api/group/group-members/get-group-members-info", - "title": "Get group members info", - "context": "chat/platform-api", - "template": "api", - "contentFile": "content/docs/chat/platform-api/group/group-members/get-group-members-info.mdx" + "sourcePath": "/sdk/wasm/message/managing-messages/revoke-a-message", + "openimPath": "/sdk/wasm/message/managing-messages/revoke-a-message", + "title": "Revoke a message", + "context": "chat/sdk/wasm", + "template": "guide", + "contentFile": "content/docs/chat/sdk/wasm/message/managing-messages/revoke-a-message.mdx" }, { - "sourcePath": "/platform-api/group/group-members/get-group-member-list", - "openimPath": "/platform-api/group/group-members/get-group-member-list", - "title": "Get group member list", - "context": "chat/platform-api", - "template": "api", - "contentFile": "content/docs/chat/platform-api/group/group-members/get-group-member-list.mdx" + "sourcePath": "/sdk/wasm/message/managing-messages/modify-a-message", + "openimPath": "/sdk/wasm/message/managing-messages/modify-a-message", + "title": "Modify a message", + "context": "chat/sdk/wasm", + "template": "guide", + "contentFile": "content/docs/chat/sdk/wasm/message/managing-messages/modify-a-message.mdx" }, { - "sourcePath": "/platform-api/group/group-members/invite-users-to-group", - "openimPath": "/platform-api/group/group-members/invite-users-to-group", - "title": "Invite users to group", - "context": "chat/platform-api", - "template": "api", - "contentFile": "content/docs/chat/platform-api/group/group-members/invite-users-to-group.mdx" + "sourcePath": "/sdk/wasm/message/managing-messages/get-pinned-messages", + "openimPath": "/sdk/wasm/message/managing-messages/get-pinned-messages", + "title": "View pinned messages", + "context": "chat/sdk/wasm", + "template": "guide", + "contentFile": "content/docs/chat/sdk/wasm/message/managing-messages/get-pinned-messages.mdx" }, { - "sourcePath": "/platform-api/group/group-membership/get-joined-group-list", - "openimPath": "/platform-api/group/group-membership/get-joined-group-list", - "title": "Get joined group list", - "context": "chat/platform-api", - "template": "api", - "contentFile": "content/docs/chat/platform-api/group/group-membership/get-joined-group-list.mdx" + "sourcePath": "/sdk/wasm/message/managing-messages/set-message-pinned", + "openimPath": "/sdk/wasm/message/managing-messages/set-message-pinned", + "title": "Pin or unpin a message", + "context": "chat/sdk/wasm", + "template": "guide", + "contentFile": "content/docs/chat/sdk/wasm/message/managing-messages/set-message-pinned.mdx" }, { - "sourcePath": "/platform-api/group/managing-groups/dismiss-group", - "openimPath": "/platform-api/group/managing-groups/dismiss-group", - "title": "Dismiss group", - "context": "chat/platform-api", - "template": "api", - "contentFile": "content/docs/chat/platform-api/group/managing-groups/dismiss-group.mdx" + "sourcePath": "/sdk/wasm/message/managing-messages/insert-local-single-message", + "openimPath": "/sdk/wasm/message/managing-messages/insert-local-single-message", + "title": "Insert a local direct message", + "context": "chat/sdk/wasm", + "template": "guide", + "contentFile": "content/docs/chat/sdk/wasm/message/managing-messages/insert-local-single-message.mdx" }, { - "sourcePath": "/platform-api/group/group-moderation/mute-group-member", - "openimPath": "/platform-api/group/group-moderation/mute-group-member", - "title": "Mute group member", - "context": "chat/platform-api", - "template": "api", - "contentFile": "content/docs/chat/platform-api/group/group-moderation/mute-group-member.mdx" + "sourcePath": "/sdk/wasm/message/managing-messages/insert-local-group-message", + "openimPath": "/sdk/wasm/message/managing-messages/insert-local-group-message", + "title": "Insert a local group message", + "context": "chat/sdk/wasm", + "template": "guide", + "contentFile": "content/docs/chat/sdk/wasm/message/managing-messages/insert-local-group-message.mdx" }, { - "sourcePath": "/platform-api/group/group-moderation/cancel-mute-group-member", - "openimPath": "/platform-api/group/group-moderation/cancel-mute-group-member", - "title": "Cancel mute group member", - "context": "chat/platform-api", - "template": "api", - "contentFile": "content/docs/chat/platform-api/group/group-moderation/cancel-mute-group-member.mdx" + "sourcePath": "/sdk/wasm/message/managing-messages/clear-all-local-messages", + "openimPath": "/sdk/wasm/message/managing-messages/clear-all-local-messages", + "title": "Clear all local messages", + "context": "chat/sdk/wasm", + "template": "guide", + "contentFile": "content/docs/chat/sdk/wasm/message/managing-messages/clear-all-local-messages.mdx" }, { - "sourcePath": "/platform-api/group/group-moderation/mute-group", - "openimPath": "/platform-api/group/group-moderation/mute-group", - "title": "Mute group", - "context": "chat/platform-api", - "template": "api", - "contentFile": "content/docs/chat/platform-api/group/group-moderation/mute-group.mdx" + "sourcePath": "/sdk/wasm/message/managing-messages/clear-all-messages", + "openimPath": "/sdk/wasm/message/managing-messages/clear-all-messages", + "title": "Clear all saved messages", + "context": "chat/sdk/wasm", + "template": "guide", + "contentFile": "content/docs/chat/sdk/wasm/message/managing-messages/clear-all-messages.mdx" }, { - "sourcePath": "/platform-api/group/group-moderation/cancel-mute-group", - "openimPath": "/platform-api/group/group-moderation/cancel-mute-group", - "title": "Cancel mute group", - "context": "chat/platform-api", - "template": "api", - "contentFile": "content/docs/chat/platform-api/group/group-moderation/cancel-mute-group.mdx" + "sourcePath": "/sdk/wasm/message/managing-messages/set-message-local-ex", + "openimPath": "/sdk/wasm/message/managing-messages/set-message-local-ex", + "title": "Set local message extensions", + "context": "chat/sdk/wasm", + "template": "guide", + "contentFile": "content/docs/chat/sdk/wasm/message/managing-messages/set-message-local-ex.mdx" }, { - "sourcePath": "/platform-api/group/group-members/set-group-member-info", - "openimPath": "/platform-api/group/group-members/set-group-member-info", - "title": "Set group member info", - "context": "chat/platform-api", - "template": "api", - "contentFile": "content/docs/chat/platform-api/group/group-members/set-group-member-info.mdx" + "sourcePath": "/sdk/wasm/message/managing-read-status/get-group-message-readers", + "openimPath": "/sdk/wasm/message/managing-read-status/get-group-message-readers", + "title": "View group message readers", + "context": "chat/sdk/wasm", + "template": "guide", + "contentFile": "content/docs/chat/sdk/wasm/message/managing-read-status/get-group-message-readers.mdx" }, { - "sourcePath": "/platform-api/auth/overview", - "openimPath": "/platform-api/auth/overview", - "title": "Overview", - "context": "chat/platform-api", - "template": "overview", - "contentFile": "content/docs/chat/platform-api/auth/overview.mdx" + "sourcePath": "/sdk/wasm/message/managing-read-status/send-group-read-receipts", + "openimPath": "/sdk/wasm/message/managing-read-status/send-group-read-receipts", + "title": "Send group read receipts", + "context": "chat/sdk/wasm", + "template": "guide", + "contentFile": "content/docs/chat/sdk/wasm/message/managing-read-status/send-group-read-receipts.mdx" }, { - "sourcePath": "/platform-api/auth/tokens/get-admin-token", - "openimPath": "/platform-api/auth/tokens/get-admin-token", - "title": "Get an administrator token", - "context": "chat/platform-api", - "template": "api", - "contentFile": "content/docs/chat/platform-api/auth/tokens/get-admin-token.mdx" + "sourcePath": "/sdk/wasm/file-uploads/upload-file", + "openimPath": "/sdk/wasm/file-uploads/upload-file", + "title": "Upload a file", + "context": "chat/sdk/wasm", + "template": "guide", + "contentFile": "content/docs/chat/sdk/wasm/file-uploads/upload-file.mdx" }, { - "sourcePath": "/platform-api/auth/tokens/get-user-token", - "openimPath": "/platform-api/auth/tokens/get-user-token", - "title": "Get a user token", - "context": "chat/platform-api", - "template": "api", - "contentFile": "content/docs/chat/platform-api/auth/tokens/get-user-token.mdx" + "sourcePath": "/sdk/wasm/calling/overview-calling", + "openimPath": "/sdk/wasm/calling/overview-calling", + "title": "Calling overview", + "context": "chat/sdk/wasm", + "template": "guide", + "contentFile": "content/docs/chat/sdk/wasm/calling/overview-calling.mdx" }, { - "sourcePath": "/platform-api/auth/sessions/force-logout", - "openimPath": "/platform-api/auth/sessions/force-logout", - "title": "Force logout", - "context": "chat/platform-api", - "template": "api", - "contentFile": "content/docs/chat/platform-api/auth/sessions/force-logout.mdx" + "sourcePath": "/sdk/wasm/calling/managing-calls/start-single-call", + "openimPath": "/sdk/wasm/calling/managing-calls/start-single-call", + "title": "Start a one-to-one call", + "context": "chat/sdk/wasm", + "template": "guide", + "contentFile": "content/docs/chat/sdk/wasm/calling/managing-calls/start-single-call.mdx" }, { - "sourcePath": "/platform-api/message/overview", - "openimPath": "/platform-api/message/overview", - "title": "Overview", - "context": "chat/platform-api", - "template": "overview", - "contentFile": "content/docs/chat/platform-api/message/overview.mdx" + "sourcePath": "/sdk/wasm/calling/managing-calls/start-group-call", + "openimPath": "/sdk/wasm/calling/managing-calls/start-group-call", + "title": "Start a group call", + "context": "chat/sdk/wasm", + "template": "guide", + "contentFile": "content/docs/chat/sdk/wasm/calling/managing-calls/start-group-call.mdx" }, { - "sourcePath": "/platform-api/message/message-content-types", - "openimPath": "/platform-api/message/message-content-types", - "title": "Message content types", - "context": "chat/platform-api", + "sourcePath": "/sdk/wasm/calling/managing-calls/accept-call", + "openimPath": "/sdk/wasm/calling/managing-calls/accept-call", + "title": "Accept a call", + "context": "chat/sdk/wasm", "template": "guide", - "contentFile": "content/docs/chat/platform-api/message/message-content-types.mdx" + "contentFile": "content/docs/chat/sdk/wasm/calling/managing-calls/accept-call.mdx" }, { - "sourcePath": "/platform-api/message/sending-messages/send-msg", - "openimPath": "/platform-api/message/sending-messages/send-msg", - "title": "Send a message", - "context": "chat/platform-api", - "template": "api", - "contentFile": "content/docs/chat/platform-api/message/sending-messages/send-msg.mdx" + "sourcePath": "/sdk/wasm/calling/managing-calls/reject-call", + "openimPath": "/sdk/wasm/calling/managing-calls/reject-call", + "title": "Reject a call", + "context": "chat/sdk/wasm", + "template": "guide", + "contentFile": "content/docs/chat/sdk/wasm/calling/managing-calls/reject-call.mdx" }, { - "sourcePath": "/platform-api/message/sending-messages/batch-send-msg", - "openimPath": "/platform-api/message/sending-messages/batch-send-msg", - "title": "Batch send messages", - "context": "chat/platform-api", - "template": "api", - "contentFile": "content/docs/chat/platform-api/message/sending-messages/batch-send-msg.mdx" + "sourcePath": "/sdk/wasm/calling/managing-calls/cancel-call", + "openimPath": "/sdk/wasm/calling/managing-calls/cancel-call", + "title": "Cancel a call invitation", + "context": "chat/sdk/wasm", + "template": "guide", + "contentFile": "content/docs/chat/sdk/wasm/calling/managing-calls/cancel-call.mdx" }, { - "sourcePath": "/platform-api/message/sending-messages/send-business-notification", - "openimPath": "/platform-api/message/sending-messages/send-business-notification", - "title": "Send a business notification", - "context": "chat/platform-api", - "template": "api", - "contentFile": "content/docs/chat/platform-api/message/sending-messages/send-business-notification.mdx" + "sourcePath": "/sdk/wasm/calling/managing-calls/hang-up-call", + "openimPath": "/sdk/wasm/calling/managing-calls/hang-up-call", + "title": "Hang up a call", + "context": "chat/sdk/wasm", + "template": "guide", + "contentFile": "content/docs/chat/sdk/wasm/calling/managing-calls/hang-up-call.mdx" }, { - "sourcePath": "/platform-api/message/managing-messages/revoke-msg", - "openimPath": "/platform-api/message/managing-messages/revoke-msg", - "title": "Revoke a message", - "context": "chat/platform-api", - "template": "api", - "contentFile": "content/docs/chat/platform-api/message/managing-messages/revoke-msg.mdx" + "sourcePath": "/sdk/wasm/calling/managing-calls/handle-call-events", + "openimPath": "/sdk/wasm/calling/managing-calls/handle-call-events", + "title": "Handle call events", + "context": "chat/sdk/wasm", + "template": "guide", + "contentFile": "content/docs/chat/sdk/wasm/calling/managing-calls/handle-call-events.mdx" }, { - "sourcePath": "/platform-api/message/retrieving-messages/get-server-time", - "openimPath": "/platform-api/message/retrieving-messages/get-server-time", - "title": "Get server time", - "context": "chat/platform-api", - "template": "api", - "contentFile": "content/docs/chat/platform-api/message/retrieving-messages/get-server-time.mdx" + "sourcePath": "/sdk/wasm/calling/retrieving-call-information/restore-pending-invitation", + "openimPath": "/sdk/wasm/calling/retrieving-call-information/restore-pending-invitation", + "title": "Restore a pending invitation", + "context": "chat/sdk/wasm", + "template": "guide", + "contentFile": "content/docs/chat/sdk/wasm/calling/retrieving-call-information/restore-pending-invitation.mdx" }, { - "sourcePath": "/platform-api/conversation/overview", - "openimPath": "/platform-api/conversation/overview", - "title": "Overview", - "context": "chat/platform-api", - "template": "overview", - "contentFile": "content/docs/chat/platform-api/conversation/overview.mdx" + "sourcePath": "/sdk/wasm/calling/retrieving-call-information/get-room-by-group-id", + "openimPath": "/sdk/wasm/calling/retrieving-call-information/get-room-by-group-id", + "title": "Get a group call room", + "context": "chat/sdk/wasm", + "template": "guide", + "contentFile": "content/docs/chat/sdk/wasm/calling/retrieving-call-information/get-room-by-group-id.mdx" }, { - "sourcePath": "/platform-api/conversation/listing-conversations/get-sorted-conversation-list", - "openimPath": "/platform-api/conversation/listing-conversations/get-sorted-conversation-list", - "title": "Get sorted conversation list", - "context": "chat/platform-api", - "template": "api", - "contentFile": "content/docs/chat/platform-api/conversation/listing-conversations/get-sorted-conversation-list.mdx" + "sourcePath": "/sdk/wasm/calling/retrieving-call-information/get-token-by-room-id", + "openimPath": "/sdk/wasm/calling/retrieving-call-information/get-token-by-room-id", + "title": "Get room credentials", + "context": "chat/sdk/wasm", + "template": "guide", + "contentFile": "content/docs/chat/sdk/wasm/calling/retrieving-call-information/get-token-by-room-id.mdx" }, { - "sourcePath": "/platform-api/conversation/listing-conversations/get-conversation", - "openimPath": "/platform-api/conversation/listing-conversations/get-conversation", - "title": "Get conversation", - "context": "chat/platform-api", - "template": "api", - "contentFile": "content/docs/chat/platform-api/conversation/listing-conversations/get-conversation.mdx" + "sourcePath": "/sdk/wasm/calling/sending-custom-signals/send-a-custom-signal", + "openimPath": "/sdk/wasm/calling/sending-custom-signals/send-a-custom-signal", + "title": "Send a custom signal", + "context": "chat/sdk/wasm", + "template": "guide", + "contentFile": "content/docs/chat/sdk/wasm/calling/sending-custom-signals/send-a-custom-signal.mdx" }, { - "sourcePath": "/platform-api/conversation/listing-conversations/get-conversations", - "openimPath": "/platform-api/conversation/listing-conversations/get-conversations", - "title": "Get conversations", - "context": "chat/platform-api", - "template": "api", - "contentFile": "content/docs/chat/platform-api/conversation/listing-conversations/get-conversations.mdx" + "sourcePath": "/sdk/wasm/events/overview-events", + "openimPath": "/sdk/wasm/events/overview-events", + "title": "Events overview", + "context": "chat/sdk/wasm", + "template": "guide", + "contentFile": "content/docs/chat/sdk/wasm/events/overview-events.mdx" }, { - "sourcePath": "/platform-api/conversation/managing-conversations/set-conversations", - "openimPath": "/platform-api/conversation/managing-conversations/set-conversations", - "title": "Set conversations", - "context": "chat/platform-api", - "template": "api", - "contentFile": "content/docs/chat/platform-api/conversation/managing-conversations/set-conversations.mdx" + "sourcePath": "/sdk/wasm/logger", + "openimPath": "/sdk/wasm/logger", + "title": "Logger", + "context": "chat/sdk/wasm", + "template": "guide", + "contentFile": "content/docs/chat/sdk/wasm/logger.mdx" }, { - "sourcePath": "/platform-api/conversation/listing-conversations/get-owner-conversation", - "openimPath": "/platform-api/conversation/listing-conversations/get-owner-conversation", - "title": "Get owner conversation", - "context": "chat/platform-api", - "template": "api", - "contentFile": "content/docs/chat/platform-api/conversation/listing-conversations/get-owner-conversation.mdx" + "sourcePath": "/sdk/electron/overview", + "openimPath": "/sdk/electron/overview", + "title": "OpenIM SDK for Electron", + "context": "chat/sdk/electron", + "template": "overview", + "contentFile": "content/docs/chat/sdk/electron/overview.mdx" }, { - "sourcePath": "/platform-api/migration-to-openim", - "openimPath": "/platform-api/migration-to-openim", - "title": "Migrate to OpenIM", - "context": "chat/platform-api", + "sourcePath": "/sdk/miniprogram/overview", + "openimPath": "/sdk/miniprogram/overview", + "title": "OpenIM SDK for Mini Program", + "context": "chat/sdk/miniprogram", + "template": "overview", + "contentFile": "content/docs/chat/sdk/miniprogram/overview.mdx" + }, + { + "sourcePath": "/sdk/react-native/overview", + "openimPath": "/sdk/react-native/overview", + "title": "OpenIM SDK for React Native", + "context": "chat/sdk/react-native", "template": "overview", - "contentFile": "content/docs/chat/platform-api/migration-to-openim.mdx" + "contentFile": "content/docs/chat/sdk/react-native/overview.mdx" }, { - "sourcePath": "/platform-api/logs/overview", - "openimPath": "/platform-api/logs/overview", - "title": "Overview", - "context": "chat/platform-api", - "template": "overview", - "contentFile": "content/docs/chat/platform-api/logs/overview.mdx" + "sourcePath": "/sdk/electron/getting-started/authenticate-and-init", + "openimPath": "/sdk/electron/getting-started/authenticate-and-init", + "title": "Authenticate and init", + "context": "chat/sdk/electron", + "template": "guide", + "contentFile": "content/docs/chat/sdk/electron/getting-started/authenticate-and-init.mdx" }, { - "sourcePath": "/platform-api/logs/upload-logs", - "openimPath": "/platform-api/logs/upload-logs", - "title": "Upload log records", - "context": "chat/platform-api", - "template": "api", - "contentFile": "content/docs/chat/platform-api/logs/upload-logs.mdx" + "sourcePath": "/sdk/electron/message/create-media-from-full-path", + "openimPath": "/sdk/electron/message/create-media-from-full-path", + "title": "Create media from full path", + "context": "chat/sdk/electron", + "template": "guide", + "contentFile": "content/docs/chat/sdk/electron/message/create-media-from-full-path.mdx" }, { - "sourcePath": "/platform-api/logs/search-logs", - "openimPath": "/platform-api/logs/search-logs", - "title": "Search log records", - "context": "chat/platform-api", - "template": "api", - "contentFile": "content/docs/chat/platform-api/logs/search-logs.mdx" + "sourcePath": "/sdk/electron/logger/upload-logs", + "openimPath": "/sdk/electron/logger/upload-logs", + "title": "Upload logs", + "context": "chat/sdk/electron", + "template": "guide", + "contentFile": "content/docs/chat/sdk/electron/logger/upload-logs.mdx" }, { - "sourcePath": "/platform-api/logs/delete-logs", - "openimPath": "/platform-api/logs/delete-logs", - "title": "Delete log records", + "sourcePath": "/platform-api/webhooks/overview", + "openimPath": "/platform-api/webhooks/overview", "context": "chat/platform-api", - "template": "api", - "contentFile": "content/docs/chat/platform-api/logs/delete-logs.mdx" + "template": "overview", + "title": "Overview", + "contentFile": "content/docs/chat/platform-api/webhooks/overview.mdx" }, { - "sourcePath": "/platform-api/message/managing-messages/modify-message", - "openimPath": "/platform-api/message/managing-messages/modify-message", + "sourcePath": "/platform-api/webhooks/user/before-user-register", + "openimPath": "/platform-api/webhooks/user/before-user-register", "context": "chat/platform-api", "template": "api", - "title": "Modify a message", - "contentFile": "content/docs/chat/platform-api/message/managing-messages/modify-message.mdx" + "title": "Before user registration", + "contentFile": "content/docs/chat/platform-api/webhooks/user/before-user-register.mdx" }, { - "sourcePath": "/platform-api/user/account-governance/ban-user", - "openimPath": "/platform-api/user/account-governance/ban-user", + "sourcePath": "/platform-api/webhooks/user/after-user-register", + "openimPath": "/platform-api/webhooks/user/after-user-register", "context": "chat/platform-api", "template": "api", - "title": "Ban users", - "contentFile": "content/docs/chat/platform-api/user/account-governance/ban-user.mdx" + "title": "After user registration", + "contentFile": "content/docs/chat/platform-api/webhooks/user/after-user-register.mdx" }, { - "sourcePath": "/platform-api/user/account-governance/list-disabled-users", - "openimPath": "/platform-api/user/account-governance/list-disabled-users", + "sourcePath": "/platform-api/webhooks/user/before-update-user-info", + "openimPath": "/platform-api/webhooks/user/before-update-user-info", "context": "chat/platform-api", "template": "api", - "title": "List disabled users", - "contentFile": "content/docs/chat/platform-api/user/account-governance/list-disabled-users.mdx" + "title": "Before updating user information", + "contentFile": "content/docs/chat/platform-api/webhooks/user/before-update-user-info.mdx" }, { - "sourcePath": "/platform-api/user/account-governance/unban-user", - "openimPath": "/platform-api/user/account-governance/unban-user", + "sourcePath": "/platform-api/webhooks/user/after-update-user-info", + "openimPath": "/platform-api/webhooks/user/after-update-user-info", "context": "chat/platform-api", "template": "api", - "title": "Unban users", - "contentFile": "content/docs/chat/platform-api/user/account-governance/unban-user.mdx" + "title": "After updating user information", + "contentFile": "content/docs/chat/platform-api/webhooks/user/after-update-user-info.mdx" }, { - "sourcePath": "/platform-api/user/account-governance/unregister-user", - "openimPath": "/platform-api/user/account-governance/unregister-user", + "sourcePath": "/platform-api/webhooks/user/before-update-user-info-ex", + "openimPath": "/platform-api/webhooks/user/before-update-user-info-ex", "context": "chat/platform-api", "template": "api", - "title": "Unregister users", - "contentFile": "content/docs/chat/platform-api/user/account-governance/unregister-user.mdx" + "title": "Before updating selected user fields", + "contentFile": "content/docs/chat/platform-api/webhooks/user/before-update-user-info-ex.mdx" }, { - "sourcePath": "/platform-api/relation/managing-friend-requests/delete-received-friend-requests", - "openimPath": "/platform-api/relation/managing-friend-requests/delete-received-friend-requests", + "sourcePath": "/platform-api/webhooks/user/after-update-user-info-ex", + "openimPath": "/platform-api/webhooks/user/after-update-user-info-ex", "context": "chat/platform-api", "template": "api", - "title": "Delete received friend requests", - "contentFile": "content/docs/chat/platform-api/relation/managing-friend-requests/delete-received-friend-requests.mdx" + "title": "After updating selected user fields", + "contentFile": "content/docs/chat/platform-api/webhooks/user/after-update-user-info-ex.mdx" }, { - "sourcePath": "/platform-api/relation/managing-friend-requests/delete-sent-friend-requests", - "openimPath": "/platform-api/relation/managing-friend-requests/delete-sent-friend-requests", + "sourcePath": "/platform-api/webhooks/relation/before-add-friend", + "openimPath": "/platform-api/webhooks/relation/before-add-friend", "context": "chat/platform-api", "template": "api", - "title": "Delete sent friend requests", - "contentFile": "content/docs/chat/platform-api/relation/managing-friend-requests/delete-sent-friend-requests.mdx" + "title": "Before adding a friend", + "contentFile": "content/docs/chat/platform-api/webhooks/relation/before-add-friend.mdx" }, { - "sourcePath": "/platform-api/group/group-applications/clear-group-application-badge-count", - "openimPath": "/platform-api/group/group-applications/clear-group-application-badge-count", + "sourcePath": "/platform-api/webhooks/relation/after-add-friend", + "openimPath": "/platform-api/webhooks/relation/after-add-friend", "context": "chat/platform-api", "template": "api", - "title": "Clear the group application badge count", - "contentFile": "content/docs/chat/platform-api/group/group-applications/clear-group-application-badge-count.mdx" + "title": "After adding a friend", + "contentFile": "content/docs/chat/platform-api/webhooks/relation/after-add-friend.mdx" }, { - "sourcePath": "/platform-api/group/group-applications/delete-group-received-requests", - "openimPath": "/platform-api/group/group-applications/delete-group-received-requests", + "sourcePath": "/platform-api/webhooks/relation/before-add-friend-agree", + "openimPath": "/platform-api/webhooks/relation/before-add-friend-agree", "context": "chat/platform-api", "template": "api", - "title": "Delete applications received by a group", - "contentFile": "content/docs/chat/platform-api/group/group-applications/delete-group-received-requests.mdx" + "title": "Before accepting a friend request", + "contentFile": "content/docs/chat/platform-api/webhooks/relation/before-add-friend-agree.mdx" }, { - "sourcePath": "/platform-api/group/group-applications/delete-user-group-requests", - "openimPath": "/platform-api/group/group-applications/delete-user-group-requests", + "sourcePath": "/platform-api/webhooks/relation/after-add-friend-agree", + "openimPath": "/platform-api/webhooks/relation/after-add-friend-agree", "context": "chat/platform-api", "template": "api", - "title": "Delete applications sent by a user", - "contentFile": "content/docs/chat/platform-api/group/group-applications/delete-user-group-requests.mdx" + "title": "After accepting a friend request", + "contentFile": "content/docs/chat/platform-api/webhooks/relation/after-add-friend-agree.mdx" }, { - "sourcePath": "/platform-api/group/group-applications/get-group-application-badge-count", - "openimPath": "/platform-api/group/group-applications/get-group-application-badge-count", + "sourcePath": "/platform-api/webhooks/relation/after-delete-friend", + "openimPath": "/platform-api/webhooks/relation/after-delete-friend", "context": "chat/platform-api", "template": "api", - "title": "Get the group application badge count", - "contentFile": "content/docs/chat/platform-api/group/group-applications/get-group-application-badge-count.mdx" + "title": "After deleting a friend", + "contentFile": "content/docs/chat/platform-api/webhooks/relation/after-delete-friend.mdx" }, { - "sourcePath": "/platform-api/conversation/conversation-groups/add-conversations-to-groups", - "openimPath": "/platform-api/conversation/conversation-groups/add-conversations-to-groups", + "sourcePath": "/platform-api/webhooks/relation/before-set-friend-remark", + "openimPath": "/platform-api/webhooks/relation/before-set-friend-remark", "context": "chat/platform-api", "template": "api", - "title": "Add conversations to groups", - "contentFile": "content/docs/chat/platform-api/conversation/conversation-groups/add-conversations-to-groups.mdx" + "title": "Before setting a friend remark", + "contentFile": "content/docs/chat/platform-api/webhooks/relation/before-set-friend-remark.mdx" }, { - "sourcePath": "/platform-api/conversation/conversation-groups/create-conversation-group", - "openimPath": "/platform-api/conversation/conversation-groups/create-conversation-group", + "sourcePath": "/platform-api/webhooks/relation/after-set-friend-remark", + "openimPath": "/platform-api/webhooks/relation/after-set-friend-remark", "context": "chat/platform-api", "template": "api", - "title": "Create a conversation group", - "contentFile": "content/docs/chat/platform-api/conversation/conversation-groups/create-conversation-group.mdx" + "title": "After setting a friend remark", + "contentFile": "content/docs/chat/platform-api/webhooks/relation/after-set-friend-remark.mdx" }, { - "sourcePath": "/platform-api/conversation/conversation-groups/delete-conversation-group", - "openimPath": "/platform-api/conversation/conversation-groups/delete-conversation-group", + "sourcePath": "/platform-api/webhooks/relation/before-add-black", + "openimPath": "/platform-api/webhooks/relation/before-add-black", "context": "chat/platform-api", "template": "api", - "title": "Delete a conversation group", - "contentFile": "content/docs/chat/platform-api/conversation/conversation-groups/delete-conversation-group.mdx" + "title": "Before adding to the blacklist", + "contentFile": "content/docs/chat/platform-api/webhooks/relation/before-add-black.mdx" }, { - "sourcePath": "/platform-api/conversation/conversation-groups/list-conversation-groups", - "openimPath": "/platform-api/conversation/conversation-groups/list-conversation-groups", + "sourcePath": "/platform-api/webhooks/relation/after-remove-black", + "openimPath": "/platform-api/webhooks/relation/after-remove-black", "context": "chat/platform-api", "template": "api", - "title": "List conversation groups", - "contentFile": "content/docs/chat/platform-api/conversation/conversation-groups/list-conversation-groups.mdx" + "title": "After removing from the blacklist", + "contentFile": "content/docs/chat/platform-api/webhooks/relation/after-remove-black.mdx" }, { - "sourcePath": "/platform-api/conversation/conversation-groups/remove-conversations-from-groups", - "openimPath": "/platform-api/conversation/conversation-groups/remove-conversations-from-groups", + "sourcePath": "/platform-api/webhooks/relation/before-import-friends", + "openimPath": "/platform-api/webhooks/relation/before-import-friends", "context": "chat/platform-api", "template": "api", - "title": "Remove conversations from groups", - "contentFile": "content/docs/chat/platform-api/conversation/conversation-groups/remove-conversations-from-groups.mdx" + "title": "Before importing friends", + "contentFile": "content/docs/chat/platform-api/webhooks/relation/before-import-friends.mdx" }, { - "sourcePath": "/platform-api/conversation/conversation-groups/set-conversation-group-order", - "openimPath": "/platform-api/conversation/conversation-groups/set-conversation-group-order", + "sourcePath": "/platform-api/webhooks/relation/after-import-friends", + "openimPath": "/platform-api/webhooks/relation/after-import-friends", "context": "chat/platform-api", "template": "api", - "title": "Set conversation group order", - "contentFile": "content/docs/chat/platform-api/conversation/conversation-groups/set-conversation-group-order.mdx" + "title": "After importing friends", + "contentFile": "content/docs/chat/platform-api/webhooks/relation/after-import-friends.mdx" }, { - "sourcePath": "/platform-api/conversation/conversation-groups/update-conversation-group", - "openimPath": "/platform-api/conversation/conversation-groups/update-conversation-group", + "sourcePath": "/platform-api/webhooks/group/before-create-group", + "openimPath": "/platform-api/webhooks/group/before-create-group", "context": "chat/platform-api", "template": "api", - "title": "Update a conversation group", - "contentFile": "content/docs/chat/platform-api/conversation/conversation-groups/update-conversation-group.mdx" + "title": "Before creating a group", + "contentFile": "content/docs/chat/platform-api/webhooks/group/before-create-group.mdx" }, { - "sourcePath": "/platform-api/message/content-processing/translate-text", - "openimPath": "/platform-api/message/content-processing/translate-text", + "sourcePath": "/platform-api/webhooks/group/after-create-group", + "openimPath": "/platform-api/webhooks/group/after-create-group", "context": "chat/platform-api", "template": "api", - "title": "Translate text", - "contentFile": "content/docs/chat/platform-api/message/content-processing/translate-text.mdx" + "title": "After creating a group", + "contentFile": "content/docs/chat/platform-api/webhooks/group/after-create-group.mdx" }, { - "sourcePath": "/platform-api/message/read-status/mark-conversation-read", - "openimPath": "/platform-api/message/read-status/mark-conversation-read", + "sourcePath": "/platform-api/webhooks/group/before-member-join-group", + "openimPath": "/platform-api/webhooks/group/before-member-join-group", "context": "chat/platform-api", "template": "api", - "title": "Mark a conversation read through a Seq", - "contentFile": "content/docs/chat/platform-api/message/read-status/mark-conversation-read.mdx" + "title": "Before members join a group", + "contentFile": "content/docs/chat/platform-api/webhooks/group/before-member-join-group.mdx" }, { - "sourcePath": "/platform-api/message/streaming-messages/append-stream-message", - "openimPath": "/platform-api/message/streaming-messages/append-stream-message", + "sourcePath": "/platform-api/webhooks/group/before-invite-user-to-group", + "openimPath": "/platform-api/webhooks/group/before-invite-user-to-group", "context": "chat/platform-api", "template": "api", - "title": "Append stream-message packets", - "contentFile": "content/docs/chat/platform-api/message/streaming-messages/append-stream-message.mdx" + "title": "Before inviting users to a group", + "contentFile": "content/docs/chat/platform-api/webhooks/group/before-invite-user-to-group.mdx" }, { - "sourcePath": "/platform-api/message/streaming-messages/put-stream-message", - "openimPath": "/platform-api/message/streaming-messages/put-stream-message", + "sourcePath": "/platform-api/webhooks/group/before-apply-join-group", + "openimPath": "/platform-api/webhooks/group/before-apply-join-group", "context": "chat/platform-api", "template": "api", - "title": "Upload stream-message content", - "contentFile": "content/docs/chat/platform-api/message/streaming-messages/put-stream-message.mdx" + "title": "Before applying to join a group", + "contentFile": "content/docs/chat/platform-api/webhooks/group/before-apply-join-group.mdx" }, { - "sourcePath": "/platform-api/message/unread-count/clear-conversations-unread-count", - "openimPath": "/platform-api/message/unread-count/clear-conversations-unread-count", + "sourcePath": "/platform-api/webhooks/group/after-join-group", + "openimPath": "/platform-api/webhooks/group/after-join-group", "context": "chat/platform-api", "template": "api", - "title": "Clear conversation unread counts", - "contentFile": "content/docs/chat/platform-api/message/unread-count/clear-conversations-unread-count.mdx" + "title": "After joining a group", + "contentFile": "content/docs/chat/platform-api/webhooks/group/after-join-group.mdx" }, { - "sourcePath": "/platform-api/message/unread-count/get-conversations-unread-count", - "openimPath": "/platform-api/message/unread-count/get-conversations-unread-count", + "sourcePath": "/platform-api/webhooks/group/after-quit-group", + "openimPath": "/platform-api/webhooks/group/after-quit-group", "context": "chat/platform-api", "template": "api", - "title": "Get conversation unread counts", - "contentFile": "content/docs/chat/platform-api/message/unread-count/get-conversations-unread-count.mdx" + "title": "After leaving a group", + "contentFile": "content/docs/chat/platform-api/webhooks/group/after-quit-group.mdx" }, { - "sourcePath": "/platform-api/message/unread-count/reset-conversation-unread", - "openimPath": "/platform-api/message/unread-count/reset-conversation-unread", + "sourcePath": "/platform-api/webhooks/group/after-kick-group-member", + "openimPath": "/platform-api/webhooks/group/after-kick-group-member", "context": "chat/platform-api", "template": "api", - "title": "Set a conversation unread count", - "contentFile": "content/docs/chat/platform-api/message/unread-count/reset-conversation-unread.mdx" - }, - { - "sourcePath": "/platform-api/timer/overview", - "openimPath": "/platform-api/timer/overview", - "context": "chat/platform-api", - "template": "overview", - "title": "Overview", - "contentFile": "content/docs/chat/platform-api/timer/overview.mdx" + "title": "After removing group members", + "contentFile": "content/docs/chat/platform-api/webhooks/group/after-kick-group-member.mdx" }, { - "sourcePath": "/platform-api/timer/managing-tasks/create-timer-task", - "openimPath": "/platform-api/timer/managing-tasks/create-timer-task", + "sourcePath": "/platform-api/webhooks/group/after-dismiss-group", + "openimPath": "/platform-api/webhooks/group/after-dismiss-group", "context": "chat/platform-api", "template": "api", - "title": "Create a timer task", - "contentFile": "content/docs/chat/platform-api/timer/managing-tasks/create-timer-task.mdx" + "title": "After dismissing a group", + "contentFile": "content/docs/chat/platform-api/webhooks/group/after-dismiss-group.mdx" }, { - "sourcePath": "/platform-api/timer/managing-tasks/delete-timer-task", - "openimPath": "/platform-api/timer/managing-tasks/delete-timer-task", + "sourcePath": "/platform-api/webhooks/group/after-transfer-group-owner", + "openimPath": "/platform-api/webhooks/group/after-transfer-group-owner", "context": "chat/platform-api", "template": "api", - "title": "Delete a timer task", - "contentFile": "content/docs/chat/platform-api/timer/managing-tasks/delete-timer-task.mdx" + "title": "After transferring group ownership", + "contentFile": "content/docs/chat/platform-api/webhooks/group/after-transfer-group-owner.mdx" }, { - "sourcePath": "/platform-api/timer/managing-tasks/get-timer-task", - "openimPath": "/platform-api/timer/managing-tasks/get-timer-task", + "sourcePath": "/platform-api/webhooks/group/before-set-group-member-info", + "openimPath": "/platform-api/webhooks/group/before-set-group-member-info", "context": "chat/platform-api", "template": "api", - "title": "Get a timer task", - "contentFile": "content/docs/chat/platform-api/timer/managing-tasks/get-timer-task.mdx" + "title": "Before updating group member information", + "contentFile": "content/docs/chat/platform-api/webhooks/group/before-set-group-member-info.mdx" }, { - "sourcePath": "/platform-api/timer/managing-tasks/list-timer-tasks", - "openimPath": "/platform-api/timer/managing-tasks/list-timer-tasks", + "sourcePath": "/platform-api/webhooks/group/after-set-group-member-info", + "openimPath": "/platform-api/webhooks/group/after-set-group-member-info", "context": "chat/platform-api", "template": "api", - "title": "List timer tasks", - "contentFile": "content/docs/chat/platform-api/timer/managing-tasks/list-timer-tasks.mdx" + "title": "After updating group member information", + "contentFile": "content/docs/chat/platform-api/webhooks/group/after-set-group-member-info.mdx" }, { - "sourcePath": "/platform-api/timer/managing-tasks/update-timer-task", - "openimPath": "/platform-api/timer/managing-tasks/update-timer-task", + "sourcePath": "/platform-api/webhooks/group/before-set-group-info", + "openimPath": "/platform-api/webhooks/group/before-set-group-info", "context": "chat/platform-api", "template": "api", - "title": "Update a timer task", - "contentFile": "content/docs/chat/platform-api/timer/managing-tasks/update-timer-task.mdx" + "title": "Before updating group information", + "contentFile": "content/docs/chat/platform-api/webhooks/group/before-set-group-info.mdx" }, { - "sourcePath": "/platform-api/meeting/meeting-chat/pull-meeting-chat", - "openimPath": "/platform-api/meeting/meeting-chat/pull-meeting-chat", + "sourcePath": "/platform-api/webhooks/group/after-set-group-info", + "openimPath": "/platform-api/webhooks/group/after-set-group-info", "context": "chat/platform-api", "template": "api", - "title": "Pull meeting chat messages", - "contentFile": "content/docs/chat/platform-api/meeting/meeting-chat/pull-meeting-chat.mdx" + "title": "After updating group information", + "contentFile": "content/docs/chat/platform-api/webhooks/group/after-set-group-info.mdx" }, { - "sourcePath": "/platform-api/meeting/meeting-chat/revoke-meeting-chat", - "openimPath": "/platform-api/meeting/meeting-chat/revoke-meeting-chat", + "sourcePath": "/platform-api/webhooks/group/before-set-group-info-ex", + "openimPath": "/platform-api/webhooks/group/before-set-group-info-ex", "context": "chat/platform-api", "template": "api", - "title": "Revoke a meeting chat message", - "contentFile": "content/docs/chat/platform-api/meeting/meeting-chat/revoke-meeting-chat.mdx" + "title": "Before updating selected group fields", + "contentFile": "content/docs/chat/platform-api/webhooks/group/before-set-group-info-ex.mdx" }, { - "sourcePath": "/platform-api/meeting/meeting-chat/send-meeting-chat", - "openimPath": "/platform-api/meeting/meeting-chat/send-meeting-chat", + "sourcePath": "/platform-api/webhooks/group/after-set-group-info-ex", + "openimPath": "/platform-api/webhooks/group/after-set-group-info-ex", "context": "chat/platform-api", "template": "api", - "title": "Send a meeting chat message", - "contentFile": "content/docs/chat/platform-api/meeting/meeting-chat/send-meeting-chat.mdx" + "title": "After updating selected group fields", + "contentFile": "content/docs/chat/platform-api/webhooks/group/after-set-group-info-ex.mdx" }, { - "sourcePath": "/platform-api/meeting/meeting-management/book-meeting", - "openimPath": "/platform-api/meeting/meeting-management/book-meeting", + "sourcePath": "/platform-api/webhooks/message/before-send-single-message", + "openimPath": "/platform-api/webhooks/message/before-send-single-message", "context": "chat/platform-api", "template": "api", - "title": "Schedule a meeting", - "contentFile": "content/docs/chat/platform-api/meeting/meeting-management/book-meeting.mdx" + "title": "Before sending a one-to-one message", + "contentFile": "content/docs/chat/platform-api/webhooks/message/before-send-single-message.mdx" }, { - "sourcePath": "/platform-api/meeting/meeting-management/create-immediate-meeting", - "openimPath": "/platform-api/meeting/meeting-management/create-immediate-meeting", + "sourcePath": "/platform-api/webhooks/message/after-send-single-message", + "openimPath": "/platform-api/webhooks/message/after-send-single-message", "context": "chat/platform-api", "template": "api", - "title": "Create an immediate meeting", - "contentFile": "content/docs/chat/platform-api/meeting/meeting-management/create-immediate-meeting.mdx" + "title": "After sending a one-to-one message", + "contentFile": "content/docs/chat/platform-api/webhooks/message/after-send-single-message.mdx" }, { - "sourcePath": "/platform-api/meeting/meeting-management/end-meeting", - "openimPath": "/platform-api/meeting/meeting-management/end-meeting", + "sourcePath": "/platform-api/webhooks/message/before-send-group-message", + "openimPath": "/platform-api/webhooks/message/before-send-group-message", "context": "chat/platform-api", "template": "api", - "title": "End or cancel a meeting", - "contentFile": "content/docs/chat/platform-api/meeting/meeting-management/end-meeting.mdx" + "title": "Before sending a group message", + "contentFile": "content/docs/chat/platform-api/webhooks/message/before-send-group-message.mdx" }, { - "sourcePath": "/platform-api/meeting/meeting-management/get-meeting-token", - "openimPath": "/platform-api/meeting/meeting-management/get-meeting-token", + "sourcePath": "/platform-api/webhooks/message/after-send-group-message", + "openimPath": "/platform-api/webhooks/message/after-send-group-message", "context": "chat/platform-api", "template": "api", - "title": "Get a meeting token", - "contentFile": "content/docs/chat/platform-api/meeting/meeting-management/get-meeting-token.mdx" + "title": "After sending a group message", + "contentFile": "content/docs/chat/platform-api/webhooks/message/after-send-group-message.mdx" }, { - "sourcePath": "/platform-api/meeting/meeting-management/get-meeting", - "openimPath": "/platform-api/meeting/meeting-management/get-meeting", + "sourcePath": "/platform-api/webhooks/message/before-message-modify", + "openimPath": "/platform-api/webhooks/message/before-message-modify", "context": "chat/platform-api", "template": "api", - "title": "Get a meeting", - "contentFile": "content/docs/chat/platform-api/meeting/meeting-management/get-meeting.mdx" + "title": "Before writing a message", + "contentFile": "content/docs/chat/platform-api/webhooks/message/before-message-modify.mdx" }, { - "sourcePath": "/platform-api/meeting/meeting-management/get-user-related-meetings", - "openimPath": "/platform-api/meeting/meeting-management/get-user-related-meetings", + "sourcePath": "/platform-api/webhooks/message/after-single-message-read", + "openimPath": "/platform-api/webhooks/message/after-single-message-read", "context": "chat/platform-api", "template": "api", - "title": "Get user-related meetings", - "contentFile": "content/docs/chat/platform-api/meeting/meeting-management/get-user-related-meetings.mdx" + "title": "After one-to-one messages are read", + "contentFile": "content/docs/chat/platform-api/webhooks/message/after-single-message-read.mdx" }, { - "sourcePath": "/platform-api/meeting/meeting-management/invite-meeting-users", - "openimPath": "/platform-api/meeting/meeting-management/invite-meeting-users", + "sourcePath": "/platform-api/webhooks/message/after-group-message-read", + "openimPath": "/platform-api/webhooks/message/after-group-message-read", "context": "chat/platform-api", "template": "api", - "title": "Invite users to a meeting", - "contentFile": "content/docs/chat/platform-api/meeting/meeting-management/invite-meeting-users.mdx" + "title": "After group messages are read", + "contentFile": "content/docs/chat/platform-api/webhooks/message/after-group-message-read.mdx" }, { - "sourcePath": "/platform-api/meeting/meeting-management/join-meeting", - "openimPath": "/platform-api/meeting/meeting-management/join-meeting", + "sourcePath": "/platform-api/webhooks/message/after-revoke-message", + "openimPath": "/platform-api/webhooks/message/after-revoke-message", "context": "chat/platform-api", "template": "api", - "title": "Join a meeting", - "contentFile": "content/docs/chat/platform-api/meeting/meeting-management/join-meeting.mdx" + "title": "After revoking a message", + "contentFile": "content/docs/chat/platform-api/webhooks/message/after-revoke-message.mdx" }, { - "sourcePath": "/platform-api/meeting/meeting-management/leave-meeting", - "openimPath": "/platform-api/meeting/meeting-management/leave-meeting", + "sourcePath": "/platform-api/webhooks/push/before-online-push", + "openimPath": "/platform-api/webhooks/push/before-online-push", "context": "chat/platform-api", "template": "api", - "title": "Leave a meeting", - "contentFile": "content/docs/chat/platform-api/meeting/meeting-management/leave-meeting.mdx" + "title": "Before one-to-one online push", + "contentFile": "content/docs/chat/platform-api/webhooks/push/before-online-push.mdx" }, { - "sourcePath": "/platform-api/meeting/meeting-management/list-meetings", - "openimPath": "/platform-api/meeting/meeting-management/list-meetings", + "sourcePath": "/platform-api/webhooks/push/before-group-online-push", + "openimPath": "/platform-api/webhooks/push/before-group-online-push", "context": "chat/platform-api", "template": "api", - "title": "List a user's meetings", - "contentFile": "content/docs/chat/platform-api/meeting/meeting-management/list-meetings.mdx" + "title": "Before group online push", + "contentFile": "content/docs/chat/platform-api/webhooks/push/before-group-online-push.mdx" }, { - "sourcePath": "/platform-api/meeting/meeting-management/update-meeting", - "openimPath": "/platform-api/meeting/meeting-management/update-meeting", + "sourcePath": "/platform-api/webhooks/push/before-offline-push", + "openimPath": "/platform-api/webhooks/push/before-offline-push", "context": "chat/platform-api", "template": "api", - "title": "Update a meeting", - "contentFile": "content/docs/chat/platform-api/meeting/meeting-management/update-meeting.mdx" + "title": "Before offline push", + "contentFile": "content/docs/chat/platform-api/webhooks/push/before-offline-push.mdx" }, { - "sourcePath": "/platform-api/meeting/meeting-records/delete-meeting-records", - "openimPath": "/platform-api/meeting/meeting-records/delete-meeting-records", + "sourcePath": "/platform-api/webhooks/push/after-user-online", + "openimPath": "/platform-api/webhooks/push/after-user-online", "context": "chat/platform-api", "template": "api", - "title": "Delete meeting recordings", - "contentFile": "content/docs/chat/platform-api/meeting/meeting-records/delete-meeting-records.mdx" + "title": "After a user comes online", + "contentFile": "content/docs/chat/platform-api/webhooks/push/after-user-online.mdx" }, { - "sourcePath": "/platform-api/meeting/meeting-records/get-meeting-attendance", - "openimPath": "/platform-api/meeting/meeting-records/get-meeting-attendance", + "sourcePath": "/platform-api/webhooks/push/after-user-offline", + "openimPath": "/platform-api/webhooks/push/after-user-offline", "context": "chat/platform-api", "template": "api", - "title": "Get meeting attendance", - "contentFile": "content/docs/chat/platform-api/meeting/meeting-records/get-meeting-attendance.mdx" + "title": "After a user goes offline", + "contentFile": "content/docs/chat/platform-api/webhooks/push/after-user-offline.mdx" }, { - "sourcePath": "/platform-api/meeting/meeting-records/get-meeting-records", - "openimPath": "/platform-api/meeting/meeting-records/get-meeting-records", + "sourcePath": "/platform-api/webhooks/push/after-user-kick-off", + "openimPath": "/platform-api/webhooks/push/after-user-kick-off", "context": "chat/platform-api", "template": "api", - "title": "Get meeting recordings", - "contentFile": "content/docs/chat/platform-api/meeting/meeting-records/get-meeting-records.mdx" + "title": "After a user is forced offline", + "contentFile": "content/docs/chat/platform-api/webhooks/push/after-user-kick-off.mdx" }, { - "sourcePath": "/platform-api/meeting/meeting-records/get-records-by-meeting-ids", - "openimPath": "/platform-api/meeting/meeting-records/get-records-by-meeting-ids", + "sourcePath": "/platform-api/webhooks/conversation/before-create-single-chat-conversations", + "openimPath": "/platform-api/webhooks/conversation/before-create-single-chat-conversations", "context": "chat/platform-api", "template": "api", - "title": "Get recordings by meeting IDs", - "contentFile": "content/docs/chat/platform-api/meeting/meeting-records/get-records-by-meeting-ids.mdx" + "title": "Before creating one-to-one conversations", + "contentFile": "content/docs/chat/platform-api/webhooks/conversation/before-create-single-chat-conversations.mdx" }, { - "sourcePath": "/platform-api/meeting/meeting-records/get-user-hosted-meetings", - "openimPath": "/platform-api/meeting/meeting-records/get-user-hosted-meetings", + "sourcePath": "/platform-api/webhooks/conversation/after-create-single-chat-conversations", + "openimPath": "/platform-api/webhooks/conversation/after-create-single-chat-conversations", "context": "chat/platform-api", "template": "api", - "title": "Get meetings hosted by a user", - "contentFile": "content/docs/chat/platform-api/meeting/meeting-records/get-user-hosted-meetings.mdx" + "title": "After creating one-to-one conversations", + "contentFile": "content/docs/chat/platform-api/webhooks/conversation/after-create-single-chat-conversations.mdx" }, { - "sourcePath": "/platform-api/meeting/meeting-records/get-user-meeting-histories", - "openimPath": "/platform-api/meeting/meeting-records/get-user-meeting-histories", + "sourcePath": "/platform-api/webhooks/conversation/before-create-group-chat-conversations", + "openimPath": "/platform-api/webhooks/conversation/before-create-group-chat-conversations", "context": "chat/platform-api", "template": "api", - "title": "Get a user's meeting history", - "contentFile": "content/docs/chat/platform-api/meeting/meeting-records/get-user-meeting-histories.mdx" + "title": "Before creating group conversations", + "contentFile": "content/docs/chat/platform-api/webhooks/conversation/before-create-group-chat-conversations.mdx" }, { - "sourcePath": "/platform-api/meeting/meeting-settings/clean-previous-meetings", - "openimPath": "/platform-api/meeting/meeting-settings/clean-previous-meetings", + "sourcePath": "/platform-api/webhooks/conversation/after-create-group-chat-conversations", + "openimPath": "/platform-api/webhooks/conversation/after-create-group-chat-conversations", "context": "chat/platform-api", "template": "api", - "title": "Clean previous meeting state", - "contentFile": "content/docs/chat/platform-api/meeting/meeting-settings/clean-previous-meetings.mdx" + "title": "After creating group conversations", + "contentFile": "content/docs/chat/platform-api/webhooks/conversation/after-create-group-chat-conversations.mdx" }, { - "sourcePath": "/platform-api/meeting/meeting-settings/get-personal-setting", - "openimPath": "/platform-api/meeting/meeting-settings/get-personal-setting", + "sourcePath": "/platform-api/timer/overview", + "openimPath": "/platform-api/timer/overview", "context": "chat/platform-api", - "template": "api", - "title": "Get personal meeting preferences", - "contentFile": "content/docs/chat/platform-api/meeting/meeting-settings/get-personal-setting.mdx" + "template": "overview", + "title": "Overview", + "contentFile": "content/docs/chat/platform-api/timer/overview.mdx" }, { - "sourcePath": "/platform-api/meeting/meeting-settings/modify-participant-name", - "openimPath": "/platform-api/meeting/meeting-settings/modify-participant-name", + "sourcePath": "/platform-api/meeting/overview", + "openimPath": "/platform-api/meeting/overview", "context": "chat/platform-api", - "template": "api", - "title": "Modify a participant name", - "contentFile": "content/docs/chat/platform-api/meeting/meeting-settings/modify-participant-name.mdx" + "template": "overview", + "title": "Overview", + "contentFile": "content/docs/chat/platform-api/meeting/overview.mdx" }, { - "sourcePath": "/platform-api/meeting/meeting-settings/operate-all-streams", - "openimPath": "/platform-api/meeting/meeting-settings/operate-all-streams", + "sourcePath": "/platform-api/user/account-governance/ban-user", + "openimPath": "/platform-api/user/account-governance/ban-user", "context": "chat/platform-api", "template": "api", - "title": "Control participant media streams", - "contentFile": "content/docs/chat/platform-api/meeting/meeting-settings/operate-all-streams.mdx" + "title": "Ban users", + "contentFile": "content/docs/chat/platform-api/user/account-governance/ban-user.mdx" }, { - "sourcePath": "/platform-api/meeting/meeting-settings/remove-participants", - "openimPath": "/platform-api/meeting/meeting-settings/remove-participants", + "sourcePath": "/platform-api/user/account-governance/unban-user", + "openimPath": "/platform-api/user/account-governance/unban-user", "context": "chat/platform-api", "template": "api", - "title": "Remove meeting participants", - "contentFile": "content/docs/chat/platform-api/meeting/meeting-settings/remove-participants.mdx" + "title": "Unban users", + "contentFile": "content/docs/chat/platform-api/user/account-governance/unban-user.mdx" }, { - "sourcePath": "/platform-api/meeting/meeting-settings/set-meeting-host", - "openimPath": "/platform-api/meeting/meeting-settings/set-meeting-host", + "sourcePath": "/platform-api/user/account-governance/unregister-user", + "openimPath": "/platform-api/user/account-governance/unregister-user", "context": "chat/platform-api", "template": "api", - "title": "Set meeting hosts", - "contentFile": "content/docs/chat/platform-api/meeting/meeting-settings/set-meeting-host.mdx" + "title": "Unregister users", + "contentFile": "content/docs/chat/platform-api/user/account-governance/unregister-user.mdx" }, { - "sourcePath": "/platform-api/meeting/meeting-settings/set-personal-setting", - "openimPath": "/platform-api/meeting/meeting-settings/set-personal-setting", + "sourcePath": "/platform-api/user/account-governance/list-disabled-users", + "openimPath": "/platform-api/user/account-governance/list-disabled-users", "context": "chat/platform-api", "template": "api", - "title": "Set personal meeting preferences", - "contentFile": "content/docs/chat/platform-api/meeting/meeting-settings/set-personal-setting.mdx" + "title": "List disabled users", + "contentFile": "content/docs/chat/platform-api/user/account-governance/list-disabled-users.mdx" }, { - "sourcePath": "/platform-api/meeting/meeting-signaling/get-room-by-group-id", - "openimPath": "/platform-api/meeting/meeting-signaling/get-room-by-group-id", + "sourcePath": "/platform-api/relation/managing-friend-requests/delete-sent-friend-requests", + "openimPath": "/platform-api/relation/managing-friend-requests/delete-sent-friend-requests", "context": "chat/platform-api", "template": "api", - "title": "Get a call room by group ID", - "contentFile": "content/docs/chat/platform-api/meeting/meeting-signaling/get-room-by-group-id.mdx" + "title": "Delete sent friend requests", + "contentFile": "content/docs/chat/platform-api/relation/managing-friend-requests/delete-sent-friend-requests.mdx" }, { - "sourcePath": "/platform-api/meeting/meeting-signaling/get-signal-invitation", - "openimPath": "/platform-api/meeting/meeting-signaling/get-signal-invitation", + "sourcePath": "/platform-api/relation/managing-friend-requests/delete-received-friend-requests", + "openimPath": "/platform-api/relation/managing-friend-requests/delete-received-friend-requests", "context": "chat/platform-api", "template": "api", - "title": "Get a call invitation", - "contentFile": "content/docs/chat/platform-api/meeting/meeting-signaling/get-signal-invitation.mdx" + "title": "Delete received friend requests", + "contentFile": "content/docs/chat/platform-api/relation/managing-friend-requests/delete-received-friend-requests.mdx" }, { - "sourcePath": "/platform-api/meeting/meeting-signaling/get-signal-rooms", - "openimPath": "/platform-api/meeting/meeting-signaling/get-signal-rooms", + "sourcePath": "/platform-api/group/group-applications/get-group-application-badge-count", + "openimPath": "/platform-api/group/group-applications/get-group-application-badge-count", "context": "chat/platform-api", "template": "api", - "title": "Get call rooms", - "contentFile": "content/docs/chat/platform-api/meeting/meeting-signaling/get-signal-rooms.mdx" + "title": "Get the group application badge count", + "contentFile": "content/docs/chat/platform-api/group/group-applications/get-group-application-badge-count.mdx" }, { - "sourcePath": "/platform-api/meeting/meeting-signaling/get-startup-invitation", - "openimPath": "/platform-api/meeting/meeting-signaling/get-startup-invitation", + "sourcePath": "/platform-api/group/group-applications/clear-group-application-badge-count", + "openimPath": "/platform-api/group/group-applications/clear-group-application-badge-count", "context": "chat/platform-api", "template": "api", - "title": "Get a startup call invitation", - "contentFile": "content/docs/chat/platform-api/meeting/meeting-signaling/get-startup-invitation.mdx" + "title": "Clear the group application badge count", + "contentFile": "content/docs/chat/platform-api/group/group-applications/clear-group-application-badge-count.mdx" }, { - "sourcePath": "/platform-api/meeting/overview", - "openimPath": "/platform-api/meeting/overview", + "sourcePath": "/platform-api/group/group-applications/delete-user-group-requests", + "openimPath": "/platform-api/group/group-applications/delete-user-group-requests", "context": "chat/platform-api", - "template": "overview", - "title": "Overview", - "contentFile": "content/docs/chat/platform-api/meeting/overview.mdx" + "template": "api", + "title": "Delete applications sent by a user", + "contentFile": "content/docs/chat/platform-api/group/group-applications/delete-user-group-requests.mdx" }, { - "sourcePath": "/platform-api/meeting/recurring-meetings/create-repeat-meeting", - "openimPath": "/platform-api/meeting/recurring-meetings/create-repeat-meeting", + "sourcePath": "/platform-api/group/group-applications/delete-group-received-requests", + "openimPath": "/platform-api/group/group-applications/delete-group-received-requests", "context": "chat/platform-api", "template": "api", - "title": "Create a recurring meeting", - "contentFile": "content/docs/chat/platform-api/meeting/recurring-meetings/create-repeat-meeting.mdx" + "title": "Delete applications received by a group", + "contentFile": "content/docs/chat/platform-api/group/group-applications/delete-group-received-requests.mdx" }, { - "sourcePath": "/platform-api/meeting/recurring-meetings/delete-repeat-meeting", - "openimPath": "/platform-api/meeting/recurring-meetings/delete-repeat-meeting", + "sourcePath": "/platform-api/message/content-processing/translate-text", + "openimPath": "/platform-api/message/content-processing/translate-text", "context": "chat/platform-api", "template": "api", - "title": "Delete a recurring meeting", - "contentFile": "content/docs/chat/platform-api/meeting/recurring-meetings/delete-repeat-meeting.mdx" + "title": "Translate text", + "contentFile": "content/docs/chat/platform-api/message/content-processing/translate-text.mdx" }, { - "sourcePath": "/platform-api/meeting/recurring-meetings/get-repeat-meeting", - "openimPath": "/platform-api/meeting/recurring-meetings/get-repeat-meeting", + "sourcePath": "/platform-api/message/streaming-messages/append-stream-message", + "openimPath": "/platform-api/message/streaming-messages/append-stream-message", "context": "chat/platform-api", "template": "api", - "title": "Get a recurring meeting", - "contentFile": "content/docs/chat/platform-api/meeting/recurring-meetings/get-repeat-meeting.mdx" + "title": "Append stream-message packets", + "contentFile": "content/docs/chat/platform-api/message/streaming-messages/append-stream-message.mdx" }, { - "sourcePath": "/platform-api/meeting/recurring-meetings/list-repeat-meeting-instances", - "openimPath": "/platform-api/meeting/recurring-meetings/list-repeat-meeting-instances", + "sourcePath": "/platform-api/message/streaming-messages/put-stream-message", + "openimPath": "/platform-api/message/streaming-messages/put-stream-message", "context": "chat/platform-api", "template": "api", - "title": "List recurring meeting instances", - "contentFile": "content/docs/chat/platform-api/meeting/recurring-meetings/list-repeat-meeting-instances.mdx" + "title": "Upload stream-message content", + "contentFile": "content/docs/chat/platform-api/message/streaming-messages/put-stream-message.mdx" }, { - "sourcePath": "/platform-api/meeting/recurring-meetings/list-repeat-meetings", - "openimPath": "/platform-api/meeting/recurring-meetings/list-repeat-meetings", + "sourcePath": "/platform-api/message/read-status/mark-conversation-read", + "openimPath": "/platform-api/message/read-status/mark-conversation-read", "context": "chat/platform-api", "template": "api", - "title": "List recurring meetings", - "contentFile": "content/docs/chat/platform-api/meeting/recurring-meetings/list-repeat-meetings.mdx" + "title": "Mark a conversation read through a Seq", + "contentFile": "content/docs/chat/platform-api/message/read-status/mark-conversation-read.mdx" }, { - "sourcePath": "/platform-api/meeting/recurring-meetings/update-repeat-meeting", - "openimPath": "/platform-api/meeting/recurring-meetings/update-repeat-meeting", + "sourcePath": "/platform-api/message/managing-messages/modify-message", + "openimPath": "/platform-api/message/managing-messages/modify-message", "context": "chat/platform-api", "template": "api", - "title": "Update a recurring meeting", - "contentFile": "content/docs/chat/platform-api/meeting/recurring-meetings/update-repeat-meeting.mdx" + "title": "Modify a message", + "contentFile": "content/docs/chat/platform-api/message/managing-messages/modify-message.mdx" }, { - "sourcePath": "/platform-api/webhooks/conversation/after-create-group-chat-conversations", - "openimPath": "/platform-api/webhooks/conversation/after-create-group-chat-conversations", + "sourcePath": "/platform-api/message/unread-count/get-conversations-unread-count", + "openimPath": "/platform-api/message/unread-count/get-conversations-unread-count", "context": "chat/platform-api", "template": "api", - "title": "After creating group conversations", - "contentFile": "content/docs/chat/platform-api/webhooks/conversation/after-create-group-chat-conversations.mdx" + "title": "Get conversation unread counts", + "contentFile": "content/docs/chat/platform-api/message/unread-count/get-conversations-unread-count.mdx" }, { - "sourcePath": "/platform-api/webhooks/conversation/after-create-single-chat-conversations", - "openimPath": "/platform-api/webhooks/conversation/after-create-single-chat-conversations", + "sourcePath": "/platform-api/message/unread-count/clear-conversations-unread-count", + "openimPath": "/platform-api/message/unread-count/clear-conversations-unread-count", "context": "chat/platform-api", "template": "api", - "title": "After creating one-to-one conversations", - "contentFile": "content/docs/chat/platform-api/webhooks/conversation/after-create-single-chat-conversations.mdx" + "title": "Clear conversation unread counts", + "contentFile": "content/docs/chat/platform-api/message/unread-count/clear-conversations-unread-count.mdx" }, { - "sourcePath": "/platform-api/webhooks/conversation/before-create-group-chat-conversations", - "openimPath": "/platform-api/webhooks/conversation/before-create-group-chat-conversations", + "sourcePath": "/platform-api/message/unread-count/reset-conversation-unread", + "openimPath": "/platform-api/message/unread-count/reset-conversation-unread", "context": "chat/platform-api", "template": "api", - "title": "Before creating group conversations", - "contentFile": "content/docs/chat/platform-api/webhooks/conversation/before-create-group-chat-conversations.mdx" + "title": "Set a conversation unread count", + "contentFile": "content/docs/chat/platform-api/message/unread-count/reset-conversation-unread.mdx" }, { - "sourcePath": "/platform-api/webhooks/conversation/before-create-single-chat-conversations", - "openimPath": "/platform-api/webhooks/conversation/before-create-single-chat-conversations", + "sourcePath": "/platform-api/conversation/conversation-groups/create-conversation-group", + "openimPath": "/platform-api/conversation/conversation-groups/create-conversation-group", "context": "chat/platform-api", "template": "api", - "title": "Before creating one-to-one conversations", - "contentFile": "content/docs/chat/platform-api/webhooks/conversation/before-create-single-chat-conversations.mdx" + "title": "Create a conversation group", + "contentFile": "content/docs/chat/platform-api/conversation/conversation-groups/create-conversation-group.mdx" }, { - "sourcePath": "/platform-api/webhooks/group/after-create-group", - "openimPath": "/platform-api/webhooks/group/after-create-group", + "sourcePath": "/platform-api/conversation/conversation-groups/update-conversation-group", + "openimPath": "/platform-api/conversation/conversation-groups/update-conversation-group", "context": "chat/platform-api", "template": "api", - "title": "After creating a group", - "contentFile": "content/docs/chat/platform-api/webhooks/group/after-create-group.mdx" + "title": "Update a conversation group", + "contentFile": "content/docs/chat/platform-api/conversation/conversation-groups/update-conversation-group.mdx" }, { - "sourcePath": "/platform-api/webhooks/group/after-dismiss-group", - "openimPath": "/platform-api/webhooks/group/after-dismiss-group", + "sourcePath": "/platform-api/conversation/conversation-groups/delete-conversation-group", + "openimPath": "/platform-api/conversation/conversation-groups/delete-conversation-group", "context": "chat/platform-api", "template": "api", - "title": "After dismissing a group", - "contentFile": "content/docs/chat/platform-api/webhooks/group/after-dismiss-group.mdx" + "title": "Delete a conversation group", + "contentFile": "content/docs/chat/platform-api/conversation/conversation-groups/delete-conversation-group.mdx" }, { - "sourcePath": "/platform-api/webhooks/group/after-join-group", - "openimPath": "/platform-api/webhooks/group/after-join-group", + "sourcePath": "/platform-api/conversation/conversation-groups/list-conversation-groups", + "openimPath": "/platform-api/conversation/conversation-groups/list-conversation-groups", "context": "chat/platform-api", "template": "api", - "title": "After joining a group", - "contentFile": "content/docs/chat/platform-api/webhooks/group/after-join-group.mdx" + "title": "List conversation groups", + "contentFile": "content/docs/chat/platform-api/conversation/conversation-groups/list-conversation-groups.mdx" }, { - "sourcePath": "/platform-api/webhooks/group/after-kick-group-member", - "openimPath": "/platform-api/webhooks/group/after-kick-group-member", + "sourcePath": "/platform-api/conversation/conversation-groups/set-conversation-group-order", + "openimPath": "/platform-api/conversation/conversation-groups/set-conversation-group-order", "context": "chat/platform-api", "template": "api", - "title": "After removing group members", - "contentFile": "content/docs/chat/platform-api/webhooks/group/after-kick-group-member.mdx" + "title": "Set conversation group order", + "contentFile": "content/docs/chat/platform-api/conversation/conversation-groups/set-conversation-group-order.mdx" }, { - "sourcePath": "/platform-api/webhooks/group/after-quit-group", - "openimPath": "/platform-api/webhooks/group/after-quit-group", + "sourcePath": "/platform-api/conversation/conversation-groups/add-conversations-to-groups", + "openimPath": "/platform-api/conversation/conversation-groups/add-conversations-to-groups", "context": "chat/platform-api", "template": "api", - "title": "After leaving a group", - "contentFile": "content/docs/chat/platform-api/webhooks/group/after-quit-group.mdx" + "title": "Add conversations to groups", + "contentFile": "content/docs/chat/platform-api/conversation/conversation-groups/add-conversations-to-groups.mdx" }, { - "sourcePath": "/platform-api/webhooks/group/after-set-group-info", - "openimPath": "/platform-api/webhooks/group/after-set-group-info", + "sourcePath": "/platform-api/conversation/conversation-groups/remove-conversations-from-groups", + "openimPath": "/platform-api/conversation/conversation-groups/remove-conversations-from-groups", "context": "chat/platform-api", "template": "api", - "title": "After updating group information", - "contentFile": "content/docs/chat/platform-api/webhooks/group/after-set-group-info.mdx" + "title": "Remove conversations from groups", + "contentFile": "content/docs/chat/platform-api/conversation/conversation-groups/remove-conversations-from-groups.mdx" }, { - "sourcePath": "/platform-api/webhooks/group/after-set-group-info-ex", - "openimPath": "/platform-api/webhooks/group/after-set-group-info-ex", + "sourcePath": "/platform-api/timer/managing-tasks/create-timer-task", + "openimPath": "/platform-api/timer/managing-tasks/create-timer-task", "context": "chat/platform-api", "template": "api", - "title": "After updating selected group fields", - "contentFile": "content/docs/chat/platform-api/webhooks/group/after-set-group-info-ex.mdx" + "title": "Create a timer task", + "contentFile": "content/docs/chat/platform-api/timer/managing-tasks/create-timer-task.mdx" }, { - "sourcePath": "/platform-api/webhooks/group/after-set-group-member-info", - "openimPath": "/platform-api/webhooks/group/after-set-group-member-info", + "sourcePath": "/platform-api/timer/managing-tasks/update-timer-task", + "openimPath": "/platform-api/timer/managing-tasks/update-timer-task", "context": "chat/platform-api", "template": "api", - "title": "After updating group member information", - "contentFile": "content/docs/chat/platform-api/webhooks/group/after-set-group-member-info.mdx" + "title": "Update a timer task", + "contentFile": "content/docs/chat/platform-api/timer/managing-tasks/update-timer-task.mdx" }, { - "sourcePath": "/platform-api/webhooks/group/after-transfer-group-owner", - "openimPath": "/platform-api/webhooks/group/after-transfer-group-owner", + "sourcePath": "/platform-api/timer/managing-tasks/delete-timer-task", + "openimPath": "/platform-api/timer/managing-tasks/delete-timer-task", "context": "chat/platform-api", "template": "api", - "title": "After transferring group ownership", - "contentFile": "content/docs/chat/platform-api/webhooks/group/after-transfer-group-owner.mdx" + "title": "Delete a timer task", + "contentFile": "content/docs/chat/platform-api/timer/managing-tasks/delete-timer-task.mdx" }, { - "sourcePath": "/platform-api/webhooks/group/before-apply-join-group", - "openimPath": "/platform-api/webhooks/group/before-apply-join-group", + "sourcePath": "/platform-api/timer/managing-tasks/get-timer-task", + "openimPath": "/platform-api/timer/managing-tasks/get-timer-task", "context": "chat/platform-api", "template": "api", - "title": "Before applying to join a group", - "contentFile": "content/docs/chat/platform-api/webhooks/group/before-apply-join-group.mdx" + "title": "Get a timer task", + "contentFile": "content/docs/chat/platform-api/timer/managing-tasks/get-timer-task.mdx" }, { - "sourcePath": "/platform-api/webhooks/group/before-create-group", - "openimPath": "/platform-api/webhooks/group/before-create-group", + "sourcePath": "/platform-api/timer/managing-tasks/list-timer-tasks", + "openimPath": "/platform-api/timer/managing-tasks/list-timer-tasks", "context": "chat/platform-api", "template": "api", - "title": "Before creating a group", - "contentFile": "content/docs/chat/platform-api/webhooks/group/before-create-group.mdx" + "title": "List timer tasks", + "contentFile": "content/docs/chat/platform-api/timer/managing-tasks/list-timer-tasks.mdx" }, { - "sourcePath": "/platform-api/webhooks/group/before-invite-user-to-group", - "openimPath": "/platform-api/webhooks/group/before-invite-user-to-group", + "sourcePath": "/platform-api/meeting/meeting-management/book-meeting", + "openimPath": "/platform-api/meeting/meeting-management/book-meeting", "context": "chat/platform-api", "template": "api", - "title": "Before inviting users to a group", - "contentFile": "content/docs/chat/platform-api/webhooks/group/before-invite-user-to-group.mdx" + "title": "Schedule a meeting", + "contentFile": "content/docs/chat/platform-api/meeting/meeting-management/book-meeting.mdx" }, { - "sourcePath": "/platform-api/webhooks/group/before-member-join-group", - "openimPath": "/platform-api/webhooks/group/before-member-join-group", + "sourcePath": "/platform-api/meeting/meeting-management/create-immediate-meeting", + "openimPath": "/platform-api/meeting/meeting-management/create-immediate-meeting", "context": "chat/platform-api", "template": "api", - "title": "Before members join a group", - "contentFile": "content/docs/chat/platform-api/webhooks/group/before-member-join-group.mdx" + "title": "Create an immediate meeting", + "contentFile": "content/docs/chat/platform-api/meeting/meeting-management/create-immediate-meeting.mdx" }, { - "sourcePath": "/platform-api/webhooks/group/before-set-group-info", - "openimPath": "/platform-api/webhooks/group/before-set-group-info", + "sourcePath": "/platform-api/meeting/meeting-management/join-meeting", + "openimPath": "/platform-api/meeting/meeting-management/join-meeting", "context": "chat/platform-api", "template": "api", - "title": "Before updating group information", - "contentFile": "content/docs/chat/platform-api/webhooks/group/before-set-group-info.mdx" + "title": "Join a meeting", + "contentFile": "content/docs/chat/platform-api/meeting/meeting-management/join-meeting.mdx" }, { - "sourcePath": "/platform-api/webhooks/group/before-set-group-info-ex", - "openimPath": "/platform-api/webhooks/group/before-set-group-info-ex", + "sourcePath": "/platform-api/meeting/meeting-management/get-meeting-token", + "openimPath": "/platform-api/meeting/meeting-management/get-meeting-token", "context": "chat/platform-api", "template": "api", - "title": "Before updating selected group fields", - "contentFile": "content/docs/chat/platform-api/webhooks/group/before-set-group-info-ex.mdx" + "title": "Get a meeting token", + "contentFile": "content/docs/chat/platform-api/meeting/meeting-management/get-meeting-token.mdx" }, { - "sourcePath": "/platform-api/webhooks/group/before-set-group-member-info", - "openimPath": "/platform-api/webhooks/group/before-set-group-member-info", + "sourcePath": "/platform-api/meeting/meeting-management/update-meeting", + "openimPath": "/platform-api/meeting/meeting-management/update-meeting", "context": "chat/platform-api", "template": "api", - "title": "Before updating group member information", - "contentFile": "content/docs/chat/platform-api/webhooks/group/before-set-group-member-info.mdx" + "title": "Update a meeting", + "contentFile": "content/docs/chat/platform-api/meeting/meeting-management/update-meeting.mdx" }, { - "sourcePath": "/platform-api/webhooks/message/after-group-message-read", - "openimPath": "/platform-api/webhooks/message/after-group-message-read", + "sourcePath": "/platform-api/meeting/meeting-management/get-meeting", + "openimPath": "/platform-api/meeting/meeting-management/get-meeting", "context": "chat/platform-api", "template": "api", - "title": "After group messages are read", - "contentFile": "content/docs/chat/platform-api/webhooks/message/after-group-message-read.mdx" + "title": "Get a meeting", + "contentFile": "content/docs/chat/platform-api/meeting/meeting-management/get-meeting.mdx" }, { - "sourcePath": "/platform-api/webhooks/message/after-revoke-message", - "openimPath": "/platform-api/webhooks/message/after-revoke-message", + "sourcePath": "/platform-api/meeting/meeting-management/list-meetings", + "openimPath": "/platform-api/meeting/meeting-management/list-meetings", "context": "chat/platform-api", "template": "api", - "title": "After revoking a message", - "contentFile": "content/docs/chat/platform-api/webhooks/message/after-revoke-message.mdx" + "title": "List a user's meetings", + "contentFile": "content/docs/chat/platform-api/meeting/meeting-management/list-meetings.mdx" }, { - "sourcePath": "/platform-api/webhooks/message/after-send-group-message", - "openimPath": "/platform-api/webhooks/message/after-send-group-message", + "sourcePath": "/platform-api/meeting/meeting-management/invite-meeting-users", + "openimPath": "/platform-api/meeting/meeting-management/invite-meeting-users", "context": "chat/platform-api", "template": "api", - "title": "After sending a group message", - "contentFile": "content/docs/chat/platform-api/webhooks/message/after-send-group-message.mdx" + "title": "Invite users to a meeting", + "contentFile": "content/docs/chat/platform-api/meeting/meeting-management/invite-meeting-users.mdx" }, { - "sourcePath": "/platform-api/webhooks/message/after-send-single-message", - "openimPath": "/platform-api/webhooks/message/after-send-single-message", + "sourcePath": "/platform-api/meeting/meeting-management/leave-meeting", + "openimPath": "/platform-api/meeting/meeting-management/leave-meeting", "context": "chat/platform-api", "template": "api", - "title": "After sending a one-to-one message", - "contentFile": "content/docs/chat/platform-api/webhooks/message/after-send-single-message.mdx" + "title": "Leave a meeting", + "contentFile": "content/docs/chat/platform-api/meeting/meeting-management/leave-meeting.mdx" }, { - "sourcePath": "/platform-api/webhooks/message/after-single-message-read", - "openimPath": "/platform-api/webhooks/message/after-single-message-read", + "sourcePath": "/platform-api/meeting/meeting-management/end-meeting", + "openimPath": "/platform-api/meeting/meeting-management/end-meeting", "context": "chat/platform-api", "template": "api", - "title": "After one-to-one messages are read", - "contentFile": "content/docs/chat/platform-api/webhooks/message/after-single-message-read.mdx" + "title": "End or cancel a meeting", + "contentFile": "content/docs/chat/platform-api/meeting/meeting-management/end-meeting.mdx" }, { - "sourcePath": "/platform-api/webhooks/message/before-message-modify", - "openimPath": "/platform-api/webhooks/message/before-message-modify", + "sourcePath": "/platform-api/meeting/meeting-management/get-user-related-meetings", + "openimPath": "/platform-api/meeting/meeting-management/get-user-related-meetings", "context": "chat/platform-api", "template": "api", - "title": "Before writing a message", - "contentFile": "content/docs/chat/platform-api/webhooks/message/before-message-modify.mdx" + "title": "Get user-related meetings", + "contentFile": "content/docs/chat/platform-api/meeting/meeting-management/get-user-related-meetings.mdx" }, { - "sourcePath": "/platform-api/webhooks/message/before-send-group-message", - "openimPath": "/platform-api/webhooks/message/before-send-group-message", + "sourcePath": "/platform-api/meeting/meeting-settings/set-personal-setting", + "openimPath": "/platform-api/meeting/meeting-settings/set-personal-setting", "context": "chat/platform-api", "template": "api", - "title": "Before sending a group message", - "contentFile": "content/docs/chat/platform-api/webhooks/message/before-send-group-message.mdx" + "title": "Set personal meeting preferences", + "contentFile": "content/docs/chat/platform-api/meeting/meeting-settings/set-personal-setting.mdx" }, { - "sourcePath": "/platform-api/webhooks/message/before-send-single-message", - "openimPath": "/platform-api/webhooks/message/before-send-single-message", + "sourcePath": "/platform-api/meeting/meeting-settings/get-personal-setting", + "openimPath": "/platform-api/meeting/meeting-settings/get-personal-setting", "context": "chat/platform-api", "template": "api", - "title": "Before sending a one-to-one message", - "contentFile": "content/docs/chat/platform-api/webhooks/message/before-send-single-message.mdx" + "title": "Get personal meeting preferences", + "contentFile": "content/docs/chat/platform-api/meeting/meeting-settings/get-personal-setting.mdx" }, { - "sourcePath": "/platform-api/webhooks/overview", - "openimPath": "/platform-api/webhooks/overview", + "sourcePath": "/platform-api/meeting/meeting-settings/operate-all-streams", + "openimPath": "/platform-api/meeting/meeting-settings/operate-all-streams", "context": "chat/platform-api", - "template": "overview", - "title": "Overview", - "contentFile": "content/docs/chat/platform-api/webhooks/overview.mdx" + "template": "api", + "title": "Control participant media streams", + "contentFile": "content/docs/chat/platform-api/meeting/meeting-settings/operate-all-streams.mdx" }, { - "sourcePath": "/platform-api/webhooks/push/after-user-kick-off", - "openimPath": "/platform-api/webhooks/push/after-user-kick-off", + "sourcePath": "/platform-api/meeting/meeting-settings/modify-participant-name", + "openimPath": "/platform-api/meeting/meeting-settings/modify-participant-name", "context": "chat/platform-api", "template": "api", - "title": "After a user is forced offline", - "contentFile": "content/docs/chat/platform-api/webhooks/push/after-user-kick-off.mdx" + "title": "Modify a participant name", + "contentFile": "content/docs/chat/platform-api/meeting/meeting-settings/modify-participant-name.mdx" }, { - "sourcePath": "/platform-api/webhooks/push/after-user-offline", - "openimPath": "/platform-api/webhooks/push/after-user-offline", + "sourcePath": "/platform-api/meeting/meeting-settings/remove-participants", + "openimPath": "/platform-api/meeting/meeting-settings/remove-participants", "context": "chat/platform-api", "template": "api", - "title": "After a user goes offline", - "contentFile": "content/docs/chat/platform-api/webhooks/push/after-user-offline.mdx" + "title": "Remove meeting participants", + "contentFile": "content/docs/chat/platform-api/meeting/meeting-settings/remove-participants.mdx" }, { - "sourcePath": "/platform-api/webhooks/push/after-user-online", - "openimPath": "/platform-api/webhooks/push/after-user-online", + "sourcePath": "/platform-api/meeting/meeting-settings/set-meeting-host", + "openimPath": "/platform-api/meeting/meeting-settings/set-meeting-host", "context": "chat/platform-api", "template": "api", - "title": "After a user comes online", - "contentFile": "content/docs/chat/platform-api/webhooks/push/after-user-online.mdx" + "title": "Set meeting hosts", + "contentFile": "content/docs/chat/platform-api/meeting/meeting-settings/set-meeting-host.mdx" }, { - "sourcePath": "/platform-api/webhooks/push/before-group-online-push", - "openimPath": "/platform-api/webhooks/push/before-group-online-push", + "sourcePath": "/platform-api/meeting/meeting-settings/clean-previous-meetings", + "openimPath": "/platform-api/meeting/meeting-settings/clean-previous-meetings", "context": "chat/platform-api", "template": "api", - "title": "Before group online push", - "contentFile": "content/docs/chat/platform-api/webhooks/push/before-group-online-push.mdx" + "title": "Clean previous meeting state", + "contentFile": "content/docs/chat/platform-api/meeting/meeting-settings/clean-previous-meetings.mdx" }, { - "sourcePath": "/platform-api/webhooks/push/before-offline-push", - "openimPath": "/platform-api/webhooks/push/before-offline-push", + "sourcePath": "/platform-api/meeting/recurring-meetings/create-repeat-meeting", + "openimPath": "/platform-api/meeting/recurring-meetings/create-repeat-meeting", "context": "chat/platform-api", "template": "api", - "title": "Before offline push", - "contentFile": "content/docs/chat/platform-api/webhooks/push/before-offline-push.mdx" + "title": "Create a recurring meeting", + "contentFile": "content/docs/chat/platform-api/meeting/recurring-meetings/create-repeat-meeting.mdx" }, { - "sourcePath": "/platform-api/webhooks/push/before-online-push", - "openimPath": "/platform-api/webhooks/push/before-online-push", + "sourcePath": "/platform-api/meeting/recurring-meetings/update-repeat-meeting", + "openimPath": "/platform-api/meeting/recurring-meetings/update-repeat-meeting", "context": "chat/platform-api", "template": "api", - "title": "Before one-to-one online push", - "contentFile": "content/docs/chat/platform-api/webhooks/push/before-online-push.mdx" + "title": "Update a recurring meeting", + "contentFile": "content/docs/chat/platform-api/meeting/recurring-meetings/update-repeat-meeting.mdx" }, { - "sourcePath": "/platform-api/webhooks/relation/after-add-friend", - "openimPath": "/platform-api/webhooks/relation/after-add-friend", + "sourcePath": "/platform-api/meeting/recurring-meetings/delete-repeat-meeting", + "openimPath": "/platform-api/meeting/recurring-meetings/delete-repeat-meeting", "context": "chat/platform-api", "template": "api", - "title": "After adding a friend", - "contentFile": "content/docs/chat/platform-api/webhooks/relation/after-add-friend.mdx" + "title": "Delete a recurring meeting", + "contentFile": "content/docs/chat/platform-api/meeting/recurring-meetings/delete-repeat-meeting.mdx" }, { - "sourcePath": "/platform-api/webhooks/relation/after-add-friend-agree", - "openimPath": "/platform-api/webhooks/relation/after-add-friend-agree", + "sourcePath": "/platform-api/meeting/recurring-meetings/get-repeat-meeting", + "openimPath": "/platform-api/meeting/recurring-meetings/get-repeat-meeting", "context": "chat/platform-api", "template": "api", - "title": "After accepting a friend request", - "contentFile": "content/docs/chat/platform-api/webhooks/relation/after-add-friend-agree.mdx" + "title": "Get a recurring meeting", + "contentFile": "content/docs/chat/platform-api/meeting/recurring-meetings/get-repeat-meeting.mdx" }, { - "sourcePath": "/platform-api/webhooks/relation/after-delete-friend", - "openimPath": "/platform-api/webhooks/relation/after-delete-friend", + "sourcePath": "/platform-api/meeting/recurring-meetings/list-repeat-meetings", + "openimPath": "/platform-api/meeting/recurring-meetings/list-repeat-meetings", "context": "chat/platform-api", "template": "api", - "title": "After deleting a friend", - "contentFile": "content/docs/chat/platform-api/webhooks/relation/after-delete-friend.mdx" + "title": "List recurring meetings", + "contentFile": "content/docs/chat/platform-api/meeting/recurring-meetings/list-repeat-meetings.mdx" }, { - "sourcePath": "/platform-api/webhooks/relation/after-import-friends", - "openimPath": "/platform-api/webhooks/relation/after-import-friends", + "sourcePath": "/platform-api/meeting/recurring-meetings/list-repeat-meeting-instances", + "openimPath": "/platform-api/meeting/recurring-meetings/list-repeat-meeting-instances", "context": "chat/platform-api", "template": "api", - "title": "After importing friends", - "contentFile": "content/docs/chat/platform-api/webhooks/relation/after-import-friends.mdx" + "title": "List recurring meeting instances", + "contentFile": "content/docs/chat/platform-api/meeting/recurring-meetings/list-repeat-meeting-instances.mdx" }, { - "sourcePath": "/platform-api/webhooks/relation/after-remove-black", - "openimPath": "/platform-api/webhooks/relation/after-remove-black", + "sourcePath": "/platform-api/meeting/meeting-records/get-user-meeting-histories", + "openimPath": "/platform-api/meeting/meeting-records/get-user-meeting-histories", "context": "chat/platform-api", "template": "api", - "title": "After removing from the blacklist", - "contentFile": "content/docs/chat/platform-api/webhooks/relation/after-remove-black.mdx" + "title": "Get a user's meeting history", + "contentFile": "content/docs/chat/platform-api/meeting/meeting-records/get-user-meeting-histories.mdx" }, { - "sourcePath": "/platform-api/webhooks/relation/after-set-friend-remark", - "openimPath": "/platform-api/webhooks/relation/after-set-friend-remark", + "sourcePath": "/platform-api/meeting/meeting-records/get-user-hosted-meetings", + "openimPath": "/platform-api/meeting/meeting-records/get-user-hosted-meetings", "context": "chat/platform-api", "template": "api", - "title": "After setting a friend remark", - "contentFile": "content/docs/chat/platform-api/webhooks/relation/after-set-friend-remark.mdx" + "title": "Get meetings hosted by a user", + "contentFile": "content/docs/chat/platform-api/meeting/meeting-records/get-user-hosted-meetings.mdx" }, { - "sourcePath": "/platform-api/webhooks/relation/before-add-black", - "openimPath": "/platform-api/webhooks/relation/before-add-black", + "sourcePath": "/platform-api/meeting/meeting-records/get-meeting-records", + "openimPath": "/platform-api/meeting/meeting-records/get-meeting-records", "context": "chat/platform-api", "template": "api", - "title": "Before adding to the blacklist", - "contentFile": "content/docs/chat/platform-api/webhooks/relation/before-add-black.mdx" + "title": "Get meeting recordings", + "contentFile": "content/docs/chat/platform-api/meeting/meeting-records/get-meeting-records.mdx" }, { - "sourcePath": "/platform-api/webhooks/relation/before-add-friend", - "openimPath": "/platform-api/webhooks/relation/before-add-friend", + "sourcePath": "/platform-api/meeting/meeting-records/get-records-by-meeting-ids", + "openimPath": "/platform-api/meeting/meeting-records/get-records-by-meeting-ids", "context": "chat/platform-api", "template": "api", - "title": "Before adding a friend", - "contentFile": "content/docs/chat/platform-api/webhooks/relation/before-add-friend.mdx" + "title": "Get recordings by meeting IDs", + "contentFile": "content/docs/chat/platform-api/meeting/meeting-records/get-records-by-meeting-ids.mdx" }, { - "sourcePath": "/platform-api/webhooks/relation/before-add-friend-agree", - "openimPath": "/platform-api/webhooks/relation/before-add-friend-agree", + "sourcePath": "/platform-api/meeting/meeting-records/get-meeting-attendance", + "openimPath": "/platform-api/meeting/meeting-records/get-meeting-attendance", "context": "chat/platform-api", "template": "api", - "title": "Before accepting a friend request", - "contentFile": "content/docs/chat/platform-api/webhooks/relation/before-add-friend-agree.mdx" + "title": "Get meeting attendance", + "contentFile": "content/docs/chat/platform-api/meeting/meeting-records/get-meeting-attendance.mdx" }, { - "sourcePath": "/platform-api/webhooks/relation/before-import-friends", - "openimPath": "/platform-api/webhooks/relation/before-import-friends", + "sourcePath": "/platform-api/meeting/meeting-records/delete-meeting-records", + "openimPath": "/platform-api/meeting/meeting-records/delete-meeting-records", "context": "chat/platform-api", "template": "api", - "title": "Before importing friends", - "contentFile": "content/docs/chat/platform-api/webhooks/relation/before-import-friends.mdx" + "title": "Delete meeting recordings", + "contentFile": "content/docs/chat/platform-api/meeting/meeting-records/delete-meeting-records.mdx" }, { - "sourcePath": "/platform-api/webhooks/relation/before-set-friend-remark", - "openimPath": "/platform-api/webhooks/relation/before-set-friend-remark", + "sourcePath": "/platform-api/meeting/meeting-signaling/get-room-by-group-id", + "openimPath": "/platform-api/meeting/meeting-signaling/get-room-by-group-id", "context": "chat/platform-api", "template": "api", - "title": "Before setting a friend remark", - "contentFile": "content/docs/chat/platform-api/webhooks/relation/before-set-friend-remark.mdx" + "title": "Get a call room by group ID", + "contentFile": "content/docs/chat/platform-api/meeting/meeting-signaling/get-room-by-group-id.mdx" }, { - "sourcePath": "/platform-api/webhooks/user/after-update-user-info", - "openimPath": "/platform-api/webhooks/user/after-update-user-info", + "sourcePath": "/platform-api/meeting/meeting-signaling/get-signal-rooms", + "openimPath": "/platform-api/meeting/meeting-signaling/get-signal-rooms", "context": "chat/platform-api", "template": "api", - "title": "After updating user information", - "contentFile": "content/docs/chat/platform-api/webhooks/user/after-update-user-info.mdx" + "title": "Get call rooms", + "contentFile": "content/docs/chat/platform-api/meeting/meeting-signaling/get-signal-rooms.mdx" }, { - "sourcePath": "/platform-api/webhooks/user/after-update-user-info-ex", - "openimPath": "/platform-api/webhooks/user/after-update-user-info-ex", + "sourcePath": "/platform-api/meeting/meeting-signaling/get-signal-invitation", + "openimPath": "/platform-api/meeting/meeting-signaling/get-signal-invitation", "context": "chat/platform-api", "template": "api", - "title": "After updating selected user fields", - "contentFile": "content/docs/chat/platform-api/webhooks/user/after-update-user-info-ex.mdx" + "title": "Get a call invitation", + "contentFile": "content/docs/chat/platform-api/meeting/meeting-signaling/get-signal-invitation.mdx" }, { - "sourcePath": "/platform-api/webhooks/user/after-user-register", - "openimPath": "/platform-api/webhooks/user/after-user-register", + "sourcePath": "/platform-api/meeting/meeting-signaling/get-startup-invitation", + "openimPath": "/platform-api/meeting/meeting-signaling/get-startup-invitation", "context": "chat/platform-api", "template": "api", - "title": "After user registration", - "contentFile": "content/docs/chat/platform-api/webhooks/user/after-user-register.mdx" + "title": "Get a startup call invitation", + "contentFile": "content/docs/chat/platform-api/meeting/meeting-signaling/get-startup-invitation.mdx" }, { - "sourcePath": "/platform-api/webhooks/user/before-update-user-info", - "openimPath": "/platform-api/webhooks/user/before-update-user-info", + "sourcePath": "/platform-api/meeting/meeting-chat/send-meeting-chat", + "openimPath": "/platform-api/meeting/meeting-chat/send-meeting-chat", "context": "chat/platform-api", "template": "api", - "title": "Before updating user information", - "contentFile": "content/docs/chat/platform-api/webhooks/user/before-update-user-info.mdx" + "title": "Send a meeting chat message", + "contentFile": "content/docs/chat/platform-api/meeting/meeting-chat/send-meeting-chat.mdx" }, { - "sourcePath": "/platform-api/webhooks/user/before-update-user-info-ex", - "openimPath": "/platform-api/webhooks/user/before-update-user-info-ex", + "sourcePath": "/platform-api/meeting/meeting-chat/pull-meeting-chat", + "openimPath": "/platform-api/meeting/meeting-chat/pull-meeting-chat", "context": "chat/platform-api", "template": "api", - "title": "Before updating selected user fields", - "contentFile": "content/docs/chat/platform-api/webhooks/user/before-update-user-info-ex.mdx" + "title": "Pull meeting chat messages", + "contentFile": "content/docs/chat/platform-api/meeting/meeting-chat/pull-meeting-chat.mdx" }, { - "sourcePath": "/platform-api/webhooks/user/before-user-register", - "openimPath": "/platform-api/webhooks/user/before-user-register", + "sourcePath": "/platform-api/meeting/meeting-chat/revoke-meeting-chat", + "openimPath": "/platform-api/meeting/meeting-chat/revoke-meeting-chat", "context": "chat/platform-api", "template": "api", - "title": "Before user registration", - "contentFile": "content/docs/chat/platform-api/webhooks/user/before-user-register.mdx" + "title": "Revoke a meeting chat message", + "contentFile": "content/docs/chat/platform-api/meeting/meeting-chat/revoke-meeting-chat.mdx" }, { "sourcePath": "/sdk/error-codes", diff --git a/design-qa.md b/design-qa.md new file mode 100644 index 0000000000..5fcb188c0d --- /dev/null +++ b/design-qa.md @@ -0,0 +1,36 @@ +# Homepage hero design QA + +## Source and implementation + +- Source reference: `/var/folders/xx/zjxj2dw143xfd4xd1jf152b40000gn/T/codex-clipboard-40387acb-99a5-4ffa-b2e4-295b6e04d5e1.png` +- Source dimensions: 1448 × 1086 px +- Final light asset: `/Volumes/workspace/work/openim-chat-docs-next/public/brand/openimsdk-im-hero-light.png` +- Final dark asset: `/Volumes/workspace/work/openim-chat-docs-next/public/brand/openimsdk-im-hero-dark.png` +- Final asset dimensions: 1448 × 1086 px each +- Light implementation screenshot: `/tmp/openim-home-theme-light-final.png` +- Dark implementation screenshot: `/tmp/openim-home-theme-dark.png` +- Verification viewport: 761 × 830 px for the responsive theme-switch check; the 1280 × 720 px desktop composition was retained from the prior comparison +- Verified state: Chinese homepage in both light and dark themes + +## Comparison + +The source and implementation were reviewed together at full-view and focused-view scales. Both theme assets preserve the same hierarchy: a dominant desktop IM client, an overlapping mobile client, a theme-appropriate product backdrop, and restrained capability labels. The images fit the existing hero slot without cropping and keep the heading and primary actions visually dominant. + +## Findings and iteration history + +1. Replaced the compact code-drawn chat window with a high-fidelity product image so message content remains legible and the composition reads as a real cross-platform IM product. +2. Matched the source's desktop/phone overlap, three-column desktop layout, conversation density, shared file, image message, voice message, read receipts, and cross-device sync cues. +3. Removed potentially misleading terminology from the generated visual: `Groups & Channels` became `Group Chats`, and `End-to-End Encryption` became `Rich Messages`. +4. Replaced the lock beside `Rich Messages` with a layered image-and-text content-card icon so the label no longer implies encryption. +5. Added a dedicated dark image with dark desktop and mobile clients, dark capability cards, a deep navy backdrop, and preserved content and geometry. The implementation switches source assets with the site theme instead of applying a brightness filter. +6. Kept both images face-on, centered, and padded rather than using the previous perspective tilt, which better matches the supplied marketing reference. +7. Confirmed there are no visible clipping, overflow, alignment, contrast, hydration, console, or loading issues when switching between themes. + +## Severity review + +- P0: none +- P1: none +- P2: none +- P3: small interface labels intentionally become secondary at the homepage display size; the desktop/mobile composition and capability cues remain clear. + +final result: passed diff --git a/package.json b/package.json index 5cfd03ac82..6c2f78b478 100644 --- a/package.json +++ b/package.json @@ -34,15 +34,15 @@ "content:metadata": "node scripts/sync-content-metadata.mjs", "sdk:zh": "node scripts/build-wasm-sdk-zh-content.mjs", "sdk:zh:check": "node scripts/check-localized-sdk-content.mjs", - "sdk:native:zh": "node scripts/build-client-sdk-zh-content.mjs ios flutter", - "sdk:native:zh:check": "node scripts/check-localized-sdk-content.mjs ios flutter", + "sdk:native:zh": "node scripts/build-client-sdk-zh-content.mjs android ios flutter", + "sdk:native:zh:check": "node scripts/check-localized-sdk-content.mjs android ios flutter", "sdk:native:structure:sync": "node scripts/sync-client-sdk-structure.mjs ios flutter", - "sdk:native:routes:sync": "node scripts/sync-client-sdk-route-skeletons.mjs ios flutter && node scripts/sync-content-metadata.mjs", + "sdk:native:routes:sync": "node scripts/sync-client-sdk-route-skeletons.mjs android ios flutter && node scripts/sync-content-metadata.mjs", "structure:sync": "node scripts/import-structure.mjs", "structure:report": "pnpm content:metadata && node scripts/structure-report.mjs && prettier --write docs/STRUCTURE_REPORT.md", "check": "eslint . && tsc --noEmit && pnpm test:audit && node scripts/check-content.mjs && node scripts/check-guides-content-audit.mjs && node scripts/check-wasm-content-audit.mjs && node scripts/check-localized-sdk-content.mjs && node scripts/check-client-sdk-content-audit.mjs && node scripts/check-wasm-sdk-examples.mjs && pnpm docsets-sync:lint-openapi && pnpm platform-api:test", "postbuild": "node scripts/prepare-standalone.mjs", - "content:sync": "node scripts/build-wasm-sdk-zh-content.mjs && node scripts/build-client-sdk-zh-content.mjs ios flutter && node scripts/build-search-index.mjs", + "content:sync": "node scripts/build-wasm-sdk-zh-content.mjs && node scripts/build-client-sdk-zh-content.mjs android ios flutter && node scripts/build-search-index.mjs", "guides:sync": "node scripts/import-openim-guides.mjs", "platform-api:sync": "node scripts/import-openim-platform-api.mjs && node scripts/sync-openim-user-api.mjs && node scripts/sync-openim-friend-api.mjs && node scripts/sync-openim-group-api.mjs && node scripts/sync-openim-auth-api.mjs && node scripts/sync-openim-third-api.mjs && node scripts/sync-openim-msg-api.mjs && node scripts/sync-openim-conversation-api.mjs && node scripts/sync-openim-platform-api-order.mjs && node scripts/sync-openim-platform-api-english.mjs && node scripts/build-search-index.mjs", "user-api:sync": "node scripts/sync-openim-user-api.mjs", diff --git a/public/brand/openimsdk-im-hero-dark.png b/public/brand/openimsdk-im-hero-dark.png new file mode 100644 index 0000000000..3150e71d59 Binary files /dev/null and b/public/brand/openimsdk-im-hero-dark.png differ diff --git a/public/brand/openimsdk-im-hero-light.png b/public/brand/openimsdk-im-hero-light.png new file mode 100644 index 0000000000..d229573554 Binary files /dev/null and b/public/brand/openimsdk-im-hero-light.png differ diff --git a/scripts/__tests__/build-client-sdk-zh-content.test.mjs b/scripts/__tests__/build-client-sdk-zh-content.test.mjs index 4243c51ca2..39397033d7 100644 --- a/scripts/__tests__/build-client-sdk-zh-content.test.mjs +++ b/scripts/__tests__/build-client-sdk-zh-content.test.mjs @@ -52,6 +52,13 @@ test('resolves missing native route records from the reviewed WASM suffix baseli test('native audit seeds and generated packages retain the fixed structural contract', () => { const expected = { + android: { + context: 'chat/sdk/android', + root: 'content/zh/docs/chat/sdk/android', + sdkKey: 'androidSdk', + tag: 'v3.8.4.0', + commit: 'f82b142c7d3b4b66ce20586adabc69de9cd61673', + }, ios: { context: 'chat/sdk/ios', root: 'content/zh/docs/chat/sdk/ios', diff --git a/scripts/__tests__/build-search-index.test.mjs b/scripts/__tests__/build-search-index.test.mjs index ff54affccb..1af5521546 100644 --- a/scripts/__tests__/build-search-index.test.mjs +++ b/scripts/__tests__/build-search-index.test.mjs @@ -28,23 +28,28 @@ function auditPage(path, zh, en) { }; } -test('omits unpublished WASM pages and indexes published manual Chinese content', () => { - const nonWasm = route('/sdk/android/overview'); +test('applies publication audits to Android and WASM search content', () => { + const android = route('/sdk/android/overview'); const pending = route('/sdk/wasm/pending', 'chat/sdk/wasm'); const published = route('/sdk/wasm/published', 'chat/sdk/wasm'); const result = buildSearchIndexes({ - routes: [nonWasm, pending, published], + routes: [android, pending, published], sourcePages: new Map([ - [nonWasm.path, { body: 'Android source body' }], + [android.path, { body: 'Android source body' }], [pending.path, { body: 'Pending source body' }], [published.path, { body: 'Published source body' }], ]), manualZhPages: new Map([ + [ + android.path, + { body: 'Android 中文正文', description: 'Android 描述', title: 'Android 标题' }, + ], [pending.path, { body: '待审核正文', description: '待审核', title: '待审核' }], [published.path, { body: '已发布中文正文', description: '中文描述', title: '中文标题' }], ]), auditPages: new Map([ + [android.path, auditPage(android.path, 'published', 'published')], [pending.path, auditPage(pending.path, 'written', 'deferred')], [published.path, auditPage(published.path, 'published', 'published')], ]), @@ -52,11 +57,11 @@ test('omits unpublished WASM pages and indexes published manual Chinese content' assert.deepEqual( result.en.map((record) => record.path), - [nonWasm.path, published.path], + [android.path, published.path], ); assert.deepEqual( result.zh.map((record) => record.path), - [nonWasm.path, published.path], + [android.path, published.path], ); assert.equal(result.zh.at(-1).title, '中文标题'); assert.equal(result.zh.at(-1).description, '中文描述'); diff --git a/scripts/__tests__/client-sdk-publication.test.mjs b/scripts/__tests__/client-sdk-publication.test.mjs index c015fe5d07..b84a523fe7 100644 --- a/scripts/__tests__/client-sdk-publication.test.mjs +++ b/scripts/__tests__/client-sdk-publication.test.mjs @@ -12,6 +12,7 @@ import { } from '../../src/lib/client-sdk-publication.ts'; test('detects all registered active SDK routes and excludes legacy native routes', () => { + assert.equal(getClientSdkPlatform('/sdk/android/overview'), 'android'); assert.equal(getClientSdkPlatform('/sdk/ios/overview'), 'ios'); assert.equal(getClientSdkPlatform('/sdk/flutter/overview/'), 'flutter'); assert.equal(getClientSdkPlatform('/sdk/wasm/overview'), 'wasm'); @@ -19,6 +20,7 @@ test('detects all registered active SDK routes and excludes legacy native routes }); test('reads locale publication state per platform audit', () => { + assert.deepEqual(getPublishedClientSdkLocales('/sdk/android/overview'), ['en', 'zh']); assert.equal(isClientSdkLocalePublished('/sdk/ios/overview', 'zh'), true); assert.deepEqual(getPublishedClientSdkLocales('/sdk/flutter/overview'), ['en', 'zh']); assert.equal(isClientSdkLocalePublished('/sdk/flutter/overview', 'en'), true); @@ -40,14 +42,12 @@ test('creates a platform-specific neutral pending body', () => { description: '审核状态说明', }); assert.match(pending?.body ?? '', /OpenIM Flutter SDK/); - assert.equal( - createClientSdkPendingReviewContent({ - path: '/sdk/android/overview', - title: 'Android', - description: 'Android', - }), - undefined, - ); + const androidPending = createClientSdkPendingReviewContent({ + path: '/sdk/android/overview', + title: 'Android', + description: 'Android', + }); + assert.match(androidPending?.body ?? '', /OpenIM Android SDK/); }); test('only selects manual client SDK content after its locale is published', () => { diff --git a/scripts/__tests__/client-sdk-sidebar.test.mjs b/scripts/__tests__/client-sdk-sidebar.test.mjs index 33ada39c22..9d40d1b91c 100644 --- a/scripts/__tests__/client-sdk-sidebar.test.mjs +++ b/scripts/__tests__/client-sdk-sidebar.test.mjs @@ -12,7 +12,20 @@ import { const wasmSidebar = readJson('data/structure/wasm-sidebar.json'); test('registers the supported client SDK platforms and their structure paths', () => { - assert.deepEqual(clientSdkPlatformIds, ['ios', 'flutter', 'wasm']); + assert.deepEqual(clientSdkPlatformIds, ['android', 'ios', 'flutter', 'wasm']); + assert.deepEqual(getClientSdkPlatform('android'), { + id: 'android', + contextKey: 'chat/sdk/android', + routePrefix: '/sdk/android', + manualRoot: 'content/zh/docs/chat/sdk/android', + auditPath: 'data/structure/android-content-audit.json', + labelsPath: 'data/structure/android-navigation-labels.json', + sidebarPath: 'data/structure/android-sidebar.json', + localizedOutputPath: 'src/generated/android-sdk-zh-content.json', + sdkSourceKey: 'androidSdk', + sdkTag: 'v3.8.4.0', + sdkCommit: 'f82b142c7d3b4b66ce20586adabc69de9cd61673', + }); assert.deepEqual(getClientSdkPlatform('ios'), { id: 'ios', contextKey: 'chat/sdk/ios', @@ -28,7 +41,7 @@ test('registers the supported client SDK platforms and their structure paths', ( }); assert.equal(getClientSdkPlatform('flutter').contextKey, 'chat/sdk/flutter'); assert.equal(getClientSdkPlatform('wasm').contextKey, 'chat/sdk/wasm'); - assert.throws(() => getClientSdkPlatform('android'), /Unknown client SDK platform: android/); + assert.throws(() => getClientSdkPlatform('unknown'), /Unknown client SDK platform: unknown/); }); test('native sidebars keep unique platform routes and may extend the WASM structure', () => { @@ -53,7 +66,7 @@ test('native sidebars keep unique platform routes and may extend the WASM struct test('keeps relationships beside users and account settings beside user profiles', () => { const navigation = readJson('src/generated/navigation.json'); - for (const platform of ['wasm', 'ios', 'flutter']) { + for (const platform of ['wasm', 'ios', 'flutter', 'android']) { const sidebar = readJson(`data/structure/${platform}-sidebar.json`); const user = sidebar.nodes.find((node) => node.id === 'user'); const relationships = sidebar.nodes.find((node) => node.id === 'relationships'); @@ -66,7 +79,9 @@ test('keeps relationships beside users and account settings beside user profiles const globalReceptionPath = platform === 'wasm' ? '/sdk/wasm/user/profile/set-global-message-reception' - : `/sdk/${platform}/user/retrieving-and-updating-user-information/set-global-message-reception`; + : platform === 'android' + ? '/sdk/android/user/user-profile/set-global-message-reception' + : `/sdk/${platform}/user/retrieving-and-updating-user-information/set-global-message-reception`; const onlineStatusPaths = platform === 'wasm' ? [ @@ -74,11 +89,17 @@ test('keeps relationships beside users and account settings beside user profiles '/sdk/wasm/user/online-status/get-subscribe-users-status', '/sdk/wasm/user/online-status/unsubscribe-users-status', ] - : [ - `/sdk/${platform}/user/retrieving-and-updating-user-information/subscribe-user-status`, - `/sdk/${platform}/user/retrieving-and-updating-user-information/get-subscribed-user-status`, - `/sdk/${platform}/user/retrieving-and-updating-user-information/unsubscribe-user-status`, - ]; + : platform === 'android' + ? [ + '/sdk/android/user/online-status/subscribe-users-online-status', + '/sdk/android/user/online-status/get-subscribe-online-users-status', + '/sdk/android/user/online-status/unsubscribe-users-online-status', + ] + : [ + `/sdk/${platform}/user/retrieving-and-updating-user-information/subscribe-user-status`, + `/sdk/${platform}/user/retrieving-and-updating-user-information/get-subscribed-user-status`, + `/sdk/${platform}/user/retrieving-and-updating-user-information/unsubscribe-user-status`, + ]; assert.ok(profile, platform); assert.ok(onlineStatus, platform); diff --git a/scripts/__tests__/search-index-contract.test.mjs b/scripts/__tests__/search-index-contract.test.mjs index 2f54a220ed..21336ca9f4 100644 --- a/scripts/__tests__/search-index-contract.test.mjs +++ b/scripts/__tests__/search-index-contract.test.mjs @@ -14,11 +14,12 @@ function page(path, en, zh) { } test('expects non-client routes and only locale-published client SDK routes', () => { - const nonWasm = { path: '/sdk/android/overview', contextKey: 'chat/sdk/android' }; + const android = { path: '/sdk/android/overview', contextKey: 'chat/sdk/android' }; const pending = { path: '/sdk/wasm/pending', contextKey: 'chat/sdk/wasm' }; const enOnly = { path: '/sdk/wasm/en', contextKey: 'chat/sdk/wasm' }; const zhOnly = { path: '/sdk/wasm/zh', contextKey: 'chat/sdk/wasm' }; const auditPages = new Map([ + [android.path, page(android.path, 'published', 'published')], [pending.path, page(pending.path, 'deferred', 'written')], [enOnly.path, page(enOnly.path, 'published', 'deferred')], [zhOnly.path, page(zhOnly.path, 'deferred', 'published')], @@ -26,11 +27,11 @@ test('expects non-client routes and only locale-published client SDK routes', () assert.deepEqual( validateSearchIndexPaths({ - routes: [nonWasm, pending, enOnly, zhOnly], + routes: [android, pending, enOnly, zhOnly], auditPages, indexes: { - en: [{ path: nonWasm.path }, { path: enOnly.path }], - zh: [{ path: nonWasm.path }, { path: zhOnly.path }], + en: [{ path: android.path }, { path: enOnly.path }], + zh: [{ path: android.path }, { path: zhOnly.path }], }, }), [], diff --git a/scripts/__tests__/sync-client-sdk-route-skeletons.test.mjs b/scripts/__tests__/sync-client-sdk-route-skeletons.test.mjs index 90b591dfa3..0d79f9b171 100644 --- a/scripts/__tests__/sync-client-sdk-route-skeletons.test.mjs +++ b/scripts/__tests__/sync-client-sdk-route-skeletons.test.mjs @@ -63,12 +63,14 @@ test('replaces legacy platform route records with the reviewed active tree', () test('resolves every active native suffix against the current WASM routes', () => { const routes = readJson('src/generated/routes.json'); - for (const platformId of ['ios', 'flutter']) { + for (const platformId of ['android', 'ios', 'flutter']) { const sidebar = readJson(`data/structure/${platformId}-sidebar.json`); const resolved = resolveClientSdkSkeletonRoutes({ platformId, sidebar, routes }); assert.equal(resolved.length, getSidebarPathCount(sidebar)); assert.equal(resolved[0].path, `/sdk/${platformId}/overview`); - assert.equal(resolved[0].title, `OpenIM SDK for ${platformId === 'ios' ? 'iOS' : 'Flutter'}`); + const displayName = + platformId === 'ios' ? 'iOS' : platformId === 'android' ? 'Android' : 'Flutter'; + assert.equal(resolved[0].title, `OpenIM SDK for ${displayName}`); } }); @@ -93,6 +95,76 @@ test('uses each native SDK method name while preserving the shared WASM route su ); }); +test('uses Flutter-aligned titles for Android media message routes', () => { + const expectedTitles = { + 'message/creating-messages/create-image-message': 'Create an image message', + 'message/creating-messages/create-image-message-by-file': + 'Create an image message from a local path', + 'message/creating-messages/create-image-message-by-url': + 'Create an image message from URLs', + 'message/creating-messages/create-sound-message': 'Create an audio message', + 'message/creating-messages/create-sound-message-by-file': + 'Create an audio message from a local path', + 'message/creating-messages/create-sound-message-by-url': + 'Create an audio message from a URL', + 'message/creating-messages/create-video-message': 'Create a video message', + 'message/creating-messages/create-video-message-by-file': + 'Create a video message from local paths', + 'message/creating-messages/create-video-message-by-url': + 'Create a video message from URLs', + 'message/creating-messages/create-file-message': 'Create a file message', + 'message/creating-messages/create-file-message-by-file': + 'Create a file message from a local path', + 'message/creating-messages/create-file-message-by-url': + 'Create a file message from a URL', + }; + + for (const [suffix, expectedTitle] of Object.entries(expectedTitles)) { + assert.equal( + resolveClientSdkRouteTitle({ + platformId: 'android', + suffix, + baselineTitle: 'Create a message from a file', + }), + expectedTitle, + ); + } +}); + +test('uses the batch-message deletion title for Android', () => { + assert.equal( + resolveClientSdkRouteTitle({ + platformId: 'android', + suffix: 'message/managing-messages/delete-saved-messages', + baselineTitle: 'Delete messages in a batch', + }), + 'Delete messages in a batch', + ); +}); + +test('supports reviewed Android extension routes outside the WASM tree', () => { + const routes = readJson('src/generated/routes.json'); + const sidebar = readJson('data/structure/android-sidebar.json'); + const resolved = resolveClientSdkSkeletonRoutes({ platformId: 'android', sidebar, routes }); + assert.ok( + resolved.some( + (route) => + route.path === '/sdk/android/user/user-profile/get-self-local-user-info' && + route.title === 'Get the current user profile', + ), + ); + + const next = replaceClientSdkRouteRecords({ platformId: 'android', sidebar, routes }); + const extension = next.find( + (route) => route.path === '/sdk/android/user/online-status/subscribe-users-online-status', + ); + assert.equal(extension?.template, 'guide'); + assert.equal( + extension?.contentFile, + 'content/docs/chat/sdk/android/user/online-status/subscribe-users-online-status.mdx', + ); +}); + function getSidebarPathCount(sidebar) { const count = (nodes) => nodes.reduce( diff --git a/scripts/__tests__/wasm-commercial.test.mjs b/scripts/__tests__/wasm-commercial.test.mjs index 604bdccac4..eae678d97d 100644 --- a/scripts/__tests__/wasm-commercial.test.mjs +++ b/scripts/__tests__/wasm-commercial.test.mjs @@ -3,6 +3,7 @@ import { readFileSync } from 'node:fs'; import test from 'node:test'; const ownership = JSON.parse(readFileSync('data/structure/wasm-api-ownership.json', 'utf8')); +const androidAudit = JSON.parse(readFileSync('data/structure/android-content-audit.json', 'utf8')); const flutterAudit = JSON.parse(readFileSync('data/structure/flutter-content-audit.json', 'utf8')); const iosAudit = JSON.parse(readFileSync('data/structure/ios-content-audit.json', 'utf8')); @@ -82,6 +83,9 @@ const nonCommercialEvents = [ ]; const platformSymbolAliases = { + android: { + getConversationPinnedMsgs: 'getConversationPinnedMsg', + }, flutter: { getConversationGroupByConversationID: 'getConversationGroupIDsByConversationID', onHangup: 'OnHangUp', @@ -124,6 +128,11 @@ const partialCommercialConceptSources = { '/sdk/ios/calling/managing-calls/handle-call-events', '/sdk/ios/calling/retrieving-call-information/restore-pending-invitation', ], + '/sdk/android/calling/overview-calling': [ + '/sdk/android/calling/managing-calls/start-single-call', + '/sdk/android/calling/managing-calls/handle-call-events', + '/sdk/android/calling/retrieving-call-information/restore-pending-invitation', + ], }; const fullCommercialConceptPages = new Set([ @@ -141,6 +150,9 @@ const fullCommercialConceptPages = new Set([ '/sdk/ios/conversation/managing-conversations/set-message-destruct', '/sdk/ios/conversation/managing-conversations/set-message-destruct-time', '/sdk/ios/message/composing-messages/save-local-transcript', + '/sdk/android/conversation/managing-conversations/set-private-chat', + '/sdk/android/conversation/managing-conversations/set-burn-duration', + '/sdk/android/conversation/managing-conversations/set-message-destruct', ]); function applyCommercialConceptOverride(pagePath, info) { @@ -200,7 +212,7 @@ function getPageCommercialInfo(pagePath) { }; } - const match = pagePath.match(/^\/sdk\/(wasm|flutter|ios)(\/.*)$/); + const match = pagePath.match(/^\/sdk\/(android|wasm|flutter|ios)(\/.*)$/); if (!match) return { kind: 'none', methods: [], openSourceMethods: [], events: [] }; const platform = match[1]; @@ -209,7 +221,8 @@ function getPageCommercialInfo(pagePath) { return applyCommercialConceptOverride(pagePath, getWasmPageCommercialInfo(wasmPath)); } - const audit = platform === 'flutter' ? flutterAudit : iosAudit; + const audit = + platform === 'android' ? androidAudit : platform === 'flutter' ? flutterAudit : iosAudit; const page = audit.pages.find( (entry) => entry.currentPath === pagePath && entry.disposition !== 'omit', ); @@ -390,6 +403,12 @@ test('applies the WASM commercial presentation to verified Flutter and iOS capab assert.ok(flutterPinned.methods.includes('setConversationPinnedMsg')); assert.ok(flutterPinned.events.includes('onChangedPinnedMsg')); + const androidPinned = getPageCommercialInfo( + '/sdk/android/message/managing-messages/get-pinned-messages', + ); + assert.equal(androidPinned.kind, 'full'); + assert.ok(androidPinned.methods.includes('getConversationPinnedMsgs')); + const flutterTranscription = getPageCommercialInfo( '/sdk/flutter/message/composing-messages/transcribe-audio', ); @@ -414,6 +433,11 @@ test('marks calling overviews as mixed while preserving verified platform symbol assert.ok( iosOverview.methods.includes('getSignalingInvitationInfoStartAppWithOnSuccess:onFailure:'), ); + + const androidOverview = getPageCommercialInfo('/sdk/android/calling/overview-calling'); + assert.equal(androidOverview.kind, 'partial'); + assert.ok(androidOverview.methods.includes('signalingInvite')); + assert.ok(androidOverview.methods.includes('getSignalingInvitationInfoStartApp')); }); test('does not infer commercial presentation for absent or open-source native capabilities', () => { @@ -468,6 +492,24 @@ test('classifies mixed commercial pages', () => { getPageCommercialInfo('/sdk/wasm/group/group-applications/delete-group-requests').kind, 'full', ); + + for (const pagePath of [ + '/sdk/android/message/managing-messages/delete-saved-messages', + '/sdk/android/message/retrieving-messages/load-message-context', + '/sdk/android/message/managing-read-status/send-group-read-receipts', + '/sdk/android/message/managing-read-status/get-group-message-readers', + ]) { + assert.equal(getPageCommercialInfo(pagePath).kind, 'full'); + } + + assert.equal( + getPageCommercialInfo('/sdk/android/message/managing-messages/delete-user-messages').kind, + 'none', + ); + assert.equal( + getPageCommercialInfo('/sdk/android/message/composing-messages/update-typing-status').kind, + 'none', + ); }); test('matches commercial symbols in inline code text', () => { diff --git a/scripts/__tests__/wasm-full-capability-structure.test.mjs b/scripts/__tests__/wasm-full-capability-structure.test.mjs index 487b4c7b5a..61a9954201 100644 --- a/scripts/__tests__/wasm-full-capability-structure.test.mjs +++ b/scripts/__tests__/wasm-full-capability-structure.test.mjs @@ -655,16 +655,19 @@ test('the rendered WASM overview links only to active capability pages', () => { assert.match(source, /OpenIM WASM SDK 为浏览器应用/); }); -test('custom SDK overviews render for Chinese pages and the reviewed English WASM overview', () => { +test('custom SDK overviews render for Chinese pages and reviewed English WASM and Android overviews', () => { const source = readFileSync('src/components/docs/documentation-page.tsx', 'utf8'); + const overviewSource = readFileSync('src/components/docs/sdk-overview-page.tsx', 'utf8'); const wasmOverview = readFileSync( 'content/zh/docs/chat/sdk/wasm/overview.mdx', 'utf8', ); assert.match(source, /candidateSdkOverviewPlatform === 'wasm'/); + assert.match(source, /candidateSdkOverviewPlatform === 'android'/); assert.match(source, /'\/sdk\/flutter\/overview': 'flutter'/); assert.match(source, /'\/sdk\/ios\/overview': 'ios'/); assert.match(source, /'\/sdk\/wasm\/overview': 'wasm'/); + assert.match(overviewSource, /OpenIM Android SDK provides users, conversations, groups/); assert.equal(wasmOverview.replace(/^---\n[\s\S]*?\n---\n?/, '').trim(), ''); }); diff --git a/scripts/build-client-sdk-zh-content.mjs b/scripts/build-client-sdk-zh-content.mjs index 79331aea48..ab8744aca0 100644 --- a/scripts/build-client-sdk-zh-content.mjs +++ b/scripts/build-client-sdk-zh-content.mjs @@ -142,7 +142,7 @@ export function resolvePlatformRoutes({ platform, routesData, sidebar }) { suffix === 'overview' ? platform.id === 'wasm' ? structuralRoute.title - : `OpenIM SDK for ${platform.id === 'ios' ? 'iOS' : 'Flutter'}` + : `OpenIM SDK for ${platform.id === 'ios' ? 'iOS' : platform.id === 'android' ? 'Android' : 'Flutter'}` : structuralRoute.title, }; }); @@ -150,7 +150,7 @@ export function resolvePlatformRoutes({ platform, routesData, sidebar }) { async function main() { const requested = process.argv.slice(2).filter((value) => !value.startsWith('-')); - const platformIds = requested.length > 0 ? requested : ['ios', 'flutter', 'wasm']; + const platformIds = requested.length > 0 ? requested : ['android', 'ios', 'flutter', 'wasm']; for (const platformId of platformIds) { const output = await buildClientSdkLocalizedFile(platformId); console.log( diff --git a/scripts/check-client-sdk-content-audit.mjs b/scripts/check-client-sdk-content-audit.mjs index 22be4be8eb..c01690a538 100644 --- a/scripts/check-client-sdk-content-audit.mjs +++ b/scripts/check-client-sdk-content-audit.mjs @@ -169,6 +169,10 @@ function validateManualPage({ platform, page, path, source, errors }) { ) { errors.push(`${path}: content invents a Flutter listener removal API`); } + } else if (platform.id === 'android') { + if ((page.sdkMethods?.length ?? 0) > 0 && !source.includes('```java')) { + errors.push(`${path}: method page requires a Java example`); + } } } @@ -192,7 +196,7 @@ function extractDartCodeBlocks(source) { async function main() { const requested = process.argv.slice(2).filter((value) => !value.startsWith('-')); - const platformIds = requested.length > 0 ? requested : ['ios', 'flutter']; + const platformIds = requested.length > 0 ? requested : ['android', 'ios', 'flutter']; let failed = false; for (const platformId of platformIds) { const platform = getClientSdkPlatform(platformId); diff --git a/scripts/lib/client-sdk-platforms.mjs b/scripts/lib/client-sdk-platforms.mjs index b326948cdb..724b7d4f2e 100644 --- a/scripts/lib/client-sdk-platforms.mjs +++ b/scripts/lib/client-sdk-platforms.mjs @@ -1,4 +1,17 @@ const clientSdkPlatforms = { + android: { + id: 'android', + contextKey: 'chat/sdk/android', + routePrefix: '/sdk/android', + manualRoot: 'content/zh/docs/chat/sdk/android', + auditPath: 'data/structure/android-content-audit.json', + labelsPath: 'data/structure/android-navigation-labels.json', + sidebarPath: 'data/structure/android-sidebar.json', + localizedOutputPath: 'src/generated/android-sdk-zh-content.json', + sdkSourceKey: 'androidSdk', + sdkTag: 'v3.8.4.0', + sdkCommit: 'f82b142c7d3b4b66ce20586adabc69de9cd61673', + }, ios: { id: 'ios', contextKey: 'chat/sdk/ios', diff --git a/scripts/sync-client-sdk-route-skeletons.mjs b/scripts/sync-client-sdk-route-skeletons.mjs index 3618d34c98..6d7826555d 100644 --- a/scripts/sync-client-sdk-route-skeletons.mjs +++ b/scripts/sync-client-sdk-route-skeletons.mjs @@ -7,6 +7,60 @@ import { getClientSdkSidebarPaths } from './lib/client-sdk-sidebar.mjs'; const root = process.cwd(); +const androidRouteTitles = { + 'user/overview-user': 'User overview', + 'user/user-profile/get-users-info': 'Get specified user profiles', + 'user/user-profile/get-self-local-user-info': 'Get the current user profile', + 'user/user-profile/set-self-info': 'Update the current user profile', + 'user/user-profile/set-global-message-reception': 'Set global message reception', + 'user/friends/get-friend-list-page': 'Get the friend list by page', + 'user/friends/search-friends': 'Search friends', + 'user/friends/get-friends-info': 'Get specified friend profiles', + 'user/friends/check-friend': 'Check friendship', + 'user/friends/update-friends': 'Update friend profiles', + 'user/friends/delete-friend': 'Delete a friend', + 'user/friend-applications/add-friend': 'Send a friend request', + 'user/friend-applications/get-recv-friend-application-list': 'Get received friend requests', + 'user/friend-applications/get-send-friend-application-list': 'Get sent friend requests', + 'user/friend-applications/accept-friend-application': 'Accept a friend request', + 'user/friend-applications/refuse-friend-application': 'Reject a friend request', + 'user/blacklist/get-blacklist': 'Get the blacklist', + 'user/blacklist/add-blacklist': 'Block a user', + 'user/blacklist/remove-blacklist': 'Unblock a user', + 'user/online-status/subscribe-users-online-status': 'Subscribe to user online status', + 'user/online-status/get-subscribe-online-users-status': 'Get subscribed user online status', + 'user/online-status/unsubscribe-users-online-status': 'Unsubscribe from user status', + 'group/group-applications/overview-group-applications': 'Group applications overview', + 'group/retrieving-group-members/overview-retrieving-group-members': + 'Group member queries overview', + 'message/sending-messages/set-msg-send-progress-listener': 'Track message sending progress', + 'message/managing-messages/delete-saved-messages': 'Delete messages in a batch', + 'message/creating-messages/create-image-message': 'Create an image message', + 'message/creating-messages/create-image-message-by-file': + 'Create an image message from a local path', + 'message/creating-messages/create-image-message-by-url': + 'Create an image message from URLs', + 'message/creating-messages/create-sound-message': 'Create an audio message', + 'message/creating-messages/create-sound-message-by-file': + 'Create an audio message from a local path', + 'message/creating-messages/create-sound-message-by-url': + 'Create an audio message from a URL', + 'message/creating-messages/create-video-message': 'Create a video message', + 'message/creating-messages/create-video-message-by-file': + 'Create a video message from local paths', + 'message/creating-messages/create-video-message-by-url': + 'Create a video message from URLs', + 'message/creating-messages/create-file-message': 'Create a file message', + 'message/creating-messages/create-file-message-by-file': + 'Create a file message from a local path', + 'message/creating-messages/create-file-message-by-url': + 'Create a file message from a URL', + 'message/creating-messages/create-advanced-text-message': 'Create a rich-text message', + 'message/creating-messages/create-advanced-quote-message': 'Create a rich-text reply', + 'message/composing-messages/get-typing-status': 'Retrieve typing status', + 'file-uploads/track-file-upload-progress': 'Track file upload progress', +}; + const conversationGroupTitles = { ios: { 'conversation/managing-conversation-groups/overview-conversation-groups': @@ -55,13 +109,13 @@ const conversationGroupTitles = { }; export function resolveClientSdkRouteTitle({ platformId, suffix, baselineTitle }) { - if (suffix === 'overview') - return `OpenIM SDK for ${platformId === 'ios' ? 'iOS' : 'Flutter'}`; + if (suffix === 'overview') return `OpenIM SDK for ${getPlatformDisplayName(platformId)}`; + if (platformId === 'android' && androidRouteTitles[suffix]) return androidRouteTitles[suffix]; return conversationGroupTitles[platformId]?.[suffix] ?? baselineTitle; } export function buildClientSdkSkeleton({ path, platformId, title }) { - const platformName = platformId === 'ios' ? 'iOS' : 'Flutter'; + const platformName = getPlatformDisplayName(platformId); const template = path === `/sdk/${platformId}/overview` ? 'overview' : 'guide'; return `--- title: '${escapeSingleQuote(title)}' @@ -87,8 +141,10 @@ export function isGeneratedClientSdkSkeleton(source) { return ( /generatedBy:\s*['"]sync-client-sdk-route-skeletons['"]/.test(source) || (/status:\s*['"]draft['"]/.test(source) && - /context:\s*['"]chat\/sdk\/(?:ios|flutter)['"]/.test(source) && - /The English version of this OpenIM (?:iOS|Flutter) SDK guide is deferred/.test(source)) + /context:\s*['"]chat\/sdk\/(?:android|ios|flutter)['"]/.test(source) && + /The English version of this OpenIM (?:Android|iOS|Flutter) SDK guide is deferred/.test( + source, + )) ); } @@ -103,14 +159,15 @@ export function resolveClientSdkSkeletonRoutes({ platformId, sidebar, routes }) const suffix = path.replace(`/sdk/${platformId}/`, ''); const baseline = wasmBySuffix.get(suffix); const existing = routeByPath.get(path); - if (!baseline && !existing) + const extensionTitle = platformId === 'android' ? androidRouteTitles[suffix] : undefined; + if (!baseline && !existing && !extensionTitle) throw new Error(`[${platformId}] missing WASM baseline or platform extension: ${suffix}`); return { path, title: resolveClientSdkRouteTitle({ platformId, suffix, - baselineTitle: existing?.title ?? baseline.title, + baselineTitle: existing?.title ?? baseline?.title ?? extensionTitle, }), }; }); @@ -125,7 +182,8 @@ export function replaceClientSdkRouteRecords({ platformId, sidebar, routes }) { const otherRoutes = routes.filter((route) => route.contextKey !== platform.contextKey); const baseId = Math.max(...otherRoutes.map((route) => route.id)) + 1; const baseSourceIndex = Math.max(...otherRoutes.map((route) => route.sourceIndex)) + 1; - const contextTitle = `SDKs · ${platformId === 'ios' ? 'iOS' : 'Flutter'} · v4`; + const platformName = getPlatformDisplayName(platformId); + const contextTitle = `SDKs · ${platformName} · v4`; const wasmBySuffix = new Map( routes .filter((route) => route.contextKey === 'chat/sdk/wasm') @@ -136,12 +194,13 @@ export function replaceClientSdkRouteRecords({ platformId, sidebar, routes }) { const suffix = path.replace(`${platform.routePrefix}/`, ''); const baseline = wasmBySuffix.get(suffix); const template = baseline ?? existingByPath.get(path); - if (!template) + const extensionTitle = platformId === 'android' ? androidRouteTitles[suffix] : undefined; + if (!template && !extensionTitle) throw new Error(`[${platformId}] missing WASM baseline or platform extension: ${suffix}`); const title = resolveClientSdkRouteTitle({ platformId, suffix, - baselineTitle: template.title, + baselineTitle: template?.title ?? extensionTitle, }); return { ...template, @@ -150,10 +209,14 @@ export function replaceClientSdkRouteRecords({ platformId, sidebar, routes }) { relativePath: `sdk/${platformId}/${suffix}`, sourcePath: path, title, - description: `OpenIM ${platformId === 'ios' ? 'iOS' : 'Flutter'} SDK guide for ${title}.`, + description: `OpenIM ${platformName} SDK guide for ${title}.`, + product: 'sdk', + version: 'v4', platform: platformId, contextKey: platform.contextKey, contextTitle, + template: template?.template ?? 'guide', + status: template?.status ?? 'draft', sourceIndex: baseSourceIndex + index, contentFile: `content/docs/chat/sdk/${platformId}/${suffix}.mdx`, navOrder: baseNavOrder + index, @@ -167,7 +230,7 @@ export function replaceClientSdkRouteRecords({ platformId, sidebar, routes }) { async function main() { const requested = process.argv.slice(2).filter((value) => !value.startsWith('-')); - const platformIds = requested.length > 0 ? requested : ['ios', 'flutter']; + const platformIds = requested.length > 0 ? requested : ['android', 'ios', 'flutter']; let routes = await readJson('src/generated/routes.json'); for (const platformId of platformIds) { @@ -242,6 +305,12 @@ async function readJson(relativePath) { return JSON.parse(await readFile(resolve(root, relativePath), 'utf8')); } +function getPlatformDisplayName(platformId) { + if (platformId === 'ios') return 'iOS'; + if (platformId === 'android') return 'Android'; + return 'Flutter'; +} + function escapeSingleQuote(value) { return value.replaceAll("'", "''"); } diff --git a/scripts/sync-content-metadata.mjs b/scripts/sync-content-metadata.mjs index 67a9b43679..a67ed1c988 100644 --- a/scripts/sync-content-metadata.mjs +++ b/scripts/sync-content-metadata.mjs @@ -10,6 +10,7 @@ import { const root = process.cwd(); const routesPath = resolve(root, 'src/generated/routes.json'); const navigationPath = resolve(root, 'src/generated/navigation.json'); +const structurePath = resolve(root, 'data/structure/chat-pages.json'); const routes = JSON.parse(await readFile(routesPath, 'utf8')); const navigation = JSON.parse(await readFile(navigationPath, 'utf8')); const clientSdkSidebars = new Map( @@ -92,7 +93,8 @@ for (const context of navigation.contexts) { for (const platformId of clientSdkPlatformIds) { if (sidebarDecisions.get(platformId).mode === 'skip') { const pageCount = getClientSdkSidebarPaths(clientSdkSidebars.get(platformId)).length; - const platformName = platformId === 'ios' ? 'iOS' : 'Flutter'; + const platformName = + platformId === 'ios' ? 'iOS' : platformId === 'android' ? 'Android' : 'Flutter'; console.log( `Skipped ${platformName} client SDK sidebar sync: native route tree has not migrated to all ${pageCount} reviewed paths.`, ); @@ -102,6 +104,22 @@ for (const platformId of clientSdkPlatformIds) { await Promise.all([ writeFile(routesPath, `${JSON.stringify(routes, null, 2)}\n`, 'utf8'), writeFile(navigationPath, `${JSON.stringify(navigation, null, 2)}\n`, 'utf8'), + writeFile( + structurePath, + `${JSON.stringify( + routes.map((route) => ({ + sourcePath: route.sourcePath, + openimPath: route.path, + title: route.title, + context: route.contextKey, + template: route.template, + contentFile: route.contentFile, + })), + null, + 2, + )}\n`, + 'utf8', + ), ]); console.log(`Synchronized content metadata (${changed.toLocaleString()} changed fields).`); diff --git a/src/components/docs/documentation-page.tsx b/src/components/docs/documentation-page.tsx index 460333bc88..45cd87f1b8 100644 --- a/src/components/docs/documentation-page.tsx +++ b/src/components/docs/documentation-page.tsx @@ -212,7 +212,9 @@ export async function renderDocumentationPage( const candidateSdkOverviewPlatform = getSdkOverviewPlatform(effectiveRoute.path); const sdkOverviewPlatform = - locale === 'zh' || candidateSdkOverviewPlatform === 'wasm' + locale === 'zh' || + candidateSdkOverviewPlatform === 'wasm' || + candidateSdkOverviewPlatform === 'android' ? candidateSdkOverviewPlatform : undefined; @@ -291,6 +293,7 @@ export async function renderDocumentationPage( function getSdkOverviewPlatform(path: string): SdkOverviewPlatform | undefined { const overviewPaths: Record = { + '/sdk/android/overview': 'android', '/sdk/flutter/overview': 'flutter', '/sdk/ios/overview': 'ios', '/sdk/wasm/overview': 'wasm', diff --git a/src/components/docs/sdk-overview-page.tsx b/src/components/docs/sdk-overview-page.tsx index 8463905f94..6649482ee1 100644 --- a/src/components/docs/sdk-overview-page.tsx +++ b/src/components/docs/sdk-overview-page.tsx @@ -24,7 +24,7 @@ type ResourceLink = { title: string; }; -export type SdkOverviewPlatform = 'flutter' | 'ios' | 'wasm'; +export type SdkOverviewPlatform = 'android' | 'flutter' | 'ios' | 'wasm'; type OverviewCopy = { eyebrow: string; @@ -211,6 +211,54 @@ const copy = { } satisfies Record; const mobileCopy = { + android: { + eyebrow: 'Version 4', + intro: + 'OpenIM Android SDK 为原生 Android 应用提供用户、会话、群组、消息、实时事件和本地存储能力。先完成 Android 工程配置与登录,再通过各 manager 的 API 和 listener 把业务数据接入应用状态。', + mostPopular: '热门主题', + recommended: '推荐功能', + resources: '资源', + popular: createMobilePopularCards('android'), + features: [ + { + title: '用户认证', + description: '使用后端签发的 Token 登录,并处理连接、过期和被踢下线事件。', + href: '/sdk/android/getting-started/authenticate-and-manage-session', + }, + { + title: '群组', + description: '管理群资料、群成员、入群申请、权限和群组事件。', + href: '/sdk/android/group/overview-group', + }, + { + title: '事件', + description: '注册各 manager 的 listener,并按稳定标识合并增量数据。', + href: '/sdk/android/events/overview-events', + }, + ], + links: [ + { + title: '发送第一条消息', + description: '完成接入、初始化、登录、选择目标并发送消息。', + href: '/sdk/android/getting-started/send-first-message', + }, + { + title: 'Android 环境接入', + description: '配置 Android 工程、SDK 初始化、网络权限和应用数据目录。', + href: '/sdk/android/getting-started/environment-specific-implementation', + }, + { + title: '日志与诊断', + description: '配置 SDK 日志,并保留错误码和错误信息用于诊断。', + href: '/sdk/android/logger', + }, + { + title: '客户端 SDK 错误码', + description: '查询通用客户端错误码,并按错误来源选择处理方式。', + href: '/sdk/error-codes', + }, + ], + }, flutter: { eyebrow: 'Version 4', intro: @@ -309,6 +357,102 @@ const mobileCopy = { }, } satisfies Record, OverviewCopy>; +const androidEnglishCopy = { + eyebrow: 'Version 4', + intro: + 'OpenIM Android SDK provides users, conversations, groups, messages, realtime events, and local storage for native Android applications. Configure the Android project and sign in first, then connect business data to application state through manager APIs and listeners.', + mostPopular: 'Most popular', + recommended: 'Recommended features', + resources: 'Resources', + popular: [ + { + title: 'Manage conversations', + description: + 'Configure conversation state, drafts, unread counts, hiding, and deletion.', + href: '/sdk/android/conversation/overview-conversation', + visual: 'migration', + }, + { + title: 'Unread message count', + description: + 'Read conversation unread counts and synchronize chat lists, badges, and global unread state.', + href: '/sdk/android/conversation/managing-conversations/mark-conversation-read', + visual: 'unread', + }, + { + title: 'Conversation read status', + description: + 'Clear conversation unread counts and handle one-to-one message read receipts.', + href: '/sdk/android/conversation/managing-conversations/mark-conversation-read', + visual: 'receipt', + }, + { + title: 'Send messages', + description: 'Create text, file, or custom messages and send them to users or groups.', + href: '/sdk/android/message/sending-messages/send-message', + visual: 'message', + }, + { + title: 'Receive messages', + description: + 'Subscribe to new-message events and merge incremental messages into application state.', + href: '/sdk/android/message/receiving-messages/receive-messages', + visual: 'events', + }, + { + title: 'Message history', + description: + 'Retrieve local and synchronized message history with conversation identifiers and message cursors.', + href: '/sdk/android/message/retrieving-messages/load-older-messages', + visual: 'history', + }, + ], + features: [ + { + title: 'Authentication', + description: + 'Sign in with a backend-issued token and handle connection, expiration, and forced-logout events.', + href: '/sdk/android/getting-started/authenticate-and-manage-session', + }, + { + title: 'Groups', + description: + 'Manage group profiles, members, applications, permissions, and group events.', + href: '/sdk/android/group/overview-group', + }, + { + title: 'Events', + description: + 'Register listeners on each manager and merge incremental data by stable identifiers.', + href: '/sdk/android/events/overview-events', + }, + ], + links: [ + { + title: 'Send your first message', + description: 'Complete integration, initialization, sign-in, target selection, and sending.', + href: '/sdk/android/getting-started/send-first-message', + }, + { + title: 'Android integration', + description: + 'Configure the Android project, SDK initialization, network permissions, and application data directory.', + href: '/sdk/android/getting-started/environment-specific-implementation', + }, + { + title: 'Logging and diagnostics', + description: + 'Configure SDK logging and retain error codes and messages for diagnosis.', + href: '/sdk/android/logger', + }, + { + title: 'Client SDK error codes', + description: 'Look up common client errors and choose a handling path by error source.', + href: '/sdk/error-codes', + }, + ], +} satisfies OverviewCopy; + function createMobilePopularCards( platform: Exclude, ): OverviewCard[] { @@ -373,7 +517,12 @@ export function SdkOverviewPage({ route: RouteRecord; showVersion: boolean; }) { - const text = platform === 'wasm' ? copy[locale] : mobileCopy[platform]; + const text = + platform === 'wasm' + ? copy[locale] + : platform === 'android' && locale === 'en' + ? androidEnglishCopy + : mobileCopy[platform]; return (
diff --git a/src/components/mdx/hero-product-image.tsx b/src/components/mdx/hero-product-image.tsx new file mode 100644 index 0000000000..db83113dc4 --- /dev/null +++ b/src/components/mdx/hero-product-image.tsx @@ -0,0 +1,32 @@ +'use client'; + +import Image from 'next/image'; +import { useSyncExternalStore } from 'react'; +import { useTheme } from 'fumadocs-ui/provider/base'; + +const subscribeToHydration = () => () => {}; + +export function HeroProductImage() { + const { resolvedTheme } = useTheme(); + const hydrated = useSyncExternalStore( + subscribeToHydration, + () => true, + () => false, + ); + const source = + hydrated && resolvedTheme === 'dark' + ? '/brand/openimsdk-im-hero-dark.png' + : '/brand/openimsdk-im-hero-light.png'; + + return ( + + ); +} diff --git a/src/components/mdx/landing.tsx b/src/components/mdx/landing.tsx index aec07a8154..bb0f9e64bc 100644 --- a/src/components/mdx/landing.tsx +++ b/src/components/mdx/landing.tsx @@ -1,5 +1,6 @@ import Link from 'next/link'; import type { ReactNode } from 'react'; +import { HeroProductImage } from '@/src/components/mdx/hero-product-image'; import { CodeIcon, LayoutIcon, ServerIcon } from '@/src/components/ui/icons'; import type { Locale } from '@/src/lib/i18n'; import { toLocalizedPath } from '@/src/lib/i18n'; @@ -838,7 +839,6 @@ export function ChatHero({ secondaryHref, } : { eyebrow, title, description, primaryLabel, primaryHref, secondaryLabel, secondaryHref }; - return (