Community and channel events
Use ChannelHandler to receive community channel events and general channel sync events. This single interface covers:
- Community channel list sync and sub-channel events (type changes, user kicks, deletions)
- General channel sync status (remote channel list, channel status)
- Per-channel setting changes synced from other devices (pinned, do-not-disturb, translate strategy)
- Typing status notifications
Register and remove the handler
- Kotlin
- Java
kotlin
// Register
NCEngine.addChannelHandler("CHANNEL_HANDLER", object : ChannelHandler {
override fun onChannelStatusSyncCompleted(event: ChannelStatusSyncCompletedEvent) { /* ... */ }
})
// Remove
NCEngine.removeChannelHandler("CHANNEL_HANDLER")
Java
// Register
NCEngine.addChannelHandler("CHANNEL_HANDLER", new ChannelHandler() {
@Override
public void onChannelStatusSyncCompleted(@NonNull ChannelStatusSyncCompletedEvent event) { /* ... */ }
});
// Remove
NCEngine.removeChannelHandler("CHANNEL_HANDLER");
Sync events
- Kotlin
- Java
kotlin
NCEngine.addChannelHandler("CHANNEL_SYNC_HANDLER", object : ChannelHandler {
// All channel status data sync completed
override fun onChannelStatusSyncCompleted(event: ChannelStatusSyncCompletedEvent) {
if (event.error == null) {
// Sync succeeded — refresh UI
}
}
// Remote channel list sync completed
override fun onRemoteChannelsSyncCompleted(event: RemoteChannelsSyncCompletedEvent) {
if (event.error == null) {
// Remote channels pulled from server
}
}
// Community channel list and latest messages sync completed
override fun onCommunityChannelsSyncCompleted(event: CommunityChannelsSyncCompletedEvent) {
// Community channel list is ready
}
// Channel pinned status changed on another device
override fun onChannelPinnedSync(event: ChannelPinnedSyncEvent) {
println("Channel ${event.channelIdentifier.channelId} pinned: ${event.isPinned}")
}
// Channel do-not-disturb level changed on another device
override fun onChannelNoDisturbLevelSync(event: ChannelNoDisturbLevelSyncEvent) {
println("Channel ${event.channelIdentifier.channelId} DND level: ${event.level}")
}
// Channel translation strategy changed on another device
override fun onChannelTranslateStrategySync(event: ChannelTranslateStrategySyncEvent) {
println("Channel ${event.channelIdentifier.channelId} translate strategy: ${event.strategy}")
}
// Typing status changed in a channel
override fun onTypingStatusChanged(event: TypingStatusChangedEvent) {
// event.channelIdentifier — channel identifier
// event.userTypingStatus — list of users currently typing (empty = stopped)
for (status in event.userTypingStatus) {
println("User ${status.userId} is typing")
}
}
})
Java
NCEngine.addChannelHandler("CHANNEL_SYNC_HANDLER", new ChannelHandler() {
@Override
public void onChannelStatusSyncCompleted(@NonNull ChannelStatusSyncCompletedEvent event) {
if (event.getError() == null) {
// Sync succeeded
}
}
@Override
public void onRemoteChannelsSyncCompleted(@NonNull RemoteChannelsSyncCompletedEvent event) {
if (event.getError() == null) {
// Remote channels ready
}
}
@Override
public void onCommunityChannelsSyncCompleted(@NonNull CommunityChannelsSyncCompletedEvent event) {
// Community channel list ready
}
@Override
public void onChannelPinnedSync(@NonNull ChannelPinnedSyncEvent event) {
System.out.println("Pinned: " + event.isPinned());
}
@Override
public void onChannelNoDisturbLevelSync(@NonNull ChannelNoDisturbLevelSyncEvent event) {
System.out.println("DND level: " + event.getLevel());
}
@Override
public void onChannelTranslateStrategySync(@NonNull ChannelTranslateStrategySyncEvent event) {
System.out.println("Translate strategy: " + event.getStrategy());
}
@Override
public void onTypingStatusChanged(@NonNull TypingStatusChangedEvent event) {
for (ChannelUserTypingStatusInfo status : event.getUserTypingStatus()) {
System.out.println("User " + status.getUserId() + " is typing");
}
}
});
Community sub-channel events
- Kotlin
- Java
kotlin
NCEngine.addChannelHandler("COMMUNITY_HANDLER", object : ChannelHandler {
// Sub-channel changed between public and private
override fun onCommunitySubChannelTypeChanged(event: CommunitySubChannelTypeChangedEvent) {
for (info in event.info) {
// info.channelIdentifier — sub-channel identifier
// info.changeType — CommunitySubChannelChangeType
println("Sub-channel type changed: ${info.changeType}")
}
}
// Current user was kicked from a private sub-channel
override fun onCommunitySubChannelUserKicked(event: CommunitySubChannelUserKickedEvent) {
for (info in event.info) {
// info.channelIdentifier — sub-channel identifier
// info.userId — kicked user ID
println("Kicked from sub-channel: ${info.userId}")
}
}
// A sub-channel was deleted
override fun onCommunitySubChannelDeleted(event: CommunitySubChannelDeletedEvent) {
for (info in event.info) {
// info.channelIdentifier — community channel identifier
// info.subChannelType — CommunitySubChannelType (PUBLIC or PRIVATE)
// info.operationTime — deletion timestamp (ms)
println("Sub-channel deleted at ${info.operationTime}")
}
}
})
Java
NCEngine.addChannelHandler("COMMUNITY_HANDLER", new ChannelHandler() {
@Override
public void onCommunitySubChannelTypeChanged(@NonNull CommunitySubChannelTypeChangedEvent event) {
for (CommunitySubChannelTypeChangedInfo info : event.getInfo()) {
System.out.println("Sub-channel type changed: " + info.getChangeType());
}
}
@Override
public void onCommunitySubChannelUserKicked(@NonNull CommunitySubChannelUserKickedEvent event) {
for (CommunitySubChannelUserKickedInfo info : event.getInfo()) {
System.out.println("Kicked: " + info.getUserId());
}
}
@Override
public void onCommunitySubChannelDeleted(@NonNull CommunitySubChannelDeletedEvent event) {
for (CommunitySubChannelDeletedInfo info : event.getInfo()) {
System.out.println("Deleted at: " + info.getOperationTime());
}
}
});
Callback reference
| Callback | Event type | Trigger |
|---|---|---|
onChannelStatusSyncCompleted | ChannelStatusSyncCompletedEvent | All channel status data sync completed. Check event.error for failure. |
onRemoteChannelsSyncCompleted | RemoteChannelsSyncCompletedEvent | Remote channel list pulled from server. Check event.error for failure. |
onCommunityChannelsSyncCompleted | CommunityChannelsSyncCompletedEvent | Community channel list and latest messages synced. |
onChannelPinnedSync | ChannelPinnedSyncEvent | Channel pinned status changed on another device. |
onChannelNoDisturbLevelSync | ChannelNoDisturbLevelSyncEvent | Channel DND level changed on another device. |
onChannelTranslateStrategySync | ChannelTranslateStrategySyncEvent | Channel translation strategy changed on another device. |
onTypingStatusChanged | TypingStatusChangedEvent | Users started or stopped typing. userTypingStatus is empty when all stopped. |
onCommunitySubChannelTypeChanged | CommunitySubChannelTypeChangedEvent | Sub-channel changed between public and private. Iterate event.info. |
onCommunitySubChannelUserKicked | CommunitySubChannelUserKickedEvent | User kicked from a private sub-channel. Iterate event.info. |
onCommunitySubChannelDeleted | CommunitySubChannelDeletedEvent | One or more sub-channels deleted. Iterate event.info. |
For more on community channel management, see Community channels.