You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
308 lines
15 KiB
308 lines
15 KiB
import 'package:flutter/material.dart';
|
|
import 'package:get/get.dart';
|
|
|
|
import '../../data/services/bailian_multimodal_service.dart';
|
|
import '../../data/services/device_location_service.dart';
|
|
import '../../routes/app_routes.dart';
|
|
import '../emai/views/emai_view.dart';
|
|
import '../module_descriptor.dart';
|
|
import 'bindings/eaicar_chat_binding.dart';
|
|
|
|
/// EaiCar 车载助手(EaiCar 车载香薰的随身对话 agent)
|
|
///
|
|
/// 与 EMAI 共用同一套对话 UI 和控制器,差别只有一个:连的是百炼里**另一个应用**
|
|
/// (见 [kEaiCarBailianAppId])。所以这里直接复用 [EmaiView],靠 `controllerTag`
|
|
/// 取到 [EaiCarChatBinding] 装配的那份带专属 app_id 的实例。
|
|
///
|
|
/// ⚠️ **没有声明 `requiredCapabilities`**:这个 agent 手机自己就能聊,不必连着香薰
|
|
/// (产品定位是"随时开聊")。设备连上时它会被自动铺到 AI 页首位,那是
|
|
/// `AgentModules.defaultsByCategory[carAroma]` 的事,与本字段无关。
|
|
///
|
|
/// ⚠️ **对话记录与 EMAI 共用 `EmaiChatStore`**:设备按键唤醒的轮次由
|
|
/// `DeviceAiSessionService` 写进那个 store,页面不开也能收;这里若另起一个 store,
|
|
/// 设备发起的对话就不会出现在本页上。要拆分历史得连 `DeviceAiSessionService`
|
|
/// 一起改,本期不做。
|
|
final AgentModuleDescriptor eaicarModule = AgentModuleDescriptor(
|
|
id: 'smartcarChat',
|
|
title: 'agentEaiCar',
|
|
subtitle: 'agentEaiCarDesc',
|
|
// 卡片图标只支持 IconData(module_card 里是 Icon(module.icon) 套渐变块),
|
|
// 用不了产品图 EaiCar_icon.png。要用图得给 AgentModule 加字段并改 module_card,
|
|
// 那是耳机/支架共用的卡片组件,本期不动。
|
|
icon: Icons.directions_car,
|
|
// 与「AI车载香薰」品类卡同色系(device_category.dart 的 carAroma)
|
|
gradient: const [Color(0xFFFFB74D), Color(0xFFE65100)],
|
|
entryRoute: Routes.eaicarChat,
|
|
// 设备按键唤醒时接的就是这个应用(不是 EMAI)——见 AgentModuleDescriptor.bailianAppId
|
|
bailianAppId: kEaiCarBailianAppId,
|
|
// 车载助手提示词要 ${location} / ${date}:登记本应用,Start 时带上位置与日期;
|
|
// 位置服务也只为它常驻(EMAI 耳机的会话不带、不受影响)。
|
|
registerServices: () {
|
|
BailianMultimodalService.clientContextAppIds.add(kEaiCarBailianAppId);
|
|
if (!Get.isRegistered<DeviceLocationService>()) {
|
|
Get.put<DeviceLocationService>(DeviceLocationService(), permanent: true);
|
|
}
|
|
},
|
|
pages: [
|
|
GetPage(
|
|
name: Routes.eaicarChat,
|
|
page: () => const EmaiView(
|
|
controllerTag: kEaiCarTag,
|
|
titleKey: 'agentEaiCar',
|
|
),
|
|
binding: EaiCarChatBinding(),
|
|
transition: Transition.rightToLeft,
|
|
transitionDuration: const Duration(milliseconds: 250),
|
|
),
|
|
],
|
|
// 模块自带文案:不用再去改 41 个语言文件。
|
|
// 缺某个语种时 GetX 回退到全局表,全局也没有就显示 key 本身,
|
|
// 所以至少要保证 zh_CN / en_US 有(module_registry_test 守着这两个)。
|
|
translations: const {
|
|
'zh_CN': {
|
|
'agentEaiCar': 'EaiCar',
|
|
'emaiDeviceTalkingTapPhone': '设备对话中 · 点此改用手机',
|
|
'agentEaiCarDesc': '您的车载助手',
|
|
'eaicarWelcome': '欢迎回来',
|
|
'eaicarA2dpTitle': '需要连接蓝牙音频',
|
|
'eaicarA2dpHint': 'AI 回复和音乐要经典蓝牙才能从设备里放出来。请到「设置 → 蓝牙」里配对 @name。',
|
|
'deviceSettingsTitle': '设备设置',
|
|
'deviceNotConnected': '设备未连接',
|
|
'goConnect': '去连接',
|
|
'refresh': '刷新',
|
|
'settingReadFailed': '读取设备状态失败',
|
|
'settingApplyFailed': '设置失败',
|
|
'settingNoItems': '该设备没有可调项',
|
|
'settingPower': '启停开关',
|
|
'settingVolume': '音量',
|
|
'settingBrightness': '亮度',
|
|
'settingDrivingSense': '行车感应',
|
|
'settingSwing': '摇摆',
|
|
'settingRandomExpressionInterval': '随机表情频次',
|
|
'settingSeconds': '@n 秒',
|
|
'settingPlayRandomExpression': '随机来一个表情',
|
|
},
|
|
'zh_TW': {
|
|
'agentEaiCar': 'EaiCar',
|
|
'emaiDeviceTalkingTapPhone': '裝置對話中 · 點此改用手機',
|
|
'agentEaiCarDesc': '您的車載助手',
|
|
'eaicarWelcome': '歡迎回來',
|
|
'eaicarA2dpTitle': '需要連接藍牙音訊',
|
|
'eaicarA2dpHint': 'AI 回覆和音樂要經典藍牙才能從裝置裡播出來。請到「設定 → 藍牙」配對 @name。',
|
|
'deviceSettingsTitle': '裝置設定',
|
|
'deviceNotConnected': '裝置未連接',
|
|
'goConnect': '去連接',
|
|
'refresh': '重新整理',
|
|
'settingReadFailed': '讀取裝置狀態失敗',
|
|
'settingApplyFailed': '設定失敗',
|
|
'settingNoItems': '此裝置沒有可調項目',
|
|
'settingPower': '啟停開關',
|
|
'settingVolume': '音量',
|
|
'settingBrightness': '亮度',
|
|
'settingDrivingSense': '行車感應',
|
|
'settingSwing': '搖擺',
|
|
'settingRandomExpressionInterval': '隨機表情頻率',
|
|
'settingSeconds': '@n 秒',
|
|
'settingPlayRandomExpression': '隨機來一個表情',
|
|
},
|
|
'zh_HK': {
|
|
'agentEaiCar': 'EaiCar',
|
|
'agentEaiCarDesc': '您的車載助手',
|
|
'eaicarWelcome': '歡迎回來',
|
|
'eaicarA2dpTitle': '需要連接藍牙音訊',
|
|
'eaicarA2dpHint': 'AI 回覆和音樂要經典藍牙先可以喺裝置度播出嚟。請去「設定 → 藍牙」配對 @name。',
|
|
'deviceSettingsTitle': '裝置設定',
|
|
'deviceNotConnected': '裝置未連接',
|
|
'goConnect': '去連接',
|
|
'refresh': '重新整理',
|
|
'settingReadFailed': '讀取裝置狀態失敗',
|
|
'settingApplyFailed': '設定失敗',
|
|
'settingNoItems': '呢部裝置冇可調項目',
|
|
'settingPower': '啟停開關',
|
|
'settingVolume': '音量',
|
|
'settingBrightness': '亮度',
|
|
'settingDrivingSense': '行車感應',
|
|
'settingSwing': '搖擺',
|
|
'settingRandomExpressionInterval': '隨機表情頻率',
|
|
'settingSeconds': '@n 秒',
|
|
'settingPlayRandomExpression': '隨機嚟一個表情',
|
|
},
|
|
'en_US': {
|
|
'agentEaiCar': 'EaiCar',
|
|
'emaiDeviceTalkingTapPhone': 'On device · tap to use phone',
|
|
'agentEaiCarDesc': 'Your in-car assistant',
|
|
'eaicarWelcome': 'Welcome back',
|
|
'eaicarA2dpTitle': 'Bluetooth audio not connected',
|
|
'eaicarA2dpHint': 'Pair @name under Settings → Bluetooth so replies and music play from the device.',
|
|
'deviceSettingsTitle': 'Device settings',
|
|
'deviceNotConnected': 'Device not connected',
|
|
'goConnect': 'Connect',
|
|
'refresh': 'Refresh',
|
|
'settingReadFailed': 'Failed to read device status',
|
|
'settingApplyFailed': 'Failed to apply',
|
|
'settingNoItems': 'No adjustable settings on this device',
|
|
'settingPower': 'Auto power',
|
|
'settingVolume': 'Volume',
|
|
'settingBrightness': 'Brightness',
|
|
'settingDrivingSense': 'Driving sensor',
|
|
'settingSwing': 'Swing',
|
|
'settingRandomExpressionInterval': 'Random expression interval',
|
|
'settingSeconds': '@n s',
|
|
'settingPlayRandomExpression': 'Play a random expression',
|
|
},
|
|
'ja_JP': {
|
|
'agentEaiCar': 'EaiCar',
|
|
'agentEaiCarDesc': '車載アシスタント',
|
|
'eaicarWelcome': 'おかえりなさい',
|
|
'eaicarA2dpTitle': 'Bluetoothオーディオ未接続',
|
|
'eaicarA2dpHint': '「設定 → Bluetooth」で @name をペアリングすると、応答と音楽が本体から再生されます。',
|
|
'deviceSettingsTitle': 'デバイス設定',
|
|
'deviceNotConnected': 'デバイス未接続',
|
|
'goConnect': '接続する',
|
|
'refresh': '更新',
|
|
'settingReadFailed': 'デバイス状態の取得に失敗',
|
|
'settingApplyFailed': '設定に失敗',
|
|
'settingNoItems': 'このデバイスに調整項目はありません',
|
|
'settingPower': '自動オン/オフ',
|
|
'settingVolume': '音量',
|
|
'settingBrightness': '明るさ',
|
|
'settingDrivingSense': '走行センサー',
|
|
'settingSwing': 'スイング',
|
|
'settingRandomExpressionInterval': 'ランダム表情の間隔',
|
|
'settingSeconds': '@n 秒',
|
|
'settingPlayRandomExpression': 'ランダムに表情を再生',
|
|
},
|
|
'ko_KR': {
|
|
'agentEaiCar': 'EaiCar',
|
|
'agentEaiCarDesc': '차량용 어시스턴트',
|
|
'eaicarWelcome': '다시 오신 것을 환영합니다',
|
|
'eaicarA2dpTitle': '블루투스 오디오 미연결',
|
|
'eaicarA2dpHint': '설정 → 블루투스에서 @name 을(를) 페어링하면 응답과 음악이 기기에서 재생됩니다。',
|
|
'deviceSettingsTitle': '기기 설정',
|
|
'deviceNotConnected': '기기 미연결',
|
|
'goConnect': '연결하기',
|
|
'refresh': '새로고침',
|
|
'settingReadFailed': '기기 상태를 읽지 못했습니다',
|
|
'settingApplyFailed': '설정 실패',
|
|
'settingNoItems': '이 기기에는 조절 항목이 없습니다',
|
|
'settingPower': '자동 전원',
|
|
'settingVolume': '음량',
|
|
'settingBrightness': '밝기',
|
|
'settingDrivingSense': '주행 감지',
|
|
'settingSwing': '스윙',
|
|
'settingRandomExpressionInterval': '랜덤 표정 주기',
|
|
'settingSeconds': '@n 초',
|
|
'settingPlayRandomExpression': '랜덤 표정 재생',
|
|
},
|
|
'de_DE': {
|
|
'agentEaiCar': 'EaiCar',
|
|
'agentEaiCarDesc': 'Ihr Auto-Assistent',
|
|
'eaicarWelcome': 'Willkommen zurück',
|
|
'eaicarA2dpTitle': 'Bluetooth-Audio nicht verbunden',
|
|
'eaicarA2dpHint': 'Koppeln Sie @name unter Einstellungen → Bluetooth, damit Antworten und Musik über das Gerät laufen.',
|
|
'deviceSettingsTitle': 'Geräteeinstellungen',
|
|
'deviceNotConnected': 'Gerät nicht verbunden',
|
|
'goConnect': 'Verbinden',
|
|
'refresh': 'Aktualisieren',
|
|
'settingReadFailed': 'Gerätestatus konnte nicht gelesen werden',
|
|
'settingApplyFailed': 'Einstellung fehlgeschlagen',
|
|
'settingNoItems': 'Keine einstellbaren Optionen',
|
|
'settingPower': 'Automatisches Ein/Aus',
|
|
'settingVolume': 'Lautstärke',
|
|
'settingBrightness': 'Helligkeit',
|
|
'settingDrivingSense': 'Fahrsensor',
|
|
'settingSwing': 'Schwingen',
|
|
'settingRandomExpressionInterval': 'Intervall zufälliger Ausdrücke',
|
|
'settingSeconds': '@n s',
|
|
'settingPlayRandomExpression': 'Zufälligen Ausdruck abspielen',
|
|
},
|
|
'fr_FR': {
|
|
'agentEaiCar': 'EaiCar',
|
|
'agentEaiCarDesc': 'Votre assistant automobile',
|
|
'eaicarWelcome': 'Bon retour',
|
|
'eaicarA2dpTitle': 'Audio Bluetooth non connecté',
|
|
'eaicarA2dpHint': 'Associez @name dans Réglages → Bluetooth pour que les réponses et la musique sortent de l\'appareil.',
|
|
'deviceSettingsTitle': 'Réglages de l\'appareil',
|
|
'deviceNotConnected': 'Appareil non connecté',
|
|
'goConnect': 'Connecter',
|
|
'refresh': 'Actualiser',
|
|
'settingReadFailed': 'Impossible de lire l\'état de l\'appareil',
|
|
'settingApplyFailed': 'Échec du réglage',
|
|
'settingNoItems': 'Aucun réglage disponible',
|
|
'settingPower': 'Marche/arrêt auto',
|
|
'settingVolume': 'Volume',
|
|
'settingBrightness': 'Luminosité',
|
|
'settingDrivingSense': 'Capteur de conduite',
|
|
'settingSwing': 'Balancement',
|
|
'settingRandomExpressionInterval': 'Intervalle des expressions aléatoires',
|
|
'settingSeconds': '@n s',
|
|
'settingPlayRandomExpression': 'Jouer une expression aléatoire',
|
|
},
|
|
'es_ES': {
|
|
'agentEaiCar': 'EaiCar',
|
|
'agentEaiCarDesc': 'Tu asistente para el coche',
|
|
'eaicarWelcome': 'Bienvenido de nuevo',
|
|
'eaicarA2dpTitle': 'Audio Bluetooth no conectado',
|
|
'eaicarA2dpHint': 'Empareja @name en Ajustes → Bluetooth para que las respuestas y la música suenen en el dispositivo.',
|
|
'deviceSettingsTitle': 'Ajustes del dispositivo',
|
|
'deviceNotConnected': 'Dispositivo no conectado',
|
|
'goConnect': 'Conectar',
|
|
'refresh': 'Actualizar',
|
|
'settingReadFailed': 'No se pudo leer el estado del dispositivo',
|
|
'settingApplyFailed': 'Error al aplicar',
|
|
'settingNoItems': 'No hay ajustes disponibles',
|
|
'settingPower': 'Encendido automático',
|
|
'settingVolume': 'Volumen',
|
|
'settingBrightness': 'Brillo',
|
|
'settingDrivingSense': 'Sensor de conducción',
|
|
'settingSwing': 'Balanceo',
|
|
'settingRandomExpressionInterval': 'Intervalo de expresiones aleatorias',
|
|
'settingSeconds': '@n s',
|
|
'settingPlayRandomExpression': 'Reproducir una expresión aleatoria',
|
|
},
|
|
'pt_PT': {
|
|
'agentEaiCar': 'EaiCar',
|
|
'agentEaiCarDesc': 'O seu assistente para o carro',
|
|
'eaicarWelcome': 'Bem-vindo de volta',
|
|
'eaicarA2dpTitle': 'Áudio Bluetooth não ligado',
|
|
'eaicarA2dpHint': 'Emparelhe @name em Definições → Bluetooth para que as respostas e a música saiam do dispositivo.',
|
|
'deviceSettingsTitle': 'Definições do dispositivo',
|
|
'deviceNotConnected': 'Dispositivo não ligado',
|
|
'goConnect': 'Ligar',
|
|
'refresh': 'Atualizar',
|
|
'settingReadFailed': 'Falha ao ler o estado do dispositivo',
|
|
'settingApplyFailed': 'Falha ao aplicar',
|
|
'settingNoItems': 'Sem definições ajustáveis',
|
|
'settingPower': 'Ligar/desligar automático',
|
|
'settingVolume': 'Volume',
|
|
'settingBrightness': 'Brilho',
|
|
'settingDrivingSense': 'Sensor de condução',
|
|
'settingSwing': 'Balanço',
|
|
'settingRandomExpressionInterval': 'Intervalo de expressões aleatórias',
|
|
'settingSeconds': '@n s',
|
|
'settingPlayRandomExpression': 'Reproduzir uma expressão aleatória',
|
|
},
|
|
'ru_RU': {
|
|
'agentEaiCar': 'EaiCar',
|
|
'agentEaiCarDesc': 'Ваш автомобильный помощник',
|
|
'eaicarWelcome': 'С возвращением',
|
|
'eaicarA2dpTitle': 'Bluetooth-аудио не подключено',
|
|
'eaicarA2dpHint': 'Подключите @name в «Настройки → Bluetooth», чтобы ответы и музыка звучали из устройства.',
|
|
'deviceSettingsTitle': 'Настройки устройства',
|
|
'deviceNotConnected': 'Устройство не подключено',
|
|
'goConnect': 'Подключить',
|
|
'refresh': 'Обновить',
|
|
'settingReadFailed': 'Не удалось прочитать состояние устройства',
|
|
'settingApplyFailed': 'Не удалось применить',
|
|
'settingNoItems': 'Нет настраиваемых параметров',
|
|
'settingPower': 'Автовключение',
|
|
'settingVolume': 'Громкость',
|
|
'settingBrightness': 'Яркость',
|
|
'settingDrivingSense': 'Датчик движения',
|
|
'settingSwing': 'Покачивание',
|
|
'settingRandomExpressionInterval': 'Интервал случайных эмоций',
|
|
'settingSeconds': '@n с',
|
|
'settingPlayRandomExpression': 'Показать случайную эмоцию',
|
|
},
|
|
},
|
|
);
|
|
|