Скачать SDK с гитхаба
В нём хранится как нативная реализация так и вебвью
вебвью хранится в crafttalk-android-sdk\app\src\main\java\com\crafttalk\sampleChat\web_view
достаточно будет скопировать код
хранящийся в crafttalk-android-sdk\app\src\main\java\com\crafttalk\sampleChat\web_view
в файле AuthFreqment.kt можно посмотреть какие данные передаются в окно с чатом для идентификации пользователя
в файле crafttalk-android-sdk\app\src\main\res\values\strings.xml хранятся переменные строки в которых указан адрес до веб чата
<string name="webUrlChatScheme">https</string>
<string name="webUrlChatHost">ваш сайт</string>
<string name="webUrlChatNameSpace">канал</string>
также чат умеет отправлять фото и документы для которых требуются разрешения
Add this in your root build.gradle file (not your module build.gradle file):
allprojects {
repositories {
maven { url "https://jitpack.io" }
}
}Then, add the library to your module build.gradle
dependencies {
implementation 'com.github.crafttalk:crafttalk-android-sdk:latest.release.version'
}В примере продемонстрировано, как нужно использовать библиотеку.
В AndroidManifest необходимо добавить следующие permissions:
<uses-permission android:name="android.permission.INTERNET"/>
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
<uses-permission android:name="android.permission.CAMERA"/>
При использовании пушей в AndroidManifest необходимо добавить ChatPushService и дефолтный channel id.
Для загрузки файлов необходим FileProvider, для этого в AndroidManifest необходимо указать provider с authorities (он должен совпадать со значением атрибута fileProviderAuthorities в ChatView).
<application
...>
<meta-data
android:name="com.google.firebase.messaging.default_notification_channel_id"
android:value="@string/default_notification_channel_id" />
...
<service
android:name="com.crafttalk.chat.data.push.ChatPushService"
android:exported="false">
<intent-filter>
<action android:name="com.google.firebase.MESSAGING_EVENT" />
</intent-filter>
</service>
<provider
android:name="androidx.core.content.FileProvider"
android:authorities="com.crafttalk.chat.fileprovider"
android:exported="false"
android:grantUriPermissions="true">
<meta-data
android:name="android.support.FILE_PROVIDER_PATHS"
android:resource="@xml/file_paths" />
</provider>
</application>
В xml файл, где будет располагаться чат, необходимо добавить ChatView c 5 обязательными атрибутами (auth, urlSocketHost, urlSocketNameSpace, urlUploadHost, urlUploadNameSpace, fileProviderAuthorities)
<com.crafttalk.chat.presentation.ChatView
android:id="@+id/chatView"
android:layout_height="match_parent"
android:layout_width="match_parent" />
Необходимо инициализировать библиотеку, сделать это нужно как можно раньше (до любого другого вызова из библиотеки). Также с помощью метода Chat.init можно задать поведение чат-бота.
Chat.init(
this,
getString(R.string.urlChatScheme),
getString(R.string.urlChatHost),
getString(R.string.urlChatNameSpace),
fileProviderAuthorities = getString(R.string.chat_file_provider_authorities)
)
- urlChatScheme - указывает, какая схема будет использоваться при подключении
- urlChatHost - указывает, какое доменное имя будет использоваться при подключении
- urlChatNameSpace - указывает, по какому nameSpace будет происходить подключение
- authType - может принимать AUTH_WITH_FORM или AUTH_WITHOUT_FORM. Это поле определяет, как будет проходить аутентификация для пользователя
- operatorPreviewMode - может принимать CACHE (по умолчанию) или ALWAYS_REQUEST. Это поле определяет режим сохранения иконки оператора.
- operatorNameMode - может принимать IMMUTABLE (по умолчанию) или ACTUAL. Это поле определяет режим обновления имени оператора у старых сообщений, отправленным этим оператором.
- clickableLinkMode - может принимать ALL (по умолчанию) или SECURE. Это поле определяет, какие из ссылок будут кликабельными, а какие нет.
- localeLanguage - это поле используется при формировании локали
- localeCountry - это поле используется при формировании локали
- phonePatterns - определяет шаблоны, по которым определяются телефонные номера
- fileProviderAuthorities - значение authorities для FileProvider
- certificatePinning - указывает сертификат, использующийся для включения SSL Pinning
- fileConnectTimeout - устанавливает connectTimeout для отправки файлов (измеряется в секундах)
- fileReadTimeout - устанавливает readTimeout для отправки файлов (измеряется в секундах)
- fileWriteTimeout - устанавливает writeTimeout для отправки файлов (измеряется в секундах)
- fileCallTimeout - устанавливает callTimeout для отправки файлов (измеряется в секундах)
Аутентификация может осуществляться двумя способами: явно (AUTH_WITH_FORM) и неявно (AUTH_WITHOUT_FORM) для пользователя. Отличие заключается в том, что при AUTH_WITH_FORM пользователю необходимо самому ввести данные о себе через форму, а при AUTH_WITHOUT_FORM за формирование объекта Visitor, необходимого для аутентификации, отвечает тот, кто использует библиотеку.
Схему авторизации клиент может поменять, для этого необходимо расширять объект Visitor новыми полями. Для этих целей у объекта Visitor есть метод addNewFiled(fieldName: String, fieldValue: Any), который добавляет наименование поля и его значение, и removeAddedField(firstName: String), который удаляет ранее добавленное поле по его наименованию.
Чтобы разлогинить пользователя необходимо воспользоваться методами Chat.logOut (или Chat.logOutWithUIActionAfter, или Chat.logOutWithIOActionAfter). Отличаются они тем, что в последних двух методах происходит вызов callback'а после "разлогинивания" пользователя. Необходимо помнить, что после вызова этих методов, нельзя переходить в чат без предварительного вызова Chat.wakeUp (с объектом Visitor), поскольку в чате уже не будет данных о пользователе.
Чтобы включить SSL Pinning необходимо в метод Chat.init передать сертификат, как атрибут certificatePinning.
Если аутентификация была успешной, то производится подписка пользователя на push уведомления, если тот ранее не был подписан. В противном случае пользователя отписывают от получение push уведомлений.
В рамках сессии пользователь решает свои вопросы, в пределах одной сессии 'живет' сокет.
Создать сессию можно с помощью вызова метода Chat.createSession, при повторных вызовах этого метода сокет пересоздаваться не будет, если не был вызван метод Chat.destroySession. Уничтожение сессии осуществляется с помощью вызова метода Chat.destroySession.
Методы Chat.wakeUp и drop управляют активностью сокета (они определяют авторизован ли пользователь). При вызове метода Chat.wakeUp происходит 'активизация сокета' и дальнейшая авторизация пользователя, при повторном вызове авторизация повторно не происходит. При вызове метода Chat.drop происходит отключение сокета (пользователь находится в неавторизованном состоянии). Чтобы возобновить работу необходимо вызвать метод Chat.wakeUp, произойдет подключение с последующей авторизацией пользователя.
Пока сокет 'активен' (между вызовами Chat.wakeUp и Chat.drop) уведомления приходить не будут, так как пользователь находится в приложении. Когда сокет 'спит' (между вызовами Chat.drop и Chat.wakeUp) уведомления приходить будут, так как пользователь закрывает приложение.
Важно!!! Создание сессии должно происходить (вызов метода Chat.createSession) после инициализации чат-бота (вызов метода Chat.init).
Важно!!! В случае если методы Chat.wakeUp и Chat.drop вызываются в том же фрагменте, где располагается сам чат-бот, то вызов метода chatView.onResume должен идти после Chat.wakeUp.
Важно!!! Также существует метод Chat.wakeUp без аргументов. Этот метод стоит использовать, когда Chat.wakeUp вызывается на экране чата, в таком случае этот метод должен вызываться перед вызовом chatView.onResume.
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
...
Chat.createSession()
}
override fun onResume() {
super.onResume()
Chat.wakeUp(getVisitor(this))
...
}
override fun onStop() {
super.onStop()
Chat.drop()
}
override fun onDestroy() {
super.onDestroy()
Chat.destroySession()
}
Необходимо оповестить ChatView о том, что приложение находится в определенном состоянии (onViewCreated, onResume).
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState)
chatView.onViewCreated(this, viewLifecycleOwner)
}
override fun onResume() {
super.onResume()
chatView.onResume()
}
override fun onStop() {
super.onStop()
chatView.onStop()
}
override fun onDestroyView() {
super.onDestroyView()
chatView.onDestroyView()
}
Настройка ChatView осуществляется в файле xml. Для кастомизации используются атрибуты. Атрибуты делятся на две группы. Одни задают поведение чата, другие определяют визуальную составляющую.
timeDelayed- выставляет минимальное время отображения троббераdelay_download_document- минимальное время, отображения иконки, установленной через атрибут drawable_document_downloading_icon
color_main- устанавливает главный цвет чатаcolor_bg_user_message- устанавливает цвет фона пользовательского сообщенияcolor_bg_user_media_file_message- устанавливает цвет фона пользовательского сообщения с фото или гифкойcolor_bg_operator_message- устанавливает цвет фона сообщения бота/оператораcolor_bg_operator_media_file_message- устанавливает цвет фона сообщения бота/оператора с фото или гифкойcolor_text_user_message- устанавливает цвет текста пользовательского сообщенияcolor_text_operator_message- устанавливает цвет текста сообщения бота/оператораcolor_text_operator_action- устанавливает цвет текста подсказки ботаcolor_bg_operator_selected_action- устанавливает цвет фона выбранной подсказки ботаcolor_text_operator_selected_action- устанавливает цвет текста выбранной подсказки ботаcolor_text_operator_button- устанавливает дефолтный цвет текста кнопки-подсказки ботаcolor_primary_text_operator_button- устанавливает цвет текста для кнопки-подсказки бота со стилем primarycolor_secondary_text_operator_button- устанавливает цвет текста для кнопки-подсказки бота со стилем secondarycolor_negative_text_operator_button- устанавливает цвет текста для кнопки-подсказки бота со стилем negativecolor_text_operator_selected_button- устанавливает дефолтный цвет текста выбранной кнопки-подсказки ботаcolor_primary_text_operator_selected_button- устанавливает цвет текста для выбранной кнопки-подсказки бота со стилем primarycolor_secondary_text_operator_selected_button- устанавливает цвет текста для выбранной кнопки-подсказки бота со стилем secondarycolor_negative_text_operator_selected_button- устанавливает цвет текста для выбранной кнопки-подсказки бота со стилем negativecolor_file_name- устанавливает цвет имени файла для всех сообщенийcolor_user_file_name- устанавливает цвет имени файла для пользовательского сообщенияcolor_operator_file_name- устанавливает цвет имени файла для сообщения бота/оператораcolor_file_size- устанавливает цвет размера файла для всех сообщенийcolor_user_file_size- устанавливает цвет размера файла для пользовательского сообщенияcolor_operator_file_size- устанавливает цвет размера файла для сообщения бота/оператораcolor_text_user_message_author- устанавливает цвет текста имени пользователяcolor_text_operator_message_author- устанавливает цвет текста имени бота/оператораcolor_user_message_time- устанавливает цвет времени сообщения для всех типов от пользователяcolor_user_file_message_time- устанавливает цвет времени сообщения с файлом от пользователя, если атрибут не указан, то используется значение из color_user_message_timecolor_user_gif_message_time- устанавливает цвет времени сообщения с гифкой от пользователя, если атрибут не указан, то используется значение из color_user_message_timecolor_user_image_message_time- устанавливает цвет времени сообщения с фото от пользователя, если атрибут не указан, то используется значение из color_user_message_timecolor_user_text_message_time- устанавливает цвет времени сообщения с текстом и для смешанного сообщения (текст + фото/гифка/файл) от пользователя, если атрибут не указан, то используется значение из color_user_message_timecolor_operator_message_time- устанавливает цвет времени сообщения для всех типов от бота/оператораcolor_operator_file_message_time- устанавливает цвет времени сообщения с файлом от бота/оператора, если атрибут не указан, то используется значение из color_operator_message_timecolor_operator_gif_message_time- устанавливает цвет времени сообщения с гифкой от бота/оператора, если атрибут не указан, то используется значение из color_operator_message_timecolor_operator_image_message_time- устанавливает цвет времени сообщения с фото от бота/оператора, если атрибут не указан, то используется значение из color_operator_message_timecolor_operator_text_message_time- устанавливает цвет времени сообщения с текстом и для смешанного сообщения (текст + фото/гифка/файл) от бота/оператора, если атрибут не указан, то используется значение из color_operator_message_timecolor_operator_widget_message_time- устанавливает цвет времени сообщения для виджета от бота/оператора, если атрибут не указан, то используется значение из color_operator_message_timecolor_user_message_status- устанавливает цвет иконок статуса для всех типов сообщенийcolor_user_file_message_status- устанавливает цвет иконок статуса для сообщения с файлом, если не указано, то используется значение из color_user_message_statuscolor_user_gif_message_status- устанавливает цвет иконок статуса для сообщения с гифкой, если не указано, то используется значение из color_user_message_statuscolor_user_image_message_status- устанавливает цвет иконок статуса для сообщения с фото, если не указано, то используется значение из color_user_message_statuscolor_user_text_message_status- устанавливает цвет иконок статуса для сообщения с текстом и для смешанного сообщения (текст + фото/гифка/файл), если не указано, то используется значение из color_user_message_statuscolor_text_link_operator_message- устанавливает цвет текста ссылки в сообщении от бота/оператораcolor_text_link_user_message- устанавливает цвет текста ссылки в пользовательском сообщенииcolor_text_warning- устанавливает цвет текста, сообщающего о состоянии соединенияcolor_company- устанавливает цвет текста названия компании (имеет смысл, есть атрибут show_company_name выставлен в true)color_text_date_grouping- устанавливает цвет текста даты, группирующей сообщенияcolor_text_phone_operator_message- устанавливает цвет текста телефона в сообщении от бота/оператораcolor_text_phone_user_message- устанавливает цвет текста телефона в пользовательском сообщении
resource_bg_user_message- устанавливает background для сообщений пользователяresource_bg_operator_message- устанавливает background для сообщений бота/оператораresource_bg_operator_button- устанавливает дефолтный background для кнопки-подсказки ботаresource_primary_bg_operator_button- устанавливает background для кнопки-подсказки бота со стилем primaryresource_secondary_bg_operator_button- устанавливает background для кнопки-подсказки бота со стилем secondaryresource_negative_bg_operator_button- устанавливает background для кнопки-подсказки бота со стилем negativeresource_bg_operator_selected_button- устанавливает дефолтный background для выбранной кнопки-подсказки ботаresource_primary_bg_operator_selected_button- устанавливает background для выбранной кнопки-подсказки бота со стилем primaryresource_secondary_bg_operator_selected_button- устанавливает background для выбранной кнопки-подсказки бота со стилем secondaryresource_negative_bg_operator_selected_button- устанавливает background для выбранной кнопки-подсказки бота со стилем negative
drawable_progress_indeterminate- устанавливает цвет всех тробберов в чатеdrawable_attach_file- устанавливает иконку элемента, предназначенного для прикрепления файловdrawable_send_message- устанавливает иконку элемента, предназначенного для отправки сообщенийdrawable_document_not_downloaded_icon- устанавливает иконку для файла, который еще не был скачан, в сообщении, содержащем файлdrawable_document_downloading_icon- устанавливает иконку для файла, который скачивается, в сообщении, содержащем файлdrawable_document_downloaded_icon- устанавливает иконку для файла, который уже скачан, в сообщении, содержащем файл
size_user_message- устанавливает размер текста пользовательского сообщенияsize_operator_message- устанавливает размер текста сообщения бота/оператораsize_operator_action- устанавливает размер текста подсказки ботаsize_operator_button- устанавливает размер текста кнопки-подсказки ботаsize_file_name- устанавливает размер текста имени файла для всех сообщенийsize_user_file_name- устанавливает размер текста имени файла пользовательского сообщенияsize_operator_file_name- устанавливает размер текста имени файла сообщения бота/оператораsize_file_size- устанавливает размер текста размера файла для всех сообщенийsize_user_file_size- устанавливает размер текста размера файла пользовательского сообщенияsize_operator_file_size- устанавливает размер текста размера файла сообщения бота/оператораsize_user_message_author- устанавливает размер имени пользователя в сообщенииsize_operator_message_author- устанавливает размер имени бота/оператора в сообщенииsize_user_message_time- устанавливает размер текста времени в сообщении пользователяsize_operator_message_time- устанавливает размер текста времени в сообщении бота/оператораsize_warning- устанавливает размер текста, сообщающего о состоянии соединенияsize_info- устанавливает размер текста информационного сообщения (название компании/сообщение, сообщающие о том, что оператор набирает сообщение)size_text_date_grouping- устанавливает размер текста даты, группирующей сообщения
size_operator_message_author_preview- устанавливает размер иконки бота/оператора в сообщенииwidth_item_user_text_message- устанавливает максимальную ширину бабла сообщения с текстом и смешанного сообщения (текст + фото/гифка/файл) от пользователяwidth_item_operator_text_message- устанавливает максимальную ширину бабла сообщения с текстом и смешанного сообщения (текст + фото/гифка/файл) от бота/оператораwidth_item_user_file_icon_message- устанавливает размер (ширину/высоту) иконки файла в сообщении от пользователяwidth_item_operator_file_icon_message- устанавливает размер (ширину/высоту) иконки файла в сообщении от бота/оператораwidth_item_user_file_preview_warning_message- устанавливает размер (ширину/высоту) в сообщении с фото/гифкой (если оно не грузится) от пользователяwidth_item_operator_file_preview_warning_message- устанавливает размер (ширину/высоту) в сообщении с фото/гифкой (если оно не грузится) от бота/оператораwidth_elongated_item_user_file_preview_message- устанавливает ширину фото/гифки (если ширина ресурса больше высоты) в сообщении от пользователяwidth_elongated_item_operator_file_preview_message- устанавливает ширину фото/гифки (если ширина ресурса больше высоты) в сообщении от бота/оператораheight_elongated_item_user_file_preview_message- устанавливает высоту фото/гифки (если высота ресурса больше ширины) в сообщении от пользователяheight_elongated_item_operator_file_preview_message- устанавливает высоту фото/гифки (если высота ресурса больше ширины) в сообщении от бота/оператораwidth_item_user_text_message_in_percent- устанавливает максимальную ширину бабла сообщения с текстом и смешанного сообщения (текст + фото/гифка/файл) от пользователя в процентном соотношенииwidth_item_operator_text_message_in_percent- устанавливает максимальную ширину бабла сообщения с текстом и смешанного сообщения (текст + фото/гифка/файл) от бота/оператора в процентном соотношенииwidth_item_user_file_icon_message_in_percent- устанавливает размер (ширину/высоту) иконки файла в сообщении от пользователя в процентном соотношенииwidth_item_operator_file_icon_message_in_percent- устанавливает размер (ширину/высоту) иконки файла в сообщении от бота/оператора в процентном соотношенииwidth_item_user_file_preview_warning_message_in_percent- устанавливает размер (ширину/высоту) в сообщении с фото/гифкой (если оно не грузится) от пользователя в процентном соотношенииwidth_item_operator_file_preview_warning_message_in_percent- устанавливает размер (ширину/высоту) в сообщении с фото/гифкой (если оно не грузится) от бота/оператора в процентном соотношенииwidth_elongated_item_user_file_preview_message_in_percent- устанавливает ширину фото/гифки (если ширина ресурса больше высоты) в сообщении от пользователя в процентном соотношенииwidth_elongated_item_operator_file_preview_message_in_percent- устанавливает ширину фото/гифки (если ширина ресурса больше высоты) в сообщении от бота/оператора в процентном соотношенииheight_elongated_item_user_file_preview_message_in_percent- устанавливает высоту фото/гифки (если высота ресурса больше ширины) в сообщении от пользователя в процентном соотношенииheight_elongated_item_operator_file_preview_message_in_percent- устанавливает высоту фото/гифки (если высота ресурса больше ширины) в сообщении от бота/оператора в процентном соотношенииhorizontal_spacing_operator_button- устанавливает горизонтальное расстояние между соседними кнопками-подсказками ботаvertical_spacing_operator_button- устанавливает вертикальное расстояние между соседними кнопками-подсказками бота
rounded_media_file_preview_message- устанавливает значения скругления углов для медиафайлаrounded_gif_file_preview_message- устанавливает значения скругления углов для gif'окrounded_top_left_user_media_file_preview_message- устанавливает значение скругления верхнего левого угла для медиафайла от пользователяrounded_top_right_user_media_file_preview_message- устанавливает значение скругления верхнего правого угла для медиафайла от пользователяrounded_bottom_left_user_media_file_preview_message- устанавливает значение скругления нижнего левого угла для медиафайла от пользователяrounded_bottom_right_user_media_file_preview_message- устанавливает значение скругления нижнего правого угла для медиафайла от пользователяrounded_top_left_user_gif_file_preview_message- устанавливает значение скругления верхнего левого угла для gif'ок пользователяrounded_top_right_user_gif_file_preview_message- устанавливает значение скругления верхнего правого угла для gif'ок пользователяrounded_bottom_left_user_gif_file_preview_message- устанавливает значение скругления нижнего левого угла для gif'ок пользователяrounded_bottom_right_user_gif_file_preview_message- устанавливает значение скругления нижнего правого угла для gif'ок пользователяrounded_top_left_operator_media_file_preview_message- устанавливает значение скругления верхнего левого угла для медиафайла от бота/оператораrounded_top_right_operator_media_file_preview_message- устанавливает значение скругления верхнего правого угла для медиафайла от бота/оператораrounded_bottom_left_operator_media_file_preview_message- устанавливает значение скругления нижнего левого угла для медиафайла от бота/оператораrounded_bottom_right_operator_media_file_preview_message- устанавливает значение скругления нижнего правого угла для медиафайла от бота/оператораrounded_top_left_operator_gif_file_preview_message- устанавливает значение скругления верхнего левого угла для gif'ок бота/оператораrounded_top_right_operator_gif_file_preview_message- устанавливает значение скругления верхнего правого угла для gif'ок бота/оператораrounded_bottom_left_operator_gif_file_preview_message- устанавливает значение скругления нижнего левого угла для gif'ок бота/оператораrounded_bottom_right_operator_gif_file_preview_message- устанавливает значение скругления нижнего правого угла для gif'ок бота/оператора
resource_font_family_all_text- шрифт для всех сообщений, если указан этот атрибут, то остальные игнорируютсяresource_font_family_user_messageresource_font_family_operator_messageresource_font_family_operator_actionresource_font_family_operator_buttonresource_font_family_file_inforesource_font_family_message_authorresource_font_family_message_timeresource_font_family_message_date
margin_start_media_file- устанавливает margin слева от медиа файлаmargin_end_media_file- устанавливает margin справа от медиа файлаmargin_top_media_file- устанавливает margin сверху от медиа файлаmargin_bottom_media_file- устанавливает margin снизу от медиа файла
company_name- указывает название компании (имеет смысл, есть атрибут show_company_name выставлен в true)show_company_name- указывает о необходимости отобразить название компанииshow_internet_connection_state- указывает о необходимости отобразить дефолтную панель с состоянием сетиshow_upper_limiter- указывает о необходимости отобразить верхний разграничительshow_starting_progress- указывает о необходимости отобразить троббер при загрузки чата (значение по умолчанию true)show_user_message_author- указывает о необходимости отобразить имя автора пользователяshow_user_message_status- указывает о необходимости отобразить статус пользовательского сообщенияshow_chat_state- указывает о необходимости отобразить дефолтную панель с состоянием синхронизации
media_file_download_mode- указывает о необходимости отобразить кнопку для скачивания файлов (дефолтное значение ONLY_IN_VIEWER). ONLY_IN_VIEWER - предоставляет возможность скачать фото только при просмотре этого фото, ONLY_IN_CHAT - предоставляет возможность скачать фото из чата, All_PLACES - предоставляет возможность скачать фото из любого места.color_user_file_message_download- устанавливает цвет текста кнопки для пользовательского сообщенияcolor_operator_file_message_download- устанавливает цвет текста кнопки для сообщения от бота/оператораsize_user_file_message_download- устанавливает размер текста кнопки для пользовательского сообщенияsize_operator_file_message_download- устанавливает размер текста кнопки для сообщения от бота/оператораbackground_user_file_message_download- устанавливает фон кнопки для пользовательского сообщенияbackground_operator_file_message_download- устанавливает фон кнопки для сообщения от бота/оператора
reply_enable- включает (true) или отключает (false) цитированиеdrawable_reply_message- устанавливает иконку "процесса цитирования", при свайпе влевоcolor_barrier_user_replied_message- устанавливает цвет барьера для процитированного блока в сообщении пользователяcolor_barrier_operator_replied_message- устанавливает цвет барьера для процитированного блока в сообщении оператораcolor_text_user_replied_message- устанавливает цвет текста процитированного сообщения пользователемcolor_text_operator_replied_message- устанавливает цвет текста процитированного сообщения операторомcolor_user_replied_file_name- устанавливает цвет текста имени файла процитированного сообщения пользователемcolor_operator_replied_file_name- устанавливает цвет текста имени файла процитированного сообщения операторомcolor_user_replied_file_size- устанавливает цвет текста размера файла процитированного сообщения пользователемcolor_operator_replied_file_size- устанавливает цвет текста размера файла процитированного сообщения операторомsize_user_replied_message- устанавливает размер текста процитированного сообщения пользователемsize_operator_replied_message- устанавливает размер текста процитированного сообщения операторомsize_user_replied_file_name- устанавливает размер текста имени файла процитированного сообщения пользователемsize_operator_replied_file_name- устанавливает размер текста имени файла процитированного сообщения операторомsize_user_replied_file_size- устанавливает размер текста размера файла процитированного сообщения пользователемsize_operator_replied_file_size- устанавливает размер текста размера файла процитированного сообщения оператором
show_voice_input- включает (true) или отключает (false) голосовой вводdelay_voice_input_post_recording- устанавливает задержку для дозаписиdelay_voice_input_between_recurring_warnings- устанавливает задержку между двумя предупреждениями при использовании голосового вводаdrawable_voice_input_mic_on- устанавливает иконку для включенного микрофонаdrawable_voice_input_mic_off- устанавливает иконку для выключенного микрофона
delay_feedback_screen_appears- выставляет время в мс (при выставлении оценки), по истечении которого сворачивается плашка оценки работы оператора (по умолчанию 1000 мс)color_feedback_title- устанавливает цвет заголовка на плашке оценки работы оператораsize_feedback_title- устанавливает размер заголовка на плашке оценки работы оператораcolor_feedback_star- устанавливает цвет звездfeedback_title_block_entering_message- позволяет выбрать, должна ли оценка диалога перекрывать поле для ввода сообщения. По умолчанию не перекрывает
enable_search- включает поиск (дефолтное значение - false)enable_auto_search- включает автопоиск (дефолтное значение - false)color_select_search_text- устанавливает цвет выделения текста, подходящего под шаблонcolor_current_select_search_text- устанавливает цвет выделения текущего текстаcolor_search_coincidence_text- устанавливает цвет текста сообщения о совпаденияхbackground_search_switch- устанавливает цвет фона блока навигации по совпадениям поискаcolor_search_top- устанавливает цвет иконки навигации по поиску вверхcolor_search_bottom- устанавливает цвет иконки навигации по поиску внизsize_text_search_coincidence- устанавливает размер текста сообщения о совпадениях
title_success_download_file_warning- устанавливает сообщение которое отображается при успешном скачивании файла (дефолтное значение - "Файл успешно скачан")color_success_download_file_warning- устанавливает цвет текста информационного сообщения при успешном скачивании файлаbackground_success_download_file_warning- устанавливает цвет фона информационного сообщения при успешном скачивании файлаtitle_fail_download_file_warning- устанавливает сообщение которое отображается при неудачном скачивании файла (дефолтное значение - "Файл не удалось скачать")color_fail_download_file_warning- устанавливает цвет текста информационного сообщения при неудачном скачивании файлаbackground_fail_download_file_warning- устанавливает цвет фона информационного сообщения при неудачном скачивании файла
layout_item_user_text_message- задает layout для текстового сообщения пользователяlayout_item_user_image_message- задает layout для сообщения с фото от пользователяlayout_item_user_gif_message- задает layout для сообщения с гифкой от пользователяlayout_item_user_file_message- задает layout для сообщения с файлом от пользователяlayout_item_user_union_message- задает layout для смешанного(текст + фото/гифка/файл) сообщения от пользователяlayout_item_operator_text_message- задает layout для текстового сообщения бота/оператораlayout_item_operator_image_message- задает layout для сообщения с фото от бота/оператораlayout_item_operator_gif_message- задает layout для сообщения с гифкой от бота/оператораlayout_item_operator_file_message- задает layout для сообщения с файлом от бота/оператораlayout_item_operator_union_message- задает layout для смешанного(текст + фото/гифка/файл) сообщения от бота/оператораlayout_item_transfer_message- задает layout для сообщения от бота о переводе на оператораlayout_item_info_message- задает layout для сообщения склейки от ботаlayout_item_widget_message- задает layout для виджетов
Имеется набор listeners, позволяющих более гибко работать с ChatView.
Этот listener устанавливается через объект Chat с помощью метода setOnChatMessageListener. При уходе с экрана чата необходимо оповещать пользователя о том, что появилось новое сообщение в чате. Соответственно для этих нужд можно использовать ChatMessageListener. Необходимо переопределить метод getNewMessages, он возвращает количество новых сообщений при условии, что пользователь ушел с экрана чата, но при этом все еще находится в приложении.
Chat.setOnChatMessageListener(object : ChatMessageListener {
override fun getNewMessages(countMessages: Int) {
Log.d("TEST", "Сount new messages = ${countMessages};")
}
})
Этот listener устанавливается через ChatView с помощью метода setOnPermissionListener. При работе с чатом пользователь может отправить файлы. Для доступа к хранилищу или камере необходимо запросить соответствующее разрешение, если ранее такой разрешение не было получено, то необходимо его запросить в чате. В самом чате реализован запрос необходимого разрешения, однако для оповещения пользователя используется Snackbar. Если Snackbar не удовлетворяет дизайну, можно установить свое решение с помощью ChatPermissionListener.
chatView.setOnPermissionListener(object : ChatPermissionListener {
override fun requestedPermissions(permissions: Array<String>, messages: Array<String>, action: () -> Unit) {
registerForActivityResult(ActivityResultContracts.RequestPermission()) { isGranted: Boolean ->
if (isGranted) {
action()
} else {
showWarning(messages[0])
}
}.launch(permissions[0])
}
})
Этот listener устанавливается через ChatView с помощью метода setOnUploadFileListener. При загрузке файлов может пойти что-то не так, поэтому необходимо уведомить об этом пользователя. Если дефолтный Snackbar не удовлетворяет требованиям, тогда можно установить UploadFileListener и обрабатывать подобные ситуации самостоятельно.
chatView.setOnUploadFileListener(object : UploadFileListener {
override fun successUpload() { ... }
override fun failUpload(message: String, type: TypeFailUpload) { ... }
})
Этот listener устанавливается через ChatView с помощью метода setOnDownloadFileListener. При скачивании медиафайлов может пойти что-то не так, поэтому необходимо уведомить об этом пользователя. Если дефолтный Snackbar не удовлетворяет требованиям, тогда можно установить DownloadFileListener и обрабатывать подобные ситуации самостоятельно.
chatView.setOnDownloadFileListener(object : DownloadFileListener {
override fun successDownload() { ... }
override fun failDownload() { ... }
override fun failDownload(title: String) { ... }
})
Этот listener устанавливается через ChatView с помощью метода setOnInternetConnectionListener. Этот listener позволяет самостоятельно реализовать Toolbar. Для этого необходимо выставить show_internet_connection_state="false" и show_upper_limiter="false".
chatView.setOnInternetConnectionListener(object : ChatInternetConnectionListener {
override fun connect() { status_connection.visibility = View.GONE }
override fun failConnect() { status_connection.visibility = View.VISIBLE }
override fun lossConnection() { status_connection.visibility = View.VISIBLE }
override fun reconnect() { status_connection.visibility = View.GONE }
})
Этот listener устанавливается через ChatView с помощью метода setOnChatStateListener. Этот listener позволяет самостоятельно реализовать Toolbar. Для этого необходимо выставить show_chat_state="false" и show_upper_limiter="false". Рекомендуется установить show_chat_state = "false", если show_internet_connection_state выставлен как "false".
chatView.setOnChatStateListener(object : ChatStateListener {
override fun startSynchronization() { ... }
override fun endSynchronization() { ... }
})
Этот listener устанавливается через ChatView с помощью метода setMergeHistoryListener. Этот listener позволяет самостоятельно обработать слияние истории двух пользователей. Метод ChatView.mergeHistory позволяет слить истории двух пользователей в одну.
chatView.setMergeHistoryListener(object : MergeHistoryListener {
override fun showDialog() { ... }
override fun startMerge() { ... }
override fun endMerge() { ... }
})
Этот listener устанавливается через ChatView с помощью метода setOnStateStartingProgressListener. Этот listener позволяет самостоятельно реализовать троббер, появляющийся при загрузки чата. Для этого необходимо выставить show_starting_progress="false".
chatView.setOnStateStartingProgressListener(object : StateStartingProgressListener {
override fun start() { loader.visibility = View.VISIBLE }
override fun stop() { loader.visibility = View.GONE }
})
Реализация собственных layouts позволяет задать свое расположение элементов. Необходимо соблюдать некоторые правила:
- тип элемента должен быть такой же, как и в реализации по умолчанию
- id должен быть такой же, как и в реализации по умолчанию
Пример можно найти тут
Реализации по умолчанию:
- текстовое сообщение пользователя
- сообщение с фото от пользователя
- сообщение с гифкой от пользователя
- сообщение с файлом от пользователя
- смешанное(текст + фото/гифка/файл) сообщение от пользователя
- текстовое сообщение бота/оператора
- сообщение с фото от бота/оператора
- сообщение с гифкой от бота/оператора
- сообщение с файлом от бота/оператора
- смешанное(текст + фото/гифка/файл) сообщение от бота/оператора
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.