Обработка команд сценария в Native App
Чтобы фронтенд понимал команды, приходящие с бэкенда, вам нужно дополнительно настроить Android-приложение.
Некоторые команды ОС передает напрямую в приложение минуя сценарий. К таким командам относятся навигационные и команды управления плеером.
Рассмотрим это на примере демонстрационного Native App. Он опубликован в каталоге приложений, чтобы запустить его, скажите ассистенту на умном устройстве Sber: «Открой демо новый зеленый».
В демонстрационном Native App на вкладке Assistant пользователь может надевать вещи на андроида и снимать их. Чтобы настроить этот процесс:
Подпишитесь на получение сообщений от сценария с помощью библиотеки Messaging:
init {
messaging.addListener(listener)
}Добавьте список команд, чтобы пользователи могли надевать и снимать одежду с андроида:
/**
* Base command from smartapp backend
*/
@Serializable
sealed class BaseCommand
/**
* Command for dressing up the Android
*/
@Serializable
@SerialName("wear_this")
internal class WearThisCommand(
val clothes: Clothes? = null
): BaseCommand()
/**
* Command for undressing the Android
*/
@Serializable
@SerialName("dont_wear_anything")
internal class ClearClothesCommand: BaseCommand()Добавьте список вещей, которые пользователь сможет надевать на андроида:
/**
* Items variants
*/
@Serializable
enum class Clothes(val clothes: String) {
@SerialName("шапку")
BEANIE("шапка"),
@SerialName("перчатки")
GLOVES("перчатки"),
@SerialName("ботинки")
BOOTS("ботинки"),
@SerialName("куртку")
JACKET("куртка")
}Настройте передачу информации о вещах в графический интерфейс:
private val _clothes = MutableSharedFlow<Clothes?>
Подключите обработчик входящих сообщений:
private val listener = object : Messaging.Listener {
override fun onMessage(messageId: MessageId, payload: Payload) {
logger.debug { "Message ${messageId.value} received: ${payload.data}" }
val model = commandParser.decodeFromString<BaseCommand>(payload.data) // парсим входящие сообщения
when (model) { // обрабатываем входящую команду – надеваем или снимаем вещь
is WearThisCommand -> {
model.clothes?.let {
currentClothes.add(it)
_clothes.tryEmit(model.clothes)
}
}
is ClearClothesCommand -> {
currentClothes.clear()
_clothes.resetReplayCache()
_clothes.tryEmit(null)
}
}
// send current state to smartapp backend
appStateHolder.setState( // определяем текущий appState – что надето на андроиде
Json.encodeToString(
MyAppState("На андроиде ${currentClothes.joinToString(transform = { it.clothes })}")
)
)
}
override fun onError(messageId: MessageId, throwable: Throwable) { // создаем обработчик ошибок
logger.error { throwable.stackTraceToString() }
}
}