logo
In-app Chat
SDK Error Codes
On this page

User status management


Note

To use this feature, please subscribe to the Enterprise Plan.

Feature overview

User status includes user online status and custom status:

  • User online status ( ZIMUserOnlineStatus ): This can be divided into three states - online, offline, and logged out, as defined by ZIM. These states cannot be modified by developers.
    • Online: When the login interface is actively called and a network connection is maintained, the user's status changes to online.
    • Logged out: After actively calling the logout interface, the user's status changes to logged-out state.
    • Offline: After calling the login interface, if the app is force-closed, the screen is locked, or it is moved to the background causing the network connection to break, the user's status changes to offline.
  • Custom status: You can define your own statuses as needed, such as Do Not Disturb, Busy, etc.

This article explains how to set a custom status, as well as how to subscribe to and query user statuses.

Set custom status

You can set a custom status using any of the following methods:

Note
  • The maximum length of customStatus is 64 bytes, and it is valid for 1 day.
  • The frequency limit for the updateUserCustomStatus interface is 1 time/second.
Set on Login
Update Custom Status
ZIMLoginConfig config = new ZIMLoginConfig();
conifg.customStatus = "Busy" // Default is an empty string. If it's an empty string, the user's custom status will not be modified during login.
1
Copied!
ZIM.getInstance().updateUserCustomStatus("Do Not Disturb", new ZIMUserCustomStatusUpdatedCallback() {
    @Override
    public void onUserCustomStatusUpdated(String customStatus, ZIMError errorInfo) {

    }
});
1
Copied!

Subscribe to user status

To continuously monitor the status of certain users, you can call the subscribeUsersStatus interface. Pass the target user IDs in batches to the parameter userIDs (up to 100 registered users, excluding the subscriber themselves). In the config, pass the subscriptionDuration (the duration for which the subscription is valid, during which the user status changes of the target users will be continuously monitored), thereby adding the subscription of the target users' user status to the current user's subscription list.

Note
  • A single user can subscribe to a maximum of 3,000 people. When the number of subscribed users exceeds 3,000, the earliest subscribed users will be overwritten.
  • After subscribing to other users' user statuses, even if the user logs out and relogs into the ZIM SDK within the subscriptionDuration, the subscription remains valid, and there is no need to call the subscription method again.
Untitled
ZIMUserStatusSubscribeConfig config = new ZIMUserStatusSubscribeConfig();
config.subscriptionDuration = 60; // Subscription validity time, in minutes. The valid range is 1 to 43200 (i.e., 30 days).

ArrayList<String> userIDs = new ArrayList<>();
userIDs.add("userIdA");
userIDs.add("userIdB");

zim.subscribeUsersStatus(userIDs, config, new ZIMUsersStatusSubscribedCallback() {
    @Override
    public void onUsersStatusSubscribed(ArrayList<ZIMErrorUserInfo> errorUserList, ZIMError errorInfo) {
        // Handle subscription callback
        for (ZIMErrorUserInfo errorUserInfo : errorUserList) {
            System.out.println("User ID for which subscription failed: " + errorUserInfo.userID);
            System.out.println("Error code for subscription failure: " + errorUserInfo.reason);
        }
    }
});
1
Copied!

Result Callback

Subsequently, within the time frame specified by subscriptionDuration, updates to the target user's user status will be returned via the ZIMEventHandler event callback in onUserStatusUpdated.

Note

If a user logs in again after subscribing, the ZIM SDK will proactively notify the user of the last status change of their subscribed target user during the logout period through this callback.

Untitled
zim.setEventHandler(new ZIMEventHandler(){
    public void onUserStatusUpdated(ZIM zim, ArrayList<ZIMUserStatus> userStatusList) {
        for (ZIMUserStatus userStatus : userStatusList) {
            String userID = userStatus.userID; // Target user ID
            String onlineStatus = userStatus.onlineStatus; // User online status
            String customStatus = userStatus.customStatus; // User custom status
            ArrayList<String> onlinePlatforms = userStatus.onlinePlatforms; // User online platform list
            long lastUpdateTime = userStatus.lastUpdateTime; // Last status update time
            long lastOnlineStatusUpdateTime = userStatus.lastOnlineStatusUpdateTime; // Last online status update time
            long lastCustomStatusUpdateTime = userStatus.lastCustomStatusUpdateTime; // Last custom status update time
        }
    }
});
1
Copied!

Unsubscribe from User Status

If you no longer wish to monitor the user status of certain users, you can call the unsubscribeUsersStatus interface and pass the target user IDs (up to 100 users) into the userIDs parameter.

Untitled
ArrayList<String> userIDs = new ArrayList<>();
userIDs.add("userIdA");
userIDs.add("userIdB");

zim.unsubscribeUsersStatus(userIDs, new ZIMUsersStatusUnsubscribedCallback() {
    @Override
    public void onUsersStatusUnsubscribed(ArrayList<ZIMErrorUserInfo> errorUserList, ZIMError errorInfo) {
        for (ZIMErrorUserInfo errorUserInfo : errorUserList) {
            System.out.println("User ID failed to unsubscribe: " + errorUserInfo.userID);
            System.out.println("Failure reason: " + errorUserInfo.reason);
        }
    }
});
1
Copied!

Query user status

If you only need to obtain the user status of a target user once without continuous attention, you can call the queryUsersStatus interface and pass in the userIDs of the target users (up to 200 users, excluding the current user).

Untitled
ArrayList<String> userIDs = new ArrayList<>();
userIDs.add("userIdA");
userIDs.add("userIdB");

zim.queryUsersStatus(userIDs, new ZIMUsersStatusQueriedCallback() {
    @Override
    public void onUsersStatusQueried(ArrayList<ZIMUserStatus> userStatusList,
                                        ArrayList<ZIMErrorUserInfo> errorUserList, ZIMError errorInfo) {
        for (ZIMUserStatus userStatus : userStatusList) {
            System.out.println("User ID: " + userStatus.userID); // Target user ID
            System.out.println("Online Status: " + userStatus.onlineStatus); // User's online status
            System.out.println("Online Platforms: " + userStatus.onlinePlatforms); // List of platforms where the user is online
            System.out.println("Last Update Time: " + userStatus.lastUpdateTime); // Last time the online status was updated
        }

        for (ZIMErrorUserInfo errorUserInfo : errorUserList) {
            System.out.println("User ID for failed query: " + errorUserInfo.userID);
            System.out.println("Error code for failed query: " + errorUserInfo.reason);
        }
    }
});
1
Copied!

Query the user status subscription list

If a user wants to know which users' user statuses they have subscribed to, they can use the querySubscribedUserStatusList interface. By passing an empty config.userIDs parameter, the user can obtain the complete subscription list, including the current status of the subscribed target users and the duration of the subscription validity.

If a user wants to confirm whether they have subscribed to certain users' user statuses, they can pass the userID of the query target into the config.userIDs parameter.

Untitled
// Query target user IDs (a single query can include up to 200 users)
// When userIDs is empty, it indicates the need to retrieve full subscription table information
// When userIDs is not empty, it indicates the need to check if the target users are in the subscription list
// If they exist, the result callback will include the user status information
// If they do not exist, the result callback will not include relevant information
ZIMSubscribedUserStatusQueryConfig config = new ZIMSubscribedUserStatusQueryConfig();
config.userIDs.add("userIdA");
config.userIDs.add("userIdB");

zim.querySubscribedUserStatusList(config, new ZIMSubscribedUserStatusListQueriedCallback() {
    @Override
    public void onSubscribedUserStatusListQueried(ArrayList<ZIMUserStatusSubscription> userStatusSubscriptionList, ZIMError errorInfo) {
        for (ZIMUserStatusSubscription subscription : userStatusSubscriptionList) {
            subscription.subscribeExpiredTime; // Subscription expiration timestamp for users in the subscription table
            subscription.userStatus; // Status information of users in the subscription table
        }
    }
});
1
Copied!

Monitoring the online status of the current user on the current device

If you need to monitor the online status of the current user on the current device, you can obtain the user's current connection status ( ZIMConnectionState ) via the onConnectionStateChanged callback and determine the online status of the current user based on it.

In ZIMConnectionState, CONNECTED indicates that the user is online, and DISCONNECTED indicates that the user is offline. For the remaining two connection statuses, CONNECTING and RECONNECTING, you can decide whether the user is online based on your business logic.

Untitled
zim.setEventHandler(new ZIMEventHandler(){
    public void onConnectionStateChanged(ZIM zim, ZIMConnectionState state,
                                        ZIMConnectionEvent event, JSONObject extendedData) {
        switch (state) {
            case CONNECTED:
                // Connected, you can map the current user's online status as online
                break;
            case CONNECTING:
                // Connecting, based on your business logic, you can map the current user's online status as either online or offline
                break;
            case RECONNECTING:
                // Reconnecting, based on your business logic, you can map the current user's online status as either online or offline
                break;
            case DISCONNECTED:
                // Disconnected, you can map the current user's status as offline
                break;
            default:
                break;
        }
    }
});
1
Copied!

Listening to the List of Online Platforms for the Current User

In a multi-device login scenario, when a user logs in from a second platform, you can listen to the onUserStatusUpdated callback to learn about currently online platforms via the userStatus.onlinePlatforms property. Developers can use this information to display the user's online status across different platforms (e.g., showing that the user is online on iOS and Windows).

Note

When the onUserStatusUpdated callback returns the userStatus information for the current user, the onlineStatus will be unknown, and lastUpdateTime will be 0, which does not accurately reflect the online status.

Untitled
zim.setEventHandler(new ZIMEventHandler(){
    public void onUserStatusUpdated(ZIM zim, ArrayList<ZIMUserStatus> userStatusList) {
        String myUserID = "Current User ID"; // The current user ID
        for (ZIMUserStatus userStatus : userStatusList) {
            if (userStatus.userID.equals(myUserID)) {
                // For the current user, onlineStatus will be UNKNOWN and cannot truly reflect the current user's online status
                ZIMUserOnlineStatus onlineStatus = userStatus.onlineStatus;

                // Online platforms list of the current user
                ArrayList<ZIMPlatformType> onlinePlatforms = userStatus.onlinePlatforms;

                // For the current user, lastUpdateTime will be 0
                long lastUpdateTime = userStatus.lastUpdateTime;
            }
        }
    }
});
1
Copied!

Previous

Friend management

Next

Manage rooms