# Event Listener

The Android SDK provides interfaces to listen to various events on the client app. Through these interfaces, TapTalk.io notifies the client app of events that happen on your app. You will need to register the listener objects to receive event callbacks from TapTalk.io.

| Event Listener                                                                                                               | Description                                                                               |
| ---------------------------------------------------------------------------------------------------------------------------- | ----------------------------------------------------------------------------------------- |
| [TapListener](/powertalk-chat-sdk-documentation/powertalk-android/event-listener.md#taplistener)                             | Listens to general event changes in the application                                       |
| [TapUIRoomListListener](/powertalk-chat-sdk-documentation/powertalk-android/event-listener.md#tapuiroomlistlistener)         | Listens to UI-related events in **Room List View** when UI implementation type is used    |
| [TapUIChatRoomListener](/powertalk-chat-sdk-documentation/powertalk-android/event-listener.md#tapuichatroomlistener)         | Listens to UI-related events in **Chat Room View** when UI implementation type is used    |
| [TapUIChatProfileListener](#tapuichatprofilelistener)                                                                        | Listens to UI-related events in **Chat Profile View** when UI implementation type is used |
| [TapUIMyAccountListener](#tapuimyaccountlistener)                                                                            | Listens to UI-related events in **My Account View** when UI implementation type is used   |
| [TapCustomKeyboardListener](/powertalk-chat-sdk-documentation/powertalk-android/event-listener.md#tapcustomkeyboardlistener) | Listens to custom keyboard-related events when UI implementation type is used             |
| [TapCoreMessageListener](/powertalk-chat-sdk-documentation/powertalk-android/event-listener.md#tapcoremessagelistener)       | Listens to events when a new/updated message is received by the application               |
| [TapCoreRoomListListener](#tapcoreroomlistlistener)                                                                          | Listens to changes to chat room's state in the room list                                  |
| [TapCoreChatRoomListener](/powertalk-chat-sdk-documentation/powertalk-android/event-listener.md#tapcorechatroomlistener)     | Listens to room status events such as typing events and online status                     |
| [TapCoreContactListener](#tapcorecontactlistener)                                                                            | Listens to contact related events such as block or unblock contact                        |

### TapListener

General events such as notifications will be notified through TapListener. A TapListener instance is required when initializing TapTalk.

We strongly suggest to override `onTapTalkRefreshTokenExpired` to handle authentication when the user's session has expired.

{% tabs %}
{% tab title="Java" %}

```java
import io.taptalk.TapTalk.Helper.TapTalk;
import io.taptalk.TapTalk.Listener.TapListener;
import io.taptalk.TapTalk.Model.TAPMessageModel;

...

TapListener tapListener = new TapListener() {
    @Override
    public void onInitializationCompleted(String instanceKey) {
        // Initialization process has finished
    }
    
    @Override
    public void onTapTalkRefreshTokenExpired() {
        // Authentication is needed
    }

    @Override
    public void onTapTalkUnreadChatRoomBadgeCountUpdated(int unreadCount) {
        // Returns number of unread messages from the application
    }

    @Override
    public void onNotificationReceived(TAPMessageModel message) {
        // A new message from TapTalk.io is received
    }

    @Override
    public void onUserLogout() {
        // User has finished logging out from TapUI or TapTalk.logoutAndClearAllTapTalkData() process has completed
    }
  
    @Override
    public void onTaskRootChatRoomClosed(Activity activity) {
        // A chat room activity was closed by user when no other activity in the application is present
        // You may start another activity to keep the app open, otherwise the app will stay closed
    }
};

TapTalk.init(
  CONTEXT, 
  APP_KEY_ID, 
  APP_KEY_SECRET,            
  APP_ICON, 
  APP_NAME, 
  APP_BASE_URL,            
  IMPLEMENTATION_TYPE, 
  tapListener
);
```

{% endtab %}

{% tab title="Kotlin" %}

```kotlin
import io.taptalk.TapTalk.Helper.TapTalk
import io.taptalk.TapTalk.Listener.TapListener
import io.taptalk.TapTalk.Model.TAPMessageModel

...

var tapListener: TapListener = object : TapListener() {
    override fun onInitializationCompleted(instanceKey: String) {
        // Initialization process has finished
    }
    
    override fun onTapTalkRefreshTokenExpired() {
        // Authentication is needed
    }

    override fun onTapTalkUnreadChatRoomBadgeCountUpdated(unreadCount: Int) {
        // Returns number of unread messages from the application
    }

    override fun onNotificationReceived(message: TAPMessageModel?) {
        // A new message from TapTalk.io is received
    }
    
    override fun onUserLogout() {
        // User has finished logging out from TapUI or TapTalk.logoutAndClearAllTapTalkData() process has completed
    }
  
    override fun onTaskRootChatRoomClosed(activity: Activity?) {
        // A chat room activity was closed by user when no other activity in the application is present
    }
}

TapTalk.init(
  CONTEXT, 
  APP_KEY_ID, 
  APP_KEY_SECRET,            
  APP_ICON, 
  APP_NAME, 
  APP_BASE_URL,            
  IMPLEMENTATION_TYPE, 
  tapListener
)
```

{% endtab %}
{% endtabs %}

TapListener listens to changes in the following methods:

| Method Name                                      | Invoked When                                                                                                                 |
| ------------------------------------------------ | ---------------------------------------------------------------------------------------------------------------------------- |
| **`onInitializationCompleted()`**                | TapTalk instance has finished initialization process.                                                                        |
| **`onTapTalkRefreshTokenExpired()`**             | User's refresh token has expired. An authentication with a new auth ticket is required.                                      |
| **`onTapTalkUnreadChatRoomBadgeCountUpdated()`** | The number of unread messages in the application is updated. Returns the **number** of unread messages from the application. |
| **`onNotificationReceived()`**                   | User receives new message from TapTalk.io through notification. Returns the newly received **message**.                      |
| **`onUserLogout()`**                             | User has finished logging out from TapUI or `TapTalk.logoutAndClearAllTapTalkData()` process has completed                   |
| **`onTaskRootChatRoomClosed()`**                 | A chat room activity was closed by user when no other activity in the application is present (application will close).       |

### TapUIRoomListListener

TapUIRoomListListener listens to UI-related events in **Room List View** when UI implementation type is used. You can register a TapUIRoomListListener instance in your application through the **TapUI** class as follows:

{% tabs %}
{% tab title="Java" %}

```java
import io.taptalk.TapTalk.Manager.TapUI;
import io.taptalk.TapTalk.Listener.TapUIRoomListListener;
import io.taptalk.TapTalk.View.Fragment.TapUIMainRoomListFragment;

...

TapUI.getInstance().addRoomListListener(new TapUIRoomListListener() {
    @Override
    public void onSearchChatBarTapped(Activity activity, TapUIMainRoomListFragment mainRoomListFragment) {
        // Calling super will open search chat page by default
        super.onSearchChatBarTapped(activity, mainRoomListFragment);
    }
    
    @Override
    public void onCloseRoomListTapped(Activity activity) {
        // Calling super will close TapTalk's room list activity by default
        super.onCloseRoomListTapped(activity);
    }
    
    @Override
    public void onTapTalkAccountButtonTapped(Activity activity) {
        // Calling super will open TapTalk user account page by default
        super.onTapTalkAccountButtonTapped(activity);
    }
    
    @Override
    public void onNewChatButtonTapped(Activity activity) {
        // Calling super will open TapTalk start new chat page by default
        super.onNewChatButtonTapped(activity);
    }
});
```

{% endtab %}

{% tab title="Kotlin" %}

```kotlin
import io.taptalk.TapTalk.Manager.TapUI
import io.taptalk.TapTalk.Listener.TapUIRoomListListener
import io.taptalk.TapTalk.View.Fragment.TapUIMainRoomListFragment

...

TapUI.getInstance().addRoomListListener(object : TapUIRoomListListener() {
    override fun onSearchChatBarTapped(activity: Activity, mainRoomListFragment: TapUIMainRoomListFragment) {
        // Calling super will open search chat page by default
        super.onSearchChatBarTapped(activity, mainRoomListFragment)
    }
    
    override fun onCloseRoomListTapped(activity: Activity) {
        // Calling super will close TapTalk's room list activity by default
        super.onCloseRoomListTapped(activity)
    }
    
    override fun onTapTalkAccountButtonTapped(activity: Activity) {
        // Calling super will open TapTalk user account page by default
        super.onTapTalkAccountButtonTapped(activity)
    }
    
    override fun onNewChatButtonTapped(activity: Activity) {
        // Calling super will open TapTalk start new chat page by default
        super.onNewChatButtonTapped(activity)
    }


})
```

{% endtab %}
{% endtabs %}

| Method Name                          | Invoked When                                                                                                                              |
| ------------------------------------ | ----------------------------------------------------------------------------------------------------------------------------------------- |
| **`onSearchBarTapped()`**            | Search bar in room list is tapped by active user. Returns the room list **activity** instance and **TapUIMainRoomListFragment** instance. |
| **`onCloseRoomListTapped()`**        | TapTalk's room list activity is closed by active user. Returns the room list **activity** instance.                                       |
| **`onTapTalkAccountButtonTapped()`** | My account button in top right room list view is tapped by active user. Returns the room list **activity** instance.                      |
| **`onNewChatButtonTapped()`**        | Floating New Chat button on the bottom right of the room list view is tapped by active user. Returns the room list **activity** instance. |

### TapUIChatRoomListener

TapUIChatRoomListener listens to UI-related events in **Chat Room View** when UI implementation type is used.

Your are also able to customize existing long press menus through this listener.

You can register a TapUIChatRoomListener instance in your application through the **TapUI** class as follows:

{% tabs %}
{% tab title="Java" %}

```java
import io.taptalk.TapTalk.Manager.TapUI;
import io.taptalk.TapTalk.Listener.TapUIChatRoomListener;
import io.taptalk.TapTalk.Model.TAPMessageModel;
import io.taptalk.TapTalk.Model.TAPRoomModel;
import io.taptalk.TapTalk.Model.TAPUserModel;
import io.taptalk.TapTalk.Model.TapLongPressMenuItem;

...

TapUI.getInstance().addChatRoomListener(new TapUIChatRoomListener() {
    @Override
    public void onTapTalkChatRoomOpened(Activity activity, TAPRoomModel room, @Nullable TAPUserModel otherUser) {
        // Returns activity instance and opened room model
    }

    @Override
    public void onTapTalkChatRoomClosed(Activity activity, TAPRoomModel room, @Nullable TAPUserModel otherUser) {
        // Returns activity instance and closed room model
    }
    @Override
    public void onTapTalkActiveUserSendMessage(Activity activity, TAPMessageModel messageModel, TAPRoomModel room) {
        // Returns activity instance, temporary message model to be sent, and the room where the message is being sent
    }
    
    @Override
    public void onTapTalkUserProfileButtonTapped(Activity activity, TAPRoomModel room, TAPUserModel user) {
        // Using super will open TapTalk user profile by default
        super.onTapTalkUserProfileButtonTapped(activity, room, user);
    }
  
    @Override
    public void onTapTalkGroupChatProfileButtonTapped(Activity activity, TAPRoomModel room) {
        // Using super will open TapTalk group chat profile by default
        super.onTapTalkGroupChatProfileButtonTapped(activity, room);
    }
  
    @Override
    public void onTapTalkGroupMemberAvatarTapped(Activity activity, TAPRoomModel room, TAPUserModel user) {
        // Using super will open TapTalk user profile by default
        super.onTapTalkGroupMemberAvatarTapped(activity, room, user);
    }

    @Override
    public void onTapTalkUserMentionTapped(Activity activity, TAPMessageModel messageModel, TAPUserModel user, boolean isRoomParticipant) {
        // Using super will open TapTalk user profile by default 
        super.onTapTalkUserMentionTapped(activity, messageModel, user, isRoomParticipant);
    }

    @Override
    public void onTapTalkMessageQuoteTapped(Activity activity, TAPMessageModel message, HashMap<String, Object> userInfo) {
        // Returns activity instance, tapped message, and userInfo
    }
    
    @Override
    public List<TapLongPressMenuItem> setMessageLongPressMenuItems(Context context, TAPMessageModel messageModel) {
        // Return your customized list of TapLongPressMenuItem here if you wish to change the message's long press menu options
        return super.setMessageLongPressMenuItems(context, messageModel);
    }

    @Override
    public List<TapLongPressMenuItem> setScheduledMessageLongPressMenuItems(Context context, TAPMessageModel messageModel) {
        // Return your customized list of TapLongPressMenuItem here if you wish to change the scheduled message's long press menu options
        return super.setScheduledMessageLongPressMenuItems(context, messageModel);
    }

    @Override
    public List<TapLongPressMenuItem> setLinkLongPressMenuItems(Context context, @Nullable TAPMessageModel messageModel, String url) {
        // Return your customized list of TapLongPressMenuItem here if you wish to change the url's long press menu options
        return super.setLinkLongPressMenuItems(context, messageModel, url);
    }

    @Override
    public List<TapLongPressMenuItem> setEmailLongPressMenuItems(Context context, @Nullable TAPMessageModel messageModel, String emailAddress) {
        // Return your customized list of TapLongPressMenuItem here if you wish to change the email address's long press menu options
        return super.setEmailLongPressMenuItems(context, messageModel, emailAddress);
    }

    @Override
    public List<TapLongPressMenuItem> setPhoneLongPressMenuItems(Context context, @Nullable TAPMessageModel messageModel, String phoneNumber) {
        // Return your customized list of TapLongPressMenuItem here if you wish to change the phone number's long press menu options
        return super.setPhoneLongPressMenuItems(context, messageModel, phoneNumber);
    }

    @Override
    public List<TapLongPressMenuItem> setMentionLongPressMenuItems(Context context, @Nullable TAPMessageModel messageModel, String mentionSpan) {
        // Return your customized list of TapLongPressMenuItem here if you wish to change the mention's long press menu options
        return super.setMentionLongPressMenuItems(context, messageModel, mentionSpan);
    }

    @Override
    public void onLongPressMenuItemSelected(Activity activity, TapLongPressMenuItem longPressMenuItem, TAPMessageModel messageModel) {
        // A long press menu item was selected by user
        // You may add your own response and delete the super below
        super.onLongPressMenuItemSelected(activity, longPressMenuItem, messageModel);
    }
});
```

{% endtab %}

{% tab title="Kotlin" %}

```kotlin
import io.taptalk.TapTalk.Model.TAPMessageModel
import io.taptalk.TapTalk.Model.TAPRoomModel
import io.taptalk.TapTalk.Model.TAPUserModel
import io.taptalk.TapTalk.Model.TapLongPressMenuItem

...

TapUI.getInstance().addChatRoomListener(object : TapUIChatRoomListener() {
    override fun onTapTalkChatRoomOpened(activity: Activity, room: TAPRoomModel, otherUser: TAPUserModel?) {
        // Returns activity instance and opened room model
    }
    
    override fun onTapTalkChatRoomClosed(activity: Activity, room: TAPRoomModel, otherUser: TAPUserModel?) {
        // Returns activity instance and closed room model
    }
    
    override fun onTapTalkActiveUserSendMessage(activity: Activity, messageModel: TAPMessageModel, room: TAPRoomModel) {
        // Returns activity instance, temporary message model to be sent, and the destination room
    }
    
    override fun onTapTalkUserProfileButtonTapped(activity: Activity, room: TAPRoomModel, user: TAPUserModel?) {
        // Using super will open TapTalk user profile by default
        super.onTapTalkUserProfileButtonTapped(activity, room, user)
    }
  
    override fun onTapTalkGroupChatProfileButtonTapped(activity: Activity, room: TAPRoomModel) {
        // Using super will open TapTalk group chat profile by default
        super.onTapTalkGroupChatProfileButtonTapped(activity, room)
    }
    
    override fun onTapTalkGroupMemberAvatarTapped(activity: Activity, room: TAPRoomModel, user: TAPUserModel) {
        // Using super will open TapTalk user profile by default
        super.onTapTalkGroupMemberAvatarTapped(activity, room, user)
    }

    override fun onTapTalkUserMentionTapped(activity: Activity, messageModel: TAPMessageModel, user: TAPUserModel, isRoomParticipant: Boolean) {
        // Using super will open TapTalk user profile by default
        super.onTapTalkUserMentionTapped(activity, messageModel, user, isRoomParticipant)
    }

    override fun onTapTalkMessageQuoteTapped(activity: Activity, message: TAPMessageModel, userInfo: HashMap<String, Any>?) {
        // Returns activity instance, tapped message, and userInfo
    }
    
    override fun setMessageLongPressMenuItems(context: Context, messageModel: TAPMessageModel): List<TapLongPressMenuItem> { 
        // Return your customized list of TapLongPressMenuItem here if you wish to change the message's long press menu options
        return super.setMessageLongPressMenuItems(context, messageModel)
    }

    override fun setScheduledMessageLongPressMenuItems(context: Context, messageModel: TAPMessageModel): List<TapLongPressMenuItem> { 
        // Return your customized list of TapLongPressMenuItem here if you wish to change the scheduled message's long press menu options
        return super.setScheduledMessageLongPressMenuItems(context, messageModel)
    }

    override fun setLinkLongPressMenuItems(context: Context, messageModel: TAPMessageModel?, url: String): List<TapLongPressMenuItem> {
        // Return your customized list of TapLongPressMenuItem here if you wish to change the url's long press menu options
        return super.setLinkLongPressMenuItems(context, messageModel, url)
    }

    override fun setEmailLongPressMenuItems(context: Context, messageModel: TAPMessageModel?, emailAddress: String): List<TapLongPressMenuItem> {
        // Return your customized list of TapLongPressMenuItem here if you wish to change the email address's long press menu options
        return super.setEmailLongPressMenuItems(context, messageModel, emailAddress)
    }

    override fun setPhoneLongPressMenuItems(context: Context, messageModel: TAPMessageModel?, phoneNumber: String): List<TapLongPressMenuItem> {
        // Return your customized list of TapLongPressMenuItem here if you wish to change the phone number's long press menu options
        return super.setPhoneLongPressMenuItems(context, messageModel, phoneNumber)
    }

    override fun setMentionLongPressMenuItems(context: Context, messageModel: TAPMessageModel?, mentionSpan: String): List<TapLongPressMenuItem> {
        // Return your customized list of TapLongPressMenuItem here if you wish to change the mention's long press menu options
        return super.setMentionLongPressMenuItems(context, messageModel, mentionSpan)
    }

    override fun onLongPressMenuItemSelected(activity: Activity, longPressMenuItem: TapLongPressMenuItem, messageModel: TAPMessageModel?) {
        // A long press menu item was selected by user
        // You may add your own response and delete the super below
        super.onLongPressMenuItemSelected(activity, longPressMenuItem, messageModel)
    }
})
```

{% endtab %}
{% endtabs %}

<table data-header-hidden><thead><tr><th width="440.3245778611632">Method Name</th><th>Invoked When</th></tr></thead><tbody><tr><td>Method Name</td><td>Invoked When</td></tr><tr><td><strong><code>onTapTalkChatRoomOpened()</code></strong></td><td>A chat room is opened. Returns the opened <strong>activity</strong> instance and <strong>room</strong> model.</td></tr><tr><td><strong><code>onTapTalkChatRoomClosed()</code></strong></td><td>A chat room is closed. Returns the closed <strong>activity</strong> instance and <strong>room</strong> model.</td></tr><tr><td><strong><code>onTapTalkActiveUserSendMessage()</code></strong></td><td>Active user sends any message to a chat room. Message may not yet be delivered to the room when this happens. Returns the <strong>activity</strong> instance, <strong>message</strong> to be sent, and the destination <strong>room</strong>. Returned message is temporary and the values will be updated through socket once the message is delivered.</td></tr><tr><td><strong><code>onTapTalkUserProfileButtonTapped()</code></strong></td><td>Profile button in a <strong>personal</strong> chat room is tapped by active user. Returns the <strong>activity</strong> instance, <strong>room</strong>, and recipient <strong>user</strong>.</td></tr><tr><td><strong><code>onTapTalkGroupChatProfileButtonTapped()</code></strong></td><td>Profile button in a <strong>group</strong> chat room is tapped by active user. Returns the <strong>activity</strong> instance and <strong>room</strong>.</td></tr><tr><td><strong><code>onTapTalkGroupMemberAvatarTapped()</code></strong></td><td>A group member's profile picture on a message bubble in <strong>group</strong> chat room is tapped by active user. Returns the <strong>activity</strong> instance, <strong>room</strong>, and recipient <strong>user</strong>.</td></tr><tr><td><strong><code>onTapTalkUserMentionTapped()</code></strong></td><td>A user mention span in a chat bubble is tapped by active user. Returns <strong>activity</strong> instance, <strong>message</strong> model, mentioned <strong>user</strong> model, and <strong>isRoomParticipant</strong></td></tr><tr><td><strong><code>onTapTalkMessageQuoteTapped()</code></strong></td><td>A quote inside a message bubble in a chat room is tapped by active user. Returns <strong>activity</strong> instance, tapped <strong>message</strong>, and <strong>userInfo</strong>.<br>UserInfo is a HashMap object embedded inside a message containing data specified by client, and is generally null when not specified.</td></tr><tr><td><strong><code>setMessageLongPressMenuItems()</code></strong></td><td>A message bubble in chat room is long pressed by user. TapTalk.io will request custom long press items from the client app to be displayed. Returns <strong>context</strong> and the long pressed <strong>message</strong>.</td></tr><tr><td><strong><code>setScheduledMessageLongPressMenuItems()</code></strong></td><td>A message bubble in scheduled messages chat room is long pressed by user. TapTalk.io will request custom long press items from the client app to be displayed. Returns <strong>context</strong> and the long pressed <strong>message</strong>.</td></tr><tr><td><strong><code>setLinkLongPressMenuItems()</code></strong></td><td>A URL inside a message bubble is long pressed by user. TapTalk.io will request custom long press items from the client app to be displayed. Returns <strong>context</strong>, the long pressed <strong>message</strong>, and the <strong>URL</strong>.</td></tr><tr><td><strong><code>setEmailLongPressMenuItems()</code></strong></td><td>An email address inside a message bubble is long pressed by user. TapTalk.io will request custom long press items from the client app to be displayed. Returns <strong>context</strong>, the long pressed <strong>message</strong>, and the <strong>email address</strong>.</td></tr><tr><td><strong><code>setPhoneLongPressMenuItems()</code></strong></td><td>A phone number inside a message bubble is long pressed by user. TapTalk.io will request custom long press items from the client app to be displayed. Returns <strong>context</strong>, the long pressed <strong>message</strong>, and the <strong>phone number</strong>.</td></tr><tr><td><strong><code>setMentionLongPressMenuItems()</code></strong></td><td>A mention span inside a message bubble is long pressed by user. TapTalk.io will request custom long press items from the client app to be displayed. Returns <strong>context</strong>, the long pressed <strong>message</strong>, and the <strong>mention span</strong>.</td></tr><tr><td><strong><code>onLongPressMenuItemSelected()</code></strong></td><td>A long press menu is selected by the active user. Returns the current <strong>activity</strong>, long pressed menu <strong>item</strong>, and the <strong>message</strong> model.</td></tr></tbody></table>

### TapUIChatProfileListener

TapUIChatProfileListener listens to UI-related events in **Chat Profile View** when UI implementation type is used. You can register a TapUIChatProfileListener instance in your application through the **TapUI** class as follows:

{% tabs %}
{% tab title="Java" %}

```java
import io.taptalk.TapTalk.Manager.TapUI;
import io.taptalk.TapTalk.Listener.TapUIChatProfileListener;
import io.taptalk.TapTalk.Model.TAPRoomModel;
import io.taptalk.TapTalk.Model.TAPUserModel;

...

TapUI.getInstance().addChatProfileListener(new TapUIChatProfileListener() {
    @Override
    public void onReportUserButtonTapped(Activity activity, TAPRoomModel room, TAPUserModel reportedUser) {
        // Returns activity instance, room model, and user model
    }
    
    @Override
    public void onReportGroupButtonTapped(Activity activity, TAPRoomModel room) {
        // Returns activity instance and room model
    }

    @Override
    public void onGroupInCommonItemTapped(Activity activity, TAPRoomModel room) {
        // Returns activity instance and room model
    }
});
```

{% endtab %}

{% tab title="Kotlin" %}

```kotlin
import io.taptalk.TapTalk.Manager.TapUI
import io.taptalk.TapTalk.Listener.TapUIChatProfileListener
import io.taptalk.TapTalk.Model.TAPRoomModel
import io.taptalk.TapTalk.Model.TAPUserModel

...

TapUI.getInstance().addChatProfileListener(object : TapUIChatProfileListener() {
    override fun onReportUserButtonTapped(activity: Activity, room: TAPRoomModel, reportedUser: TAPUserModel) {
        // Returns activity instance, room model, and user model
    }
    
    override fun onReportGroupButtonTapped(activity: Activity, room: TAPRoomModel) {
        // Returns activity instance and room model
    }
    
    override fun onGroupInCommonItemTapped(activity: Activity, room: TAPRoomModel) {
        // Returns activity instance and room model
    }
})
```

{% endtab %}
{% endtabs %}

<table data-header-hidden><thead><tr><th width="333">Method Name</th><th>Invoked When</th></tr></thead><tbody><tr><td>Method Name</td><td>Invoked When</td></tr><tr><td><strong><code>onReportUserButtonTapped()</code></strong></td><td>Active user taps the Report User button in chat profile view. Returns <strong>activity</strong> instance, <strong>room</strong> model, and the reported <strong>user</strong> model.</td></tr><tr><td><strong><code>onReportGroupButtonTapped()</code></strong></td><td>Active user taps the Report Group button in chat profile view. Returns <strong>activity</strong> instance and <strong>room</strong> model.</td></tr><tr><td><strong><code>onGroupInCommonItemTapped()</code></strong></td><td>Active user taps an item in Groups in Common list. Returns <strong>activity</strong> instance and <strong>room</strong> model.</td></tr></tbody></table>

### TapUIMyAccountListener

TapUIMyAccountListener listens to UI-related events in **My Account View** when UI implementation type is used. You can register a TapUIMyAccountListener instance in your application through the **TapUI** class as follows:

{% tabs %}
{% tab title="Java" %}

```java
import io.taptalk.TapTalk.Manager.TapUI;
import io.taptalk.TapTalk.Listener.TapUIMyAccountListener;

...

TapUI.getInstance().addMyAccountListener(new TapUIMyAccountListener() {
    @Override
    public void onDeleteButtonInMyAccountPageTapped(@NonNull Activity activity) {
        // Returns My Account activity instance
    }
});
```

{% endtab %}

{% tab title="Kotlin" %}

```kotlin
import io.taptalk.TapTalk.Manager.TapUI
import io.taptalk.TapTalk.Listener.TapUIMyAccountListener

...

TapUI.getInstance().addMyAccountListener(object : TapUIMyAccountListener() {
    override fun onDeleteButtonInMyAccountPageTapped(activity: Activity) {
        // Returns My Account activity instance
    }
})
```

{% endtab %}
{% endtabs %}

<table data-header-hidden><thead><tr><th width="333">Method Name</th><th>Invoked When</th></tr></thead><tbody><tr><td>Method Name</td><td>Invoked When</td></tr><tr><td><strong><code>onDeleteButtonInMyAccountPageTapped()</code></strong></td><td>Active user taps the Delete Account button in My Account view. Returns the currently active My Account <strong>activity</strong> instance.</td></tr></tbody></table>

### TapUICustomKeyboardListener

TapUICustomKeyboardListener bridges the custom keyboard-related events between TapTalk.io and the client app when UI implementation type is used. TapTalk.io will request custom keyboard items from the client app through this listener when a chat room is opened by the user. TapUICustomKeyboardListener can be implemented using the **TapUI** class.

{% tabs %}
{% tab title="Java" %}

```java
import io.taptalk.TapTalk.Manager.TapUI;
import io.taptalk.TapTalk.Listener.TapUICustomKeyboardListener;
import io.taptalk.TapTalk.Model.TAPRoomModel;
import io.taptalk.TapTalk.Model.TAPUserModel;
import io.taptalk.TapTalk.Model.TAPCustomKeyboardItemModel;

...

TapUI.getInstance().addCustomKeyboardListener(new TapUICustomKeyboardListener() {
    @Override
    public List<TAPCustomKeyboardItemModel> setCustomKeyboardItems(TAPRoomModel room, TAPUserModel activeUser, @Nullable TAPUserModel recipientUser) {
        // Return items here if you wish to use custom keyboard in chat room
        return null;
    }

    @Override
    public void onCustomKeyboardItemTapped(Activity activity, TAPCustomKeyboardItemModel customKeyboardItem, TAPRoomModel room, TAPUserModel activeUser, @Nullable TAPUserModel recipientUser) {
        // Do an action when user taps a custom keyboard item
    }
});
```

{% endtab %}

{% tab title="Kotlin" %}

```kotlin
import io.taptalk.TapTalk.Listener.TapUICustomKeyboardListener
import io.taptalk.TapTalk.Model.TAPRoomModel
import io.taptalk.TapTalk.Model.TAPUserModel
import io.taptalk.TapTalk.Model.TAPCustomKeyboardItemModel

...

TapUI.getInstance().addCustomKeyboardListener(object : TapCustomKeyboardListener() {
    override fun setCustomKeyboardItems(
        room: TAPRoomModel?,
        activeUser: TAPUserModel?,
        recipientUser: TAPUserModel?
    ): List<TAPCustomKeyboardItemModel>? {
        // Return items here if you wish to use custom keyboard in chat room
        return null
    }

    override fun onCustomKeyboardItemTapped(
        activity: Activity?,
        customKeyboardItem: TAPCustomKeyboardItemModel?,
        room: TAPRoomModel?,
        activeUser: TAPUserModel?,
        recipientUser: TAPUserModel?
    ) {
        // Do an action when user taps a custom keyboard item
    }
})
```

{% endtab %}
{% endtabs %}

To use custom keyboard in the chat room, return a list of **TAPCustomKeyboardItemModel** on the `setCustomKeyboardItems()` method in this listener. See the example below:

{% tabs %}
{% tab title="Java" %}

```java
import io.taptalk.TapTalk.Manager.TapUI;
import io.taptalk.TapTalk.Listener.TapUICustomKeyboardListener;
import io.taptalk.TapTalk.Model.TAPRoomModel;
import io.taptalk.TapTalk.Model.TAPUserModel;
import io.taptalk.TapTalk.Model.TAPCustomKeyboardItemModel;

...

TapUI.getInstance().addCustomKeyboardListener(new TapUICustomKeyboardListener() {
    @Override
    public List<TAPCustomKeyboardItemModel> setCustomKeyboardItems(TAPRoomModel room, TAPUserModel activeUser, @Nullable TAPUserModel recipientUser) {
        List<TAPCustomKeyboardItemModel> customKeyboardItems = new ArrayList<>();
        TAPCustomKeyboardItemModel customKeyboardItem1 = new TAPCustomKeyboardItemModel(
            "customKeyboardItem1",
            getDrawable(R.drawable.keyboard_icon_1),
            "Hello, " + room.getRoomName()
        );
        TAPCustomKeyboardItemModel customKeyboardItem2 = new TAPCustomKeyboardItemModel(
                "customKeyboardItem2",
                "https://www.yoururl.com/image2.png",
                "Hello, my name is " + activeUser.getName()
        );
        customKeyboardItems.add(customKeyboardItem1);
        customKeyboardItems.add(customKeyboardItem2);
        return customKeyboardItems;
    }

    @Override
    public void onCustomKeyboardItemTapped(Activity activity, TAPCustomKeyboardItemModel customKeyboardItem, TAPRoomModel room, TAPUserModel activeUser, @Nullable TAPUserModel recipientUser) {
        if (customKeyboardItem.getItemID().equals("customKeyboardItem1")) {
            // Custom keyboard item 1 was tapped by user
        }
        else if (customKeyboardItem.getItemID().equals("customKeyboardItem2")) {
            // Custom keyboard item 2 was tapped by user
        }
    }
});
```

{% endtab %}

{% tab title="Kotlin" %}

```kotlin
import io.taptalk.TapTalk.Listener.TapUICustomKeyboardListener
import io.taptalk.TapTalk.Model.TAPRoomModel
import io.taptalk.TapTalk.Model.TAPUserModel
import io.taptalk.TapTalk.Model.TAPCustomKeyboardItemModel

...

TapUI.getInstance().addCustomKeyboardListener(object : TapCustomKeyboardListener() {
    override fun setCustomKeyboardItems(
        room: TAPRoomModel?,
        activeUser: TAPUserModel?,
        recipientUser: TAPUserModel?
    ): List<TAPCustomKeyboardItemModel> {
        val customKeyboardItems = ArrayList<TAPCustomKeyboardItemModel>()
        val customKeyboardItem1 = TAPCustomKeyboardItemModel(
            "customKeyboardItem1",
            getDrawable(R.drawable.keyboard_icon_1),
            "Hello, " + room.getRoomName()
        )
        val customKeyboardItem2 = TAPCustomKeyboardItemModel(
            "customKeyboardItem2",
            "https://www.yoururl.com/image2.png",
            "Hello, my name is " + activeUser!!.name
        )
        customKeyboardItems.add(customKeyboardItem1)
        customKeyboardItems.add(customKeyboardItem2)
        return customKeyboardItems
    }

    override fun onCustomKeyboardItemTapped(
        activity: Activity?,
        customKeyboardItem: TAPCustomKeyboardItemModel?,
        room: TAPRoomModel?,
        activeUser: TAPUserModel?,
        recipientUser: TAPUserModel?
    ) {
        if (customKeyboardItem?.itemID == "customKeyboardItem1") {
            // Custom keyboard item 1 was tapped by user
        }
        else if (customKeyboardItem?.itemID == "customKeyboardItem2") {
            // Custom keyboard item 2 was tapped by user
        }
    }
})
```

{% endtab %}
{% endtabs %}

| Method Name                        | Invoked When                                                                                                                                                                                                         |
| ---------------------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| **`setCustomKeyboardItems()`**     | Chat room is opened. TapTalk.io will request custom keyboard items from the client app to be displayed in the chat room. Returns **room**, **active user**, and the **recipient user** (only for personal chat room) |
| **`onCustomKeyboardItemTapped()`** | A custom keyboard item in a chat room is tapped by the user. Returns the **activity** instance, custom keyboard **item**, **room**, **active user**, and **recipient user** (only for personal chat room)            |

### TapCoreMessageListener

TapCoreMessageListener listens to message-related events, such as receiving new or updated message. TapCoreMessageListener can be registered through the **TapCoreMessageManager** class.JavaKotlin

{% tabs %}
{% tab title="Java" %}

```java
import io.taptalk.TapTalk.Manager.TapCoreMessageManager;
import io.taptalk.TapTalk.Listener.TapCoreMessageListener;
import io.taptalk.TapTalk.Model.TAPMessageModel;

...

TapCoreMessageManager.getInstance().addMessageListener(new TapCoreMessageListener() {
    @Override
    public void onReceiveNewMessage(TAPMessageModel message) {

    }

    @Override
    public void onReceiveUpdatedMessage(TAPMessageModel message) {

    }
    
    @Override
    public void onMessageDeleted(TAPMessageModel message) {
    
    }

    @Override
    public void onRequestMessageFileUpload(TAPMessageModel message, Uri fileUri) {

    }
});
```

{% endtab %}

{% tab title="Kotlin" %}

```kotlin
import io.taptalk.TapTalk.Manager.TapCoreMessageManager
import io.taptalk.TapTalk.Listener.TapCoreMessageListener
import io.taptalk.TapTalk.Model.TAPMessageModel

...

TapCoreMessageManager.getInstance().addMessageListener(object : TapCoreMessageListener() {
    override fun onReceiveNewMessage(message: TAPMessageModel?) {
        
    }

    override fun onReceiveUpdatedMessage(message: TAPMessageModel?) {
        
    }

    override fun onMessageDeleted(message: TAPMessageModel?) {
        
    }

    override fun onRequestMessageFileUpload(message: TAPMessageModel?, fileUri: Uri?) {
        
    }
})
```

{% endtab %}
{% endtabs %}

| Method Name                        | Invoked When                                                                                                                                                           |
| ---------------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| **`onReceiveNewMessage()`**        | A new message is received. Returns the newly received **message**.                                                                                                     |
| **`onReceiveUpdatedMessage()`**    | An updated message is received. Returns the updated **message**.                                                                                                       |
| **`onMessageDeleted()`**           | A message is deleted. Returns the deleted **message**.                                                                                                                 |
| **`onRequestMessageFileUpload()`** | Active user sends a message with file, such as image, video, or document. Returns the **message** to be sent and the **uri** of the file to be uploaded by the client. |

{% hint style="info" %}
**Note:** the callback `onRequestMessageFileUpload()` will only be invoked when the user calls `setUploadMessageFileToExternalServerEnabled(true)` in **TapCoreMessageManager**. Enabling this will prevent the SDK from uploading message files, which are image, video, or document, to TapTalk servers, means the message will not be sent until the client returns the uploaded file's URL to the SDK through the `onFileUploadCompleted` method in **TapCoreMessageManager**.
{% endhint %}

### TapCoreRoomListListener

Changes to a chat room's state, such as pin and mute events are notified through TapCoreRoomListListener. An instance of TapCoreRoomListListener can be registered from the **TapCoreRoomListManager** class.

{% tabs %}
{% tab title="Java" %}

```java
import io.taptalk.TapTalk.Manager.TapCoreRoomListManager;
import io.taptalk.TapTalk.Listener.TapCoreRoomListListener;

...

TapCoreRoomListManager.getInstance().addCoreRoomListListener(new TapCoreRoomListListener() {
    @Override
    public void onChatRoomMuted(@NonNull String roomID, long expiryTime) {
        
    }

    @Override
    public void onChatRoomUnmuted(@NonNull String roomID) {
        
    }

    @Override
    public void onChatRoomPinned(@NonNull String roomID) {
        
    }

    @Override
    public void onChatRoomUnpinned(@NonNull String roomID) {
        
    }
    
    @Override
    public void onChatRoomDeleted(@NonNull String roomID) {

    }
});
```

{% endtab %}

{% tab title="Kotlin" %}

```kotlin
import io.taptalk.TapTalk.Manager.TapCoreRoomListManager
import io.taptalk.TapTalk.Listener.TapCoreRoomListListener

...

TapCoreRoomListManager.getInstance().addCoreRoomListListener(object : TapCoreRoomListListener() {
    override fun onChatRoomMuted(roomID: String, expiryTime: Long) {

    }

    override fun onChatRoomUnmuted(roomID: String) {

    }

    override fun onChatRoomPinned(roomID: String) {

    }

    override fun onChatRoomUnpinned(roomID: String) {

    }
    
    override fun onChatRoomDeleted(roomID: String) {

    }
})
```

{% endtab %}
{% endtabs %}

| Method Name                | Invoked When                                                                                           |
| -------------------------- | ------------------------------------------------------------------------------------------------------ |
| **`onChatRoomMuted()`**    | The active user muted a chat room. Returns the **room ID** and **mute expiry time** of the muted room. |
| **`onChatRoomUnmuted()`**  | The active user unmuted a chat room. Returns the **room ID** of the unmuted room.                      |
| **`onChatRoomPinned()`**   | The active user pinned a chat room. Returns the **room ID** of the pinned room.                        |
| **`onChatRoomUnpinned()`** | The active user unpinned a chat room. Returns the **room ID** of the unpinned room.                    |
| **`onChatRoomDeleted()`**  | The active user deleted a chat room. Returns the **room ID** of the deleted room.                      |

### TapCoreChatRoomListener

Room status events such as typing events and online status are notified through TapCoreChatRoomListener. An instance of TapCoreChatRoomListener can be registered from the **TapCoreContactManager** class.

{% tabs %}
{% tab title="Java" %}

```java
import io.taptalk.TapTalk.Manager.TapCoreChatRoomManager;
import io.taptalk.TapTalk.Listener.TapCoreChatRoomListener;
import io.taptalk.TapTalk.Model.TAPUserModel;

...

TapCoreChatRoomManager.getInstance().addChatRoomListener(new TapCoreChatRoomListener() {
    @Override
    public void onReceiveStartTyping(String roomID, TAPUserModel user) {
    
    }

    @Override
    public void onReceiveStopTyping(String roomID, TAPUserModel user) {
    
    }

    @Override
    public void onReceiveOnlineStatus(TAPUserModel user, Boolean isOnline, Long lastActive) {
    
    }
});
```

{% endtab %}

{% tab title="Kotlin" %}

```kotlin
import io.taptalk.TapTalk.Manager.TapCoreChatRoomManager
import io.taptalk.TapTalk.Listener.TapCoreChatRoomListener
import io.taptalk.TapTalk.Model.TAPUserModel

...

TapCoreChatRoomManager.getInstance().addChatRoomListener(object : TapCoreChatRoomListener() {
    override fun onReceiveStartTyping(roomID: String?, user: TAPUserModel?) {

    }

    override fun onReceiveStopTyping(roomID: String?, user: TAPUserModel?) {

    }

    override fun onReceiveOnlineStatus(user: TAPUserModel?, isOnline: Boolean?, lastActive: Long?) {

    }
})
```

{% endtab %}
{% endtabs %}

| Method Name                   | Invoked When                                                                                                                              |
| ----------------------------- | ----------------------------------------------------------------------------------------------------------------------------------------- |
| **`onReceiveStartTyping()`**  | Another user starts typing a message in a chat room. Returns the **room ID** and typing **user**.                                         |
| **`onReceiveStopTyping()`**   | Another user stops typing a message in a chat room. Returns the **room ID** and typing **user**.                                          |
| **`onReceiveOnlineStatus()`** | Another user comes online or offline. Returns the updated **user**, **online status**, and the updated user's last active **time stamp**. |

### TapCoreContactListener

Contact related events such as block/unblock are notified through TapCoreContactListener. An instance of TapCoreContactListener can be registered from the **TapCoreContactManager** class.

{% tabs %}
{% tab title="Java" %}

```java
import io.taptalk.TapTalk.Manager.TapCoreContactManager;
import io.taptalk.TapTalk.Listener.TapCoreContactListener;
import io.taptalk.TapTalk.Model.TAPUserModel;

...

TapCoreContactManager.getInstance().addContactListener(new TapCoreContactListener() {
    @Override
    public void onContactBlocked(TAPUserModel user) {
    
    }

    @Override
    public void onContactUnblocked(TAPUserModel user) {
    
    }
});
```

{% endtab %}

{% tab title="Kotlin" %}

```kotlin
import io.taptalk.TapTalk.Manager.TapCoreContactManager
import io.taptalk.TapTalk.Listener.TapCoreContactListener
import io.taptalk.TapTalk.Model.TAPUserModel

...

TapCoreContactManager.getInstance().addContactListener(object : TapCoreContactListener() {
    override fun onContactBlocked(user: TAPUserModel) {

    }

    override fun onContactUnblocked(user: TAPUserModel) {

    }
})
```

{% endtab %}
{% endtabs %}

| Method Name                | Invoked When                                                       |
| -------------------------- | ------------------------------------------------------------------ |
| **`onContactBlocked()`**   | Active user blocks another user. Returns the blocked **user**.     |
| **`onContactUnblocked()`** | Active user unblocks another user. Returns the unblocked **user**. |


---

# Agent Instructions: Querying This Documentation

If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter:

```
GET https://docs.taptalk.io/powertalk-chat-sdk-documentation/powertalk-android/event-listener.md?ask=<question>
```

The question should be specific, self-contained, and written in natural language.
The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
