Merge #502 into sdk602patch0626 from refs/changes/502/head 505/target/1
author罗正 <1732036298@qq.com>
Thu, 11 Jul 2024 10:01:46 +0000 (10:01 +0000)
committersnickersun@163.com <accounts_62b90f7fcf51ade33b6f628e@mail.teambition.com>
Thu, 11 Jul 2024 10:01:46 +0000 (10:01 +0000)
Code review from 罗正

* refs/changes/502/head: (13 commits squashed)

  - Ai语音修改,遗留Label闪屏和字数过长后段不显示问题,
    与蓝鹊app联调经常发送了语音没有返回内容

  - Merge branch &#39;sdk602patch0626&#39; of https://codeup.aliyun.com/64191456b9581d62e8f81ac0/FD230 into sdk602patch0626

  - Merge branch &#39;sdk602patch0626&#39; of https://codeup.aliyun.com/64191456b9581d62e8f81ac0/FD230 into sdk602patch0626

  - 添加applist的足球显示样式

  - Merge branch &#39;sdk602patch0626&#39; of https://codeup.aliyun.com/64191456b9581d62e8f81ac0/FD230 into sdk602patch0626

  - Merge branch &#39;sdk602patch0626&#39; of https://codeup.aliyun.com/64191456b9581d62e8f81ac0/FD230 into sdk602patch0626

  - Merge branch &#39;sdk602patch0626&#39; of https://codeup.aliyun.com/64191456b9581d62e8f81ac0/FD230 into sdk602patch0626

  - 1.AI模型选择界面 完成
    2.添加适配ai模型界面的字体,图片
    3.ai语音界面Model修改,现在停止录音会有2秒等待时间

  - 解决录音Slice中录音列表获取日期导致的内存泄漏问题

  - Merge branch &#39;sdk602patch0626&#39; of https://codeup.aliyun.com/64191456b9581d62e8f81ac0/FD230 into sdk602patch0626

  - ai大模型UI完成需适配接口

  - Merge branch &#39;sdk602patch0626&#39; of https://codeup.aliyun.com/64191456b9581d62e8f81ac0/FD230 into sdk602patch0626

  - Merge branch &#39;sdk602patch0626&#39; of https://codeup.aliyun.com/64191456b9581d62e8f81ac0/FD230 into sdk602patch0626

Signed-off-by: 罗正 <1732036298@qq.com>
Reviewed-by: snickersun@163.com <accounts_62b90f7fcf51ade33b6f628e@mail.teambition.com>
Merged-by: snickersun@163.com <accounts_62b90f7fcf51ade33b6f628e@mail.teambition.com>
link: https://codeup.aliyun.com/64191456b9581d62e8f81ac0/FD230/change/502
40 files changed:
code/sdk/application/wearable/fd230app/CMakeLists.txt
code/sdk/application/wearable/fd230app/nativelauncher/include/AppViewIDs.h
code/sdk/application/wearable/fd230app/nativelauncher/include/NativeLauncher.h
code/sdk/application/wearable/fd230app/nativelauncher/src/NativeLauncher.cpp
code/sdk/application/wearable/fd230app/nativeui/aimodels/include/AiModelsModel.h [new file with mode: 0644]
code/sdk/application/wearable/fd230app/nativeui/aimodels/include/AiModelsPresenter.h [new file with mode: 0644]
code/sdk/application/wearable/fd230app/nativeui/aimodels/include/AiModelsView.h [new file with mode: 0644]
code/sdk/application/wearable/fd230app/nativeui/aimodels/src/AiModelsModel.cpp [new file with mode: 0644]
code/sdk/application/wearable/fd230app/nativeui/aimodels/src/AiModelsPresenter.cpp [new file with mode: 0644]
code/sdk/application/wearable/fd230app/nativeui/aimodels/src/AiModelsView.cpp [new file with mode: 0644]
code/sdk/application/wearable/fd230app/nativeui/aivoice/include/AiVoiceModel.h
code/sdk/application/wearable/fd230app/nativeui/aivoice/src/AiVoiceModel.cpp
code/sdk/application/wearable/fd230app/nativeui/aivoice/src/AiVoicePresenter.cpp
code/sdk/application/wearable/fd230app/nativeui/language/Language_xml/input_list_en.txt
code/sdk/application/wearable/fd230app/nativeui/language/Language_xml/input_list_zh.txt
code/sdk/application/wearable/fd230app/nativeui/language/Language_xml/language_en.xml
code/sdk/application/wearable/fd230app/nativeui/language/Language_xml/language_ja.xml [deleted file]
code/sdk/application/wearable/fd230app/nativeui/language/Language_xml/language_zh.xml
code/sdk/application/wearable/fd230app/nativeui/language/font/en.lang
code/sdk/application/wearable/fd230app/nativeui/language/font/ja.lang
code/sdk/application/wearable/fd230app/nativeui/language/font/ui_resource_string.h
code/sdk/application/wearable/fd230app/nativeui/language/font/zh.lang
code/sdk/application/wearable/fd230app/nativeui/main/src/MainPresenterSample.cpp
code/sdk/application/wearable/fd230app/nativeui/main/src/PullUpDownView.cpp
code/sdk/application/wearable/fd230app/nativeui/rebootdevice/include/RebootModel.h
code/sdk/application/wearable/fd230app/nativeui/rebootdevice/src/RebootModel.cpp
code/sdk/application/wearable/fd230app/nativeui/record/include/RecordingModel.h
code/sdk/application/wearable/fd230app/nativeui/record/src/RecordingModel.cpp
code/sdk/build/config/target_config/brandy/mk_fs_image/fd230/fs/user/res/AIVoice/aimodels/aimode_lschatgpt_on.bin [new file with mode: 0644]
code/sdk/build/config/target_config/brandy/mk_fs_image/fd230/fs/user/res/AIVoice/aimodels/aimodels_bg.bin [new file with mode: 0644]
code/sdk/build/config/target_config/brandy/mk_fs_image/fd230/fs/user/res/AIVoice/aimodels/aimodels_chatgpt_off.bin [new file with mode: 0644]
code/sdk/build/config/target_config/brandy/mk_fs_image/fd230/fs/user/res/AIVoice/aimodels/aimodels_doubao.bin [new file with mode: 0644]
code/sdk/build/config/target_config/brandy/mk_fs_image/fd230/fs/user/res/AIVoice/aimodels/aimodels_kimi.bin [new file with mode: 0644]
code/sdk/build/config/target_config/brandy/mk_fs_image/fd230/fs/user/res/AIVoice/aimodels/aimodels_select.bin [new file with mode: 0644]
code/sdk/build/config/target_config/brandy/mk_fs_image/fd230/fs/user/res/AIVoice/aimodels/aimodels_title_bg.bin [new file with mode: 0644]
code/sdk/build/config/target_config/brandy/mk_fs_image/fd230/fs/user/res/AIVoice/aimodels/aimodels_wenxinyiyan.bin [new file with mode: 0644]
code/sdk/build/config/target_config/brandy/mk_fs_image/fd230/fs/user/res/font/en.lang
code/sdk/build/config/target_config/brandy/mk_fs_image/fd230/fs/user/res/font/ja.lang
code/sdk/build/config/target_config/brandy/mk_fs_image/fd230/fs/user/res/font/ui_resource_string.h
code/sdk/build/config/target_config/brandy/mk_fs_image/fd230/fs/user/res/font/zh.lang

index 6953c70..10c9c0c 100644 (file)
@@ -401,6 +401,11 @@ set(SOURCES
     ${CMAKE_CURRENT_SOURCE_DIR}/nativeui/aivoice/src/AivoiceChatContentListAdapter.cpp
     ${CMAKE_CURRENT_SOURCE_DIR}/nativeui/aivoice/src/AivoiceReturnResultTextView.cpp
     
+    #Ai Models
+    ${CMAKE_CURRENT_SOURCE_DIR}/nativeui/aimodels/src/AiModelsModel.cpp
+    ${CMAKE_CURRENT_SOURCE_DIR}/nativeui/aimodels/src/AiModelsView.cpp
+    ${CMAKE_CURRENT_SOURCE_DIR}/nativeui/aimodels/src/AiModelsPresenter.cpp
+
     #声音与震动
     ${CMAKE_CURRENT_SOURCE_DIR}/nativeui/soundandvibration/src/SoundAndVibrationPresenter.cpp 
     ${CMAKE_CURRENT_SOURCE_DIR}/nativeui/soundandvibration/src/SoundAndVibrationView.cpp
index a9b255a..0d8f7d1 100644 (file)
@@ -65,6 +65,7 @@ typedef enum : uint16_t
     VIEW_RESPIRATORY_TRAINING,      // 呼吸训练
     VIEW_THEME_STYLE,               // 主题样式
     VIEW_AI_VOICE,                  // AI Voice(人工智能语音)
+    VIEW_AI_MODELS,                 // AI模型选择界面
     VIEW_SET_DESKTOP,               // 显示方式
     VIEW_RECORD,
     /* ----------------------------------------------------------------------------- */
index a5503e3..92e0360 100644 (file)
@@ -63,6 +63,7 @@ namespace OHOS
         void InitRespiratoryTrainingSlice(void);
         void InitThemeStyleSlice(void);
         void InitAiVoiceSlice(void);
+        void InitAiModelsSlice(void);
         /* --------------------------------界面------------------------------------ */
         void InitRotateSlice(void);
         void InitBloodSlice(void);
index 3b9c238..e7b0622 100644 (file)
 
 #include "aivoice/include/AiVoicePresenter.h"
 #include "aivoice/include/AiVoiceView.h"
+
+#include "aimodels/include/AiModelsPresenter.h"
+#include "aimodels/include/AiModelsView.h"
 /* -------------------------------------------------------------------------- */
 #include "traing/include/TraingView.h"
 #include "traing/include/TraingPresenter.h"
@@ -293,6 +296,7 @@ namespace OHOS
         {VIEW_RESPIRATORY_TRAINING, &NativeLauncher::InitRespiratoryTrainingSlice},          // 呼吸训练界面
         {VIEW_THEME_STYLE, &NativeLauncher::InitThemeStyleSlice},                            // 主题样式界面
         {VIEW_AI_VOICE, &NativeLauncher::InitAiVoiceSlice},                                  //  Ai Voice(人工智能语音)
+        {VIEW_AI_MODELS, &NativeLauncher::InitAiModelsSlice},                                 //  Ai Models(Ai模型选择界面)
 
         // {VIEW_SECONDARY_FUNCTION, &NativeLauncher::InitSecondaryFunction},
         // {VIEW_FAST_TRAINING, &NativeLauncher::InitFastTrainingSlice},
@@ -434,7 +438,7 @@ namespace OHOS
         ScreenModels::GetInstance()->PreLoadAppimages();
         // NativeAbility::GetInstance().SetDefaultSliceId(VIEW_MAIN);
         //  注册按键事件
-        RebootModel::GetInstance()->RegisterKeyEvents();
+        RebootModel::GetInstance()->RegisterAllKeyEvents();
 
         // 开机检测充电状态
         WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "get_charge_stat is %d", get_charge_stat());
@@ -1279,6 +1283,18 @@ namespace OHOS
         }
         NativeAbility::GetInstance().AddSliceProxy(VIEW_AI_VOICE, AiVoice);
     }
+
+    /*Ai模型选择界面*/
+    void NativeLauncher::InitAiModelsSlice(void)
+    {
+        SliceProxy *AiModels = new AbilitySliceProxy<AiModelsView, AiModelsPresenter>;
+        if (AiModels == nullptr)
+        {
+            WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "AiModels");
+            return;
+        }
+        NativeAbility::GetInstance().AddSliceProxy(VIEW_AI_MODELS, AiModels);
+    }
     /* -------------------------------------------------------------------------- */
     void NativeLauncher::InitSetDesktopSlice(void)
     {
diff --git a/code/sdk/application/wearable/fd230app/nativeui/aimodels/include/AiModelsModel.h b/code/sdk/application/wearable/fd230app/nativeui/aimodels/include/AiModelsModel.h
new file mode 100644 (file)
index 0000000..00d64da
--- /dev/null
@@ -0,0 +1,38 @@
+/*
+ * @Author: luozheng 1732036298@qq.com
+ * @Date: 2024-07-08 09:39:31
+ * @LastEditors: luozheng 1732036298@qq.com
+ * @LastEditTime: 2024-07-10 21:20:02
+ * @FilePath: /FD230/code/sdk/application/wearable/fd230app/nativeui/aimodels/include/AiModelsModel.h
+ */
+
+#ifndef AI_MODELS_MODEL_H
+#define AI_MODELS_MODEL_H
+
+#include <iostream>
+#include "string"
+
+namespace OHOS
+{
+    class AiModelsModel
+    {
+    public:
+        static AiModelsModel &GetInstance(void);
+        int GetSelectAiModel(void);
+        void SetSelectAiModel(int index);
+        bool ChangeAiModel(void);
+        int GetAiModelTextId(void);
+        void SetAiModelTextId(int textId);
+
+    private:
+        AiModelsModel();
+        ~AiModelsModel();
+        AiModelsModel(const AiModelsModel &) = delete;
+        AiModelsModel &operator=(const AiModelsModel &) = delete;
+
+        int selectAiModel; // 选择的ai模型
+        int textId;
+    };
+}
+
+#endif
\ No newline at end of file
diff --git a/code/sdk/application/wearable/fd230app/nativeui/aimodels/include/AiModelsPresenter.h b/code/sdk/application/wearable/fd230app/nativeui/aimodels/include/AiModelsPresenter.h
new file mode 100644 (file)
index 0000000..dda8635
--- /dev/null
@@ -0,0 +1,52 @@
+/*
+ * @Author: luozheng 1732036298@qq.com
+ * @Date: 2024-07-08 09:39:10
+ * @LastEditors: luozheng 1732036298@qq.com
+ * @LastEditTime: 2024-07-10 10:21:57
+ * @FilePath: /FD230/code/sdk/application/wearable/fd230app/nativeui/aimodels/include/AiModelsPresenter.h
+ */
+
+#ifndef AI_MODELS_PRESENTER_H
+#define AI_MODELS_PRESENTER_H
+
+#include "Presenter.h"
+#include "View.h"
+#include "aimodels/include/AiModelsModel.h"
+
+namespace OHOS
+{
+    class AiModelsView;
+    class AiModelsModel;
+    class AiModelsPresenter : public Presenter<AiModelsView>,
+                              public UIView::OnClickListener,
+                              public UIView::OnDragListener,
+                              public RootView::OnKeyActListener
+    {
+    public:
+        AiModelsPresenter();
+        virtual ~AiModelsPresenter();
+        static AiModelsPresenter *GetInstance();
+
+        /*获取选择的ai模型*/
+        int16_t GetSelectAiModel(void);
+        /*单击func key切换ai模型*/
+        void ChangeAiModel(void);
+        void SetAiModelTextId(int16_t id);
+
+        void OnStart() override;
+        void OnResume() override;
+        void OnPause() override;
+        void OnStop() override;
+
+    private:
+        bool OnClick(UIView &view, const ClickEvent &event) override;
+        bool OnDrag(UIView &view, const DragEvent &event) override;
+        bool OnDragEnd(UIView &view, const DragEvent &event) override;
+        bool OnKeyAct(UIView &view, const KeyEvent &event) override; // 增加按键事件
+
+        AiModelsModel *model;
+        bool X_DRAG_FLAG{false};
+    };
+}
+
+#endif
\ No newline at end of file
diff --git a/code/sdk/application/wearable/fd230app/nativeui/aimodels/include/AiModelsView.h b/code/sdk/application/wearable/fd230app/nativeui/aimodels/include/AiModelsView.h
new file mode 100644 (file)
index 0000000..3643e02
--- /dev/null
@@ -0,0 +1,120 @@
+/*
+ * @Author: luozheng 1732036298@qq.com
+ * @Date: 2024-07-08 09:38:50
+ * @LastEditors: luozheng 1732036298@qq.com
+ * @LastEditTime: 2024-07-10 10:11:28
+ * @FilePath: /FD230/code/sdk/application/wearable/fd230app/nativeui/aimodels/include/AiModelsView.h
+ */
+
+#ifndef AI_MODELS_VIEW_H
+#define AI_MODELS_VIEW_H
+
+#include "BaseView.h"
+#include "View.h"
+#include "components/ui_view_group.h"
+#include "components/ui_button.h"
+#include "components/ui_scroll_view.h"
+#include "components/ui_image_view.h"
+#include "components/ui_label_ext.h"
+#include "language/font/ui_resource_string.h"
+#include <map>
+namespace OHOS
+{
+#define AIMODELS_IMAGE_PATH "/user/res/AIVoice/aimodels"
+    typedef enum : uint8_t
+    {
+        AIMODES_DOUBAO = 0,  /*豆包*/
+        AIMODES_WENXINYIYAN, /*wenxinyiyan*/
+        AIMODES_KIMI,        /*kimi*/
+        AIMODES_CHATGPT,     /*chatgpt*/
+        AIMODES_MAX_NUM,
+    } aimodels;
+
+    static constexpr char *AIMODES_DOUBAO_BUTTONVIEWID = "doubao_button";
+    static constexpr char *AIMODES_WENXINYIYAN_BUTTONVIEWID = "wenxinyiyan_button";
+    static constexpr char *AIMODES_KIMI_BUTTONVIEWID = "kimi_button";
+    static constexpr char *AIMODES_CHATGPT_BUTTONVIEWID = "chatgpt_button";
+
+    static constexpr char *AiModels_Bg = AIMODELS_IMAGE_PATH "/aimodels_bg.bin";             /*整个模型背景*/
+    static constexpr char *AiModels_title_Bg = AIMODELS_IMAGE_PATH "/aimodels_title_bg.bin"; /*标题背景*/
+    static constexpr char *AiModels_select = AIMODELS_IMAGE_PATH "/aimodels_select.bin";     /*模型选中状态*/
+    static constexpr char *AiModelsImagePath[AIMODES_MAX_NUM] = {
+        AIMODELS_IMAGE_PATH "/aimodels_doubao.bin",      /*豆包*/
+        AIMODELS_IMAGE_PATH "/aimodels_wenxinyiyan.bin", /*文心一言*/
+        AIMODELS_IMAGE_PATH "/aimodels_kimi.bin",        /*Kimi*/
+        AIMODELS_IMAGE_PATH "/aimode_lschatgpt_on.bin",  /*ChatGPT*/
+    };
+
+    static constexpr char *AiModelsButtonViewId[AIMODES_MAX_NUM] = {
+        AIMODES_DOUBAO_BUTTONVIEWID,      /*豆包*/
+        AIMODES_WENXINYIYAN_BUTTONVIEWID, /*文心一言*/
+        AIMODES_KIMI_BUTTONVIEWID,        /*Kimi*/
+        AIMODES_CHATGPT_BUTTONVIEWID,     /*ChatGPT*/
+    };
+
+    class AiModelsPresenter;
+    class AiModelsView : public View<AiModelsPresenter>
+    {
+    public:
+        struct LabelConfig
+        {
+            int16_t left;
+            int16_t top;
+            int16_t width;
+            int16_t height;
+            int16_t fontSize;
+            int16_t lineHeigh;
+            uint16_t textId;
+            uint8_t lineBreakMode;
+        };
+
+        struct ImageConfig
+        {
+            int16_t x;
+            int16_t y;
+            int16_t w;
+            int16_t h;
+            const char *src;
+        };
+
+        struct ButtonConfig
+        {
+            int16_t x;
+            int16_t y;
+            int16_t w;
+            int16_t h;
+            const char *viewId;
+        };
+
+        AiModelsView();
+        ~AiModelsView();
+        static AiModelsView *GetInstance(void);
+        void UpdateAiModelsSelectStateAndTitleId();
+
+        void OnStart() override;
+        void OnSetUpView() override;
+        void OnTearDownView() override;
+        void OnStop() override;
+
+    private:
+        UILabelExt *AiModelsViewLabelInit(const LabelConfig &labelconfig);
+        UIImageView *AiModelsViewImageViewInit(const ImageConfig &imageconfig);
+        UIButton *AiModelsViewButtonInit(const ButtonConfig &buttonconfig);
+        bool CreateAiModelsViewLabel(void);
+        bool CreateAiModelsViewImageView(void);
+        bool CreateAiModelsViewButton(void);
+        bool CreateAiModelsScrollView(void);
+        void CreateAiModelsView(void);
+        void ClearAll(void);
+
+        UIScrollView *AiModelsScrollView{nullptr};
+        UIImageView *AiModelsBackGroundImage{nullptr};
+        UIImageView *AiModelsTitleBackGroundImage{nullptr};
+        UILabelExt *AiModelsTitle{nullptr}; // au模型标题
+        UIButton *AiModelsButtons[AIMODES_MAX_NUM]{nullptr};
+        UIImageView *AiModelsImages[AIMODES_MAX_NUM]{nullptr};
+        static const int AimodelsTextId[AIMODES_MAX_NUM];
+        bool viewInitStatus{false};
+    };
+}
+#endif
\ No newline at end of file
diff --git a/code/sdk/application/wearable/fd230app/nativeui/aimodels/src/AiModelsModel.cpp b/code/sdk/application/wearable/fd230app/nativeui/aimodels/src/AiModelsModel.cpp
new file mode 100644 (file)
index 0000000..52c9c49
--- /dev/null
@@ -0,0 +1,63 @@
+/*
+ * @Author: luozheng 1732036298@qq.com
+ * @Date: 2024-07-08 09:39:58
+ * @LastEditors: luozheng 1732036298@qq.com
+ * @LastEditTime: 2024-07-10 21:20:06
+ * @FilePath: /FD230/code/sdk/application/wearable/fd230app/nativeui/aimodels/src/AiModelsModel.cpp
+ */
+
+#include "aimodels/include/AiModelsModel.h"
+#include "aimodels/include/AiModelsPresenter.h"
+#include "wearable_log.h"
+
+namespace OHOS
+{
+    AiModelsModel::AiModelsModel() {}
+
+    AiModelsModel::~AiModelsModel() {}
+
+    AiModelsModel &AiModelsModel::GetInstance()
+    {
+        static AiModelsModel instance;
+        return instance;
+    }
+
+    /*获取选择的ai模型*/
+    int AiModelsModel::GetSelectAiModel(void)
+    {
+        return selectAiModel;
+    }
+
+    // 设置选择的ai模型
+    void AiModelsModel::SetSelectAiModel(int index)
+    {
+        selectAiModel = index;
+    }
+
+    /*单击func key切换ai模型*/
+    bool AiModelsModel::ChangeAiModel(void)
+    {
+        WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "AiModelsModel::ChangeAiModel");
+        AiModelsPresenter *aiModelsPresenter = AiModelsPresenter::GetInstance();
+        if (aiModelsPresenter == nullptr)
+        {
+            WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "AiModelsModel::ChangeAiModel - AiModelsPresenter instance is nullptr");
+            return false;
+        }
+        aiModelsPresenter->ChangeAiModel();
+        return true;
+    }
+
+    /*获取已选择的ai模型的textid*/
+    int AiModelsModel::GetAiModelTextId(void)
+    {
+        WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "AiModelsModel::GetAiModelTextId - textId = %d", textId);
+        return textId;
+    }
+
+    void AiModelsModel::SetAiModelTextId(int id)
+    {
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "AiModelsModel::SetAiModelTextId - id = %d", id);
+        textId = id;
+    }
+}
diff --git a/code/sdk/application/wearable/fd230app/nativeui/aimodels/src/AiModelsPresenter.cpp b/code/sdk/application/wearable/fd230app/nativeui/aimodels/src/AiModelsPresenter.cpp
new file mode 100644 (file)
index 0000000..545549c
--- /dev/null
@@ -0,0 +1,154 @@
+/*
+ * @Author: luozheng 1732036298@qq.com
+ * @Date: 2024-06-20 15:11:17
+ * @LastEditors: luozheng 1732036298@qq.com
+ * @LastEditTime: 2024-07-10 10:22:18
+ * @FilePath: /FD230/code/sdk/application/wearable/fd230app/nativeui/aivoice/src/AiModelsPresenter.cpp
+ */
+#include "AppViewIDs.h"
+#include "NativeAbility.h"
+#include "common/key_code.h"
+#include <custom_utils.h>
+#include "UiConfig.h"
+#include "aimodels/include/AiModelsPresenter.h"
+#include "aimodels/include/AiModelsView.h"
+
+namespace OHOS
+{
+
+    // 当前Presenter属性实例化的内存指针
+    static AiModelsPresenter *g_pAiModelsPresenter = nullptr;
+
+    AiModelsPresenter::AiModelsPresenter()
+    {
+        model = &AiModelsModel::GetInstance();
+        g_pAiModelsPresenter = this;
+    }
+
+    AiModelsPresenter::~AiModelsPresenter()
+    {
+        g_pAiModelsPresenter = nullptr;
+    }
+
+    AiModelsPresenter *AiModelsPresenter::GetInstance()
+    {
+        return g_pAiModelsPresenter;
+    }
+
+    int16_t AiModelsPresenter::GetSelectAiModel(void)
+    {
+        return model->GetSelectAiModel();
+    }
+
+    void AiModelsPresenter::ChangeAiModel(void)
+    {
+        int index = GetSelectAiModel() + 1;
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "AiModelsPresenter::index = %d", index);
+        if (index >= AIMODES_MAX_NUM)
+        {
+            index = AIMODES_DOUBAO;
+        }
+        model->SetSelectAiModel(index);
+        view_->UpdateAiModelsSelectStateAndTitleId();
+    }
+
+    void AiModelsPresenter::SetAiModelTextId(int16_t id)
+    {
+        model->SetAiModelTextId(id);
+    }
+
+    // 启动时执行的逻辑
+    void AiModelsPresenter::OnStart()
+    {
+        WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "AiModelsPresenter::OnStart");
+        Presenter<AiModelsView>::OnStart();
+    }
+
+    // 页面已经展示后的调用逻辑
+    void AiModelsPresenter::OnResume(void)
+    {
+        WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "AiModelsPresenter::OnResume");
+        Presenter<AiModelsView>::OnResume();
+        if (view_ == nullptr)
+        {
+            return;
+        }
+    }
+
+    // 页面准备切换到后台前执行的逻辑
+    void AiModelsPresenter::OnPause(void)
+    {
+        WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "AiModelsPresenter::OnPause");
+        Presenter<AiModelsView>::OnPause();
+    }
+
+    // 页面完全置于后台时的逻辑。
+    void AiModelsPresenter::OnStop(void)
+    {
+        WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "AiModelsPresenter::OnStop");
+        Presenter<AiModelsView>::OnStop();
+    }
+
+    bool AiModelsPresenter::OnClick(UIView &view, const ClickEvent &event)
+    {
+        UNUSED(event);
+        WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "AiModelsPresenter::OnClick");
+        std::string viewId = view.GetViewId();
+        // 定义视图ID与文本ID的映射关系
+        std::map<std::string, int> viewIdToTextId = {
+            {AIMODES_DOUBAO_BUTTONVIEWID, AIMODES_DOUBAO},
+            {AIMODES_WENXINYIYAN_BUTTONVIEWID, AIMODES_WENXINYIYAN},
+            {AIMODES_KIMI_BUTTONVIEWID, AIMODES_KIMI},
+            {AIMODES_CHATGPT_BUTTONVIEWID, AIMODES_CHATGPT}};
+
+        // 根据视图ID设置文本ID
+        auto it = viewIdToTextId.find(viewId);
+        if (it != viewIdToTextId.end())
+        {
+            model->SetSelectAiModel(it->second);
+        }
+        if (model->GetSelectAiModel() == it->second) // 点击重复ai模型不执行更新
+        {
+            view_->UpdateAiModelsSelectStateAndTitleId();
+        }
+
+        return true;
+    }
+
+    bool AiModelsPresenter::OnDrag(UIView &view, const DragEvent &event)
+    {
+        UNUSED(view);
+        WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "AiModelsPresenter::OnDrag");
+        if ((event.GetDeltaX() > X_DRAG_OFFSET) && (event.GetDeltaX() > (DOUBLES * MATH_ABS(event.GetDeltaY())))) // 拖动过程中判断是否是水平滑动
+        {
+            AiModelsPresenter::X_DRAG_FLAG = true;
+        }
+        return true;
+    }
+
+    bool AiModelsPresenter::OnDragEnd(UIView &view, const DragEvent &event)
+    {
+        UNUSED(view);
+        WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "AiModelsPresenter::OnDragEnd");
+        if (event.GetDragDirection() == DragEvent::DIRECTION_LEFT_TO_RIGHT && AiModelsPresenter::X_DRAG_FLAG)
+        {
+            NativeAbility::GetInstance().Back();
+            AiModelsPresenter::X_DRAG_FLAG = false;
+        }
+        return true;
+    }
+
+    bool AiModelsPresenter::OnKeyAct(UIView &view, const KeyEvent &event) // 增加按键事件
+    {
+        UNUSED(view);
+        WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "AiModelsPresenter::OnKeyAct");
+        uint16_t keyID = event.GetKeyId();
+        uint16_t keyState = event.GetState();
+        // 如果是power键,且是亮屏状态,按键释放就返回上一级
+        if (keyID == static_cast<uint16_t>(ZliteKeyCode::ZLITE_KEY_POWER) && keyState == 0 && uapi_get_screen_state() == 0)
+        {
+            NativeAbility::GetInstance().Back();
+        }
+        return true;
+    }
+}
\ No newline at end of file
diff --git a/code/sdk/application/wearable/fd230app/nativeui/aimodels/src/AiModelsView.cpp b/code/sdk/application/wearable/fd230app/nativeui/aimodels/src/AiModelsView.cpp
new file mode 100644 (file)
index 0000000..89db668
--- /dev/null
@@ -0,0 +1,383 @@
+/*
+ * @Author: luozheng 1732036298@qq.com
+ * @Date: 2024-05-07 11:25:58
+ * @LastEditors: luozheng 1732036298@qq.com
+ * @LastEditTime: 2024-07-10 10:24:57
+ * @FilePath: /FD230/code/sdk/application/wearable/fd230app/nativeui/AiModels/src/AiModelsView.cpp
+ */
+#include "aimodels/include/AiModelsPresenter.h"
+#include "aimodels/include/AiModelsView.h"
+#include "wearable_log.h"
+
+namespace OHOS
+{
+    const int AiModelsView::AimodelsTextId[AIMODES_MAX_NUM] = {STR_AIMODELS_DOUBAO, STR_AIMODES_WENXINYIYAN, STR_AIMODES_KIMI, STR_AIMODES_CHATGPT};
+    static AiModelsView *g_pAiModelsView{nullptr};
+    AiModelsView::AiModelsView()
+    {
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "AiModelsView::AiModelsView");
+        g_pAiModelsView = this;
+    }
+
+    AiModelsView::~AiModelsView()
+    {
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "AiModelsView::~AiModelsView");
+        g_pAiModelsView = nullptr;
+    }
+
+    AiModelsView *AiModelsView::GetInstance()
+    {
+        if (!g_pAiModelsView)
+        {
+            WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "AiModelsView::GetInstance - Instance not initialized!");
+        }
+        return g_pAiModelsView;
+    }
+
+    /*更新模型选中状态和title的textid*/
+    void AiModelsView::UpdateAiModelsSelectStateAndTitleId()
+    {
+        int index = presenter_->GetSelectAiModel();
+        int textId = AimodelsTextId[index];
+        presenter_->SetAiModelTextId(textId);
+        if (AiModelsTitle != nullptr)
+        {
+            AiModelsTitle->SetTextId(textId);
+            AiModelsTitle->ForceResetText();
+        }
+        // 更新模型选中状态的函数中的循环优化
+        for (int i = 0; i < AIMODES_MAX_NUM; ++i)
+        {
+            if (AiModelsImages[i] != nullptr)
+            {
+                bool shouldBeVisible = (index == i);
+                if (AiModelsImages[i])
+                {
+                    AiModelsImages[i]->SetVisible(shouldBeVisible);
+                }
+            }
+        }
+    }
+
+    void AiModelsView::ClearAll(void)
+    {
+        WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "AiModelsView::ClearAll");
+        if (viewInitStatus)
+        {
+            if (container_ != nullptr)
+            {
+                container_->Remove(AiModelsScrollView);
+                if (AiModelsScrollView != nullptr)
+                {
+                    AiModelsScrollView->RemoveAll();
+
+                    if (AiModelsBackGroundImage != nullptr)
+                    {
+                        delete AiModelsBackGroundImage;
+                        AiModelsBackGroundImage = nullptr;
+                    }
+
+                    if (AiModelsTitleBackGroundImage != nullptr)
+                    {
+                        delete AiModelsTitleBackGroundImage;
+                        AiModelsTitleBackGroundImage = nullptr;
+                    }
+
+                    if (AiModelsTitle != nullptr)
+                    {
+                        delete AiModelsTitle;
+                        AiModelsTitle = nullptr;
+                    }
+
+                    for (int i = 0; i < AIMODES_MAX_NUM; i++)
+                    {
+                        if (AiModelsButtons[i] != nullptr)
+                        {
+                            delete AiModelsButtons[i];
+                            AiModelsButtons[i] = nullptr;
+                        }
+
+                        if (AiModelsImages[i] != nullptr)
+                        {
+                            delete AiModelsImages[i];
+                            AiModelsImages[i] = nullptr;
+                        }
+                    }
+
+                    delete AiModelsScrollView;
+                    AiModelsScrollView = nullptr;
+                }
+
+                delete container_;
+                container_ = nullptr;
+            }
+        }
+    }
+
+    UILabelExt *AiModelsView::AiModelsViewLabelInit(const LabelConfig &labelconfig)
+    {
+        UILabelExt *label = new UILabelExt();
+        if (label == nullptr)
+        {
+            return nullptr;
+        }
+        label->SetPosition(labelconfig.left, labelconfig.top, labelconfig.width, labelconfig.height);
+        label->SetStyle(STYLE_TEXT_FONT, labelconfig.fontSize);
+        label->SetStyle(STYLE_LINE_HEIGHT, labelconfig.lineHeigh);
+        label->SetTextId(labelconfig.textId);
+        label->SetLineBreakMode(labelconfig.lineBreakMode);
+        label->SetAlign(TEXT_ALIGNMENT_CENTER, TEXT_ALIGNMENT_CENTER);
+        label->SetRollSpeed(70);
+        label->SetFont(DEFAULT_VECTOR_FONT_FILENAME, labelconfig.fontSize);
+        return label;
+    }
+
+    UIImageView *AiModelsView::AiModelsViewImageViewInit(const ImageConfig &imageconfig)
+    {
+        UIImageView *Image = new UIImageView();
+        if (Image == nullptr)
+        {
+            return nullptr;
+        }
+        Image->SetPosition(imageconfig.x, imageconfig.y, imageconfig.w, imageconfig.h);
+        Image->SetSrc(imageconfig.src);
+        Image->SetStyle(STYLE_BORDER_RADIUS, 100);
+        Image->SetAutoEnable(false);
+        Image->SetResizeMode(UIImageView::FILL);
+        return Image;
+    }
+
+    UIButton *AiModelsView::AiModelsViewButtonInit(const ButtonConfig &buttonconfig)
+    {
+        UIButton *button = new UIButton();
+        if (button == nullptr)
+        {
+            return nullptr;
+        }
+        button->SetPosition(buttonconfig.x, buttonconfig.y, buttonconfig.w, buttonconfig.h);
+        button->SetViewId(buttonconfig.viewId);
+        button->SetStyle(STYLE_BACKGROUND_COLOR, 0xff000000);
+        button->SetStyle(STYLE_BACKGROUND_OPA, 0xff);
+        button->SetStyleForState(STYLE_BACKGROUND_COLOR, 0xffffffff, UIButton::PRESSED);
+        button->SetStyleForState(STYLE_BACKGROUND_OPA, 0x00, UIButton::PRESSED);
+        button->SetOnClickListener(presenter_);
+
+        return button;
+    }
+
+    bool AiModelsView::CreateAiModelsViewLabel(void)
+    {
+        WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "AiModelsView::CreateAiModelsViewLabel");
+        LabelConfig labelConfig = {
+            .left = 83,
+            .top = 50,
+            .width = 300,
+            .height = 35,
+            .fontSize = 30,
+            .lineHeigh = 35,
+            .textId = 0,
+            .lineBreakMode = UILabel::LINE_BREAK_OSCILLATION,
+        };
+        AiModelsTitle = AiModelsViewLabelInit(labelConfig);
+        if (AiModelsTitle == nullptr)
+        {
+            WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "AiModelsTitle new fail!");
+            return false;
+        }
+
+        return true;
+    }
+
+    bool AiModelsView::CreateAiModelsViewImageView(void)
+    {
+        WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "AiModelsView::CreateAiModelsViewImageView");
+        ImageConfig imagecinfig = {
+            .x = 63,
+            .y = 63,
+            .w = 340,
+            .h = 340,
+            .src = AiModels_Bg,
+        };
+        AiModelsBackGroundImage = AiModelsViewImageViewInit(imagecinfig);
+        if (AiModelsBackGroundImage == nullptr)
+        {
+            WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "AiModelsView::AiModelsBackGroundImage is nullptr!!");
+            return false;
+        }
+        /* -------------------------------------------------------------------------- */
+        imagecinfig = {
+            .x = 149,
+            .y = 38,
+            .w = 168,
+            .h = 79,
+            .src = AiModels_title_Bg,
+        };
+        AiModelsTitleBackGroundImage = AiModelsViewImageViewInit(imagecinfig);
+        if (AiModelsTitleBackGroundImage == nullptr)
+        {
+            WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "AiModelsView::AiModelsTitleBackGroundImage is nullptr!!");
+            return false;
+        }
+        /* -------------------------------------------------------------------------- */
+        imagecinfig.w = 36;
+        imagecinfig.h = 36;
+        imagecinfig.src = AiModels_select;
+        for (uint8_t i = 0; i < AIMODES_MAX_NUM; i++)
+        {
+            if (i % 2 == 0)
+            {
+                imagecinfig.x = 187;
+            }
+            else
+            {
+                imagecinfig.x = 307;
+            }
+
+            if (i < 2)
+            {
+                imagecinfig.y = 187;
+            }
+            else
+            {
+                imagecinfig.y = 307;
+            }
+
+            AiModelsImages[i] = AiModelsViewImageViewInit(imagecinfig);
+            if (AiModelsImages[i] == nullptr)
+            {
+                WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "AiModelsImages[%d] new fail!", i);
+                return false;
+            }
+        }
+
+        return true;
+    }
+
+    bool AiModelsView::CreateAiModelsViewButton(void)
+    {
+        WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "AiModelsView::CreateAiModelsViewButton");
+
+        ButtonConfig buttonconfig;
+        buttonconfig.w = 120;
+        buttonconfig.h = 120;
+        for (uint8_t i = 0; i < AIMODES_MAX_NUM; i++)
+        {
+            if (i % 2 == 0)
+            {
+                buttonconfig.x = 113;
+            }
+            else
+            {
+                buttonconfig.x = 233;
+            }
+
+            if (i < 2)
+            {
+                buttonconfig.y = 113;
+            }
+            else
+            {
+                buttonconfig.y = 233;
+            }
+            buttonconfig.viewId = AiModelsButtonViewId[i];
+            AiModelsButtons[i] = AiModelsViewButtonInit(buttonconfig);
+            if (AiModelsButtons[i] == nullptr)
+            {
+                WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "AiModelsButtons[%d] new fail!", i);
+                return false;
+            }
+            AiModelsButtons[i]->SetImageSrc(AiModelsImagePath[i], AiModelsImagePath[i]);
+        }
+
+        return true;
+    }
+
+    bool AiModelsView::CreateAiModelsScrollView(void)
+    {
+        WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "AiModelsView::CreateAiModelsScrollView");
+        AiModelsScrollView = new UIScrollView();
+        if (AiModelsScrollView == nullptr)
+        {
+            WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "AiModelsView::CreateAiModelsScrollView new fail!");
+            return false;
+        }
+        AiModelsScrollView->SetPosition(0, 0, 466, 466);
+        AiModelsScrollView->SetTouchable(true);
+        AiModelsScrollView->SetDraggable(true);
+
+        return true;
+    }
+
+    /*创建Ai模型视图*/
+    void AiModelsView::CreateAiModelsView(void)
+    {
+        WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "AiModelsView::CreateAiModelsView");
+        if (!CreateAiModelsScrollView() || !CreateAiModelsViewLabel() ||
+            !CreateAiModelsViewImageView() || !CreateAiModelsViewButton())
+        {
+            WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "AiModelsView::CreateAiModelsView fail!");
+            return;
+        }
+
+        UpdateAiModelsSelectStateAndTitleId();
+
+        AiModelsScrollView->Add(AiModelsBackGroundImage);
+        AiModelsScrollView->Add(AiModelsTitleBackGroundImage);
+        AiModelsScrollView->Add(AiModelsTitle);
+        for (int8_t i = 0; i < AIMODES_MAX_NUM; i++)
+        {
+            AiModelsScrollView->Add(AiModelsButtons[i]);
+            AiModelsScrollView->Add(AiModelsImages[i]);
+        }
+        container_->Add(AiModelsScrollView);
+    }
+
+    void AiModelsView::OnStart()
+    {
+        WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "AiModelsView::OnStart");
+        View<AiModelsPresenter>::OnStart();
+        SetContainerView(new UIViewGroup());
+        if (GetContainer() == nullptr)
+        {
+            WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "SetContainerView fail!!");
+            return;
+        }
+        container_->SetPosition(0, 0, Screen::GetInstance().GetWidth(), Screen::GetInstance().GetHeight());
+        container_->SetOnDragListener(presenter_);
+        container_->SetTouchable(true);
+        container_->SetDraggable(true);
+
+        if (!viewInitStatus)
+        {
+            CreateAiModelsView();
+            viewInitStatus = true;
+        }
+
+        RootView::GetInstance()->SetOnKeyActListener(presenter_);
+
+        return;
+    }
+    void AiModelsView::OnSetUpView()
+    {
+        WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "AiModelsView::OnSetUpView");
+        View<AiModelsPresenter>::OnSetUpView();
+        Draw();
+        return;
+    }
+
+    void AiModelsView::OnTearDownView()
+    {
+        WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "AiModelsView::OnTearDownView");
+        View<AiModelsPresenter>::OnTearDownView();
+        return;
+    }
+
+    void AiModelsView::OnStop()
+    {
+        WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "AiModelsView::OnStop");
+        View<AiModelsPresenter>::OnStop();
+        RootView::GetInstance()->ClearOnKeyActListener();
+        ClearAll();
+        return;
+    }
+}
\ No newline at end of file
index 48722f4..724b735 100644 (file)
@@ -2,7 +2,7 @@
  * @Author: luozheng 1732036298@qq.com
  * @Date: 2024-06-20 15:14:43
  * @LastEditors: luozheng 1732036298@qq.com
- * @LastEditTime: 2024-07-04 18:31:22
+ * @LastEditTime: 2024-07-11 14:35:27
  * @FilePath: /FD230/code/sdk/application/wearable/fd230app/nativeui/aivoice/include/AiVoiceModel.h
  */
 #ifndef AI_VOICE_MODEL_H
@@ -62,7 +62,7 @@ namespace OHOS
         void StopListenAndRecordingUserQuestion(void);
 
         // 定时器管理
-        void AIVoice_StartTimer(uint32_t interval = 1000);
+        void AIVoice_StartTimer(uint32_t interval = 2000);
         void AIVoice_StopTimer(void);
 
     private:
index 7f33333..711ffe4 100644 (file)
@@ -2,7 +2,7 @@
  * @Author: luozheng 1732036298@qq.com
  * @Date: 2024-06-20 15:14:50
  * @LastEditors: luozheng 1732036298@qq.com
- * @LastEditTime: 2024-07-05 20:34:32
+ * @LastEditTime: 2024-07-11 14:36:14
  * @FilePath: /FD230/code/sdk/application/wearable/fd230app/nativeui/aivoice/src/AiVoiceModel.cpp
  */
 #include "aivoice/include/AiVoiceModel.h"
@@ -26,7 +26,7 @@ namespace OHOS
 {
     // 声明定时器变量
     static osTimerId_t g_timer = NULL;
-    static constexpr uint16_t THIRTY_TIME = 30; // 30秒超时
+    static constexpr uint16_t THIRTY_TIME = 32;
     static int Time = THIRTY_TIME;
 
     AiVoiceModel::AiVoiceModel() {}
@@ -305,7 +305,7 @@ namespace OHOS
             WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "GetChatContentListCount() - 1 = %d,line = %d", GetChatContentListCount() - 1, __LINE__);
             // 将更新后的 AI 回答内容添加到列表
             adapter->GetChatContentItem().push_back(chatTtems[GetChatContentListCount() - 1]);
-             p_AivoiceReturnResultTextView->GetChatContentList()->RefreshList();
+            p_AivoiceReturnResultTextView->GetChatContentList()->RefreshList();
         }
         else
         {
@@ -334,7 +334,7 @@ namespace OHOS
             usleep(50000);             // 延时等待创建完成,0.05秒
         }
         /* -------------------------------------------------------------------------- */
-        userQuestionStr = str;
+        userQuestionStr += str;
         /* -------------------------------------------------------------------------- */
         if (!UpdateUserQuestionStr())
         {
@@ -489,29 +489,38 @@ namespace OHOS
     static void AIVoice_TimerCallbackProc(int data)
     {
         WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "AIVoice_TimerCallbackProc,Time = %d", Time);
-        Time -= 1;
-        AiVoiceView *view_ = AiVoiceView::GetInstance();
-        if (view_ == nullptr)
-        {
-            WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "AiVoiceView::GetInstance fail!!");
-            return;
-        }
-
-        AiVoicePresenter *p_AiVoicePresenter = AiVoicePresenter::GetInstance();
-        if (p_AiVoicePresenter == nullptr)
+        Time -= 2;
+        if (Time == 30)
         {
-            WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "AiVoicePresenter::GetInstance fail!!");
-            return;
+            AiVoiceModel::GetInstance().CheckFileAndSendAIIsReady();
         }
-
         if (Time < 0) // 如果思考时间超时30s,进入连接超时界面
         {
+            AiVoiceView *view_ = AiVoiceView::GetInstance();
+            if (view_ == nullptr)
+            {
+                WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "AiVoiceView::GetInstance fail!!");
+                AiVoiceModel::GetInstance().AIVoice_StopTimer();
+                return;
+            }
+            AiVoicePresenter *p_AiVoicePresenter = AiVoicePresenter::GetInstance();
+            if (p_AiVoicePresenter == nullptr)
+            {
+                WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "AiVoicePresenter::GetInstance fail!!");
+                AiVoiceModel::GetInstance().AIVoice_StopTimer();
+                return;
+            }
+            bool flag = false;
             if ((view_->GetAiVoiceScrollView(AIVOICE_THINKING_VIEWID) != nullptr) &&
                 (view_->GetAiVoiceScrollView(AIVOICE_THINKING_VIEWID)->IsVisible()))
             {
                 p_AiVoicePresenter->ChangeViewAndLogicOperator(AIVOICE_THINKING_VIEWID, AIVOICE_CONNECT_TIMEOUT_VIEWID);
+                flag = true;
+            }
+            if (!flag)
+            {
+                AiVoiceModel::GetInstance().AIVoice_StopTimer();
             }
-            AiVoiceModel::GetInstance().AIVoice_StopTimer();
         }
 
         return;
index 7c9d415..ff12fa1 100644 (file)
@@ -1,8 +1,8 @@
 /*
  * @Author: luozheng 1732036298@qq.com
  * @Date: 2024-06-20 15:11:17
- * @LastEditors: SnickerSun snickersun@163.com
- * @LastEditTime: 2024-07-05 10:35:34
+ * @LastEditors: luozheng 1732036298@qq.com
+ * @LastEditTime: 2024-07-09 18:27:33
  * @FilePath: /FD230/code/sdk/application/wearable/fd230app/nativeui/aivoice/src/AiVoicePresenter.cpp
  */
 #include "AppViewIDs.h"
@@ -224,7 +224,7 @@ namespace OHOS
             if (showView == AIVOICE_THINKING_VIEWID) // 聆听中->思考中界面
             {
                 // osal_msleep(500);
-                model->CheckFileAndSendAIIsReady();
+                //model->CheckFileAndSendAIIsReady();
                 model->AIVoice_StartTimer();
             }
             else if (showView == AIVOICE_STARTCHAT_VIEWID) // 聆听中->开始对话界面:(右滑不想录音了)
index 4bad2f5..bd842a6 100644 (file)
@@ -468,4 +468,8 @@ STR_THINKING$Thinking
 STR_CANCEL$Cancel\r
 STR_CONNECT_TIMEOUT$Connection Timeout\r
 STR_PLEASE_RESTART_CHAT$Please restart the conversation\r
-STR_CONTINUE_CHAT$Continue the conversation
\ No newline at end of file
+STR_CONTINUE_CHAT$Continue the conversation\r
+STR_AIMODELS_DOUBAO$Cici\r
+STR_AIMODES_WENXINYIYAN$ERNIE Bot\r
+STR_AIMODES_KIMI$Kimi\r
+STR_AIMODES_CHATGPT$ChatGPT
\ No newline at end of file
index 7b00911..407425a 100644 (file)
@@ -468,4 +468,8 @@ STR_THINKING$正在思考...
 STR_CANCEL$取消\r
 STR_CONNECT_TIMEOUT$连接超时\r
 STR_PLEASE_RESTART_CHAT$请重新开始对话\r
-STR_CONTINUE_CHAT$继续对话
\ No newline at end of file
+STR_CONTINUE_CHAT$继续对话\r
+STR_AIMODELS_DOUBAO$豆包\r
+STR_AIMODES_WENXINYIYAN$文心一言\r
+STR_AIMODES_KIMI$Kimi\r
+STR_AIMODES_CHATGPT$ChatGPT
\ No newline at end of file
index 1335d7b..be26e19 100644 (file)
        <lanstr id="STR_CONNECT_TIMEOUT" value="Connection Timeout"/>
        <lanstr id="STR_PLEASE_RESTART_CHAT" value="Please restart the conversation"/>
        <lanstr id="STR_CONTINUE_CHAT" value="Continue the conversation"/>
+       <lanstr id="STR_AIMODELS_DOUBAO" value="Cici"/>
+       <lanstr id="STR_AIMODES_WENXINYIYAN" value="ERNIE Bot"/>
+       <lanstr id="STR_AIMODES_KIMI" value="Kimi"/>
+       <lanstr id="STR_AIMODES_CHATGPT" value="ChatGPT"/>
 </language>
diff --git a/code/sdk/application/wearable/fd230app/nativeui/language/Language_xml/language_ja.xml b/code/sdk/application/wearable/fd230app/nativeui/language/Language_xml/language_ja.xml
deleted file mode 100644 (file)
index b539e5f..0000000
+++ /dev/null
@@ -1,240 +0,0 @@
-<language id="language" direct="ltr" languageinfo="ja">
-       <lanstr id="STR_EXERCISE_GENERAL" value="一般的なトレーニング"/>
-       <lanstr id="STR_EXERCISE_FREETRAINING" value="フリートレーニング"/>
-       <lanstr id="STR_EXERCISE_RESISTANCETRAINING" value="筋力トレーニング"/>
-       <lanstr id="STR_EXERCISE_SPINBIKE" value="フライカート/室内フィットネスカート"/>
-       <lanstr id="STR_EXERCISE_TREADMILL" value="ステッパー"/>
-       <lanstr id="STR_EXERCISE_STROLLMACHINE" value="ウォークマン"/>
-       <lanstr id="STR_EXERCISE_HIIT" value="HIIT/高強度インターバルトレーニング"/>
-       <lanstr id="STR_EXERCISE_CROSSFIT" value="フィットネス"/>
-       <lanstr id="STR_EXERCISE_GROUPCALISTHENICS" value="マステ"/>
-       <lanstr id="STR_EXERCISE_YOGA" value="ヨガ"/>
-       <lanstr id="STR_EXERCISE_YOGACAT" value="ヨガ猫式"/>
-       <lanstr id="STR_EXERCISE_YOGACOW" value="ヨガ牛式"/>
-       <lanstr id="STR_EXERCISE_YOGACOBRA" value="ヨガコブラ式"/>
-       <lanstr id="STR_EXERCISE_YOGAHERO1" value="ヨガヒーロー式1"/>
-       <lanstr id="STR_EXERCISE_YOGAHERO2" value="ヨガヒーロー式2"/>
-       <lanstr id="STR_EXERCISE_YOGAHERO3" value="ヨガヒーロー式3"/>
-       <lanstr id="STR_EXERCISE_YOGAROLLING" value="ヨガローラー"/>
-       <lanstr id="STR_EXERCISE_OUTDOORWALKING" value="屋外ウォーキング"/>
-       <lanstr id="STR_EXERCISE_OUTDOORRUNNING" value="屋外ランニング"/>
-       <lanstr id="STR_EXERCISE_INDOORWALKING" value="インドアウォーキング"/>
-       <lanstr id="STR_EXERCISE_INDOORRUNNING" value="インドアランニング"/>
-       <lanstr id="STR_EXERCISE_OUTDOORBIKING" value="屋外サイクリング"/>
-       <lanstr id="STR_EXERCISE_JUMPINGROPE" value="縄跳び"/>
-       <lanstr id="STR_EXERCISE_PILATES" value="ピラティス"/>
-       <lanstr id="STR_EXERCISE_CROSS_FIT" value="ミックスフィットネス"/>
-       <lanstr id="STR_EXERCISE_FUNCTIONALTRAINING" value="機能的トレーニング"/>
-       <lanstr id="STR_EXERCISE_PHYSICALTRAINING" value="体力トレーニング"/>
-       <lanstr id="STR_EXERCISE_TAEKWONDO" value="テコンドー/キックボクシング"/>
-       <lanstr id="STR_EXERCISE_BOXING" value="ボクシング"/>
-       <lanstr id="STR_EXERCISE_KICKBOXING" value="キックボクシング"/>
-       <lanstr id="STR_EXERCISE_KARATE" value="空手"/>
-       <lanstr id="STR_EXERCISE_FENCING" value="フェンシング"/>
-       <lanstr id="STR_EXERCISE_CORETRAINING" value="コアトレーニング"/>
-       <lanstr id="STR_EXERCISE_BODYCOMBAT" value="ボクシング有酸素"/>
-       <lanstr id="STR_EXERCISE_KENDO" value="剣道"/>
-       <lanstr id="STR_EXERCISE_HORIZONTALBAR" value="鉄棒"/>
-       <lanstr id="STR_EXERCISE_PARALLELBARS" value="平行棒"/>
-       <lanstr id="STR_EXERCISE_CIRCUIT" value="サイクルトレーニング"/>
-       <lanstr id="STR_EXERCISE_AEROBICS" value="エアロビクス"/>
-       <lanstr id="STR_EXERCISE_CALISTHENICE" value="エアロビクス"/>
-       <lanstr id="STR_EXERCISE_P90X" value="P90X"/>
-       <lanstr id="STR_EXERCISE_KETTLEBELTRAINING" value="ポットベルトレーニング"/>
-       <lanstr id="STR_EXERCISE_MIXEDMARTIALARTS" value="総合格闘技"/>
-       <lanstr id="STR_EXERCISE_STAIRCLIMBINGMACHINE" value="階段昇降機"/>
-       <lanstr id="STR_EXERCISE_WEIGHTLIFTING" value="ウエイトリフティング"/>
-       <lanstr id="STR_EXERCISE_BARRE" value="Barre"/>
-       <lanstr id="STR_EXERCISE_HANDCYCLING" value="ハンドホイール"/>
-       <lanstr id="STR_EXERCISE_TRACKFIELD" value="陸上"/>
-       <lanstr id="STR_EXERCISE_WRESTLING" value="角力"/>
-       <lanstr id="STR_EXERCISE_MINDBODY" value="心身運動"/>
-       <lanstr id="STR_EXERCISE_FLEXIBILITY" value="柔軟体操"/>
-       <lanstr id="STR_EXERCISE_MIXEDCARDIO" value="混合有酸素"/>
-       <lanstr id="STR_EXERCISE_TRADITIONALSTRENGTHTRAINING" value="従来の筋力トレーニング"/>
-       <lanstr id="STR_EXERCISE_CROSSTRAINING" value="クロストレーニング"/>
-       <lanstr id="STR_EXERCISE_GYMNASTICS" value="体操"/>
-       <lanstr id="STR_EXERCISE_STEPTRAINING" value="ステップトレーニング"/>
-       <lanstr id="STR_EXERCISE_ELLIPTICALTRAINER" value="楕円マシン"/>
-       <lanstr id="STR_EXERCISE_ROWINGMACHINE" value="ローイングマシン"/>
-       <lanstr id="STR_DANCING_GENERAL" value="一般ダンス"/>
-       <lanstr id="STR_DANCING_BELLY" value="ベリーダンス"/>
-       <lanstr id="STR_DANCING_JAZZ" value="ジャズダンス"/>
-       <lanstr id="STR_DANCING_LATIN" value="ラテンダンス"/>
-       <lanstr id="STR_DANCING_BALLET" value="バレエ"/>
-       <lanstr id="STR_DANCING_STREET" value="ストリートダンス"/>
-       <lanstr id="STR_DANCING_PUBLICSQUARE" value="スクエアダンス"/>
-       <lanstr id="STR_DANCING_ZUMBA" value="ズンバ"/>
-       <lanstr id="STR_DANCING_SOCIALDANCE" value="ソシアルダンス"/>
-       <lanstr id="STR_DANCING_TAPDANCE" value="タップダンス"/>
-       <lanstr id="STR_RECREATIONAL_SPORTS" value="一般レジャースポーツ"/>
-       <lanstr id="STR_RECREATIONAL_SKATING" value="ローラースケート"/>
-       <lanstr id="STR_RECREATIONAL_MARTIALARTS" value="武道"/>
-       <lanstr id="STR_RECREATIONAL_TAICHI" value="太極拳"/>
-       <lanstr id="STR_RECREATIONAL_HULAHOOP" value="フラフープ"/>
-       <lanstr id="STR_RECREATIONAL_DISCSPORT" value="フリスビー"/>
-       <lanstr id="STR_RECREATIONAL_DARTS" value="ダーツ"/>
-       <lanstr id="STR_RECREATIONAL_ARCHERY" value="アーチェリー"/>
-       <lanstr id="STR_RECREATIONAL_HORSERIDING" value="馬に乗る"/>
-       <lanstr id="STR_RECREATIONAL_BATTLEGAME" value="対戦ゲーム"/>
-       <lanstr id="STR_RECREATIONAL_KITE" value="凧揚げ"/>
-       <lanstr id="STR_RECREATIONAL_TUGOFWAR" value="綱引き"/>
-       <lanstr id="STR_RECREATIONAL_SWING" value="ブランコ"/>
-       <lanstr id="STR_RECREATIONAL_STAIRCLIMBING" value="階段を登る"/>
-       <lanstr id="STR_RECREATIONAL_OBSTACLERACE" value="障害レース"/>
-       <lanstr id="STR_RECREATIONAL_FISHING" value="フィッシング"/>
-       <lanstr id="STR_RECREATIONAL_HUNTING" value="狩り"/>
-       <lanstr id="STR_RECREATIONAL_SCOOTERRIDING" value="カート"/>
-       <lanstr id="STR_RECREATIONAL_PARAGLIDING" value="パラグライダー"/>
-       <lanstr id="STR_RECREATIONAL_TEAMSPORTS" value="チーム競技"/>
-       <lanstr id="STR_RECREATIONAL_FINESSGAMING" value="フィットネスゲーム"/>
-       <lanstr id="STR_RECREATIONAL_HIKING" value="健行"/>
-       <lanstr id="STR_RECREATIONAL_EQUESTRIANSPORTS" value="馬術スポーツ"/>
-       <lanstr id="STR_RECREATIONAL_PLAY" value="遊び"/>
-       <lanstr id="STR_BALL_GAMES" value="一般的な球技"/>
-       <lanstr id="STR_BALL_BADMINTON" value="バドミントン"/>
-       <lanstr id="STR_BALL_TABLETENNIS" value="卓球"/>
-       <lanstr id="STR_BALL_TENNIS" value="テニス"/>
-       <lanstr id="STR_BALL_BILLIARDS" value="ボール"/>
-       <lanstr id="STR_BALL_BOWLING" value="ボウリング"/>
-       <lanstr id="STR_BALL_VOLLEYBALL" value="バレーボール"/>
-       <lanstr id="STR_BALL_SHUTTLECOCK" value="けん玉"/>
-       <lanstr id="STR_BALL_HANDBALL" value="ハンドボール"/>
-       <lanstr id="STR_BALL_BASEBALL" value="野球"/>
-       <lanstr id="STR_BALL_SOFTBALL" value="ソフトボール"/>
-       <lanstr id="STR_BALL_CRICKET" value="クリケット"/>
-       <lanstr id="STR_BALL_FOOTBALL" value="アメリカンフットボール"/>
-       <lanstr id="STR_BALL_BEACHSOCCER" value="ビーチサッカー"/>
-       <lanstr id="STR_BALL_BEACHVOLLEYBALL" value="ビーチバレーボール"/>
-       <lanstr id="STR_BALL_CROQUET" value="クロケット"/>
-       <lanstr id="STR_BALL_HOCKEY" value="ホッケー"/>
-       <lanstr id="STR_BALL_SQUASH" value="英国式スカッシュ"/>
-       <lanstr id="STR_BALL_SEPAKTAKRAW" value="フジボール"/>
-       <lanstr id="STR_BALL_DODGEBALL" value="ドッジボール"/>
-       <lanstr id="STR_BALL_BASKETBALL" value="バスケットボール"/>
-       <lanstr id="STR_BALL_SOCCER" value="サッカーボール"/>
-       <lanstr id="STR_BALL_GOLF" value="ゴルフボール"/>
-       <lanstr id="STR_BALL_POLO" value="ポロ"/>
-       <lanstr id="STR_BALL_RACQUETBALL" value="スカッシュ"/>
-       <lanstr id="STR_BALL_RUGBY" value="ラグビー"/>
-       <lanstr id="STR_BALL_GATEBALL" value="ゲートボール"/>
-       <lanstr id="STR_BALL_PICKLEBALL" value="ピックボール"/>
-       <lanstr id="STR_BALL_LACROSSE" value="バッグスティック"/>
-       <lanstr id="STR_WATER_ACTIVITIES" value="一般水上アクティビティ"/>
-       <lanstr id="STR_WATER_SAILING" value="ヨット"/>
-       <lanstr id="STR_WATER_SURFING" value="サーフィン"/>
-       <lanstr id="STR_WATER_WHITEWATERRAFTING" value="ロービング"/>
-       <lanstr id="STR_WATER_CANOEING" value="ドラゴンボート漕ぎ"/>
-       <lanstr id="STR_WATER_KAYAKING" value="ボート"/>
-       <lanstr id="STR_WATER_ROWING" value="ローイング"/>
-       <lanstr id="STR_WATER_MOTORBOAT" value="水上バイク"/>
-       <lanstr id="STR_WATER_SUP" value="パドルサーフィン"/>
-       <lanstr id="STR_WATER_SCUBADIVING" value="ダイビング"/>
-       <lanstr id="STR_WATER_DIVING" value="飛び込み"/>
-       <lanstr id="STR_WATER_KITESURFING" value="パラグライダーサーフィン"/>
-       <lanstr id="STR_WATER_WAKEBOARDING" value="ウェイクボード"/>
-       <lanstr id="STR_WATER_POLO" value="水球"/>
-       <lanstr id="STR_WATER_WINDSURFING" value="ウィンドサーフィン"/>
-       <lanstr id="STR_WATER_DRIFTING" value="ラフティングアクティビティ"/>
-       <lanstr id="STR_WATER_FITNESS" value="ウォーターフィットネス"/>
-       <lanstr id="STR_WATER_SPORTS" value="ウォータースポーツ"/>
-       <lanstr id="STR_WATER_OUTDOORSWIM" value="アウトドアスイミング"/>
-       <lanstr id="STR_WATER_INDOORSWIM" value="インドアスイム"/>
-       <lanstr id="STR_WATER_SWIMFREESTYLE" value="水泳_フリースタイル"/>
-       <lanstr id="STR_WATER_SWIMBREASTSTROKE" value="水泳_カエル式"/>
-       <lanstr id="STR_WATER_SWIMBACKSTROKE" value="水泳_仰向け"/>
-       <lanstr id="STR_WATER_SWIMBUTTERFLY" value="スイム_バタフライ"/>
-       <lanstr id="STR_ICE_SPORTS" value="一般氷上スポーツ"/>
-       <lanstr id="STR_ICE_SKATING" value="スケート"/>
-       <lanstr id="STR_ICE_HOCKEY" value="アイスホッケー"/>
-       <lanstr id="STR_ICE_CURLING" value="アイスストーン/カーリング"/>
-       <lanstr id="STR_ICE_SNOWMOBILING" value="スノーモービル"/>
-       <lanstr id="STR_ICE_SLED" value="そり"/>
-       <lanstr id="STR_ICE_BIATHLON" value="冬の2つ"/>
-       <lanstr id="STR_ICE_CROSSCOUNTRYSKING" value="クロスカントリースキー"/>
-       <lanstr id="STR_ICE_SKIING" value="スキー"/>
-       <lanstr id="STR_ICE_SNOWBOARDING" value="スノーボード/スノーボード"/>
-       <lanstr id="STR_ICE_SNOWSHOEING" value="スノーシュー健行"/>
-       <lanstr id="STR_ICE_SNOWSPORTS" value="スノースポーツ"/>
-       <lanstr id="STR_EXTREME_SPORTS" value="一般エクストリームスポーツ"/>
-       <lanstr id="STR_EXTREME_SKATEBOARDING" value="スケートボード"/>
-       <lanstr id="STR_EXTREME_ROCKCLIMBING" value="ロッククライミング"/>
-       <lanstr id="STR_EXTREME_BUNGEEJUMPING" value="ハイジャンプ/バンジージャンプイベント"/>
-       <lanstr id="STR_EXTREME_PARKOUR" value="パルクール"/>
-       <lanstr id="STR_EXTREME_BMX" value="BMX"/>
-       <lanstr id="STR_EXTREME_ORIENTERING" value="オリエンテーリング"/>
-       <lanstr id="STR_EXTREME_PARACHUTE" value="スカイダイビング"/>
-       <lanstr id="STR_EXTREME_RACING" value="レース"/>
-       <lanstr id="STR_EXTREME_TRIATHLONS" value="トライアスロン"/>
-       <lanstr id="STR_OTHER_ELEVATOR" value="エレベーターに乗る"/>
-       <lanstr id="STR_OTHER_ESCALATOR" value="エスカレーター"/>
-       <lanstr id="STR_OTHER_GARDENING" value="ガーデニングをする"/>
-       <lanstr id="STR_OTHER_HORSEWORK" value="家事をする"/>
-       <lanstr id="STR_OTHER_INVEHICLE" value="車の中で"/>
-       <lanstr id="STR_OTHER_MEDITATION" value="瞑想する"/>
-       <lanstr id="STR_OTHER_STILL" value="静止"/>
-       <lanstr id="STR_OTHER_TILTING" value="傾斜"/>
-       <lanstr id="STR_OTHER_WHEELCHAIR" value="車椅子で移動"/>
-       <lanstr id="STR_EXERCISE_LIST" value="フィットネスクラス"/>
-       <lanstr id="STR_BALL_LIST" value="ボール"/>
-       <lanstr id="STR_WATER_LIST" value="ウォータースポーツ"/>
-       <lanstr id="STR_DANCING_LIST" value="ダンスクラス"/>
-       <lanstr id="STR_EXTREME_LIST" value="エクストリームスポーツ"/>
-       <lanstr id="STR_ICE_LIST" value="アイススポーツ"/>
-       <lanstr id="STR_RECREATIONAL_LIST" value="レジャースポーツ"/>
-       <lanstr id="STR_OTHER_LIST" value="その他"/>
-       <lanstr id="STR_DANCING_TITLE" value="ダンススポーツ"/>
-       <lanstr id="STR_BALL_LIST_TITLE" value="球技"/>
-       <lanstr id="STR_OTHER_TITLE" value="その他のスポーツ"/>
-       <lanstr id="STR_EXERCISE_TITLE" value="フィットネススポーツ"/>
-       <lanstr id="STR_TRAINING" value="トレーニング"/>
-       <lanstr id="STR_RAPID_TRAINING" value="クイックトレーニング"/>
-       <lanstr id="STR_SET_GOALS" value="目標の設定"/>
-       <lanstr id="STR_DURATION" value="期間"/>
-       <lanstr id="STR_DURATION_SETTING" value="期間設定"/>
-       <lanstr id="STR_MINUTES" value="分"/>
-       <lanstr id="STR_CALORIE" value="カロリー"/>
-       <lanstr id="STR_CALORIE_SETTING" value="カロリー設定"/>
-       <lanstr id="STR_KILOCALORIE" value="kcal"/>
-       <lanstr id="STR_DISTANCE" value="距離"/>
-       <lanstr id="STR_RANGE_SETTING" value="距離設定{{STR_RANGE_SETTING"/>
-       <lanstr id="STR_METER" value="メートル"/>
-       <lanstr id="STR_KILOMETRE" value="キロメートル"/>
-       <lanstr id="STR_STEP_NUMBER" value="ステップ数"/>
-       <lanstr id="STR_STEP_SETTING" value="ステップ設定"/>
-       <lanstr id="STR_STEP" value="ステップ"/>
-       <lanstr id="STR_HEART_RATE" value="心拍数"/>
-       <lanstr id="STR_MEAN_HEART_RATE" value="平均心拍数"/>
-       <lanstr id="STR_TIMES_PER_MIN" value="回/分"/>
-       <lanstr id="STR_MEAN_HEART_RATE_MIN" value="平均心拍数(回/分)"/>
-       <lanstr id="STR_IN_THE" value="で"/>
-       <lanstr id="STR_LOWER_STRENGTH" value="低強度"/>
-       <lanstr id="STR_MEDIUM_STRENGTH" value="中程度の強さ"/>
-       <lanstr id="STR_HIGH_STRENGTH" value="高強度"/>
-       <lanstr id="STR_ULTRA_HIGH_STRENGTH" value="超高強度"/>
-       <lanstr id="STR_TRAINING_INTENSITY" value="トレーニング強度"/>
-       <lanstr id="STR_TRAINING_INTENSITY_DESCRIPTION" value="トレーニング強度は、トレーニング不足かトレーニング過多かを判断するために用いられ、心拍数をどれだけ増加させる運動強度が最適であるかを判断する。"/>
-       <lanstr id="STR_INTENSITY_INTERVAL_DESCRIPTION" value="この強度区間は目標心拍数(個人基本資料から計算)の強弱に対応するリアルタイム状態表示であり、訓練の質を高めるのに役立つ。"/>
-       <lanstr id="STR_TRAINING_STATE_MEANING" value="トレーニング状態代表の意味"/>
-       <lanstr id="STR_WARM_UP_EXERCISE" value="ウォーミングアップ"/>
-       <lanstr id="STR_FAT_BURNING_ZONE" value="脂肪燃焼ゾーン"/>
-       <lanstr id="STR_IMPROVE_CARDIOPULMONARY_FUNCTION" value="心肺機能の向上"/>
-       <lanstr id="STR_PROFESSIONAL_ATHLETE" value="プロスポーツ選手"/>
-       <lanstr id="STR_TRAINING_INTENSITY_NOTE" value="注:このトレーニング強度はプロの運動評価ではなく、データは参考にしてください。"/>
-       <lanstr id="STR_TRAINING_IN_PROGRESS" value="トレーニング中"/>
-       <lanstr id="STR_BREAK_TRAINING" value="トレーニング一時停止"/>
-       <lanstr id="STR_FINISH" value="の終了"/>
-       <lanstr id="STR_PAUSE" value="一時停止"/>
-       <lanstr id="STR_RESUME" value="続行"/>
-       <lanstr id="STR_GOAL_ACHIEVED" value="目標を達成しました"/>
-       <lanstr id="STR_ACCOMPLISH_GOAL" value="完了目標"/>
-       <lanstr id="STR_OK" value="OK"/>
-       <lanstr id="STR_LOOK_OUT" value="注意"/>
-       <lanstr id="STR_INSUFFICENT_EXERCISE_AMOUNT" value="現在の運動量が小さすぎて記録できません。運動を終了するかどうか"/>
-       <lanstr id="STR_END_MOVEMENT" value="モーションの終了"/>
-       <lanstr id="STR_END_THIS_MOVEMENT" value="この運動を終了するかどうか"/>
-       <lanstr id="STR_GOAL_ACCOMPLISHMENT_DEGREE" value="目標達成度"/>
-       <lanstr id="STR_TRAINING_DURATION" value="トレーニング時間"/>
-       <lanstr id="STR_OFF" value="オフ"/>
-       <lanstr id="STR_MORE" value="以上"/>
-</language>
index 90181b9..0ea317f 100644 (file)
        <lanstr id="STR_CONNECT_TIMEOUT" value="连接超时"/>
        <lanstr id="STR_PLEASE_RESTART_CHAT" value="请重新开始对话"/>
        <lanstr id="STR_CONTINUE_CHAT" value="继续对话"/>
+       <lanstr id="STR_AIMODELS_DOUBAO" value="豆包"/>
+       <lanstr id="STR_AIMODES_WENXINYIYAN" value="文心一言"/>
+       <lanstr id="STR_AIMODES_KIMI" value="Kimi"/>
+       <lanstr id="STR_AIMODES_CHATGPT" value="ChatGPT"/>
 </language>
index 8551ced..a242fed 100644 (file)
Binary files a/code/sdk/application/wearable/fd230app/nativeui/language/font/en.lang and b/code/sdk/application/wearable/fd230app/nativeui/language/font/en.lang differ
index fe08bbc..3532e33 100644 (file)
Binary files a/code/sdk/application/wearable/fd230app/nativeui/language/font/ja.lang and b/code/sdk/application/wearable/fd230app/nativeui/language/font/ja.lang differ
index edf3e00..ede429d 100644 (file)
@@ -481,12 +481,16 @@ enum UIResourceTextId : uint16_t {
     STR_CONNECT_TIMEOUT = 468,\r
     STR_PLEASE_RESTART_CHAT = 469,\r
     STR_CONTINUE_CHAT = 470,\r
-    STR_MAX_ID = 471,\r
+    STR_AIMODELS_DOUBAO = 471,\r
+    STR_AIMODES_WENXINYIYAN = 472,\r
+    STR_AIMODES_KIMI = 473,\r
+    STR_AIMODES_CHATGPT = 474,\r
+    STR_MAX_ID = 475,\r
 }; // UIResourceTextId\r
 
 enum FontLanguageId : uint8_t {
-    LANGUAGE_ID_ZH,\r
     LANGUAGE_ID_EN,\r
+    LANGUAGE_ID_ZH,\r
     LANGUAGE_ID_MAX\r
 }; // UITextLanguageTextId\r
 }\r
index e2e29a9..053d7e3 100644 (file)
Binary files a/code/sdk/application/wearable/fd230app/nativeui/language/font/zh.lang and b/code/sdk/application/wearable/fd230app/nativeui/language/font/zh.lang differ
index e733875..8cb7d95 100644 (file)
@@ -430,7 +430,8 @@ namespace OHOS
             free(timeStr);
             return;
         }
-        PullUpDownView::GetInstance()->GetTimeLabel()->SetText(timeStr);
+        if (PullUpDownView::GetInstance() != nullptr)
+            PullUpDownView::GetInstance()->GetTimeLabel()->SetText(timeStr);
         free(timeStr);
     }
 
@@ -486,11 +487,14 @@ namespace OHOS
             }
         }
 
-        PullUpDownView::GetInstance()->GetProgress()->SetImage(progressImageSrc, nullptr);
-        PullUpDownView::GetInstance()->GetProgress()->SetValue(value);
-        PullUpDownView::GetInstance()->GetDateLabel()->SetText(dateStr);
-        PullUpDownView::GetInstance()->GetTimeLabel()->SetText(timeStr);
-        PullUpDownView::GetInstance()->GetWeekLabel()->SetText(weekStr);
+        if (PullUpDownView::GetInstance() != nullptr)
+        {
+            PullUpDownView::GetInstance()->GetProgress()->SetImage(progressImageSrc, progressImageSrc);
+            PullUpDownView::GetInstance()->GetProgress()->SetValue(value);
+            PullUpDownView::GetInstance()->GetDateLabel()->SetText(dateStr);
+            PullUpDownView::GetInstance()->GetTimeLabel()->SetText(timeStr);
+            PullUpDownView::GetInstance()->GetWeekLabel()->SetText(weekStr);
+        }
 
         // 释放动态分配的内存
         free(dateStr);
@@ -506,8 +510,8 @@ namespace OHOS
     /* -------------------------------------------------------------------------- */
     // 声明定时器变量
     static osTimerId_t g_timer = NULL;
-    static uint8_t UPDATETIME = 2;
-    uint8_t MainPresenterSample::g_PullUpDownTimes = UPDATETIME; // 2秒
+    static uint8_t UPDATETIME = 2; // 2秒
+    uint8_t MainPresenterSample::g_PullUpDownTimes = UPDATETIME;
 
     /*定时器到期时的处理*/
     static void PullUpDown_TimerCallbackProc(int data)
@@ -518,8 +522,23 @@ namespace OHOS
         if (MainPresenterSample::g_PullUpDownTimes <= 0)
         {
             MainPresenterSample::g_PullUpDownTimes = UPDATETIME; //
-            MainPresenterSample::GetInstance()->UpdataTime();
-            PullUpDownView::GetInstance()->UpdateSignalStrengthStatusAndBatteryPosition();
+            if (MainPresenterSample::GetInstance() != nullptr)
+            {
+                MainPresenterSample::GetInstance()->UpdataTime();
+            }
+            else
+            {
+                WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "MainPresenterSample::GetInstance fail!!");
+            }
+
+            if (PullUpDownView::GetInstance() != nullptr)
+            {
+                PullUpDownView::GetInstance()->UpdateSignalStrengthStatusAndBatteryPosition();
+            }
+            else
+            {
+                WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "PullUpDownView::GetInstance fail!!");
+            }
         }
 
         if (uapi_get_screen_state() == 1) // 息屏停止更新数据
index efe0ab7..fad5688 100644 (file)
@@ -594,7 +594,7 @@ namespace OHOS
 
         // progress->SetValue(value);
         const char *progressImageSrc = "/user/res/Battery/Battery_Normal.bin";
-        progress->SetImage(progressImageSrc, nullptr);
+        progress->SetImage(progressImageSrc, progressImageSrc);
         progress->SetBackgroundStyle(STYLE_BACKGROUND_OPA, 0x00);
         progress->SetBackgroundStyle(STYLE_TEXT_COLOR, 0xff000000);
         progress->SetForegroundStyle(STYLE_BACKGROUND_COLOR, 0xffffffff);
index 90c7ecd..4606d9f 100644 (file)
@@ -2,7 +2,7 @@
  * @Author: luozheng 1732036298@qq.com
  * @Date: 2024-06-12 11:44:04
  * @LastEditors: luozheng 1732036298@qq.com
- * @LastEditTime: 2024-06-13 19:09:49
+ * @LastEditTime: 2024-07-10 21:13:23
  * @FilePath: /FD230/code/sdk/application/wearable/fd230app/nativeui/rebootdevice/include/RebootModel.h
  * @Description: 这是默认设置,请设置`customMade`, 打开koroFileHeader查看配置 进行设置: https://github.com/OBKoro1/koro1FileHeader/wiki/%E9%85%8D%E7%BD%A
  */
@@ -28,9 +28,11 @@ public:
     void SetSelectViewId(int16_t value);
     bool GetExitsView(void);
     void SetExitsView(bool value);
-    bool RegisterLongPressEvents(void);
-    bool RegisterDoubleClickEvents(void);
-    void RegisterKeyEvents(void);
+    bool RegisterPowerKeyLongPressEvent(void);
+    bool RegisterPowerKeyDoubleClickEvent(void);
+    bool RegisterFuncKeyClickEvent(void);
+    bool RegisterFuncKeyDoubleClickEvent(void);
+    void RegisterAllKeyEvents(void);
 private:
     RebootModel();
     int16_t selectView{0};
index b083cd0..bc113aa 100644 (file)
@@ -2,7 +2,7 @@
  * @Author: luozheng 1732036298@qq.com
  * @Date: 2024-03-28 11:50:42
  * @LastEditors: luozheng 1732036298@qq.com
- * @LastEditTime: 2024-06-14 18:42:57
+ * @LastEditTime: 2024-07-11 14:41:49
  * @FilePath: /FD230/code/sdk/application/wearable/fd230app/nativeui/rebootdevice/src/RebootModel.cpp
  */
 
@@ -13,6 +13,7 @@
 #include <NativeAbility.h>
 #include <AppViewIDs.h>
 #include "power_display_service.h"
+#include "aimodels/include/AiModelsModel.h"
 namespace OHOS
 {
     RebootModel::RebootModel() {}
@@ -55,76 +56,128 @@ namespace OHOS
     }
 #endif
 
-    /*
-     * @brief 长按四秒关机回调函数
-     */
-    static void OnKeyLongPress4s_Callback(void)
+    static void HandlePowerKeyLongPress(void)
     {
-        WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "OnKeyLongPress4s_Callback");
+        WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "HandlePowerKeyLongPress");
         const power_display_svr_api_t *display_api = power_display_svr_get_api();
+        if (!display_api)
+        {
+            WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "power_display_svr_get_api returned nullptr");
+            return;
+        }
+
         if (display_api->get_screen_state() != SCREEN_ON)
         {
             display_api->turn_on_screen();
         }
+
         // 切换到关机/重启卡片
         NativeAbility::GetInstance().ChangeSlice(VIEW_SHUTDOWN_OR_REBOOT);
-
-        return;
     }
 
-    /*
-     * @brief 注册长按监听事件
-     * @return 注册成功返回true,反之返回false
-     */
-    bool RebootModel::RegisterLongPressEvents(void)
+    /*注册电源键的长按事件*/
+    bool RebootModel::RegisterPowerKeyLongPressEvent(void)
     {
-        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "RebootModel::RegisterLongPressEvents");
-        int32_t ret = uapi_button_register_event_cb(OnKeyLongPress4s_Callback, BUTTON_PWR_LONGPRESS_3S);
+        WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "RebootModel::RegisterPowerKeyLongPressEvent");
+        int32_t ret = uapi_button_register_event_cb(HandlePowerKeyLongPress, BUTTON_PWR_LONGPRESS_3S);
         if (ret != ERRCODE_SUCC)
         {
-            WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "Register LongPress Events err,ret = %d", ret);
+            WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "Register PowerKey LongPress Event error, ret = %d", ret);
             return false;
         }
         return true;
     }
 
-    /*
-     * @brief 双击事件回调函数
-     */
-    static void OnKeyDoubleClick_Callback(void)
+    static void HandlePowerKeyDoubleClick(void)
+    {
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "HandlePowerKeyDoubleClick");
+        // Handle PowerKey DoubleClick logic here
+    }
+
+    /*注册电源键的双击事件*/
+    bool RebootModel::RegisterPowerKeyDoubleClickEvent(void)
+    {
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "RebootModel::RegisterPowerKeyDoubleClickEvent");
+        // Register PowerKey DoubleClick event here
+        return true;
+    }
+
+    static void HandleFuncKeyOnClick(void)
     {
-        WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "OnKeyDoubleClick_Callback");
+        WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "HandleFuncKeyOnClick");
+
         const power_display_svr_api_t *display_api = power_display_svr_get_api();
+        if (!display_api)
+        {
+            WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "power_display_svr_get_api returned nullptr");
+            return;
+        }
+
         if (display_api->get_screen_state() == SCREEN_ON)
         {
-            // 切换到主题样式界面
-            NativeAbility::GetInstance().EnterSlice(VIEW_THEME_STYLE);
-            //NativeAbility::GetInstance().ChangeSlice(VIEW_SET_DESKTOP);
+            AiModelsModel &aiModelsModel = AiModelsModel::GetInstance();
+            if (!aiModelsModel.ChangeAiModel())
+            {
+                WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "Failed to change AI model");
+            }
+        }
+        else
+        {
+            WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "Screen is not on, skipping AI model change");
         }
+    }
+
+    /*注册功能键的单击事件*/
+    bool RebootModel::RegisterFuncKeyClickEvent(void)
+    {
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "RebootModel::RegisterFuncKeyClickEvent");
+        int32_t ret = uapi_button_register_event_cb(HandleFuncKeyOnClick, BUTTON1_CLICKUP);
+        if (ret != ERRCODE_SUCC)
+        {
+            WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "Register FuncKey Click Event error, ret = %d", ret);
+            return false;
+        }
+        return true;
+    }
 
-        return;
+    static void HandleFuncKeyDoubleClick(void)
+    {
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "HandleFuncKeyDoubleClick");
+        const power_display_svr_api_t *display_api = power_display_svr_get_api();
+        if (!display_api)
+        {
+            WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "power_display_svr_get_api returned nullptr");
+            return;
+        }
+        if (display_api->get_screen_state() == SCREEN_ON)
+        {
+            // 切换到显示方式界面
+            NativeAbility::GetInstance().EnterSlice(VIEW_AI_MODELS);
+        }
+        else
+        {
+            WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "Screen is not on, skipping Slice change");
+        }
     }
 
-    /*
-     * @brief 注册双击事件
-     * @return 注册成功返回true,反之返回false
-     */
-    bool RebootModel::RegisterDoubleClickEvents(void)
+    /*注册功能键双击事件*/
+    bool RebootModel::RegisterFuncKeyDoubleClickEvent(void)
     {
-        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "RebootModel::RegisterDoubleClickEvents");
-        int32_t ret = uapi_button_register_event_cb(OnKeyDoubleClick_Callback, BUTTON1_CLICKUP_2);
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "RebootModel::RegisterFuncKeyDoubleClickEvent");
+        int32_t ret = uapi_button_register_event_cb(HandleFuncKeyDoubleClick, BUTTON1_CLICKUP_2);
         if (ret != ERRCODE_SUCC)
         {
-            WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "Register DoubleClick Events err,ret = %d", ret);
+            WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "Register FuncKey DoubleClick Event error, ret = %d", ret);
             return false;
         }
         return true;
     }
 
-    // 注册按键事件
-    void RebootModel::RegisterKeyEvents(void)
+    void RebootModel::RegisterAllKeyEvents(void)
     {
-        RegisterLongPressEvents();
-        RegisterDoubleClickEvents();
+        RegisterPowerKeyDoubleClickEvent();
+        RegisterPowerKeyLongPressEvent();
+        RegisterFuncKeyClickEvent();
+        RegisterFuncKeyDoubleClickEvent();
     }
 }
\ No newline at end of file
index e482a50..4034edb 100644 (file)
@@ -81,7 +81,8 @@ namespace OHOS
         void Recording_StartTimer(uint32_t interval);
         void Recording_StopTimer(void);
         char *DisplayRecordDuration(void);
-        const char * GetRecordDirectory() const;
+        const char *GetRecordDirectory() const;
+
     private:
         RecordingModel();
         RecordingModel(const RecordingModel &) = delete;
@@ -110,7 +111,7 @@ namespace OHOS
         std::vector<RecordingListItem> Recordings;                 // 存放录音信息的动态数组
         std::string recordDuration;                                // 录音时长
         int index;                                                 // 保存被点击录音的下标
-        std::string yyyymmhhh_date;                                // 保存年月日时间
+        char *yyyymmhhh_date;                                      // 保存年月日时间
         std::string TotalRecordDuration;                           // 保存录音的总时长
         std::string RecordingTimeAndDuration;                      // 录音日期和录音时长
     };
index b96dfa1..f726b4e 100644 (file)
@@ -501,7 +501,20 @@ namespace OHOS
     void RecordingModel::InitRecordingListItem(void)
     {
         WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "RecordingModel::InitRecordingListItem");
-        yyyymmhhh_date = uapi_get_local_yyyymmdd_date(); // 获取日期
+        // 获取日期
+        char *yyyymmhhh_date_new = uapi_get_local_yyyymmdd_date();
+        if (yyyymmhhh_date_new == nullptr)
+        {
+            WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "Failed to get local date");
+            return; // 或者进行适当的错误处理
+        }
+        // 释放之前分配的日期字符串内存(如果之前有)
+        if (yyyymmhhh_date != nullptr)
+        {
+            free(yyyymmhhh_date);
+        }
+        // 更新日期字符串成员
+        yyyymmhhh_date = yyyymmhhh_date_new;
         RecordingMp3FileCount = 0;
         if (!fileNames.empty())
         {
@@ -522,7 +535,7 @@ namespace OHOS
             // 对 Recordings 数组进行操作
             for (int i = 0; i < RecordingMp3FileCount; i++)
             {
-                Recordings.push_back({i, fileNames[i].c_str(), "09:51", yyyymmhhh_date.c_str()});
+                Recordings.push_back({i, fileNames[i].c_str(), "09:51", yyyymmhhh_date});
             }
         }
     }
diff --git a/code/sdk/build/config/target_config/brandy/mk_fs_image/fd230/fs/user/res/AIVoice/aimodels/aimode_lschatgpt_on.bin b/code/sdk/build/config/target_config/brandy/mk_fs_image/fd230/fs/user/res/AIVoice/aimodels/aimode_lschatgpt_on.bin
new file mode 100644 (file)
index 0000000..95c04b9
--- /dev/null
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:fa5149094c14526b56913b4267664319b80efaaa2c25b502efbc040bfcfe823e
+size 9624
diff --git a/code/sdk/build/config/target_config/brandy/mk_fs_image/fd230/fs/user/res/AIVoice/aimodels/aimodels_bg.bin b/code/sdk/build/config/target_config/brandy/mk_fs_image/fd230/fs/user/res/AIVoice/aimodels/aimodels_bg.bin
new file mode 100644 (file)
index 0000000..1275fbc
--- /dev/null
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:88c0f9a3719468cfab7a7396d43edaba4a1ce2b313e0e1f95833f0ef0032f52b
+size 77544
diff --git a/code/sdk/build/config/target_config/brandy/mk_fs_image/fd230/fs/user/res/AIVoice/aimodels/aimodels_chatgpt_off.bin b/code/sdk/build/config/target_config/brandy/mk_fs_image/fd230/fs/user/res/AIVoice/aimodels/aimodels_chatgpt_off.bin
new file mode 100644 (file)
index 0000000..9f76ce3
--- /dev/null
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:1b091fbb1ad5c7188b4a2e0348fedc8a97cc37b446068021db7ab5bc2144dad8
+size 9624
diff --git a/code/sdk/build/config/target_config/brandy/mk_fs_image/fd230/fs/user/res/AIVoice/aimodels/aimodels_doubao.bin b/code/sdk/build/config/target_config/brandy/mk_fs_image/fd230/fs/user/res/AIVoice/aimodels/aimodels_doubao.bin
new file mode 100644 (file)
index 0000000..92b54e0
--- /dev/null
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:a1b1d55d2cdecc4310e0c1ac70cd87d3fb72da284d54b61a82dc2c7abac22e2c
+size 9624
diff --git a/code/sdk/build/config/target_config/brandy/mk_fs_image/fd230/fs/user/res/AIVoice/aimodels/aimodels_kimi.bin b/code/sdk/build/config/target_config/brandy/mk_fs_image/fd230/fs/user/res/AIVoice/aimodels/aimodels_kimi.bin
new file mode 100644 (file)
index 0000000..f121c8f
--- /dev/null
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:2edeb79f68820099d597ccfbeabd81466a2e5dec856792fa6cdc5cc5e3130e41
+size 9624
diff --git a/code/sdk/build/config/target_config/brandy/mk_fs_image/fd230/fs/user/res/AIVoice/aimodels/aimodels_select.bin b/code/sdk/build/config/target_config/brandy/mk_fs_image/fd230/fs/user/res/AIVoice/aimodels/aimodels_select.bin
new file mode 100644 (file)
index 0000000..56851a5
--- /dev/null
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:f08808b0413214c93e9f596a4bbfd7103ec7b2f592c5aba308792951969ee07f
+size 888
diff --git a/code/sdk/build/config/target_config/brandy/mk_fs_image/fd230/fs/user/res/AIVoice/aimodels/aimodels_title_bg.bin b/code/sdk/build/config/target_config/brandy/mk_fs_image/fd230/fs/user/res/AIVoice/aimodels/aimodels_title_bg.bin
new file mode 100644 (file)
index 0000000..a68ef86
--- /dev/null
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:d2d49375658ab31058d0190983d0594d9b3492dcc4ceca3db889e6a17def56a7
+size 8984
diff --git a/code/sdk/build/config/target_config/brandy/mk_fs_image/fd230/fs/user/res/AIVoice/aimodels/aimodels_wenxinyiyan.bin b/code/sdk/build/config/target_config/brandy/mk_fs_image/fd230/fs/user/res/AIVoice/aimodels/aimodels_wenxinyiyan.bin
new file mode 100644 (file)
index 0000000..dc5b77e
--- /dev/null
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:2d3243a22c2a00ee51eecd8e04e2549a0b16d933026dd6fe1fa119d29fa03f4b
+size 9624
index 8551ced..a242fed 100644 (file)
Binary files a/code/sdk/build/config/target_config/brandy/mk_fs_image/fd230/fs/user/res/font/en.lang and b/code/sdk/build/config/target_config/brandy/mk_fs_image/fd230/fs/user/res/font/en.lang differ
index fe08bbc..3532e33 100644 (file)
Binary files a/code/sdk/build/config/target_config/brandy/mk_fs_image/fd230/fs/user/res/font/ja.lang and b/code/sdk/build/config/target_config/brandy/mk_fs_image/fd230/fs/user/res/font/ja.lang differ
index edf3e00..ede429d 100644 (file)
@@ -481,12 +481,16 @@ enum UIResourceTextId : uint16_t {
     STR_CONNECT_TIMEOUT = 468,\r
     STR_PLEASE_RESTART_CHAT = 469,\r
     STR_CONTINUE_CHAT = 470,\r
-    STR_MAX_ID = 471,\r
+    STR_AIMODELS_DOUBAO = 471,\r
+    STR_AIMODES_WENXINYIYAN = 472,\r
+    STR_AIMODES_KIMI = 473,\r
+    STR_AIMODES_CHATGPT = 474,\r
+    STR_MAX_ID = 475,\r
 }; // UIResourceTextId\r
 
 enum FontLanguageId : uint8_t {
-    LANGUAGE_ID_ZH,\r
     LANGUAGE_ID_EN,\r
+    LANGUAGE_ID_ZH,\r
     LANGUAGE_ID_MAX\r
 }; // UITextLanguageTextId\r
 }\r
index e2e29a9..053d7e3 100644 (file)
Binary files a/code/sdk/build/config/target_config/brandy/mk_fs_image/fd230/fs/user/res/font/zh.lang and b/code/sdk/build/config/target_config/brandy/mk_fs_image/fd230/fs/user/res/font/zh.lang differ