语音slice合并提交
authorluozheng <1732036298@qq.com>
Tue, 25 Mar 2025 07:05:39 +0000 (15:05 +0800)
committerluozheng <1732036298@qq.com>
Tue, 25 Mar 2025 07:05:39 +0000 (15:05 +0800)
12 files changed:
code/sdk/application/wearable/fd230/nativeapp/nativeui/languagecode/LanguageInit.cpp [new file with mode: 0644]
code/sdk/application/wearable/fd230/nativeapp/nativeui/languagecode/LanguageInit.h [new file with mode: 0644]
code/sdk/application/wearable/fd230/nativeapp/nativeui/languagecode/include/LanguageSwitchListAdapter.h [new file with mode: 0644]
code/sdk/application/wearable/fd230/nativeapp/nativeui/languagecode/include/LanguageSwitchListitemView.h [new file with mode: 0644]
code/sdk/application/wearable/fd230/nativeapp/nativeui/languagecode/include/LanguageSwitchModel.h [new file with mode: 0644]
code/sdk/application/wearable/fd230/nativeapp/nativeui/languagecode/include/LanguageSwitchPresenter.h [new file with mode: 0644]
code/sdk/application/wearable/fd230/nativeapp/nativeui/languagecode/include/LanguageSwitchView.h [new file with mode: 0644]
code/sdk/application/wearable/fd230/nativeapp/nativeui/languagecode/src/LanguageSwitchListAdapter.cpp [new file with mode: 0644]
code/sdk/application/wearable/fd230/nativeapp/nativeui/languagecode/src/LanguageSwitchListitemView.cpp [new file with mode: 0644]
code/sdk/application/wearable/fd230/nativeapp/nativeui/languagecode/src/LanguageSwitchModel.cpp [new file with mode: 0644]
code/sdk/application/wearable/fd230/nativeapp/nativeui/languagecode/src/LanguageSwitchPresenter.cpp [new file with mode: 0644]
code/sdk/application/wearable/fd230/nativeapp/nativeui/languagecode/src/LanguageSwitchView.cpp [new file with mode: 0644]

diff --git a/code/sdk/application/wearable/fd230/nativeapp/nativeui/languagecode/LanguageInit.cpp b/code/sdk/application/wearable/fd230/nativeapp/nativeui/languagecode/LanguageInit.cpp
new file mode 100644 (file)
index 0000000..b8aa1e6
--- /dev/null
@@ -0,0 +1,306 @@
+/*
+ * @Author: luozheng 1732036298@qq.com
+ * @Date: 2024-03-30 09:14:38
+ * @LastEditors: luozheng 1732036298@qq.com
+ * @LastEditTime: 2024-11-05 14:18:49
+ * @FilePath: /FD230/code/sdk/application/wearable/fd230app/nativeui/languagecode/LanguageInit.cpp
+ */
+#include <fstream>
+#include <string>
+#include <cstdio>
+#include "cJSON.h"
+#include "font/ui_font.h"
+#include "font/font_global_manager.h"
+#include "wearable_log.h"
+#include "languagecode/LanguageInit.h"
+#include "ConfigModel.h"
+#include <NativeAbility.h>
+#include "AppViewIDs.h"
+#include "common/graphic_startup.h"
+
+#include "languagecode/include/LanguageSwitchModel.h"
+
+namespace OHOS
+{
+    // 初始化 languages 数组
+    struct Language languages[] = {
+        {ZH_CN, "zh", "中文", "中文",HARMONYOS_VECTOR_FONT_FILENAME,"user/res/font_bin/zh.bin"},
+        {EN, "en", "English", "英语",HARMONYOS_VECTOR_FONT_FILENAME,"user/res/font_bin/en.bin"},
+        {JA, "ja", "日本語", "日语",HARMONYOS_VECTOR_FONT_FILENAME,"user/res/font_bin/ja.bin"},
+        {KO, "ko", "한국어", "韩语",KOREA_FONT,"user/res/font_bin/ko.bin"},
+        {ES, "es", "Español", "西班牙语",HARMONYOS_VECTOR_FONT_FILENAME,"user/res/font_bin/es.bin"},
+        {RU, "ru", "Русский", "俄语",HARMONYOS_VECTOR_FONT_FILENAME,"user/res/font_bin/ru.bin"},
+        {HR, "hr", "Hrvatski", "克罗地亚语",HARMONYOS_VECTOR_FONT_FILENAME,"user/res/font_bin/hr.bin"},
+        {DE, "de", "Deutsch", "德语",HARMONYOS_VECTOR_FONT_FILENAME,"user/res/font_bin/de.bin"},
+        {PT, "pt", "Português", "葡萄牙语",HARMONYOS_VECTOR_FONT_FILENAME,"user/res/font_bin/pt.bin"},
+        {FR, "fr", "Français", "法语",HARMONYOS_VECTOR_FONT_FILENAME,"user/res/font_bin/fr.bin"},
+        {NL, "nl", "Nederlands", "荷兰语",HARMONYOS_VECTOR_FONT_FILENAME,"user/res/font_bin/nl.bin"},
+        {IT, "it", "Italiano", "意大利语",HARMONYOS_VECTOR_FONT_FILENAME,"user/res/font_bin/it.bin"},
+        {CS, "cs", "Čeština", "捷克语",HARMONYOS_VECTOR_FONT_FILENAME,"user/res/font_bin/cs.bin"},
+        {EL, "el", "Ελληνικά", "希腊语",HARMONYOS_VECTOR_FONT_FILENAME,"user/res/font_bin/el.bin"},
+        {HI, "hi", "हिन्दी", "印地语",HINDI_FONT,"user/res/font_bin/hi.bin"},
+        {ID, "id", "Bahasa Indonesia", "印尼语",HARMONYOS_VECTOR_FONT_FILENAME,"user/res/font_bin/id.bin"},
+        {MS, "ms", "Bahasa Melayu", "马来语",HARMONYOS_VECTOR_FONT_FILENAME,"user/res/font_bin/ms.bin"},
+        {PL, "pl", "Polski", "波兰语",HARMONYOS_VECTOR_FONT_FILENAME,"user/res/font_bin/pl.bin"},
+        {TH, "th", "ไทย", "泰语",ANUPHAN_FONT,"user/res/font_bin/th.bin"},
+        {VI, "vi", "Tiếng Việt", "越南语",HARMONYOS_VECTOR_FONT_FILENAME,"user/res/font_bin/vi.bin"},
+        {FI, "fi", "Suomi", "芬兰语",HARMONYOS_VECTOR_FONT_FILENAME,"user/res/font_bin/fi.bin"},
+        {RO, "ro", "Română", "罗马尼亚语",HARMONYOS_VECTOR_FONT_FILENAME,"user/res/font_bin/ro.bin"},
+        {TR, "tr", "Türkçe", "土耳其语",HARMONYOS_VECTOR_FONT_FILENAME,"user/res/font_bin/tr.bin"},
+        {FA, "fa", "فارسی", "波斯语",HARMONYOS_VECTOR_ARABIC_FILENAME,"user/res/font_bin/fa.bin"},
+        {AR, "ar", "العربية", "阿拉伯语",HARMONYOS_VECTOR_ARABIC_FILENAME,"user/res/font_bin/ar.bin"},
+        {HE, "he", "עברית", "希伯来语",HEBREW_FONT,"user/res/font_bin/he.bin"},
+        {UK, "uk", "Українська", "乌克兰语",HARMONYOS_VECTOR_FONT_FILENAME,"user/res/font_bin/uk.bin"},
+        {SV, "sv", "Svenska", "瑞典语",HARMONYOS_VECTOR_FONT_FILENAME,"user/res/font_bin/sv.bin"},
+        {UZ, "uz", "O‘zbek", "乌兹别克语",HARMONYOS_VECTOR_FONT_FILENAME,"user/res/font_bin/uz.bin"},
+        {AZ, "az", "Azərbaycan dili", "阿塞拜疆语",HARMONYOS_VECTOR_FONT_FILENAME,"user/res/font_bin/az.bin"},
+    };
+    
+    //稀有语言单独字库,此列需要重新加载字体
+    // struct Language uncommon_languages[] = 
+    // {
+    //     {KO, "ko", "한국어", "韩语",KOREA_FONT},
+    //     {HI, "hi", "हिन्दी", "印地语",HINDI_FONT_TTF},
+    //     {TH, "th", "ไทย", "泰语",ANUPHAN_FONT},//THAI_FONT
+    //     {HE, "he", "עברית", "希伯来语",HEBREW_FONT},
+    // };
+
+
+  
+    // static const uint8_t langcount = 2;
+
+    const char *resFiles[MAX_LANGUAGE]= {
+        "user/res/font/zh.lang",// ZH_CN = 0,
+        "user/res/font/en.lang",// EN,
+        "user/res/font/ja.lang",// JA,
+        "user/res/font/ko.lang",// KO,韩语
+        "user/res/font/es.lang",// ES,
+        "user/res/font/ru.lang",// RU,
+        "user/res/font/hr.lang",// HR,
+        "user/res/font/de.lang",// DE,
+        "user/res/font/pt.lang",// PT,
+        "user/res/font/fr.lang",// FR,
+        "user/res/font/nl.lang",// NL,
+        "user/res/font/it.lang",// IT,
+        "user/res/font/cs.lang",// CS,
+        "user/res/font/el.lang",// EL,
+        "user/res/font/hi.lang",// HI,印地语
+        "user/res/font/id.lang",// ID,
+        "user/res/font/ms.lang",// MS,
+        "user/res/font/pl.lang",// PL,
+        "user/res/font/th.lang",// TH, 泰语
+        "user/res/font/vi.lang",// VI,
+        "user/res/font/fi.lang",// FI,
+        "user/res/font/ro.lang",// RO,
+        "user/res/font/tr.lang",// TR,
+        "user/res/font/fa.lang",// FA,波斯语
+        "user/res/font/ar.lang",// AR,阿拉伯语
+        "user/res/font/he.lang",// HE,希伯来语
+        "user/res/font/uk.lang",// UK,
+        "user/res/font/sv.lang",// SV,
+        "user/res/font/uz.lang",// UZ,
+        "user/res/font/az.lang"// AZ,
+    };
+    
+    //static language *g_planguage{nullptr};
+    char current_global_font_name[256]={0};
+    char* get_current_global_font_name(void)
+    {
+        return &current_global_font_name[0];
+    }
+    
+    int set_current_global_font_name(const char* fontname)
+    {
+        memset(current_global_font_name,0,sizeof(current_global_font_name));
+        return strcat_s(current_global_font_name,sizeof(current_global_font_name),fontname);
+    }
+
+    /**
+     * return 1 从右到左
+     * return 0 从左到右
+    */
+    int get_current_font_direction(void)
+    {
+        // 从右到左排版的语言
+        // 阿拉伯语(Arabic)
+        // 希伯来语(Hebrew)
+        // 波斯语(Persian,也称为法尔斯语)
+        // 乌尔都语(Urdu)
+        // 阿拉米语(Aramaic)
+        // char* fontname=get_current_global_font_name();
+        // if (memcpy_s(fontname,strlen(fontname),PERSIAN_FONT,strlen(PERSIAN_FONT)) == 0)
+        //     return 1;
+        // else if (memcpy_s(fontname,strlen(fontname),ARABIC_FONT,strlen(ARABIC_FONT)) == 0)
+        //     return 1;
+        // else if (memcpy_s(fontname,strlen(fontname),HEBREW_FONT,strlen(HEBREW_FONT)) == 0)
+        //     return 1;
+        // else  
+        return 0;        
+    }
+
+    const char* get_language_font(uint8_t id)
+    {
+        for(int i=0;i<(sizeof( languages)/sizeof(languages[0]));i++)
+        {
+            if(languages[i].languageid==id)
+            {
+                return languages[i].fontname;
+            }
+        }
+        return NULL;
+    }
+
+    bool is_load_languages(uint8_t id)
+    {
+        for(int i=0;i<(sizeof( languages)/sizeof(languages[0]));i++)
+        {
+            if(languages[i].languageid==id)
+            {
+                WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "%s",languages[i].fontname);
+                if(strcmp(languages[i].fontname,get_current_global_font_name())!=0 && (strcmp(languages[i].fontname,HARMONYOS_VECTOR_FONT_FILENAME)!=0))
+                return true;
+                else
+                return false;
+            }
+        }
+        return false;
+    }
+
+    language::language()
+    {
+        WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "language::language");
+        ///g_planguage = this;
+    }
+
+    language::~language()
+    {
+        WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "language::~language");
+        //g_planguage = nullptr;
+    }
+
+    language *language::GetInstance()
+    {
+        static language instance;
+        return &instance;
+    }
+
+    bool language::InitLangues()
+    {
+        WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "InitLangues");
+        // 获取json里面的语言
+        #ifdef A5133_DEMO_CLIENT
+            NativeAbility::GetInstance().SetDefaultSliceId(VIEW_MAIN);
+            FontGlobalManager::GetInstance()->RegisterLanguageInfo(resFiles, MAX_LANGUAGE, 0);
+        #else
+        int thelanguage = ConfigModel::GetInstance()->GetLanguage();
+        if(is_load_languages(thelanguage))
+        {
+            GraphicStartUp::InitFontEngine(MEM_POOL_UI_FONT, MEM_POOL_UI_FONT_SIZE, OHOS::NEW_FONT_DIR,  get_language_font(thelanguage)); // 注册字体 
+            set_current_global_font_name(get_language_font(thelanguage));
+        }
+      
+
+        if(ConfigModel::GetInstance()->GetisFirstTimeStart() == true)
+        {
+            /**
+             * TODO:
+             * 如果 GetisFirstTimeStart()证明第一次启动,需要实现弹窗切换语言的功能。
+             * 在此之前,先设置成默认0
+            */
+            //thelanguage = 0;
+            NativeAbility::GetInstance().SetDefaultSliceId(VIEW_LANGUAGE_SWITCH);
+        }
+        else
+        {
+            NativeAbility::GetInstance().SetDefaultSliceId(VIEW_MAIN);
+        }
+        FontGlobalManager::GetInstance()->RegisterLanguageInfo(resFiles, MAX_LANGUAGE, thelanguage);
+        #endif
+        return true;
+    }
+
+    bool language::fileExists(const char *fileName)
+    {
+        std::ifstream file(fileName);
+        return file.is_open();
+    }
+
+    // 切换语言功能
+    bool language::ChangeLanguage(int32_t currentLanguageId)
+    {
+
+        if (!FontGlobalManager::GetInstance() || !UIFont::GetInstance())
+        {
+            WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "Error getting FontGlobalManager or UIFont");
+            return false;
+        }
+
+        if (currentLanguageId >= MAX_LANGUAGE || currentLanguageId < 0)
+            return false;
+
+        FontGlobalManager::GetInstance()->RegisterLanguageInfo(resFiles, MAX_LANGUAGE, currentLanguageId);
+        UIFont::GetInstance()->SetCurrentLangId(currentLanguageId);
+
+        ConfigModel::GetInstance()->SetLanguageCode(languages[currentLanguageId].code);
+        ConfigModel::GetInstance()->SetLanguage(currentLanguageId);
+        int ret = set_current_global_font_name(languages[currentLanguageId].fontname);
+        WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "resFiles [%d]:%s  fontname:%s , ret = %d", currentLanguageId,resFiles[currentLanguageId],languages[currentLanguageId].fontname,ret);
+        return true;
+    }
+    
+    bool language::ChangeLanguage(std::string language_code)
+    {
+        if (!FontGlobalManager::GetInstance() || !UIFont::GetInstance())
+        {
+            WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "Error getting FontGlobalManager or UIFont");
+            return false;
+        }
+
+        // 获取语言Code对应的语言Id
+        LanguageId currentLanguageId = LanguageManager::GetInstance().GetLanguageIdByCode(language_code);
+        WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "%d %s", currentLanguageId, language_code.c_str());
+        FontGlobalManager::GetInstance()->RegisterLanguageInfo(resFiles, MAX_LANGUAGE, currentLanguageId);
+        UIFont::GetInstance()->SetCurrentLangId(currentLanguageId);
+
+        ConfigModel::GetInstance()->SetLanguageCode(language_code.c_str());
+        ConfigModel::GetInstance()->SetLanguage(currentLanguageId);
+        int ret = set_current_global_font_name(languages[currentLanguageId].fontname);
+        WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "resFiles[%d]:%s fontname %s , ret = %d", currentLanguageId, resFiles[currentLanguageId], languages[currentLanguageId].fontname, ret );
+        return true;
+    }
+
+    /* ----------------------------- LanguageManager ---------------------------- */
+
+    LanguageManager::LanguageManager()
+    {
+        WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "LanguageManager::LanguageManager");
+        // 初始化语言代码到语言ID的映射关系
+        for (int i = 0; i < MAX_LANGUAGE; i++)
+        {
+            codeToIdMap[languages[i].code] = languages[i].languageid;
+            WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "%s %d", languages[i].code, languages[i].languageid);
+        }
+    }
+
+    LanguageManager::~LanguageManager()
+    {
+        WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "LanguageManager::~LanguageManager");
+    }
+
+    LanguageManager &LanguageManager::GetInstance()
+    {
+        static LanguageManager instance;
+        return instance;
+    }
+
+    LanguageId LanguageManager::GetLanguageIdByCode(const std::string &code) const
+    {
+        auto it = codeToIdMap.find(code);
+        if (it != codeToIdMap.end())
+        {
+            return it->second;
+        }
+        // 如果找不到对应的语言ID,返回一个默认值
+        return LanguageId::ZH_CN; // 默认返回中文
+    }
+}
diff --git a/code/sdk/application/wearable/fd230/nativeapp/nativeui/languagecode/LanguageInit.h b/code/sdk/application/wearable/fd230/nativeapp/nativeui/languagecode/LanguageInit.h
new file mode 100644 (file)
index 0000000..c64d9e6
--- /dev/null
@@ -0,0 +1,91 @@
+/*
+ * @Author: luozheng 1732036298@qq.com
+ * @Date: 2024-03-30 09:30:03
+ * @LastEditors: SnickerSun snickersun@163.com
+ * @LastEditTime: 2024-08-30 20:37:49
+ * @FilePath: /FD230/code/sdk/application/wearable/fd230app/nativeui/languagecode/LanguageInit.h
+ */
+#ifndef LANGUAGE_INIT_H
+#define LANGUAGE_INIT_H
+
+#include <string>
+#include <map>
+namespace OHOS
+{
+    // 定义语言ID的枚举类
+    enum LanguageId
+    {
+        ZH_CN = 0,
+        EN,
+        JA,
+        KO,
+        ES,
+        RU,
+        HR,
+        DE,
+        PT,
+        FR,
+        NL,
+        IT,
+        CS,
+        EL,
+        HI,
+        ID,
+        MS,
+        PL,
+        TH,
+        VI,
+        FI,
+        RO,
+        TR,
+        FA,
+        AR,
+        HE,
+        UK,
+        SV,
+        UZ,
+        AZ,
+        MAX_LANGUAGE,
+    };
+    // 定义语言结构体
+    struct Language
+    {
+        LanguageId languageid;
+        const char *code;
+        const char *name;
+        const char *description;
+        const char *fontname;
+        const char *path;
+    };
+
+    // 声明 languages 数组为外部变量
+    extern Language languages[];
+    class language
+    {
+    public:
+        language();
+        ~language();
+        static language *GetInstance();
+        bool InitLangues();
+        bool ChangeLanguage(int32_t);
+        bool ChangeLanguage(std::string language_code);
+        bool fileExists(const char *fileName);
+    };
+
+    class LanguageManager
+    {
+    public:
+        static LanguageManager &GetInstance();
+        //根据语言代码查找对应的语言ID
+        LanguageId GetLanguageIdByCode(const std::string &code) const;
+
+    private:
+        LanguageManager(); // 私有构造函数,确保无法在外部实例化
+        ~LanguageManager();
+        LanguageManager(const LanguageManager &) = delete;            // 禁止拷贝构造
+        LanguageManager &operator=(const LanguageManager &) = delete; // 禁止赋值运算符
+        std::map<std::string, LanguageId> codeToIdMap;
+    };
+}
+
+#endif
diff --git a/code/sdk/application/wearable/fd230/nativeapp/nativeui/languagecode/include/LanguageSwitchListAdapter.h b/code/sdk/application/wearable/fd230/nativeapp/nativeui/languagecode/include/LanguageSwitchListAdapter.h
new file mode 100644 (file)
index 0000000..15f9a0b
--- /dev/null
@@ -0,0 +1,61 @@
+/*
+ * @Author: luozheng 1732036298@qq.com
+ * @Date: 2024-03-28 14:26:55
+ * @LastEditors: luozheng 1732036298@qq.com
+ * @LastEditTime: 2024-06-28 09:34:15
+ * @FilePath: /FD230/code/sdk/application/wearable/fd230app/nativeui/languagecode/include/LanguageSwitchListAdapter.h
+ */
+#ifndef LANGUAGE_SWITCH_LIST_ADAPTER_H
+#define LANGUAGE_SWITCH_LIST_ADAPTER_H
+
+#include "components/abstract_adapter.h"
+#include "components/ui_label_button_ext.h"
+#include "components/ui_list.h"
+#include "languagecode/LanguageInit.h"
+#include "UiConfig.h"
+#include <list>
+#include "languagecode/LanguageInit.h"
+namespace OHOS
+{
+    class LanguageSwitchListAdapter : public AbstractAdapter
+    {
+    public:
+        explicit LanguageSwitchListAdapter();
+        virtual ~LanguageSwitchListAdapter();
+
+        /* *
+         * @brief Sets the UIView adapter data, which is a Language linked list.
+         *
+         * @param data Indicates the Language linked list data.
+         * @since 1.0
+         * @version 1.0
+         */
+        void SetData(std::list<Language> &data);
+
+        void ClearData(void);
+        /* *
+         * @brief Obtains the <b>data</b> size of the UILabel adapter.
+         *
+         * @return Returns the <b>data</b> size of the UILabel adapter.
+         * @since 1.0
+         * @version 1.0
+         */
+        virtual uint16_t GetCount(void) override;
+
+        virtual UIView *GetView(UIView *inView, int16_t index) override;
+
+        virtual void AddListItem(const Language &item);
+
+        void SetItemClickListener(UIView::OnClickListener *itemclicklistener)
+        {
+            itemClickListener = itemclicklistener;
+        }
+
+    private:
+        std::list<Language> listData;
+        UIView::OnClickListener *itemClickListener{nullptr};
+    };
+
+}
+
+#endif
diff --git a/code/sdk/application/wearable/fd230/nativeapp/nativeui/languagecode/include/LanguageSwitchListitemView.h b/code/sdk/application/wearable/fd230/nativeapp/nativeui/languagecode/include/LanguageSwitchListitemView.h
new file mode 100644 (file)
index 0000000..00175c5
--- /dev/null
@@ -0,0 +1,35 @@
+/*
+ * @Author: luozheng 1732036298@qq.com
+ * @Date: 2024-03-28 14:28:25
+ * @LastEditors: luozheng 1732036298@qq.com
+ * @LastEditTime: 2024-06-13 15:52:44
+ * @FilePath: /FD230/code/sdk/application/wearable/fd230app/nativeui/languagecode/include/LanguageSwitchListitemView.h
+ */
+#ifndef LANGUAGE_SWITCH_LIST_ITEM_VIEW
+#define LANGUAGE_SWITCH_LIST_ITEM_VIEW
+
+#include "components/ui_view_group.h"
+#include "components/ui_label_button_ext.h"
+#include "languagecode/include/LanguageSwitchListAdapter.h"
+#include "components/ui_image_view.h"
+
+namespace OHOS
+{
+    class LanguageSwitchListitemView : public UIViewGroup
+    {
+    public:
+        LanguageSwitchListitemView();
+        virtual ~LanguageSwitchListitemView();
+        virtual void SetItemInfo(const Language itemInfo);
+        virtual void SetUpChild();
+        UILabelButtonExt *GetUILabelButtonExt(void);
+
+    private:
+        LanguageSwitchListitemView(const LanguageSwitchListitemView &);
+        UILabelButtonExt m_LabelButtonExt;
+        UIImageView languae_Image;
+    };
+
+}
+
+#endif
diff --git a/code/sdk/application/wearable/fd230/nativeapp/nativeui/languagecode/include/LanguageSwitchModel.h b/code/sdk/application/wearable/fd230/nativeapp/nativeui/languagecode/include/LanguageSwitchModel.h
new file mode 100644 (file)
index 0000000..7421211
--- /dev/null
@@ -0,0 +1,63 @@
+/*
+ * @Author: luozheng 1732036298@qq.com
+ * @Date: 2024-03-28 16:36:58
+ * @LastEditors: luozheng 1732036298@qq.com
+ * @LastEditTime: 2024-07-20 17:59:33
+ * @FilePath: /FD230/code/sdk/application/wearable/fd230app/nativeui/languagecode/include/LanguageSwitchModel.h
+ */
+
+#ifndef LANGUAGE_SWITCH_MODEL_H
+#define LANGUAGE_SWITCH_MODEL_H
+
+#include <iostream>
+#include "string"
+#include "languagecode/include/LanguageSwitchListAdapter.h"
+namespace OHOS
+{
+
+    class LanguageSwitchModel
+    {
+    public:
+        static LanguageSwitchModel &GetInstance();
+        void SetCurLanguageCode(char *curlanguageid);
+        const char *GetCurLanguageCode(void);
+        void SetLastLanguageCode(std::string prelanguageid);
+        const char *GetLastLanguageCode(void);
+        
+        void SetisFirstTimeStart(bool value);
+        bool GetisFirstTimeStart(void);
+        void LanguageSwitchViewupdata(uint32_t);
+
+        void set_hint_flag(bool data)
+        {
+            hint_flag=data;
+        }
+
+        bool get_hint_flag()
+        {
+            return hint_flag;
+        }
+
+        int32_t get_hint_code()
+        {
+            return hint_code;
+        }
+
+         void set_hint_code(int32_t data)
+        {
+            hint_code=data;
+        }
+
+    private:
+        LanguageSwitchModel();
+        ~LanguageSwitchModel();
+        LanguageSwitchModel(const LanguageSwitchModel &) = delete;
+        const LanguageSwitchModel &operator=(const LanguageSwitchModel &) = delete;
+        static const uint16_t LANGUAGE_ITEM_MAX = MAX_LANGUAGE; // 语言总数
+        std::string PreLanguageCode;                            // 上一次切换的语言
+        bool hint_flag{false};
+        int32_t hint_code{-1};
+    };
+
+}
+#endif
diff --git a/code/sdk/application/wearable/fd230/nativeapp/nativeui/languagecode/include/LanguageSwitchPresenter.h b/code/sdk/application/wearable/fd230/nativeapp/nativeui/languagecode/include/LanguageSwitchPresenter.h
new file mode 100644 (file)
index 0000000..3be924b
--- /dev/null
@@ -0,0 +1,50 @@
+/*
+ * @Author: luozheng 1732036298@qq.com
+ * @Date: 2024-03-28 14:16:52
+ * @LastEditors: luozheng 1732036298@qq.com
+ * @LastEditTime: 2024-09-28 19:03:36
+ * @FilePath: /FD230/code/sdk/application/wearable/fd230app/nativeui/languagecode/include/LanguageSwitchPresenter.h
+ */
+#ifndef LANGUAGE_SWITCH_PRESENTER_H
+#define LANGUAGE_SWITCH_PRESENTER_H
+
+#include "Presenter.h"
+#include "View.h"
+#include "languagecode/include/LanguageSwitchModel.h"
+#include "LanguageSwitchView.h"
+#include "languagecode/include/LanguageSwitchListitemView.h"
+#include "ui_resource_string.h"
+namespace OHOS
+{
+
+    class LanguageSwitchView;
+    class LanguageSwitchPresenter : public Presenter<LanguageSwitchView>,
+                                    public UIView::OnClickListener,
+                                    public RootView::OnKeyActListener,
+                                    public UIView::OnDragListener,
+                                    public ListScrollListener
+    {
+    public:
+        LanguageSwitchPresenter();
+        virtual ~LanguageSwitchPresenter();
+
+        void OnStart() override;
+        void OnPause() override;
+        void OnResume() override;
+        void OnStop() override;
+
+        static LanguageSwitchPresenter *GetInstance();
+        void SetLabelExt(UILabelExt *label);
+    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; // 增加按键事件
+        void OnItemSelected(int16 index, UIView *view) override;
+        LanguageSwitchModel *p_LanguageSwitchModel{nullptr};
+        UILabelExt *m_labelext{nullptr};
+        bool X_DRAG_FLAG{false};
+    };
+}
+
+#endif
\ No newline at end of file
diff --git a/code/sdk/application/wearable/fd230/nativeapp/nativeui/languagecode/include/LanguageSwitchView.h b/code/sdk/application/wearable/fd230/nativeapp/nativeui/languagecode/include/LanguageSwitchView.h
new file mode 100644 (file)
index 0000000..d27b2da
--- /dev/null
@@ -0,0 +1,69 @@
+/*
+ * @Author: luozheng 1732036298@qq.com
+ * @Date: 2024-03-28 11:58:38
+ * @LastEditors: luozheng 1732036298@qq.com
+ * @LastEditTime: 2025-02-24 18:09:24
+ * @FilePath: /FD230/code/sdk/application/wearable/fd230app/nativeui/languagecode/include/LanguageSwitchView.h
+ */
+#ifndef LANGUAGE_SWITCH_VIEW_H
+#define LANGUAGE_SWITCH_VIEW_H
+
+
+#include "View.h"
+#include "components/ui_scroll_view.h"
+#include "components/ui_label_ext.h"
+#include "components/ui_list.h"
+#include "languagecode/include/LanguageSwitchListAdapter.h"
+#include "string"
+namespace OHOS
+{
+    class LanguageSwitchPresenter;
+    class LanguageSwitchView : public View<LanguageSwitchPresenter>
+    {
+
+    public:
+        LanguageSwitchView();
+        virtual ~LanguageSwitchView();
+        static LanguageSwitchView *GetInstance(void);
+
+        void OnStart() override;
+        void AddLanguageItemToList(const Language &item);
+        UIList *GetLanguageList(void);
+        void InithintView();
+        void show_hint_group(std::string code,bool data);
+        void show_hint_group(int32_t code, bool data);
+
+        std::string get_hint_id_code()
+        {
+            return hint_id_code;
+        }
+
+        int32_t get_hint_id()
+        {
+            return hint_id;
+        }
+
+        UIButton *GetLanguagebutton_cancel(void);
+
+        
+        UIButton *GetLanguagebutton_ensure(void);
+
+    private:
+        bool LanguageSwitchScrollViewInit(void);
+        bool LanguageSwitchLabelViewInit(void);
+        bool LanguageSwitchListViewInit(void);
+        void LanguageSwitchViewInit(void);
+        void ClearAll(void);
+        UIViewGroup *group{nullptr};
+        UIButton *button_cancel{nullptr};
+        UIButton *button_ensure{nullptr};
+        UILabel *LanguageSwitchViewhintLabel{nullptr};               // "语言"
+        std::string hint_id_code;
+        int32_t hint_id{-1};
+        UIScrollView *LanguageSwitchScrollView{nullptr};
+        UILabelExt *LanguageSwitchViewTitleLabel{nullptr};               // "语言"
+        UIList *LanguageList{nullptr};                                   // 语言列表
+        LanguageSwitchListAdapter *p_LanguageSwitchListAdapter{nullptr}; // 语言列表适配器
+    };
+}
+#endif
\ No newline at end of file
diff --git a/code/sdk/application/wearable/fd230/nativeapp/nativeui/languagecode/src/LanguageSwitchListAdapter.cpp b/code/sdk/application/wearable/fd230/nativeapp/nativeui/languagecode/src/LanguageSwitchListAdapter.cpp
new file mode 100644 (file)
index 0000000..e4cd974
--- /dev/null
@@ -0,0 +1,122 @@
+/*
+ * @Author: luozheng 1732036298@qq.com
+ * @Date: 2024-03-28 14:27:05
+ * @LastEditors: luozheng 1732036298@qq.com
+ * @LastEditTime: 2024-06-28 09:33:56
+ * @FilePath: /FD230/code/sdk/application/wearable/fd230app/nativeui/languagecode/src/LanguageSwitchListAdapter.cpp
+ */
+#include "languagecode/include/LanguageSwitchListAdapter.h"
+#include "languagecode/include/LanguageSwitchListitemView.h"
+#include "wearable_log.h"
+#include "languagecode/include/LanguageSwitchModel.h"
+#include "languagecode/include/LanguageSwitchPresenter.h"
+#include "languagecode/LanguageInit.h"
+#include <UiConfig.h>
+
+namespace OHOS
+{
+
+    LanguageSwitchListAdapter::LanguageSwitchListAdapter()
+    {
+        WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "LanguageSwitchListAdapter::LanguageSwitchListAdapter");
+    }
+
+    LanguageSwitchListAdapter::~LanguageSwitchListAdapter()
+    {
+        WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "LanguageSwitchListAdapter::~LanguageSwitchListAdapter");
+        listData.clear();
+    }
+
+    uint16_t LanguageSwitchListAdapter::GetCount(void)
+    {
+        return listData.size();
+    }
+
+    void LanguageSwitchListAdapter::SetData(std::list<Language> &data)
+    {
+        if (!listData.empty())
+        {
+            listData.clear();
+        }
+        std::list<Language>::iterator it;
+        for (it = data.begin(); it != data.end(); it++)
+        {
+            listData.push_back(*it);
+        }
+    }
+
+    void LanguageSwitchListAdapter::ClearData(void)
+    {
+        if (!listData.empty())
+        {
+            listData.clear();
+        }
+    }
+
+    UIView *LanguageSwitchListAdapter::GetView(UIView *inView, int16_t index)
+    {
+        WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "LanguageSwitchListAdapter::GetView,index %d", index);
+        // 1.先检查列表数据是否为空,若为空则返回空指针
+        if (listData.empty())
+        {
+            return nullptr;
+        }
+        // 2.接着检查索引是否小于0,若小于0则返回空指针
+        if (index < 0)
+        {
+            return nullptr;
+        }
+        // 3.检查是否超出列表数据大小,若超出则返回空指针
+        size_t uindex = index;
+        if (uindex >= listData.size())
+        {
+            return nullptr;
+        }
+        // 4.通过迭代器访问列表中指定索引位置的元素,将其赋值给itemData变量
+        std::list<Language>::iterator it = listData.begin();
+        for (int i = 0; i < index; i++)
+        {
+            it++;
+        }
+        Language itemData = *it;
+        LanguageSwitchListitemView *item = nullptr;
+        // 5.根据传入的inView参数是否已经存在一个视图对象,若为空则创建一个新的LanguageSwitchListItemView对象,否则将inView转换成LanguageSwitchListItemView类型的指针
+        if (inView == nullptr)
+        {
+            item = new LanguageSwitchListitemView();
+        }
+        else
+        {
+            item = dynamic_cast<LanguageSwitchListitemView *>(inView);
+        }
+        item->SetItemInfo(itemData);
+        item->GetUILabelButtonExt()->SetOnClickListener(itemClickListener);
+        WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "GetView, id = %s", item->GetUILabelButtonExt()->GetViewId());
+        if (item->GetUILabelButtonExt()->GetViewId() != nullptr)
+        {
+            char *view_languageid = const_cast<char *>(item->GetUILabelButtonExt()->GetViewId());
+            if (strcmp(LanguageSwitchModel::GetInstance().GetCurLanguageCode(), view_languageid) == 0)
+            {
+// 设置选中
+#ifdef FD230_650
+                item->GetUILabelButtonExt()->SetImageSrc(PNG_CHECKBOX_ON_IMAGE, PNG_CHECKBOX_ON_IMAGE);
+#endif
+            }
+            else
+            {
+// 设置未选中
+#ifdef FD230_650
+                item->GetUILabelButtonExt()->SetImageSrc(PNG_CHECKBOX_OFF_IMAGE, PNG_CHECKBOX_OFF_IMAGE);
+#endif
+            }
+            item->GetUILabelButtonExt()->Invalidate();
+        }
+        return item;
+    }
+
+    void LanguageSwitchListAdapter::AddListItem(const Language &item)
+    {
+        listData.push_back(item);
+    }
+
+}
\ No newline at end of file
diff --git a/code/sdk/application/wearable/fd230/nativeapp/nativeui/languagecode/src/LanguageSwitchListitemView.cpp b/code/sdk/application/wearable/fd230/nativeapp/nativeui/languagecode/src/LanguageSwitchListitemView.cpp
new file mode 100644 (file)
index 0000000..638fb6e
--- /dev/null
@@ -0,0 +1,76 @@
+/*
+ * @Author: luozheng 1732036298@qq.com
+ * @Date: 2024-03-28 14:28:03
+ * @LastEditors: luozheng 1732036298@qq.com
+ * @LastEditTime: 2024-10-05 17:39:04
+ * @FilePath: /FD230/code/sdk/application/wearable/fd230app/nativeui/languagecode/src/LanguageSwitchListitemView.cpp
+ */
+#include "languagecode/include/LanguageSwitchListitemView.h"
+#include "wearable_log.h"
+
+namespace OHOS
+{
+
+    LanguageSwitchListitemView::LanguageSwitchListitemView()
+    {
+        WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "LanguageSwitchListitemView::LanguageSwitchListitemView");
+        SetPosition(43, 120, 380, 120);
+        SetStyle(STYLE_BACKGROUND_COLOR, Color::Black().full);
+        SetStyle(STYLE_BACKGROUND_OPA, 255);
+        SetUpChild();
+        Add(&m_LabelButtonExt);
+        Add(&languae_Image);
+       
+       
+    }
+
+    LanguageSwitchListitemView::~LanguageSwitchListitemView()
+    {
+        WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "LanguageSwitchListitemView::~LanguageSwitchListitemView");
+        Remove(&m_LabelButtonExt);
+        Remove(&languae_Image);
+    }
+
+    void LanguageSwitchListitemView::SetItemInfo(const Language itemInfo)
+    {
+        WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "LanguageSwitchListitemView::SetItemInfo");
+        m_LabelButtonExt.SetViewId(itemInfo.code);
+        //m_LabelButtonExt.SetText(itemInfo.name);
+        m_LabelButtonExt.SetFont(itemInfo.fontname, 30);
+        languae_Image.SetSrc(itemInfo.path);
+        //m_LabelButtonExt
+        if(strcmp(itemInfo.code,"az") == 0)
+        {
+            SetHeight(160);
+        }
+        else
+        {
+            SetHeight(120);
+        }
+    }
+
+    void LanguageSwitchListitemView::SetUpChild()
+    {
+        WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "LanguageSwitchListitemView::SetUpChild");
+        m_LabelButtonExt.SetPosition(0, 0, 380, 100);
+        m_LabelButtonExt.SetStyle(STYLE_BACKGROUND_COLOR, 0xff191919);
+        m_LabelButtonExt.SetFont(DEFAULT_VECTOR_FONT_FILENAME, 30);
+        m_LabelButtonExt.SetStyle(STYLE_LINE_HEIGHT, 35);
+        m_LabelButtonExt.SetStyleForState(STYLE_BACKGROUND_COLOR, 0xff191919, UIButton::PRESSED);
+        m_LabelButtonExt.SetAlign(TEXT_ALIGNMENT_LEFT);
+        m_LabelButtonExt.SetLabelPosition(47, 0);
+        m_LabelButtonExt.SetImagePosition(290, 30);
+        m_LabelButtonExt.SetTouchable(true);
+        #ifdef FD230_650
+        m_LabelButtonExt.SetImageSrc(PNG_CHECKBOX_OFF_IMAGE, PNG_CHECKBOX_OFF_IMAGE);
+        #endif
+
+        languae_Image.SetPosition(33,37);
+    }
+
+    UILabelButtonExt *LanguageSwitchListitemView::GetUILabelButtonExt(void)
+    {
+        return &m_LabelButtonExt;
+    }
+
+}
\ No newline at end of file
diff --git a/code/sdk/application/wearable/fd230/nativeapp/nativeui/languagecode/src/LanguageSwitchModel.cpp b/code/sdk/application/wearable/fd230/nativeapp/nativeui/languagecode/src/LanguageSwitchModel.cpp
new file mode 100644 (file)
index 0000000..1211ca6
--- /dev/null
@@ -0,0 +1,98 @@
+/*
+ * @Author: luozheng 1732036298@qq.com
+ * @Date: 2024-03-28 16:36:46
+ * @LastEditors: luozheng 1732036298@qq.com
+ * @LastEditTime: 2024-11-09 16:31:39
+ * @FilePath: /FD230/code/sdk/application/wearable/fd230app/nativeui/languagecode/src/LanguageSwitchModel.cpp
+ */
+#include "languagecode/include/LanguageSwitchModel.h"
+#include "wearable_log.h"
+#include "languagecode/LanguageInit.h"
+#include "ConfigModel.h"
+#include "NativeAbility.h"
+#include "languagecode/include/LanguageSwitchView.h"
+#include "AppViewIDs.h"
+namespace OHOS
+{
+
+    LanguageSwitchModel::LanguageSwitchModel() {}
+
+    LanguageSwitchModel::~LanguageSwitchModel() {}
+
+    LanguageSwitchModel &LanguageSwitchModel::GetInstance()
+    {
+        static LanguageSwitchModel instance;
+        return instance;
+    }
+
+    void LanguageSwitchModel::LanguageSwitchViewupdata(uint32_t id)
+    {
+        WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "LanguageSwitchViewupdata:%d", id);
+
+        if (id == 0 || id == 1)
+        {
+            OHOS::language::GetInstance()->ChangeLanguage(id);
+            if (LanguageSwitchView::GetInstance())
+            {
+                NativeAbility::GetInstance().ChangeSlice(VIEW_LANGUAGE_SWITCH);
+            }
+        }
+        return;
+
+        if (is_load_languages(id))
+        {
+            if (LanguageSwitchView::GetInstance())
+            {
+                LanguageSwitchView::GetInstance()->show_hint_group(id, true);
+            }
+            else
+            {
+                set_hint_code(id);
+                set_hint_flag(true);
+#ifdef FD230_650
+                NativeAbility::GetInstance().EnterSlice(VIEW_LANGUAGE_SWITCH);
+#endif
+            }
+        }
+        else
+        {
+            OHOS::language::GetInstance()->ChangeLanguage(id);
+            if (LanguageSwitchView::GetInstance())
+            {
+                NativeAbility::GetInstance().ChangeSlice(VIEW_LANGUAGE_SWITCH);
+            }
+        }
+        return;
+    }
+    /*
+     * @brief: 设置当前语言code
+     */
+    void LanguageSwitchModel::SetCurLanguageCode(char *curlanguagecode)
+    {
+        ConfigModel::GetInstance()->SetLanguageCode(curlanguagecode);
+    }
+
+    /*
+     * @brief 获取当前设置的语言code
+     */
+    const char *LanguageSwitchModel::GetCurLanguageCode(void)
+    {
+        return ConfigModel::GetInstance()->GetLanguageCode().c_str();
+    }
+
+    /*
+     * @brief 设置上一次语言code
+     */
+    void LanguageSwitchModel::SetLastLanguageCode(std::string prelanguagecode)
+    {
+        PreLanguageCode = prelanguagecode;
+    }
+
+    /*
+     * @brief 获取上一次设置的语言code
+     */
+    const char *LanguageSwitchModel::GetLastLanguageCode(void)
+    {
+        return PreLanguageCode.c_str();
+    }
+}
\ No newline at end of file
diff --git a/code/sdk/application/wearable/fd230/nativeapp/nativeui/languagecode/src/LanguageSwitchPresenter.cpp b/code/sdk/application/wearable/fd230/nativeapp/nativeui/languagecode/src/LanguageSwitchPresenter.cpp
new file mode 100644 (file)
index 0000000..8501d89
--- /dev/null
@@ -0,0 +1,251 @@
+/*
+ * @Author: luozheng 1732036298@qq.com
+ * @Date: 2024-03-28 14:17:43
+ * @LastEditors: luozheng 1732036298@qq.com
+ * @LastEditTime: 2024-11-09 15:30:10
+ * @FilePath: /FD230/code/sdk/application/wearable/fd230app/nativeui/languagecode/src/LanguageSwitchPresenter.cpp
+ */
+#include "AppViewIDs.h"
+#include "NativeAbility.h"
+#include "languagecode/include/LanguageSwitchPresenter.h"
+#include "languagecode/include/LanguageSwitchListitemView.h"
+#include "languagecode/include/LanguageSwitchModel.h"
+#include "common/key_code.h"
+#include "custom_utils.h"
+#include "languagecode/LanguageInit.h"
+#include "ConfigModel.h"
+#include "settings/include/SettingModel.h"
+#ifdef SUPPORT_BLE_SERVICE
+#include "bleService.h"
+#endif
+#include "broadcast_feature.h"
+#include "NativeRegisterManager.h"
+
+namespace OHOS
+{
+    REGIST_SLICE(VIEW_LANGUAGE_SWITCH, LanguageSwitchView, LanguageSwitchPresenter);
+
+    extern Language languages[];
+
+    // 当前Presenter属性实例化的内存指针
+    static LanguageSwitchPresenter *g_pLanguageSwitchPresenter = nullptr;
+
+    LanguageSwitchPresenter::LanguageSwitchPresenter()
+    {
+        p_LanguageSwitchModel = &LanguageSwitchModel::GetInstance();
+        g_pLanguageSwitchPresenter = this;
+    }
+
+    LanguageSwitchPresenter::~LanguageSwitchPresenter()
+    {
+        g_pLanguageSwitchPresenter = nullptr;
+    }
+
+    LanguageSwitchPresenter *LanguageSwitchPresenter::GetInstance()
+    {
+        return g_pLanguageSwitchPresenter;
+    }
+
+    void LanguageSwitchPresenter::OnStart()
+    {
+        Presenter<LanguageSwitchView>::OnStart();
+    }
+
+    void LanguageSwitchPresenter::OnResume(void)
+    {
+        Presenter<LanguageSwitchView>::OnResume();
+        if (view_ == nullptr)
+        {
+            return;
+        }
+
+#if 0
+        for (uint8_t i = 0; i < MAX_LANGUAGE; i++)
+        {
+            view_->AddLanguageItemToList(languages[i]);
+        }
+#else
+        for (uint8_t i = 0; i < 2; i++)
+        {
+            view_->AddLanguageItemToList(languages[i]);
+        }
+#endif
+    }
+
+    void LanguageSwitchPresenter::OnPause(void)
+    {
+        Presenter<LanguageSwitchView>::OnPause();
+    }
+
+    void LanguageSwitchPresenter::OnStop(void)
+    {
+        Presenter<LanguageSwitchView>::OnStop();
+    }
+
+    bool LanguageSwitchPresenter::OnDrag(UIView &view, const DragEvent &event)
+    {
+        WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "RespiratoryTrainingPresenter::OnDrag");
+        UNUSED(view);
+        if ((event.GetDeltaX() > X_DRAG_OFFSET) && (event.GetDeltaX() > (DOUBLES * MATH_ABS(event.GetDeltaY())))) // 拖动过程中判断是否是水平滑动
+        {
+            LanguageSwitchPresenter::X_DRAG_FLAG = true;
+        }
+        return true;
+    }
+
+    bool LanguageSwitchPresenter::OnDragEnd(UIView &view, const DragEvent &event)
+    {
+        WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "RespiratoryTrainingPresenter::OnDragEnd");
+        UNUSED(view);
+        if (event.GetDragDirection() == DragEvent::DIRECTION_LEFT_TO_RIGHT && LanguageSwitchPresenter::X_DRAG_FLAG)
+        {
+#ifdef FD230_650
+            NativeAbility::GetInstance().Back(TransitionType::TRANSITION_BACK_TO_HEXAGONS);
+#endif
+            LanguageSwitchPresenter::X_DRAG_FLAG = false;
+        }
+        return true;
+    }
+
+    bool LanguageSwitchPresenter::OnClick(UIView &view, const ClickEvent &event)
+    {
+        WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "LanguageSwitchPresenter::OnClick");
+
+        UNUSED(event);
+        const char *lastLanguageCode = p_LanguageSwitchModel->GetLastLanguageCode();
+        UILabelButtonExt *p_UILabelButtonExt = dynamic_cast<UILabelButtonExt *>(&view);
+        char *id = const_cast<char *>(p_UILabelButtonExt->GetViewId());
+        language *g_planguage = language::GetInstance();
+
+        /* -------------------------------------------------------------------------- */
+        if (strcmp(view.GetViewId(), "BUTTON_CHECK_OK") == 0)
+        {
+            uint8_t power_buf[2] = {0};
+            power_buf[0] = 3;
+            if (LanguageSwitchView::GetInstance()->get_hint_id() != -1)
+            {
+                int32_t Hint_ID = LanguageSwitchView::GetInstance()->get_hint_id();
+
+                g_planguage->ChangeLanguage(Hint_ID);
+#ifdef FD230_650
+                CustomEventPublish(TOPIC_EVENT_DEVICE_BIND, power_buf, 2);
+#endif
+            }
+            else
+            {
+                std::string Hint_ID = LanguageSwitchView::GetInstance()->get_hint_id_code();
+
+                g_planguage->ChangeLanguage(Hint_ID);
+
+#ifdef FD230_650
+                CustomEventPublish(TOPIC_EVENT_DEVICE_BIND, power_buf, 2);
+#endif
+            }
+
+            return true;
+        }
+        else if (strcmp(view.GetViewId(), "BUTTON_CHECK_NO") == 0)
+        {
+
+            LanguageSwitchView::GetInstance()->show_hint_group("", false);
+            return true;
+        }
+
+        // if (ConfigModel::GetInstance()->GetisFirstTimeStart() == true && SettingModel::GetInstance().GetPhoneConnectStatus() == false)
+        // {
+        //     NativeAbility::GetInstance().EnterSlice(VIEW_WATCH_QR_CODE);
+        // }
+        // else if(ConfigModel::GetInstance()->GetisFirstTimeStart() == true && SettingModel::GetInstance().GetPhoneConnectStatus() == true)
+        // {
+        //     if (ConfigModel::GetInstance()->GetLanguage() == -1)
+        //     {
+        //         uapi_set_screen_on_api();
+        //         NativeAbility::GetInstance().ChangeSlice(VIEW_MAIN);
+        //         ConfigModel::GetInstance()->SetisFirstTimeStart(false);
+        //         NativeAbility::GetInstance().SetDefaultSliceId(VIEW_MAIN);
+        //     }
+        // }
+        /* -------------------------------------------------------------------------- */
+        LanguageId currentLanguageId = LanguageManager::GetInstance().GetLanguageIdByCode(id);
+        if (is_load_languages(currentLanguageId))
+        {
+            LanguageSwitchView::GetInstance()->show_hint_group(id, true);
+            return true;
+        }
+        else
+        {
+            if (ConfigModel::GetInstance()->GetisFirstTimeStart() == true)
+            {
+#ifdef FD230_650
+                NativeAbility::GetInstance().EnterSlice(VIEW_WATCH_QR_CODE);
+#endif
+            }
+        }
+
+        if (p_UILabelButtonExt != nullptr)
+        {
+            char *currentLanguageCode = id;
+            p_LanguageSwitchModel->SetCurLanguageCode(currentLanguageCode); // 设置新的当前语言Code
+        }
+        else
+        {
+            WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "p_UILabelButtonExt is nullptr !!");
+            return false;
+        }
+        WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "lastLanguageCode = %s , CurrLanguageCode = %s", p_LanguageSwitchModel->GetLastLanguageCode(), p_LanguageSwitchModel->GetCurLanguageCode());
+        //  检查当前语言ID是否已经是点击的语言ID,否则重复点击同一语言不响应切换
+        if (strcmp(p_LanguageSwitchModel->GetCurLanguageCode(), lastLanguageCode) == 0)
+        {
+            WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "Do not ChangeLanguage!!");
+            return true;
+        }
+        else
+        {
+
+            {
+
+                g_planguage->ChangeLanguage(p_LanguageSwitchModel->GetCurLanguageCode());
+                m_labelext->SetTextId(STR_LANGUAGE_SELECTION);
+                m_labelext->ForceResetText(); // 强制刷新
+
+#ifdef FD230_650
+                p_UILabelButtonExt->SetImageSrc(PNG_CHECKBOX_ON_IMAGE, PNG_CHECKBOX_ON_IMAGE);
+#endif
+                p_UILabelButtonExt->Invalidate();
+                LanguageSwitchView::GetInstance()->GetLanguageList()->RefreshList();
+                // 更新上一个语言ID
+                p_LanguageSwitchModel->SetLastLanguageCode(p_LanguageSwitchModel->GetCurLanguageCode());
+            }
+        }
+        return true;
+    }
+
+    bool LanguageSwitchPresenter::OnKeyAct(UIView &view, const KeyEvent &event) // 增加按键事件
+    {
+        UNUSED(view);
+        WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "LanguageSwitchPresenter::OnKeyAct");
+        unsigned short keyID = event.GetKeyId();
+        unsigned short keyState = event.GetState();
+        // 如果是power键,且是亮屏状态,按键释放就返回上一级
+        if (keyID == static_cast<uint16_t>(ZliteKeyCode::ZLITE_KEY_POWER) && keyState == 1 && uapi_get_screen_state() == 0)
+        {
+#ifdef FD230_650
+            NativeAbility::GetInstance().Back();
+#endif
+#ifdef SUPPORT_BLE_SERVICE
+            br_adv_start(20);
+#endif
+        }
+        return true;
+    }
+
+    void LanguageSwitchPresenter::OnItemSelected(int16 index, UIView *view)
+    {
+        WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "LanguageSwitchPresenter::OnItemSelected:%d", index);
+    }
+
+    void LanguageSwitchPresenter::SetLabelExt(UILabelExt *labelext)
+    {
+        m_labelext = labelext;
+    }
+}
\ No newline at end of file
diff --git a/code/sdk/application/wearable/fd230/nativeapp/nativeui/languagecode/src/LanguageSwitchView.cpp b/code/sdk/application/wearable/fd230/nativeapp/nativeui/languagecode/src/LanguageSwitchView.cpp
new file mode 100644 (file)
index 0000000..7010058
--- /dev/null
@@ -0,0 +1,321 @@
+#include "languagecode/include/LanguageSwitchView.h"
+#include "languagecode/include/LanguageSwitchPresenter.h"
+#include "wearable_log.h"
+#include "UiConfig.h"
+namespace OHOS
+{
+    
+    static constexpr int16_t TITLE_LABEL_X = 83;
+    static constexpr int16_t TITLE_LABEL_Y = 50;
+    static constexpr int16_t TITLE_LABEL_W = 300;
+    static constexpr int16_t TITLE_LABEL_H = 40;
+    static constexpr int16_t TITLE_LABEL_TEXT_FONT = 30;
+    static constexpr int16_t TITLE_LABEL_LINE_HEIGHT = 35;
+    static constexpr int16_t TITLE_LABEL_TEXT_ROLLSPEED = 70;
+
+    static constexpr int16_t LANGUAGE_LIST_X = 43;
+    static constexpr int16_t LANGUAGE_LIST_Y = 120;
+    static constexpr int16_t NUM_2 = 2;
+    static constexpr int16_t MAX_SCROLL_DIS = 1000;
+    static constexpr int16_t MAX_REBOUND_SIZE = 40;
+    static constexpr int16_t MAX_LANGUAGE_LIST_SCROLLBLANKSIZE = 50;
+    static constexpr int16_t ROTATEFACTORVALUE = 1.0;
+
+    static LanguageSwitchView *g_pLanguageSwitchView{nullptr};
+    LanguageSwitchView::LanguageSwitchView()
+    {
+        WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "LanguageSwitchView::LanguageSwitchView");
+        g_pLanguageSwitchView = this;
+    }
+
+    LanguageSwitchView::~LanguageSwitchView()
+    {
+        WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "LanguageSwitchView::~LanguageSwitchView");
+        ClearAll();
+        LanguageSwitchModel::GetInstance().set_hint_flag(false);
+        LanguageSwitchModel::GetInstance().set_hint_code(-1);
+        g_pLanguageSwitchView = nullptr;
+    }
+
+    LanguageSwitchView *LanguageSwitchView::GetInstance()
+    {
+        return g_pLanguageSwitchView;
+    }
+
+    void LanguageSwitchView::AddLanguageItemToList(const Language &item)
+    {
+        p_LanguageSwitchListAdapter->AddListItem(item);
+    }
+
+    UIList *LanguageSwitchView::GetLanguageList(void)
+    {
+        return LanguageList;
+    }
+
+    void LanguageSwitchView::ClearAll(void)
+    {
+        if (LanguageSwitchScrollView != nullptr)
+        {
+            LanguageSwitchScrollView->RemoveAll();
+            if (LanguageSwitchViewTitleLabel)
+            {
+                delete LanguageSwitchViewTitleLabel;
+                LanguageSwitchViewTitleLabel = nullptr;
+            }
+            if (p_LanguageSwitchListAdapter)
+            {
+                delete p_LanguageSwitchListAdapter;
+                p_LanguageSwitchListAdapter = nullptr;
+            }
+            if (LanguageList)
+            {
+                delete LanguageList;
+                LanguageList = nullptr;
+            }
+            delete LanguageSwitchScrollView;
+            LanguageSwitchScrollView = nullptr;
+            WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "LanguageSwitchView::ClearAll LanguageSwitchScrollView over!!");
+        }
+        if (group != nullptr)
+        {
+            group->RemoveAll();
+            if (button_cancel)
+            {
+                delete button_cancel;
+                button_cancel = nullptr;
+            }
+            if (button_ensure)
+            {
+                delete button_ensure;
+                button_ensure = nullptr;
+            }
+            if (LanguageSwitchViewhintLabel)
+            {
+                delete LanguageSwitchViewhintLabel;
+                LanguageSwitchViewhintLabel = nullptr;
+            }
+            delete group;
+            group = nullptr;
+            WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "LanguageSwitchView::ClearAll group over!!");
+        }
+        WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "LanguageSwitchView::ClearAll over!!");
+    }
+
+    bool LanguageSwitchView::LanguageSwitchScrollViewInit(void)
+    {
+        WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "LanguageSwitchView::LanguageSwitchScrollViewInit");
+        LanguageSwitchScrollView = new UIScrollView();
+        if (LanguageSwitchScrollView == nullptr)
+        {
+            WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "LanguageSwitchView::LanguageSwitchScrollView new fail!");
+            return false;
+        }
+        LanguageSwitchScrollView->SetPosition(0, 0, Screen::GetInstance().GetWidth(), Screen::GetInstance().GetHeight());
+        // LanguageSwitchScrollView->SetScrollBlankSize(MAX_LANGUAGE_LIST_SCROLLBLANKSIZE);
+        LanguageSwitchScrollView->SetHorizontalScrollState(false);
+        LanguageSwitchScrollView->SetTouchable(true);
+        LanguageSwitchScrollView->SetDraggable(true);
+
+        return true;
+    }
+
+    bool LanguageSwitchView::LanguageSwitchLabelViewInit(void)
+    {
+        WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "LanguageSwitchView::LanguageSwitchLabelViewInit");
+        LanguageSwitchViewTitleLabel = new UILabelExt();
+        if (LanguageSwitchViewTitleLabel == nullptr)
+        {
+            WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "LanguageSwitchView::LanguageSwitchViewTitleLabel new fail!");
+            return false;
+        }
+        LanguageSwitchViewTitleLabel->SetPosition(TITLE_LABEL_X, TITLE_LABEL_Y, TITLE_LABEL_W, TITLE_LABEL_H);
+        LanguageSwitchViewTitleLabel->SetStyle(STYLE_TEXT_FONT, TITLE_LABEL_TEXT_FONT);
+        LanguageSwitchViewTitleLabel->SetStyle(STYLE_LINE_HEIGHT, TITLE_LABEL_LINE_HEIGHT);
+        // LanguageSwitchViewTitleLabel->SetText("语言");
+        LanguageSwitchViewTitleLabel->SetTextId(STR_LANGUAGE_SELECTION);
+        LanguageSwitchViewTitleLabel->SetLineBreakMode(UILabel::LINE_BREAK_OSCILLATION);
+        LanguageSwitchViewTitleLabel->SetAlign(TEXT_ALIGNMENT_CENTER, TEXT_ALIGNMENT_CENTER);
+        LanguageSwitchViewTitleLabel->SetRollSpeed(TITLE_LABEL_TEXT_ROLLSPEED);
+        LanguageSwitchViewTitleLabel->SetFont(DEFAULT_VECTOR_FONT_FILENAME, TITLE_LABEL_TEXT_FONT);
+        LanguageSwitchPresenter::GetInstance()->SetLabelExt(LanguageSwitchViewTitleLabel);
+        LanguageSwitchScrollView->Add(LanguageSwitchViewTitleLabel);
+
+        return true;
+    }
+
+    bool LanguageSwitchView::LanguageSwitchListViewInit(void)
+    {
+        WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "LanguageSwitchView::LanguageSwitchListViewInit");
+        p_LanguageSwitchListAdapter = new LanguageSwitchListAdapter(); // UIList 的适配器
+        if (p_LanguageSwitchListAdapter == nullptr)
+        {
+            WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "LanguageSwitchView::p_LanguageSwitchListAdapter is nullptr!");
+            return false;
+        }
+        p_LanguageSwitchListAdapter->SetItemClickListener(static_cast<UIView::OnClickListener *>(LanguageSwitchPresenter::GetInstance()));
+        LanguageList = new UIList(UIList::VERTICAL);
+        if (LanguageList == nullptr)
+        {
+            WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "LanguageSwitchView::LanguageList is nullptr!");
+            return false;
+        }
+        LanguageList->SetPosition(LANGUAGE_LIST_X, LANGUAGE_LIST_Y, HORIZONTAL_RESOLUTION, 346);
+        LanguageList->SetStyle(STYLE_BACKGROUND_COLOR, 0xff000000);
+        LanguageList->EnableAutoAlign(true);      // 设置此列表的自动对齐状态。当滚动停止时,子视图被选中,其位置自动与预设位置对齐
+        LanguageList->SetThrowDrag(true);         // 设置手指抬起屏幕后是否继续滚动。
+        LanguageList->SetMaxScrollDistance(1000); // 设置手指抬起屏幕后的最大滚动距离。
+        LanguageList->SetSwipeACCLevel(200);      /*设置手指抬起屏幕后的补偿距离。*/
+        LanguageList->SetSelectPosition(346);
+        LanguageList->SetReboundSize(30);
+        LanguageList->SetScrollBlankSize(20);
+        LanguageList->SetStartIndex(0);
+        FocusManager::GetInstance()->RequestFocus(LanguageList);
+        FocusManager::GetInstance()->RequestFocusByDirection(FOCUS_DIRECTION_UP);
+        LanguageList->SetRotateFactor(1.0);
+        if (p_LanguageSwitchListAdapter->GetCount() < 3)
+        {
+            LanguageList->SetReboundSize(0);
+            LanguageList->SetScrollBlankSize(0);
+        }
+        return true;
+    }
+
+    void LanguageSwitchView::LanguageSwitchViewInit(void)
+    {
+        WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "LanguageSwitchView::LanguageSwitchViewInit");
+        if (!LanguageSwitchScrollViewInit() || !LanguageSwitchLabelViewInit() || !LanguageSwitchListViewInit())
+        {
+            WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "LanguageSwitchView::LanguageSwitchViewInit fail!!");
+            return;
+        }
+    }
+
+    void LanguageSwitchView::show_hint_group(std::string code, bool data)
+    {
+        group->SetVisible(data);
+        RootView::GetInstance()->Invalidate();
+        if (data)
+        {
+            hint_id_code = code;
+        }
+        return;
+    }
+
+    void LanguageSwitchView::show_hint_group(int32_t code, bool data)
+    {
+        group->SetVisible(data);
+        RootView::GetInstance()->Invalidate();
+        if (data)
+        {
+            hint_id = code;
+        }
+        return;
+    }
+    UIButton *LanguageSwitchView::GetLanguagebutton_cancel(void)
+    {
+        return button_cancel;
+    }
+
+    UIButton *LanguageSwitchView::GetLanguagebutton_ensure(void)
+    {
+        return button_ensure;
+    }
+
+    // Take effect after restart
+    void LanguageSwitchView::InithintView()
+    {
+        group = new UIViewGroup();
+        if (group == nullptr)
+        {
+            return;
+        }
+        group->SetPosition(0, 0, Screen::GetInstance().GetWidth(), Screen::GetInstance().GetHeight());
+        group->SetTouchable(true);
+        group->SetDraggable(true);
+        group->SetOnDragListener(presenter_);
+
+        if (LanguageSwitchViewhintLabel == nullptr)
+        {
+            LanguageSwitchViewhintLabel = new UILabel();
+        }
+        LanguageSwitchViewhintLabel->SetPosition(47, 194); // widget's left position and top position
+        LanguageSwitchViewhintLabel->Resize(370, 60);      // widget's width and height
+        LanguageSwitchViewhintLabel->SetViewId("label1");  // Set style
+        LanguageSwitchViewhintLabel->SetStyle(STYLE_TEXT_FONT, 30);
+
+        LanguageSwitchViewhintLabel->SetText("Take effect after restart");
+        LanguageSwitchViewhintLabel->SetLineBreakMode(UILabel::LINE_BREAK_WRAP);
+        LanguageSwitchViewhintLabel->SetAlign(TEXT_ALIGNMENT_CENTER, TEXT_ALIGNMENT_CENTER);
+        LanguageSwitchViewhintLabel->SetRollSpeed(0);
+        LanguageSwitchViewhintLabel->SetFont(DEFAULT_VECTOR_FONT_FILENAME_EN, 30);
+
+        group->Add(LanguageSwitchViewhintLabel);
+        LanguageSwitchViewhintLabel->SetVisible(true);
+
+        button_cancel = new UIButton();
+        if (button_cancel == nullptr)
+        {
+            WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "SystemShutdown::new button_cancel fail!");
+            return;
+        }
+        button_cancel->SetPosition(97, 299, 130, 130);
+        button_cancel->SetStyle(STYLE_BACKGROUND_COLOR, 0xffffffff);
+        button_cancel->SetStyle(STYLE_BACKGROUND_OPA, 0x00);
+        button_cancel->SetImagePosition(15, 15);
+        button_cancel->SetStyleForState(STYLE_BACKGROUND_COLOR, 0xff191919, UIButton::PRESSED);
+        button_cancel->SetStyleForState(STYLE_BACKGROUND_OPA, 0x00, UIButton::PRESSED);
+#ifdef FD230_650
+        button_cancel->SetImageSrc(PNG_SYSTEM_CHECK_OFF_IMAGE, PNG_SYSTEM_CHECK_OFF_IMAGE);
+#endif
+        button_cancel->SetViewId("BUTTON_CHECK_NO");
+        group->Add(button_cancel);
+        /* ------------------------ button_ensure ----------------------- */
+        button_ensure = new UIButton();
+        if (button_ensure == nullptr)
+        {
+            WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "SystemShutdown::new button_ensure fail!");
+            return;
+        }
+        button_ensure->SetPosition(240, 299, 130, 130);
+        button_ensure->SetStyle(STYLE_BACKGROUND_COLOR, 0xffffffff);
+        button_ensure->SetStyle(STYLE_BACKGROUND_OPA, 0x00);
+        button_ensure->SetImagePosition(15, 15);
+        button_ensure->SetStyleForState(STYLE_BACKGROUND_COLOR, 0xff191919, UIButton::PRESSED);
+        button_ensure->SetStyleForState(STYLE_BACKGROUND_OPA, 0x00, UIButton::PRESSED);
+#ifdef FD230_650
+        button_ensure->SetImageSrc(PNG_SYSTEM_CHECK_ON_IMAGE, PNG_SYSTEM_CHECK_ON_IMAGE);
+#endif
+        button_ensure->SetViewId("BUTTON_CHECK_OK");
+        group->Add(button_ensure);
+
+        button_cancel->SetOnClickListener(presenter_);
+        button_ensure->SetOnClickListener(presenter_);
+        if (LanguageSwitchModel::GetInstance().get_hint_flag() == false)
+        {
+            group->SetVisible(false);
+        }
+        else
+        {
+            group->SetVisible(true);
+            hint_id = LanguageSwitchModel::GetInstance().get_hint_code();
+
+            LanguageSwitchModel::GetInstance().set_hint_flag(false);
+        }
+    }
+
+    void LanguageSwitchView::OnStart()
+    {
+        WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "LanguageSwitchView::OnStart");
+        View<LanguageSwitchPresenter>::OnStart();
+        LanguageSwitchViewInit();
+        InithintView();
+
+        AddViewToRootContainer(LanguageSwitchScrollView);
+        LanguageList->SetAdapter(p_LanguageSwitchListAdapter);
+        LanguageSwitchScrollView->Add(LanguageList);
+        AddViewToRootContainer(group);
+        RootView::GetInstance()->SetOnKeyActListener(presenter_);
+
+        return;
+    }
+}
\ No newline at end of file