Архитектура SDK
Обзор архитектуры edna Chat Center Android SDK с точки зрения интегратора: модульная структура, асинхронная последовательность подключения и модель потоков. На этой странице — только публичный контракт и факты, которые нужно учесть при встраивании SDK в приложение. Имена внутренних компонентов и порядок вызовов между ними не документируются: они могут меняться без предупреждения в минорных версиях.
Структура модулей
SDK построен по модульному принципу и состоит из двух слоёв: ChatCenterCore (ядро) и ChatCenterUI (пользовательский интерфейс). Приложение-интегратор взаимодействует преимущественно с ChatCenterUI, который делегирует логику ядру.
| Модуль | Ответственность |
|---|---|
| ChatCenterUI | Фрагменты/Activity чата, обработка UI-событий, отображение сообщений, вложений, уведомлений. Зависит от ChatCenterCore. |
| ChatCenterCore | Сетевое взаимодействие (REST + WebSocket), локальное хранение, парсинг, авторизация, управление состоянием. Не зависит от UI-модуля. |
Конфигурация SDK описывается классами ChatConfig (расширяет ChatConfigCore), ChatTransportConfig и ChatNetworkConfig — полное описание полей в разделе Настройки → ChatConfig. Полный список методов ChatCenterUI (init, authorize, logout, getChatFragment, send, …) — в Методах → Авторизация и Методах → Сообщения.
Последовательность подключения
При вызове chatCenterUI.authorize(client, auth) SDK последовательно выполняет несколько асинхронных этапов:
- Аутентификация пользователя на сервере.
- Загрузка серверной конфигурации виджета чата.
- Регистрация устройства для push-уведомлений.
- Отправка данных пользователя.
- Получение подтверждения от сервера и загрузка истории сообщений.
Готовность чата к работе отслеживайте через публичные callback-и: ChatCenterUIListener (см. Методы → Делегаты) и flow-события ChatUpdateProcessor (продвинутые сценарии). Сетевые ошибки на любом из этапов приходят в networkErrorReceived — см. Errors.
После authorize(...) нельзя сразу обращаться к экрану чата, ожидая готовые данные: SDK ещё выполняет хендшейк, и ChatFragment будет отображать состояние загрузки до получения первого ответа сервера. Не повторяйте вызов authorize(...) с теми же параметрами как ретрай — SDK не делает early-return и переустанавливает внутреннее соединение. Добавьте guard на стороне приложения, если возможны повторные вызовы (например, при восстановлении сети) — см. Известные ограничения → Поведение при разрыве WebSocket-соединения.
Внутри SDK состояния перечисленных этапов отслеживаются на собственном enum-е, но публичного способа подписаться на текущее значение нет: ни через ChatCenterUI/ChatCenterCore, ни через ChatCenterUIListener, ни через ChatUpdateProcessor. Не закладывайтесь на конкретные значения этого внутреннего состояния в коде приложения — используйте перечисленные выше callback-и.
Модель потоков
SDK использует многопоточную модель с разделением ответственности между потоками. Эта секция перечисляет публично наблюдаемые threading-гарантии — на что можно и нельзя полагаться при работе с callback-ами SDK.
| Поток | Операции |
|---|---|
| Main (UI) thread | Callback-методы unreadMessageCountChanged и exceptionReceived, обновление UI-компонентов, обработка пользовательских действий. |
| Background threads | Сетевые запросы (REST API), WebSocket-соединение, парсинг JSON, операции с локальной БД, обработка push-уведомлений, callback networkErrorReceived (см. ниже). |
networkErrorReceived не гарантирует main threadCallback ChatCenterUIListener.networkErrorReceived(error) в текущей реализации SDK может прийти с фонового потока — большая часть call-sites идёт из OkHttp WebSocket, @WorkerThread-методов и Dispatchers.IO. Часть Retrofit-enqueue()-callback'ов приходит на main, но это деталь реализации, на которую полагаться нельзя. Любые операции с UI внутри этого callback оборачивайте в runOnUiThread { ... } или Handler(Looper.getMainLooper()).post { ... } — иначе словите CalledFromWrongThreadException.
Методы unreadMessageCountChanged и exceptionReceived вызываются на главном потоке; для urlClicked поток зависит от точки вызова в UI. Полный разбор call-sites для всех четырёх callback-ов ChatCenterUIListener приведён в Известных ограничениях → ChatUpdateProcessor coroutine scopes.
ChatCenterUIМетоды ChatCenterUI (send(), authorize(), logout() и т. п.) необходимо вызывать только с главного потока. Если требуется инициировать вызов из фонового потока — оборачивайте через runOnUiThread { ... } или собственную сериализацию вызовов на стороне приложения.
См. также Известные ограничения → Гонка при параллельном вызове методов ChatCenterUI.
Связанные разделы
- Жизненный цикл приложения — куда и в каком порядке вызывать
init,authorize,logout. - Методы → Делегаты —
ChatCenterUIListener, threading callback-ов,MessageStatus. - Методы → Errors — обработка
networkErrorReceivedи стратегии retry. - Настройки → ChatConfig — поля
ChatConfig/ChatConfigCore,PendingIntentCreator, deprecated-параметры. - Push-уведомления — интеграция FCM/HMS,
handleFCMMessage. - Известные ограничения — параметры с приоритетом серверной настройки, поведенческие особенности.