Перейти к основному содержимому
Версия: 4.31.0

Расширенные настройки

Инициализация SDK

ThreadsLib.init(ConfigBuilder configBuilder)
public static final class ConfigBuilder {
@NonNull
private Context context;
@NonNull
private PendingIntentCreator pendingIntentCreator = (context1, appMarker) -> {

};
@Nullable
private UnreadMessagesCountListener unreadMessagesCountListener = null;

private boolean isDebugLoggingEnabled = false;

private boolean keepSocketActive = false;

private int historyLoadingCount = 50;

public ConfigBuilder(@NonNull Context context) {}
}

historyLoadingCount - количество сообщений, загружаемых при запросе истории (по умолчанию - 50)

keepSocketActive - удерживать ли websocket открыты при сворачивании чата(по умолчанию - false)

isDebugLoggingEnabled - писать ли дебаг сообщения в лог (не касается кастомного логгера, подробнее см Логгер). По умолчанию - false.

к сведению

Обязательный параметр только context.

Установка пользователя

ThreadsLib.initUser(UserInfoBuilderuserInfo userInfo, boolean forceRegistration)

Если forceRegistration установить в true (по умолчанию false), то sdk отправит при вызове данного метода запрос на регистрацию девайса и, если чат еще не отображен на экране, закроет сокет. Рекомендуется использовать значение по умолчанию, при котором сохраняется только UserInfoBuilder, а запрос на регистрацию девайса вместе с остальными запросами будет отправлен при открытии чата.

Первый параметр, UserInfoBuilder, представляет собой реализацию следующего класса:

public final class UserInfoBuilder {
@NonNull
String clientId;
@Nullable
String authToken;
@Nullable
String authSchema;
@Nullable
String clientIdSignature;
@Nullable
String userName;
@Nullable
String data;
@Nullable
String appMarker;
/**
* true if client id is encrypted
*/
boolean clientIdEncrypted = false;

public UserInfoBuilder(@NonNull String clientId) {}
}
к сведению

Обязательный параметр только clientId.

  • clientId - уникальный идентификатор клиента, обязательный параметр.
  • authToken - строка с токеном для авторизаци. Может быть null.
  • authSchema - строка со схемой авторизации. Может быть null.
  • authMethod - enum определяющий способ передачи информация об авторизации. (THRAuthMethodHeaders - данные авторизации передаются в заголовках (способ по умолчанию). THRAuthMethodCookies - данные авторизации передаются через cookies)
  • clientIdSignature - авторизационная подпись clientId, должна генерироваться на вашем сервере на основе clientId с помощью приватного ключа RSA, затем зашифрована в Base64. По общей схеме работы с подписью см. документацию по бэкенду
  • userName - имя клиента (может быть пустым)
  • clientData - кастомные данные приложения, в виде json строки (может быть пустым)Параметры которые будут отображены в общей информации о клиенте: namephoneemail. Пример:
{
"name": "Name Surname",
"phone": "+7-999-999-99-99",
"email": "e@mail.com",
"customField":"customValue"
}
  • appMarker - идентификатор приложения. edna Android поддерживает подключение нескольких приложений к одному серверу (подробнее см Настройка поведения и внешнего вида). Для этого нужно настроить идентификатор на сервере и в приложениях. В качестве appMarker может быть любая уникальная строка. appMarker должен быть одинаковым у соответствующих Android и iOS приложений.
  • clientIdEncrypted - данный параметр должен быть true, если clientId передается в зашифрованном виде.

Выход пользователя

ThreadsLib.logoutClient()

Необходимо использовать для логаута юзера (бэкенд перестаёт пытаться доставить сообщения для данного пользователя на устройство)

Отслеживание количества непрочитанных сообщений

unreadMessagesCountListener - слушатель количества непрочитанных сообщений

Чтобы подписаться на изменение количества непрочитанных сообщений, можно задать слушатель:

ConfigBuilder.setUnreadMessagesCountListener(new ThreadsLib.UnreadMessagesCountListener() {
@Override
public void onUnreadMessagesCountChanged(int count) {
// Сделать необходимые действия
}
});

Первый раз проверка непрочитанных запускается при инициализации СДК (если пользователь установлен). Для получения обновлений необходим активный чат (открытый и хранимый в памяти). Если нужно дать пользователю возможность выйти с экрана, но необходимо отображать актуальный счетчик, при инициализации библиотеки следует установить флаг keepSocketActive = true. В случае необходимости работы счетчика до входа в чат, необходимо устанавливать пользователя через метод initUser с флагом forceRegistration = true, а так же установить флаг keepSocketActive = true

Установка приоритета для канала уведомлений

Начиная с API 26 вы можете устанавливать приоритет для канала уведомлений, подробнее об этом можно почитать здесь: https://developer.android.com/develop/ui/views/notifications/channels . В библиотеке вы можете выставить их через метод setNotificationImportance(NotificationManager.IMPORTANCE_...) при настройке билдера:

ConfigBuilder(this).setNotificationImportance(NotificationManager.IMPORTANCE_HIGH)

Переход по Push-уведомлению и интеграция нескольких чатов в одном приложении

pendingIntentCreator - создатель интента-обработчика перехода по пушу

В случае, если пользователь нажал на пуш уведомление библиотеки в области системных уведомлений, будет открыт основной экран библиотеки - ChatActivity. Чтобы изменить данное поведение, можно настроить создание собственного PendingIntent.

Для этого воспользуйтесь методом ConfigBuilder.setPendingIntentCreator(ThreadsLib.PendingIntentCreator pendingIntentCreator) в application вашего приложения.

ConfigBuilder.setPendingIntentCreator(new ThreadsLib.PendingIntentCreator() {
@Override
public PendingIntent createPendingIntent(Context context, String appMarker) {
if (!TextUtils.isEmpty(appMarker)) {
//Start the appropriate chat according to appMarker
}
});

Для интеграции нескольких чатов в одном приложении - в метод createPendingIntent добавлен appMarker, по которому можно определять какой чат нужно открыть.

Для реализации мультичата нужно задавать clientId и appMarker перед открытием соответсвующего чата. Например для запуска чата 1:

ThreadsLib.initUser(
new UserInfoBuilder(clientId1)
.setAppMarker(appMarker1)
)
//Configure design & behavior for chat 1

Для запуска чата 2:

ThreadsLib.initUser(
new UserInfoBuilder(clientId2)
.setAppMarker(appMarker2)
)
//Configure design & behavior for chat 2
предупреждение

Важно: clientId1 и clientid2 должны быть различными. На данный момент из коробки не поддерживается мультичат с одним и тем же clientId. Но реализация мультичата с одним клиентом при этом возможна - для этого свяжитесь с вашим менеджером подключения.

Применение стилей

ThreadsLib.applyLightTheme(ChatStyle chatStyle) // для светлой темы
ThreadsLib.applyDarkTheme(ChatStyle chatStyle) // для темной темы

Если темная тема не поддерживается, достаточно вызвать applyLightTheme(ChatStyle chatStyle). Используется для кастомизации внешнего вида чата. Подробнее см Настройка поведения и внешнего вида

Отправка сообщений

ThreadsLib.sendMessage(@Nullable String message, @Nullable File file)

Необходимо использовать для отправки произвольного сообщения от лица клиента (необходимо, чтобы хотя бы один из двух параметров (message или file) был не равен null).

  • message - текст сообщения
  • file - файл

Настройки сервера по умолчанию позволяют отправлять файлы размером до 30 мб.

SSL Pinning

Позволяет использовать указанный список сертификатов для проверки их соответствия с сертификатом на сервере.

осторожно

При использования данного функционала, не рекомендуется использовать только один сертификат. В случае его отзыва или истечения срока действия - SDK перестанет подключаться к серверу. Используйте резервные сертификаты с их своевременным обновлением.

Для включения SSL pinning необходимо:

  1. В папку res/raw поместить публичные сертификаты.
  2. В классе Application в месте инициализации ConfigBuilder, добавить список сертификатов. Например:
.trustedSSLCertificates(Collections.singletonList(R.raw.crt))
  1. В манифесте прописать сетевой конфиг. Например:

android:networkSecurityConfig="@xml/network_security_config"

В содержимом конфигурационного файла нужно указать или добавить сетевой профиль. Например:

<network-security-config> 
<domain-config cleartextTrafficPermitted="false">
<domain includeSubdomains="true">your_domain/</domain>
<trust-anchors>
<certificates src="@raw/crt"/>
</trust-anchors>
</domain-config>
</network-security-config>

Можно разрешить использовать любые непроверенные сертификаты. Для этого при инициализации ConfigBuilder указать:

.allowUntrustedSSLCertificates(true)
предупреждение

Важно: Настройка .allowUntrustedSSLCertificates(true) будет работать только если не активирован SSL pinning. В противном случае настройка игнорируется.

Настройка таймаутов подключения

Для кастомизации таймаутов запросов в ConfigBuilder добавлен метод requestConfig(final RequestConfig requestConfig).

RequestConfig содержит поля с настройками по умолчанию:

  • настройки сокетного соединения socketClientSettings (тип SocketClientSettings)
  • настройки http-соединения для библиотеки загрузки картинок Picasso picassoHttpClientSettings (тип HttpClientSettings)
  • настройки http-соединения для авторизации authHttpClientSettings (тип HttpClientSettings)
  • настройки http-соединения для серверного API Чат-Центра threadsApiHttpClientSettings (тип HttpClientSettings)

SocketClientSettings содержит:

  • resendIntervalMillis - интервал повторной попытки отправки сообщения
  • resendPingIntervalMillis - интервал запросов поддержания активной соединения (OkHttpClient.Builder().pingInterval())
  • connectTimeoutMillis - таймаут установления нового соединения (OkHttpClient.Builder().connectTimeout())
  • readTimeoutMillis - таймаут операций чтения для нового соединения (OkHttpClient.Builder().readTimeout())
  • writeTimeoutMillis - таймаут операций записи для нового соединения (OkHttpClient.Builder().writeTimeout())
  • sendIntervalMillis - таймаут для отправки сообщения, после которого оно будет помечено как недоставленное

HttpClientSettings содержит:

  • connectTimeoutMillis - таймаут установления нового соединения (OkHttpClient.Builder().connectTimeout())
  • readTimeoutMillis - таймаут операций чтения для нового соединения (OkHttpClient.Builder().readTimeout())
  • writeTimeoutMillis - таймаут операций записи для нового соединения (OkHttpClient.Builder().writeTimeout())

Использование внутренних диплинков

Библиотека позволяет использовать внутренние диплинки. Например, если в сообщении встречается текст вида:

earth://some.params?code={code}

И если вы создадите Activity, который будет запускаться Аction.VIEW, то при клике на подобную ссылку запустится ваш указанный активити. Для этого в манифесте указать для вашего активити фильтры:

<intent-filter>
<action android:name="android.intent.action.VIEW" />
<category android:name="android.intent.category.DEFAULT" />
<category android:name="android.intent.category.BROWSABLE" />
<data android:scheme="earth"
android:host="*" />
</intent-filter>

Настройки backup для приложения

В библиотеке используется настройка

<application  
android:fullBackupContent="@xml/backup_rules">
...
</application>

Содержимое данного файла:

<full-backup-content>  
<exclude domain="sharedpref" path="im.threads.internal.utils.EncryptedPrefStore.xml"/>
</full-backup-content>

Данная запись необходима, чтобы зашифрованные SharedPreferences не оставались в памяти устройства после переустановки приложения. Если вы используете свой собственный fullBackupContent файл, вам необходимо добавить в ваш файл exclude, который описан у нас и затем переопределить ваш файл своим:

<application  
android:fullBackupContent="@xml/your_backup_rules"
tools:replace="android:fullBackupContent">
...
</application>

Бывает так, что другие SDK также используют android:fullBackupContent настройку. В этом случае нужно посмотреть, какие исключения прописаны в этих SDK и сделать общий файл. Например у Vungle и AppsFlyer есть свои настройки fullBackupContent. Их исключения задокументированы следующим образом:

Vungle - https://support.vungle.com/hc/en-us/articles/360047780372#vungle-exclusion-rules-0-11
AppsFlyer - https://support.appsflyer.com/hc/en-us/articles/207032126-Android-SDK-integration-for-developers#integration-backup-rules

Для объединения их настроек с нашей должен получиться следующий файл:

<?xml version="1.0" encoding="utf-8"?>
<full-backup-content>
<exclude domain="sharedpref" path="appsflyer-data"/>
<exclude domain="file" path="vungle" />
<exclude domain="file" path="vungle_cache" />
<exclude domain="external" path="vungle_cache" />
<exclude domain="database" path="vungle_db" />
<exclude domain="sharedpref" path="com.vungle.sdk.xml" />
<exclude domain="sharedpref" path="im.threads.internal.utils.EncryptedPrefStore.xml"/>
</full-backup-content>

Логгер

Библиотека использует свой собственный логгер, который поддерживает запись в файл. По умолчанию он выключен, то есть логи не будут выводиться ни в файл, ни в консоль. Чтобы включить логи в библиотеке, нужно в ConfigBuilder включить enableLogging и передать билдер логгера:

val configBuilder = ConfigBuilder(this) // this - app context
.enableLogging(loggerConfig)

Чтобы создать билдер логгера, необходимо выполнить команду:

LoggerConfig.Builder(this) // this - app context

Чтобы включить вывод логов в файл, нужно включить это как фичу:

logToFile()

Затем нужно указать директорию логов:

dir(File(this.filesDir, "logs"))

Логгер поддерживает два способа логгирования. Это может быть логгирование в один файл, либо в несколько файлов, имя которых будет равно времени старта сессии приложения. Для этого используется LoggerRetentionPolicy со значениями FILE_COUNT - по сессиям, и TOTAL_SIZE - в одном файле. Способ логгирования указывается как:

retentionPolicy(LoggerRetentionPolicy.TOTAL_SIZE)

Если вы указали LoggerRetentionPolicy.TOTAL_SIZE, то чтобы ограничить максимальный размер, укажите:

maxTotalSize(N) // N - размер в байтах

Также в случае с LoggerRetentionPolicy.TOTAL_SIZE можно указать свое имя файла (по умолчанию будет время старта первой сессии). Для этого укажите:

fileName("ваше_имя_файла")

Если вы указали LoggerRetentionPolicy.FILE_COUNT, то чтобы ограничить количество файлов, укажите:

maxFileCount(N) // N - количество файлов

Чтобы определить минимальный уровень для логов (по умолчанию LoggerLevel.VERBOSE), укажите:

minLogLevel(logLevel) // logLevel - ваш минимальный уровень лога

В конце нужно вызвать build(). Пример настроек:

val loggerConfig = LoggerConfig.Builder(this)
.logToFile()
.dir(File(this.filesDir, "logs"))
.retentionPolicy(LoggerRetentionPolicy.TOTAL_SIZE)
.maxTotalSize(5242880)
.build()

Передача данных для авторизации

Для передачи данных авторизации, вызовите внутри UserInfoBuilder метод

setAuthData(authToken: String?, authSchema: String?, authMethod: AuthMethod)

где для AuthMethod нужно указать AuthMethod.COOKIES.

val userInfo = UserInfoBuilder(clientId)
.setAuthData(authToken, authSchema, AuthMethod.COOKIES)

Описание полей:

  • AUTH_TOKEN - строка с токеном для авторизаци. Может быть null.
  • AUTH_SCHEMA - строка со схемой авторизации. Может быть null.
  • AUTH_METHOD - enum определяющий способ передачи информация об авторизации. THRAuthMethodHeaders - данные авторизации передаются в заголовках (способ по умолчанию). THRAuthMethodCookies - данные авторизации передаются через cookies.

Для обновления данных авторизации, вызовите метод

ThreadsLib.getInstance().
updateAuthData(authToken: String?, authSchema: String?, authMethod: AuthMethod)

при этом библиотека должна быть уже инициализирована.

Изменение версии backend api

По умолчанию в мобильном sdk уровень backend api = 15. Вы можете изменить его через метод setApiVersion(apiVersion: ApiVersionEnum). Доступные к изменению версии api - 15, 17, 18.

Отключение пользовательского ввода

Для отключения пользовательского ввода и возможности отправки сообщений в чат, необходимо использовать следующий метод:

disableUserInput(disableUserInput: Boolean)