---
"@context": https://schema.org
"@type": TechArticle
"@id": https://www.twilio.com/docs/conversations-classic/android/migrate-your-chat-android-sdk-conversations#article
headline: Migrate your Chat Android SDK to Conversations (classic)
description: Migrate your Twilio Programmable Chat Android SDK to the Conversations (classic) SDK. Rename imports and entities, refactor method calls, and update listener syntax.
url: https://www.twilio.com/docs/conversations-classic/android/migrate-your-chat-android-sdk-conversations
inLanguage: en
dateModified: 2026-06-25T22:35:25.000Z
author:
  "@type": Organization
  name: Twilio Developer Education Team
publisher:
  "@type": Organization
  name: Twilio
---

# Migrate your Chat Android SDK to Conversations (classic)

This guide describes how to migrate your Programmable Chat Android SDK to Conversations (classic). To convert your existing Twilio Chat application code to Conversations (classic), you perform several mechanical changes such as renaming imports and entities and refactoring method calls. You must use Programmable Chat Android SDK 6.0.0 as the minimum version to migrate without breaking changes.

## Update supported Java version

Add to your project's `build.gradle` the following compile options, necessary to use Java8 syntax features:

```bash
compileOptions {
    sourceCompatibility JavaVersion.VERSION_1_8
    targetCompatibility JavaVersion.VERSION_1_8
}

// Also if kotlin is used in the project
kotlinOptions {
    jvmTarget = '1.8'
}
```

## Rename imports

Rename java package imports from `com.twilio.chat` to `com.twilio.conversations`

## Rename entities

* `ChatClient` to `ConversationsClient`
* `Channel` to `Conversation`
* `Member`  to `Participant`

## Remove or replace not supported methods

* Public channels: `ConversationsClient.getConversation(sid)` now returns error code `CONVERSATION_NOT_FOUND` if channel with the given SID is public.
* `Media.download()` is removed, use `Message.getMediaContentTemporaryUrl()` instead.
* `getSubscribedChannelsSortedBy()` method. Sort list returned by `ConversationsClient.getMyConversations (classic)()` instead.
* `ChannelDescriptor`, `UserDescriptor` are not needed anymore and removed. Use `Conversation` and `User` objects instead.
* `Paginator` class is not used anymore and is removed.
* Invites to a channel are not supported. Use `Conversation.addParticipantByIdentity()` and `addParticipantByAddress()` instead.
* `onConversationJoined()` callback is temporarily removed. Use `onConversationAdded()` instead.
* `Conversation` doesn't implement `Parcelable` interface anymore. Instead store Conversation objects in your ViewModel or Repository following the [Recommended app architecture](https://developer.android.com/jetpack/guide#recommended-app-arch). Use `Conversation.sid` as unique key if necessary to pass around and retrieve the Conversation information.

## Refactor method calls

`someMethod()` here indicates any of the methods existing previously on certain objects, now they are slightly moved to make API more convenient to use.

* `ChatClient.getChannels().someMethod()` becomes `ConversationsClient.someMethod()`
* `Channel.getMembers().somMethod()` becomes `Conversation.someMethod()`
* `Channel.getMessages().someMethod()` becomes `Conversation.someMethod()`
* `Message.getMedia().someMethod()` becomes `Message.getMediaSomeMethod()`
* `ChatClient.getUsers().someMethod()` becomes `ConversationsClient.someMethod()`
* `ChatClient.getSubscribedChannels()` becomes `ConversationsClient.getMyConversations (classic)()`

## Rename consumptionHorizon to readHorizon

This highlights the fact that this horizon is best useful for implementing messages that have been read. Delivery horizon could be implemented through a combination of delivery receipts and custom attributes on messages.

* `getLastConsumedMessageIndex()` → `getLastReadMessageIndex()`
* `setNoMessagesConsumedWithResult()` → `setAllMessagesUnread()`
* `setAllMessagesConsumedWithResult()` → `setAllMessagesRead()`
* `setLastConsumedMessageIndexWithResult()` → `setLastReadMessageIndex()`
* `advanceLastConsumedMessageIndexWithResult()` → `advanceLastReadMessageIndex()`
* `getUnconsumedMessagesCount()` → `getUnreadMessagesCount()`
* `getLastConsumedMessageIndex()` → `getLastReadMessageIndex()`
* `getLastConsumptionTimestamp()` → `getLastReadTimestamp()`
* `UpdateReason.LAST_CONSUMED_MESSAGE_INDEX` → `UpdateReason.LAST_READ_MESSAGE_INDEX`
* `UpdateReason.LAST_CONSUMED_MESSAGE_TIMESTAMP` → `UpdateReason.LAST_READ_TIMESTAMP`

## Update Listeners syntax in Kotlin

`CallbackListener`, `StatusListener` and `ProgressListener` are now interfaces (not abstract classes). Remove constructor invocation in Kotlin code to make it compile:

```kotlin
object : StatusListener() { … }
```

becomes

```kotlin
object : StatusListener { … }
```
