Callback Delegates

FlyCompletionHandler#

FlyCompletionHandler is used as a base callback block for most of the IO operations.

public typealias FlyCompletionHandler = (_ isSuccess: Bool,_ error: FlyError? , _ data : [String: Any]) -> Void

Observe Chat Connection#

To observe the chat connection status you must adopt a protocol 'ConnectionEventDelegate' through ChatManager

extension YourViewControleler : ConnectionEventDelegate {
func onConnected() {
// Write your success logic here to navigate Profile Page or
// To Start your one-one chat with your friends
}
func onDisconnected() {
// Connection disconnected
}
func onConnectionFailed(error: FlyError) {
// Connection Not authorized or Unable to establish connection with server
}
func onReconnecting() {
// Automatic reconnection enabled
}
}
ChatManager.shared.connectionDelegate = self

Observe Profile Events#

To observe profile related events you can must adopt a protocol 'ProfileEventsDelegate' through ContactsManager

Example:

extension YourViewControleler : ProfileEventsDelegate {
func usersProfilesFetched() {}
func userBlockedMe(jid : String) {}
func userUnBlockedMe(jid : String) {}
func userUpdatedTheirProfile(for jid : String, profileDetails:ProfileDetails) {}
func myProfileUpdated() {}
func userCameOnline(for jid : String) {}
func userWentOffline(for jid : String) {}
func usersBlockedMeListFetched(jidList : [String]) {}
func usersIBlockedListFetched(jidList : [String]) {}
func blockedThisUser(jid : String) {}
func unblockedThisUser(jid : String) {}
func hideUserLastSeen() {}
func getUserLastSeen() {}
func userDeletedTheirProfile(for : String, profileDetails:ProfileDetails) {}
}
ContactManager.shared.profileDelegate = self

Contacts Profiles Fetched.#

If the client application has mobile number as the primary identifier of the user and enabled contact sync they can fetch their contacts data and its completion is triggered in the following callbacks.

ContactManager.getRoster() //Start fetching the users data asynchronously
@Override
public void usersProfilesFetched() {
// User Profiles Fetching done Update the UI
}

User blocked you#

If a user blocked you then the following method will be triggered in the ProfileEventsDelegate.

public func userBlockedMe(jid: String) { {
//jid will be user's Jid who blocked you
}

User unblocked you#

If a user unblocked you then the following method will be triggered in the ProfileEventsDelegate.

@Override
public void userUnBlockedMe(@NotNull String jid) {
//jid will be user's Jid who unblocked you
}

User Updated his profile#

If a user updated his profile then the following method will be triggered in the ProfileEventsDelegate.

public func userUpdatedTheirProfile(for jid: String, profileDetails: ProfileDetails) {
//jid will be user's Jid who updated his profile
}

My Profile update status#

Once you initiated the update for your profile its status will be triggered by the following method in the ProfileEventsDelegate.

func myProfileUpdated() {
}

User came online#

If a user came online then the following method will be triggered in the ProfileEventsDelegate.

func userCameOnline(for jid : String) () {
//jid will be user's Jid who just came online
}

User went offine#

If a user went offline then the following method will be triggered in the ProfileEventsDelegate.

func userWentOffline(for jid : String) {
//jid will be user's Jid who just went offline
}

Users blocked me list callback#

When called to get the users who blocked me then the following method will be triggered in the ProfileEventsDelegate.

func usersBlockedMeListFetched(jidList : [String]) {
//jidList will be list of user's Jid who blocked you
}

Users i blocked list callback#

When called to get the users who i blocked then the following method will be triggered in the ProfileEventsDelegate.

func usersIBlockedListFetched(jidList : [String]) {
//jidList will be list of user's Jid who i blocked
}

User profile fetched#

When called to get the profile detatil of a user from the server then the following method will be triggered in the ProfileEventsDelegate.

@Override
func userProfileFetched(for jid:String, profileDetails:ProfileDetails?) {
//profileDetails will be the ProfileDetails object of the requested user
}

Block a user#

When called to block a user then the following method will be triggered in the ProfileEventsDelegate.

func blockedThisUser(jid : String) {
//jid will be user's Jid who i blocked just now
}

UnBlock a user#

When called to unblock a user then the following method will be triggered in the ProfileEventsDelegate.

func unblockedThisUser(jid : String) {
//jid will be user's Jid who i unblocked just now
}

User profile deleted#

When other user deleted their profile then the following method will be triggered in the ProfileEventsDelegate.

func userDeletedTheirProfile(for : String, profileDetails: ProfileDetails) {
//jid will be user's Jid who i unblocked just now
}

Observe Group Events#

To observe group related events you must adopt a protocol GroupEventsDelegate

Example:

GroupManager.shared.groupDelegate = self
func didDeleteGroupLocally(groupJid: String) {
}
func didReceiveGroupNotificationMessage(message: ChatMessage) {
}
func didLeftFromGroup(groupJid: String, leftUserJid: String) {
}
func didRemoveMemberFromAdmin(groupJid: String, removedAdminMemberJid: String, removedByMemberJid: String) {
}
func didMakeMemberAsAdmin(groupJid: String, newAdminMemberJid: String, madeByMemberJid: String) {
}
func didFetchGroups(groups: [ProfileDetails]) {
}
func didFetchGroupMembers(groupJid: String) {
}
func didRemoveMemberFromGroup(groupJid: String, removedMemberJid: String, removedByMemberJid: String) {
}
func didAddNewMemeberToGroup(groupJid: String, newMemberJid: String, addedByMemberJid: String) {
}
func didCreateGroup(groupJid : String) {
}
func didFetchGroupProfile(groupJid: String) {
}
func didUpdateGroupProfile(groupJid: String) {
}

Group Profile Fetched#

When the request for fetching a group profile is completed successfully this delegate will be triggered.

func didFetchGroupProfile(groupJid: String) {
//Group profile data fetched successfully
}

Group notification message received#

When events like new member added or member removed a notification message will be generated locally and inserted in the local database. After insertion this delegate will be triggered.

func didReceiveGroupNotificationMessage(message: ChatMessage) {
//Group Notification message received
}

New group created#

When a new group was created like when someone added you to a group this delegate will be triggered.

func didCreateGroup(groupJid: String) {
//New group created
}

Group profile updated#

When a group profile is updated this delegate will be triggered.

func didUpdateGroupProfile(groupJid: String) {
//Group profile updated
}

New member added to group#

When a new member is added to the group this delegate will be triggered.

func didAddNewMemeberToGroup(groupJid: String, newMemberJid: String, addedByMemberJid: String) {
//New member added to a group successfully
}

Member removed from group#

When a member is removed from the group this delegate will be triggered.

func didRemoveMemberFromGroup(groupJid: String, removedMemberJid: String, removedByMemberJid: String) {{
// A group member was removed
}

Fetching group members#

When a group is created, members of that group will be fetched once sucessfully fetched this delegate will be triggered.

func didFetchGroupMembers(groupJid: String) {{
// Members of a group fetched successfully
}

Group member became an admin#

When a group member became an admin this delegate will be triggered.

func didMakeMemberAsAdmin(groupJid: String, newAdminMemberJid: String, madeByMemberJid: String) {
// A group member was made an admin
}

Admin access revoked#

When a group member's admin access is revoked this delegate will be triggered.

func didRemoveMemberFromAdmin(groupJid: String, removedAdminMemberJid: String, removedByMemberJid: String) {
// A group admin access was revoked
}

Member left from the group#

When a member left the group this delegate will be triggered.

func didLeftFromGroup(groupJid: String, leftUserJid: String) { {
// A group member left from the group
}

Group deleted locally#

When the current user delete a group locally this delegate will be triggered.

func didDeleteGroupLocally(groupJid: String) {
// A group was deleted locally
}

Observing the message events#

You need to conform the MessageEventsDelegate protocol to observe all the message related events, so that you can update the UI immediately based on the message events.Once you have sent the message via sdk, you will get the callbacks for message status events.You can attach your own listener by using the below method. This is common for both single chat and groups.

tip

There can be only one message listener at a time, if you set multiple times using the below method it will always replace the old listener.

@objc public protocol MessageEventsDelegate : NSObjectProtocol {
/**
Called when the a new message is received in all types of chat
*/
func onMessageReceived(message : ChatMessage, chatJid: String)
/**
Called when the receipts from the other users or server for a particular message sent by you or received by you is updated.
*/
func onMessageStatusUpdated(messageId: String, chatJid: String, status : MessageStatus)
/**
Called when upload or download of a media file is completed successfully
*/
func onMediaStatusUpdated(message : ChatMessage)
/**
Called when upload or download of a media file is failed
*/
func onMediaStatusFailed(error : String, messageId: String, errorCode: Int)
/**
Called when the progress of upload or download of a media file is changed
*/
func onMediaProgressChanged(message: ChatMessage, progressPercentage: Float)
/**
Called when the message/conversation deleted for the chat user.
*/
func onMessagesClearedOrDeleted(messageIds: Array<String>)
/**
Called when the message/conversation deleted for everyone.
*/
func onMessagesDeletedforEveryone(messageIds: Array<String>)
/**
Called whenever a notification needed to be shown or updated or cancelled
*/
func showOrUpdateOrCancelNotification()
/**
Called whenever messages are cleared
*/
func onMessagesCleared(toJid: String, deleteType: String?)
/**
Called on set or update or remove all favourite messages
*/
func setOrUpdateFavourite(messageId: String, favourite: Bool, removeAllFavourite: Bool)
/**
Called when an incoming message is being translated
*/
func onMessageTranslated(message: ChatMessage, jid: String)
/**
Called when user cleared all conversations
*/
func clearAllConversationForSyncedDevice()
}
info

For group, message status will be updated only if all the participants sent the delivery/seen status.

Observe User Busy Status#

To observe the status of user is busy or not, And to get the busy message must adopt a protocol 'UserBusyStatusDelegate' through ChatManager

    extension YourViewControleler : UserBusyStatusDelegate {
    func didUpdateBusyStatus(status: Bool, message: String) {
    // Called whenever Busy status updated
    }
    }
    ChatManager.shared.userBusyStatusDelegate = self

    Handling Banned User/Group#

    Current User#

    To observe current user blocking/unblocking, confirm to AdminBlockCurrentUserDelegate

    public protocol AdminBlockCurrentUserDelegate : NSObjectProtocol {
    // Called when current user is blocked or unblocked
    func didBlockOrUnblockCurrentUser(userJid : String, isBlocked : Bool)
    func didBlockOrUnblockGroup(groupJid : String, isBlocked : Bool)
    func didBlockOrUnblockContact(userJid : String, isBlocked : Bool)
    }

    Contacts and Group#

    To observe contact and group blocking/unblocking, confirm to AdminBlockDelegate

    public protocol AdminBlockDelegate : NSObjectProtocol {
    // Called when contact is blocked or unblocked
    func didBlockOrUnblockContact(userJid : String, isBlocked : Bool)
    // Called when current user is blocked or unblocked
    func didBlockOrUnblockSelf(userJid : String, isBlocked : Bool)
    // Called when group is blocked or unblocked
    func didBlockOrUnblockGroup(groupJid : String, isBlocked : Bool)
    }

    Observing the Archive Chats events#

    To observe chat Archive/Unarchive, confirm to ArchiveEventsDelegate

    public protocol ArchiveEventsDelegate : NSObjectProtocol {
    /**
    When the Recent Chat Archive/UnArchive by user this callback will be triggered.
    */
    func updateArchiveUnArchiveChats(toUser : String, archiveStatus: Bool)
    /**
    When a user click on Archive Settings option this callback will be triggered.
    */
    func updateArchivedSettings(archivedSettingsStatus: Bool)
    }

    Observing the all Incoming Message Notifications on Foreground#

    To observe all Incoming Message Notifications on Foreground, confirm to LocalNotificationDelegate in AppDelegate

    public protocol LocalNotificationDelegate : NSObjectProtocol {
    /**
    When the user receives any message in foreground this callback will be triggered.
    */
    func showOrUpdateOrCancelNotification(jid: String, chatMessage: ChatMessage, groupId:String)
    }

    Observing the Backup Chats events#

    To observe backup chat progress, confirm to BackupEventDelegate

    public protocol BackupEventDelegate : NSObjectProtocol {
    /**
    When the Backup started this callback will be triggered.
    */
    func backupProgressDidReceive(completedCount: String, completedSize: String)
    /**
    When the Backup finished this callback will be triggered.
    */
    func backupDidFinish(fileUrl: String)
    /**
    When the Backup failed this callback will be triggered.
    */
    func backupDidFailed(errorMessage: String)
    }

    Observing the Restore Chats events#

    To observe restore chat progress, confirm to RestoreEventDelegate

    public protocol RestoreEventDelegate : NSObjectProtocol {
    /**
    When the Restore started this callback will be triggered.
    */
    func restoreProgressDidReceive(completedCount: Double, completedPercentage: String, completedSize: String)
    /**
    When the Restore finished this callback will be triggered.
    */
    func restoreDidFinish()
    /**
    When the Restore failed this callback will be triggered.
    */
    func restoreDidFailed(errorMessage: String)
    }