import 'package:flutter/material.dart'; import 'package:get/get.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, 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': 'Показать случайную эмоцию', }, }, );