AiVoice视图添加与修改
authorluozheng <1732036298@qq.com>
Sat, 22 Jun 2024 10:49:46 +0000 (18:49 +0800)
committerluozheng <1732036298@qq.com>
Sat, 22 Jun 2024 10:49:46 +0000 (18:49 +0800)
15 files changed:
code/sdk/application/wearable/fd230app/CMakeLists.txt
code/sdk/application/wearable/fd230app/nativeui/aivoice/include/AiVoiceBluetoothFailedStartView.h
code/sdk/application/wearable/fd230app/nativeui/aivoice/include/AiVoiceModel.h
code/sdk/application/wearable/fd230app/nativeui/aivoice/include/AiVoicePresenter.h
code/sdk/application/wearable/fd230app/nativeui/aivoice/include/AiVoiceView.h
code/sdk/application/wearable/fd230app/nativeui/aivoice/include/AivoiceConnectTimeoutView.h [new file with mode: 0644]
code/sdk/application/wearable/fd230app/nativeui/aivoice/include/AivoiceListeningView.h [new file with mode: 0644]
code/sdk/application/wearable/fd230app/nativeui/aivoice/include/AivoiceMobileDataFailedStartView.h [new file with mode: 0644]
code/sdk/application/wearable/fd230app/nativeui/aivoice/src/AiVoiceBluetoothFailedStartView.cpp
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/aivoice/src/AiVoiceView.cpp
code/sdk/application/wearable/fd230app/nativeui/aivoice/src/AivoiceConnectTimeoutView.cpp [new file with mode: 0644]
code/sdk/application/wearable/fd230app/nativeui/aivoice/src/AivoiceListeningView.cpp [new file with mode: 0644]
code/sdk/application/wearable/fd230app/nativeui/aivoice/src/AivoiceMobileDataFailedStartView.cpp [new file with mode: 0644]

index 880e468..d38afa1 100644 (file)
@@ -385,7 +385,11 @@ set(SOURCES
     ${CMAKE_CURRENT_SOURCE_DIR}/nativeui/aivoice/src/AiVoiceModel.cpp
     ${CMAKE_CURRENT_SOURCE_DIR}/nativeui/aivoice/src/AiVoicePresenter.cpp
     ${CMAKE_CURRENT_SOURCE_DIR}/nativeui/aivoice/src/AiVoiceView.cpp
-
+    ${CMAKE_CURRENT_SOURCE_DIR}/nativeui/aivoice/src/AiVoiceBluetoothFailedStartView.cpp
+    ${CMAKE_CURRENT_SOURCE_DIR}/nativeui/aivoice/src/AivoiceMobileDataFailedStartView.cpp
+    ${CMAKE_CURRENT_SOURCE_DIR}/nativeui/aivoice/src/AivoiceConnectTimeoutView.cpp
+    ${CMAKE_CURRENT_SOURCE_DIR}/nativeui/aivoice/src/AivoiceListeningView.cpp
+    
     #声音与震动
     ${CMAKE_CURRENT_SOURCE_DIR}/nativeui/soundandvibration/src/SoundAndVibrationPresenter.cpp 
     ${CMAKE_CURRENT_SOURCE_DIR}/nativeui/soundandvibration/src/SoundAndVibrationView.cpp
index e69de29..141f15b 100644 (file)
@@ -0,0 +1,74 @@
+/*
+ * @Author: luozheng 1732036298@qq.com
+ * @Date: 2024-06-21 17:07:07
+ * @LastEditors: luozheng 1732036298@qq.com
+ * @LastEditTime: 2024-06-22 16:59:20
+ * @FilePath: /FD230/code/sdk/application/wearable/fd230app/nativeui/aivoice/include/AiVoiceBluetoothFailedStartView.h
+ */
+
+#ifndef AI_VOICE_BLUETOOTH_FAILEDSTART_VIEW_H
+#define AI_VOICE_BLUETOOTH_FAILEDSTART_VIEW_H
+
+#include "components/ui_scroll_view.h"
+#include "components/ui_label_ext.h"
+#include "components/ui_button.h"
+#include "components/ui_image_view.h"
+
+namespace OHOS
+{
+    static constexpr const char *BLUETOOTHFAILEDSTART_ENSURE_BUTTON_VIEW_ID = "BluetoothFailedStartEnsureButton";//蓝牙未开启界面的确定按钮
+
+    class AiVoiceBluetoothFailedStartView
+    {
+    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 ButtonConfig
+        {
+            int16_t x;
+            int16_t y;
+            int16_t w;
+            int16_t h;
+            const char *ViewId;
+        };
+
+        struct ImageConfig
+        {
+            int16_t x;
+            int16_t y;
+            int16_t w;
+            int16_t h;
+        };
+        
+        AiVoiceBluetoothFailedStartView();
+        ~AiVoiceBluetoothFailedStartView();
+        static AiVoiceBluetoothFailedStartView *GetInstance(void);
+        UIScrollView *CreateAiVoiceBluetoothFailedStartView(void);
+
+    private:
+        void ClearAll(void);
+        UILabelExt *AiVoiceBluetoothFailedStartLabelInit(LabelConfig &labelconfig);
+        UIButton *AiVoiceBluetoothFailedStartButtonInit(ButtonConfig &buttonconfig);
+        UIImageView *AiVoiceBluetoothFailedStartImageInit(ImageConfig &imageconfig);
+        bool CreateAiVoiceBluetoothFailedStartLabel(void);
+        bool CreateAiVoiceBluetoothFailedStartButton(void);
+        bool CreateAiVoiceBluetoothFailedStartImage(void);
+        bool CreateAiVoiceBluetoothFailedStartScrollView(void);
+        UIScrollView *scrollView{nullptr};
+        UILabelExt *title{nullptr};
+        UIImageView *attentionImage{nullptr};
+        UILabelExt *label[2]{nullptr};
+        UILabelExt *ensure{nullptr};
+        UIButton *ensureButton{nullptr};
+    };
+}
+#endif
\ No newline at end of file
index 9c40b54..2a79907 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-06-20 20:13:47
+ * @LastEditTime: 2024-06-22 17:55:53
  * @FilePath: /FD230/code/sdk/application/wearable/fd230app/nativeui/aivoice/include/AiVoiceModel.h
  */
 #ifndef AI_VOICE_MODEL_H
@@ -14,6 +14,9 @@ namespace OHOS
     {
     public:
         static AiVoiceModel &GetInstance(void);
+        bool GetBluetoothIsOpen(void);
+        bool GetMobileDataIsOpen(void);
+        bool GetAiVoiceConnectStatus(void);
 
     private:
         AiVoiceModel();
index 615d7fd..d509ac4 100644 (file)
@@ -2,7 +2,7 @@
  * @Author: luozheng 1732036298@qq.com
  * @Date: 2024-06-20 14:44:22
  * @LastEditors: luozheng 1732036298@qq.com
- * @LastEditTime: 2024-06-21 21:07:37
+ * @LastEditTime: 2024-06-22 09:51:24
  * @FilePath: /FD230/code/sdk/application/wearable/fd230app/nativeui/aivoice/include/AiVoicePresenter.h
  */
 #ifndef AI_VOICE_PRESENTER_H
index 9015889..3a20124 100644 (file)
@@ -2,7 +2,7 @@
  * @Author: luozheng 1732036298@qq.com
  * @Date: 2024-06-08 09:36:01
  * @LastEditors: luozheng 1732036298@qq.com
- * @LastEditTime: 2024-06-21 21:07:45
+ * @LastEditTime: 2024-06-22 17:48:56
  * @FilePath: /FD230/code/sdk/application/wearable/fd230app/nativeui/respiratorytraining/include/AiVoiceView.h
  */
 #ifndef AI_VOICE_VIEW_H
 #include "components/ui_button.h"
 #include "components/ui_scroll_view.h"
 #include "components/ui_image_view.h"
+#include "aivoice/include/AiVoiceBluetoothFailedStartView.h"
+#include "aivoice/include/AivoiceMobileDataFailedStartView.h"
+#include "aivoice/include/AivoiceConnectTimeoutView.h"
+#include "aivoice/include/AivoiceListeningView.h"
+
 namespace OHOS
 {
     static constexpr const char *START_CHAT_BUTTON_VIEW_ID = "StartChatButton"; // 开始对话
@@ -67,6 +72,7 @@ namespace OHOS
         AiVoiceView();
         ~AiVoiceView();
         static AiVoiceView *GetInstance(void);
+        UIScrollView *GetAiVoiceScrollView(int16_t index);
         bool ClickFunc(int16_t interface);
         void ChangeView(int16_t hideView, int16_t showView);
         bool ChangeAiVoiceStartChatView(int16_t thisView);
@@ -82,13 +88,20 @@ namespace OHOS
         void OnTearDownView() override;
         void OnStop() override;
 
+    private:
+        AiVoiceBluetoothFailedStartView *p_AiVoiceBluetoothFailedStartView{nullptr};
+        AivoiceMobileDataFailedStartView *p_AivoiceMobileDataFailedStartView{nullptr};
+        AivoiceConnectTimeoutView *p_AivoiceConnectTimeoutView{nullptr};
+        AivoiceListeningView *p_AivoiceListeningView{nullptr};
+
     private:
         UILabelExt *AiVoiceViewLabelInit(LabelConfig &labelconfig);
         UIImageView *AiVoiceViewImageView(ImageConfig &imageconfig);
-        UIButton *AiVoiceViewLabelButtonInit(ButtonConfig &buttonconfig);
+        UIButton *AiVoiceViewButtonInit(ButtonConfig &buttonconfig);
         bool CreateAiVoiceViewLabel(void);
         bool CreateAiVoiceViewImageView(void);
         bool CreateAiVoiceViewButton(void);
+        bool CreateAiVoiceScrollView(void);
         void CreateAiVoiceView(void);
         void ClearAll(void);
         UILabelExt *title{nullptr};
diff --git a/code/sdk/application/wearable/fd230app/nativeui/aivoice/include/AivoiceConnectTimeoutView.h b/code/sdk/application/wearable/fd230app/nativeui/aivoice/include/AivoiceConnectTimeoutView.h
new file mode 100644 (file)
index 0000000..25d25e4
--- /dev/null
@@ -0,0 +1,74 @@
+/*
+ * @Author: luozheng 1732036298@qq.com
+ * @Date: 2024-06-22 16:46:26
+ * @LastEditors: luozheng 1732036298@qq.com
+ * @LastEditTime: 2024-06-22 17:00:33
+ * @FilePath: /FD230/code/sdk/application/wearable/fd230app/nativeui/aivoice/include/AivoiceConnectTimeoutView.h
+ */
+
+#ifndef AIVOICE_CONNECT_TIMEOUT_VIEW_H
+#define AIVOICE_CONNECT_TIMEOUT_VIEW_H
+
+#include "components/ui_scroll_view.h"
+#include "components/ui_label_ext.h"
+#include "components/ui_button.h"
+#include "components/ui_image_view.h"
+
+namespace OHOS
+{
+    static constexpr const char *AIVOICECONNECTTIMEOUT_ENSURE_BUTTON_VIEW_ID = "AivoiceConnectTimeoutEnsureButton"; // 连接超时界面确定按钮
+
+    class AivoiceConnectTimeoutView
+    {
+    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 ButtonConfig
+        {
+            int16_t x;
+            int16_t y;
+            int16_t w;
+            int16_t h;
+            const char *ViewId;
+        };
+
+        struct ImageConfig
+        {
+            int16_t x;
+            int16_t y;
+            int16_t w;
+            int16_t h;
+        };
+
+        AivoiceConnectTimeoutView();
+        ~AivoiceConnectTimeoutView();
+        static AivoiceConnectTimeoutView *GetInstance(void);
+        UIScrollView *CreateAivoiceConnectTimeoutView(void);
+
+    private:
+        void ClearAll(void);
+        UILabelExt *AivoiceConnectTimeoutLabelInit(LabelConfig &labelconfig);
+        UIButton *AivoiceConnectTimeoutButtonInit(ButtonConfig &buttonconfig);
+        UIImageView *AivoiceConnectTimeoutImageInit(ImageConfig &imageconfig);
+        bool CreateAivoiceConnectTimeoutLabel(void);
+        bool CreateAivoiceConnectTimeoutButton(void);
+        bool CreateAivoiceConnectTimeoutImage(void);
+        bool CreateAivoiceConnectTimeoutScrollView(void);
+        UIScrollView *scrollView{nullptr};
+        UILabelExt *title{nullptr};
+        UIImageView *attentionImage{nullptr};
+        UILabelExt *label[2]{nullptr};
+        UILabelExt *ensure{nullptr};
+        UIButton *ensureButton{nullptr};
+    };
+}
+#endif
diff --git a/code/sdk/application/wearable/fd230app/nativeui/aivoice/include/AivoiceListeningView.h b/code/sdk/application/wearable/fd230app/nativeui/aivoice/include/AivoiceListeningView.h
new file mode 100644 (file)
index 0000000..522b6ec
--- /dev/null
@@ -0,0 +1,73 @@
+/*
+ * @Author: luozheng 1732036298@qq.com
+ * @Date: 2024-06-22 16:46:26
+ * @LastEditors: luozheng 1732036298@qq.com
+ * @LastEditTime: 2024-06-22 17:41:04
+ * @FilePath: /FD230/code/sdk/application/wearable/fd230app/nativeui/aivoice/include/AivoiceListeningView.h
+ */
+
+#ifndef AIVOICE_LISTENING_VIEW_H
+#define AIVOICE_LISTENING_VIEW_H
+
+#include "components/ui_scroll_view.h"
+#include "components/ui_label_ext.h"
+#include "components/ui_button.h"
+#include "components/ui_image_view.h"
+
+namespace OHOS
+{
+    static constexpr const char *FINISH_SPEAKING_BUTTON_VIEW_ID = "FinishSpeakingButton"; // 聆听中界面说话完毕按钮
+
+    class AivoiceListeningView
+    {
+    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 ButtonConfig
+        {
+            int16_t x;
+            int16_t y;
+            int16_t w;
+            int16_t h;
+            const char *ViewId;
+        };
+
+        struct ImageConfig
+        {
+            int16_t x;
+            int16_t y;
+            int16_t w;
+            int16_t h;
+        };
+
+        AivoiceListeningView();
+        ~AivoiceListeningView();
+        static AivoiceListeningView *GetInstance(void);
+        UIScrollView *CreateAivoiceListeningView(void);
+
+    private:
+        void ClearAll(void);
+        UILabelExt *AivoiceListeningLabelInit(LabelConfig &labelconfig);
+        UIButton *AivoiceListeningButtonInit(ButtonConfig &buttonconfig);
+        UIImageView *AivoiceListeningImageInit(ImageConfig &imageconfig);
+        bool CreateAivoiceListeningLabel(void);
+        bool CreateAivoiceListeningButton(void);
+        bool CreateAivoiceListeningImage(void);
+        bool CreateAivoiceListeningScrollView(void);
+        UIScrollView *scrollView{nullptr};
+        UILabelExt *title{nullptr};
+        UIImageView *attentionImage{nullptr};
+        UILabelExt *finishSpeak{nullptr};
+        UIButton *finishSpeakButton{nullptr};
+    };
+}
+#endif
diff --git a/code/sdk/application/wearable/fd230app/nativeui/aivoice/include/AivoiceMobileDataFailedStartView.h b/code/sdk/application/wearable/fd230app/nativeui/aivoice/include/AivoiceMobileDataFailedStartView.h
new file mode 100644 (file)
index 0000000..8a1c056
--- /dev/null
@@ -0,0 +1,74 @@
+/*
+ * @Author: luozheng 1732036298@qq.com
+ * @Date: 2024-06-22 15:22:56
+ * @LastEditors: luozheng 1732036298@qq.com
+ * @LastEditTime: 2024-06-22 16:59:59
+ * @FilePath: /FD230/code/sdk/application/wearable/fd230app/nativeui/aivoice/include/AivoiceMobileDataFailedStartView.h
+ */
+
+#ifndef AIVOICE_MOBILEDATA_FAILEDSTART_VIEW_H
+#define AIVOICE_MOBILEDATA_FAILEDSTART_VIEW_H
+
+#include "components/ui_scroll_view.h"
+#include "components/ui_label_ext.h"
+#include "components/ui_button.h"
+#include "components/ui_image_view.h"
+
+namespace OHOS
+{
+    static constexpr const char *MOBILEDATAFAILEDSTART_ENSURE_BUTTON_VIEW_ID = "MobiledatafailedStartEnsureButton"; // 移动数据未开启界面的确定按钮
+
+    class AivoiceMobileDataFailedStartView
+    {
+    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 ButtonConfig
+        {
+            int16_t x;
+            int16_t y;
+            int16_t w;
+            int16_t h;
+            const char *ViewId;
+        };
+
+        struct ImageConfig
+        {
+            int16_t x;
+            int16_t y;
+            int16_t w;
+            int16_t h;
+        };
+
+        AivoiceMobileDataFailedStartView();
+        ~AivoiceMobileDataFailedStartView();
+        static AivoiceMobileDataFailedStartView *GetInstance(void);
+        UIScrollView *CreateAivoiceMobileDataFailedStartView(void);
+
+    private:
+        void ClearAll(void);
+        UILabelExt *AivoiceMobileDataFailedStartLabelInit(LabelConfig &labelconfig);
+        UIButton *AivoiceMobileDataFailedStartButtonInit(ButtonConfig &buttonconfig);
+        UIImageView *AivoiceMobileDataFailedStartImageInit(ImageConfig &imageconfig);
+        bool CreateAivoiceMobileDataFailedStartLabel(void);
+        bool CreateAivoiceMobileDataFailedStartButton(void);
+        bool CreateAivoiceMobileDataFailedStartImage(void);
+        bool CreateAivoiceMobileDataFailedStartScrollView(void);
+        UIScrollView *scrollView{nullptr};
+        UILabelExt *title{nullptr};
+        UIImageView *attentionImage{nullptr};
+        UILabelExt *label[2]{nullptr};
+        UILabelExt *ensure{nullptr};
+        UIButton *ensureButton{nullptr};
+    };
+}
+#endif
\ No newline at end of file
index e69de29..fc8bf34 100644 (file)
@@ -0,0 +1,264 @@
+/*
+ * @Author: luozheng 1732036298@qq.com
+ * @Date: 2024-05-07 11:25:58
+ * @LastEditors: luozheng 1732036298@qq.com
+ * @LastEditTime: 2024-06-22 15:34:59
+ * @FilePath: /FD230/code/sdk/application/wearable/fd230app/nativeui/AiVoice/src/AiVoiceBluetoothFailedStartView.cpp
+ */
+#include "aivoice/include/AiVoicePresenter.h"
+#include "aivoice/include/AiVoiceBluetoothFailedStartView.h"
+#include "wearable_log.h"
+#include "language/font/ui_resource_string.h"
+#include <UiConfig.h>
+namespace OHOS
+{
+
+    static AiVoiceBluetoothFailedStartView *g_pAiVoiceBluetoothFailedStartView{nullptr};
+
+    AiVoiceBluetoothFailedStartView::AiVoiceBluetoothFailedStartView()
+    {
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "AiVoiceBluetoothFailedStartView::AiVoiceBluetoothFailedStartView");
+        g_pAiVoiceBluetoothFailedStartView = this;
+    }
+
+    AiVoiceBluetoothFailedStartView::~AiVoiceBluetoothFailedStartView()
+    {
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "AiVoiceBluetoothFailedStartView::~AiVoiceBluetoothFailedStartView");
+        g_pAiVoiceBluetoothFailedStartView = nullptr;
+    }
+
+    AiVoiceBluetoothFailedStartView *AiVoiceBluetoothFailedStartView::GetInstance()
+    {
+        return g_pAiVoiceBluetoothFailedStartView;
+    }
+
+    void AiVoiceBluetoothFailedStartView::ClearAll(void)
+    {
+        WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "AiVoiceBluetoothFailedStartView::ClearAll");
+        if (scrollView != nullptr)
+        {
+            scrollView->RemoveAll();
+
+            if (title != nullptr)
+            {
+                delete title;
+                title = nullptr;
+            }
+
+            if (attentionImage != nullptr)
+            {
+                delete attentionImage;
+                attentionImage = nullptr;
+            }
+
+            for (int i = 0; i < 2; i++)
+            {
+                if (label[i] != nullptr)
+                {
+                    delete label[i];
+                    label[i];
+                }
+            }
+
+            if (ensure != nullptr)
+            {
+                delete ensure;
+                ensure = nullptr;
+            }
+
+            if (ensureButton != nullptr)
+            {
+                delete ensureButton;
+                ensureButton = nullptr;
+            }
+
+            delete scrollView;
+            scrollView = nullptr;
+        }
+    }
+
+    UILabelExt *AiVoiceBluetoothFailedStartView::AiVoiceBluetoothFailedStartLabelInit(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->SetFont(DEFAULT_VECTOR_FONT_FILENAME, labelconfig.fontSize);
+        return label;
+    }
+
+    UIButton *AiVoiceBluetoothFailedStartView::AiVoiceBluetoothFailedStartButtonInit(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, 0xff191919);
+        button->SetStyle(STYLE_BACKGROUND_OPA, 0xff);
+        button->SetStyleForState(STYLE_BACKGROUND_COLOR, 0xff383838, UIButton::PRESSED);
+
+        return button;
+    }
+
+    UIImageView *AiVoiceBluetoothFailedStartView::AiVoiceBluetoothFailedStartImageInit(ImageConfig &imageconfig)
+    {
+        UIImageView *Image = new UIImageView();
+        if (Image == nullptr)
+        {
+            return nullptr;
+        }
+        Image->SetPosition(imageconfig.x, imageconfig.y, imageconfig.w, imageconfig.h);
+        return Image;
+    }
+
+    bool AiVoiceBluetoothFailedStartView::CreateAiVoiceBluetoothFailedStartScrollView(void)
+    {
+        WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "AiVoiceBluetoothFailedStartView::CreateAiVoiceBluetoothFailedStartScrollView");
+        scrollView = new UIScrollView();
+        if (scrollView == nullptr)
+        {
+            WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "AiVoiceBluetoothFailedStartView::scrollView new fail!");
+            return false;
+        }
+        scrollView->SetPosition(0, 0, 466, 466);
+        scrollView->SetTouchable(true);
+        scrollView->SetDraggable(true);
+
+        return true;
+    }
+
+    bool AiVoiceBluetoothFailedStartView::CreateAiVoiceBluetoothFailedStartLabel(void)
+    {
+        WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "AiVoiceBluetoothFailedStartView::CreateAiVoiceBluetoothFailedStartLabel");
+        LabelConfig labelconfig = {
+            .left = 83,
+            .top = 52,
+            .width = 300,
+            .height = 35,
+            .fontSize = 30,
+            .lineHeigh = 35,
+            .textId = STR_AI_INTELLIGENT_ASSISTANT,
+            .lineBreakMode = UILabel::LINE_BREAK_MARQUEE,
+        };
+        title = AiVoiceBluetoothFailedStartLabelInit(labelconfig);
+        if (title == nullptr)
+        {
+            WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "AiVoiceBluetoothFailedStartView::title is nullptr!");
+            return false;
+        }
+        /* -------------------------------------------------------------------------- */
+        labelconfig.left = 53;
+        labelconfig.width = 360;
+        int textId[] = {STR_BOOT_FAILED, STR_ENABLE_BLUETOOTH_FIRST};
+        for (int i = 0; i < sizeof(textId) / sizeof(textId[0]); i++)
+        {
+            labelconfig.top = 222 + i * labelconfig.height;
+            labelconfig.textId = textId[i];
+            label[i] = AiVoiceBluetoothFailedStartLabelInit(labelconfig);
+            if (label[i] == nullptr)
+            {
+                WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "AiVoiceBluetoothFailedStartView::label[%d] is nullptr!", i);
+                return false;
+            }
+        }
+        /* -------------------------------------------------------------------------- */
+        labelconfig = {
+            .left = 133,
+            .top = 368,
+            .width = 200,
+            .height = 35,
+            .fontSize = 30,
+            .lineHeigh = 35,
+            .textId = STR_OK,
+            .lineBreakMode = UILabel::LINE_BREAK_MARQUEE,
+        };
+        ensure = AiVoiceBluetoothFailedStartLabelInit(labelconfig);
+        if (ensure == nullptr)
+        {
+            WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "AiVoiceBluetoothFailedStartView::ensure is nullptr!");
+            return false;
+        }
+
+        return true;
+    }
+
+    bool AiVoiceBluetoothFailedStartView::CreateAiVoiceBluetoothFailedStartButton(void)
+    {
+        WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "AiVoiceBluetoothFailedStartView::CreateAiVoiceBluetoothFailedStartButton");
+        ButtonConfig buttonconfig = {
+            .x = 93,
+            .y = 340,
+            .w = 280,
+            .h = 90,
+            .ViewId = BLUETOOTHFAILEDSTART_ENSURE_BUTTON_VIEW_ID,
+        };
+        ensureButton = AiVoiceBluetoothFailedStartButtonInit(buttonconfig);
+        if (ensureButton == nullptr)
+        {
+            WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "ensureButton new fail!");
+            return false;
+        }
+        UIView::OnClickListener *clickListener = static_cast<UIView::OnClickListener *>(AiVoicePresenter::GetInstance());
+        if (clickListener == nullptr)
+        {
+            WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "AiVoiceBluetoothFailedStartView::draglistener can not be nullptr!");
+            return false;
+        }
+        ensureButton->SetOnClickListener(clickListener);
+
+        return true;
+    }
+
+    bool AiVoiceBluetoothFailedStartView::CreateAiVoiceBluetoothFailedStartImage(void)
+    {
+        WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "AiVoiceBluetoothFailedStartView::CreateAiVoiceBluetoothFailedStartImage");
+        ImageConfig imageconfig = {
+            .x = 193,
+            .y = 120,
+            .w = 80,
+            .h = 80,
+        };
+        attentionImage = AiVoiceBluetoothFailedStartImageInit(imageconfig);
+        if (attentionImage == nullptr)
+        {
+            WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "attentionImage new fail!");
+            return false;
+        }
+        attentionImage->SetStyle(STYLE_BORDER_RADIUS, 100);
+        attentionImage->SetSrc(PNG_ATTENTION_IMAGE);
+
+        return true;
+    }
+
+    UIScrollView *AiVoiceBluetoothFailedStartView::CreateAiVoiceBluetoothFailedStartView(void)
+    {
+        WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "AiVoiceBluetoothFailedStartView::CreateAiVoiceBluetoothFailedStartView");
+        if (scrollView == nullptr)
+        {
+            if (!CreateAiVoiceBluetoothFailedStartScrollView() || !CreateAiVoiceBluetoothFailedStartLabel() ||
+                !CreateAiVoiceBluetoothFailedStartButton() || !CreateAiVoiceBluetoothFailedStartImage())
+            {
+                WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "AiVoiceBluetoothFailedStartView::CreateAiVoiceBluetoothFailedStartView fail!!");
+                return nullptr;
+            }
+            scrollView->Add(title);
+            scrollView->Add(attentionImage);
+            scrollView->Add(label[0]);
+            scrollView->Add(label[1]);
+            scrollView->Add(ensureButton);
+            scrollView->Add(ensure);
+        }
+        return scrollView;
+    }
+
+}
\ No newline at end of file
index 7de4eb6..8f0db65 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-06-20 15:25:15
+ * @LastEditTime: 2024-06-22 17:56:04
  * @FilePath: /FD230/code/sdk/application/wearable/fd230app/nativeui/aivoice/src/AiVoiceModel.cpp
  */
 #include "aivoice/include/AiVoiceModel.h"
@@ -20,4 +20,20 @@ namespace OHOS
         return instance;
     }
 
+    bool AiVoiceModel::GetBluetoothIsOpen(void)
+    {
+        return true;
+    }
+
+    bool AiVoiceModel::GetMobileDataIsOpen(void)
+    {
+        return true;
+    }
+
+    // 获取与AI模型的连接状态
+    bool AiVoiceModel::GetAiVoiceConnectStatus(void)
+    {
+        return false;
+    }
+
 }
index ec26344..8621d4d 100644 (file)
@@ -2,7 +2,7 @@
  * @Author: luozheng 1732036298@qq.com
  * @Date: 2024-06-20 15:11:17
  * @LastEditors: luozheng 1732036298@qq.com
- * @LastEditTime: 2024-06-21 21:07:51
+ * @LastEditTime: 2024-06-22 18:42:34
  * @FilePath: /FD230/code/sdk/application/wearable/fd230app/nativeui/aivoice/src/AiVoicePresenter.cpp
  */
 #include "AppViewIDs.h"
@@ -14,6 +14,8 @@
 #include <custom_utils.h>
 #include "UiConfig.h"
 #include "iostream"
+#include <string>        // For std::string
+#include <unordered_map> // For std::unordered_map
 
 namespace OHOS
 {
@@ -75,12 +77,48 @@ namespace OHOS
         WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "AiVoicePresenter::OnClick");
         std::string viewId = view.GetViewId();
 
-        if (viewId == START_CHAT_BUTTON_VIEW_ID)
+        if (viewId == START_CHAT_BUTTON_VIEW_ID) // 如果点击的是开始对话按钮
         {
-            WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "AiVoicePresenter::START_CHAT_BUTTON_VIEW_ID");
+            if (model->GetMobileDataIsOpen() == false) // 判断移动数据是否开启
+            {
+                view_->ChangeView(AIVOICE_STARTCHAT_VIEWID, AIVOICE_MOBILEDATA_FAILEDSTART_VIEWID); // 开始对话->移动数据未开启界面
+            }
+            else
+            {
+                view_->ChangeView(AIVOICE_STARTCHAT_VIEWID, AIVOICE_LISTENING_VIEWID); // 开始对话->聆听中界面
+            }
+            return true;
         }
 
-        return true;
+        if (viewId == FINISH_SPEAKING_BUTTON_VIEW_ID) // 如果点击的是说话完毕按钮
+        {
+            if (model->GetAiVoiceConnectStatus() == false) // 判断与AI模型的连接状态
+            {
+                view_->ChangeView(AIVOICE_LISTENING_VIEWID, AIVOICE_CONNECT_TIMEOUT_VIEWID); // 聆听中->连接超时界面
+            }
+            else
+            {
+                view_->ChangeView(AIVOICE_LISTENING_VIEWID, AIVOICE_THINKING_VIEWID); // 聆听中->思考中界面
+            }
+            return true;
+        }
+
+        std::unordered_map<std::string, std::pair<int16_t, int16_t>> viewIdMap = {
+            {BLUETOOTHFAILEDSTART_ENSURE_BUTTON_VIEW_ID, {AIVOICE_BLUETOOTH_FAILEDSTART_VIEWID, AIVOICE_STARTCHAT_VIEWID}},
+            {MOBILEDATAFAILEDSTART_ENSURE_BUTTON_VIEW_ID, {AIVOICE_MOBILEDATA_FAILEDSTART_VIEWID, AIVOICE_STARTCHAT_VIEWID}},
+            {AIVOICECONNECTTIMEOUT_ENSURE_BUTTON_VIEW_ID, {AIVOICE_CONNECT_TIMEOUT_VIEWID, AIVOICE_LISTENING_VIEWID}},
+        };
+        auto it = viewIdMap.find(viewId);
+        if (it != viewIdMap.end())
+        {
+            view_->ChangeView(it->second.first, it->second.second);
+            return true;
+        }
+        else
+        {
+            WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "Return false if viewId doesn't match any entry in the map");
+            return false;
+        }
     }
 
     bool AiVoicePresenter::OnDrag(UIView &view, const DragEvent &event)
@@ -98,9 +136,22 @@ namespace OHOS
     {
         UNUSED(view);
         WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "AiVoicePresenter::OnDragEnd");
+        UIScrollView *scrollView = dynamic_cast<UIScrollView *>(&view);
+        if (scrollView == nullptr)
+        {
+            return false;
+        }
+
         if (event.GetDragDirection() == DragEvent::DIRECTION_LEFT_TO_RIGHT && AiVoicePresenter::X_DRAG_FLAG)
         {
-            NativeAbility::GetInstance().Back(TransitionType::TRANSITION_BACK_TO_HEXAGONS);
+            if (scrollView == view_->GetAiVoiceScrollView(AIVOICE_STARTCHAT_VIEWID))
+            {
+                NativeAbility::GetInstance().Back(TransitionType::TRANSITION_BACK_TO_HEXAGONS);
+            }
+            else if (scrollView == view_->GetAiVoiceScrollView(AIVOICE_LISTENING_VIEWID))
+            {
+                view_->ChangeView(AIVOICE_LISTENING_VIEWID, AIVOICE_STARTCHAT_VIEWID); // 聆听中->开始对话界面
+            }
             AiVoicePresenter::X_DRAG_FLAG = false;
         }
         return true;
index c224ea9..60b37dc 100644 (file)
@@ -2,7 +2,7 @@
  * @Author: luozheng 1732036298@qq.com
  * @Date: 2024-05-07 11:25:58
  * @LastEditors: luozheng 1732036298@qq.com
- * @LastEditTime: 2024-06-21 21:07:56
+ * @LastEditTime: 2024-06-22 17:49:44
  * @FilePath: /FD230/code/sdk/application/wearable/fd230app/nativeui/AiVoice/src/AiVoiceView.cpp
  */
 #include "aivoice/include/AiVoicePresenter.h"
@@ -42,6 +42,50 @@ namespace OHOS
                 delete container_;
                 container_ = nullptr;
             }
+
+            if (AiVoiceScrollView[AIVOICE_STARTCHAT_VIEWID] != nullptr)
+            {
+                AiVoiceScrollView[AIVOICE_STARTCHAT_VIEWID]->RemoveAll();
+
+                delete title;
+                title = nullptr;
+
+                delete startChatImage;
+                startChatImage = nullptr;
+
+                delete startChatButton;
+                startChatButton = nullptr;
+
+                delete startChatLabel;
+                startChatLabel = nullptr;
+
+                delete AiVoiceScrollView[AIVOICE_STARTCHAT_VIEWID];
+                AiVoiceScrollView[AIVOICE_STARTCHAT_VIEWID] = nullptr;
+            }
+
+            if (p_AiVoiceBluetoothFailedStartView != nullptr)
+            {
+                delete p_AiVoiceBluetoothFailedStartView;
+                p_AiVoiceBluetoothFailedStartView = nullptr;
+            }
+
+            if (p_AivoiceMobileDataFailedStartView != nullptr)
+            {
+                delete p_AivoiceMobileDataFailedStartView;
+                p_AivoiceMobileDataFailedStartView = nullptr;
+            }
+
+            if (p_AivoiceConnectTimeoutView != nullptr)
+            {
+                delete p_AivoiceConnectTimeoutView;
+                p_AivoiceConnectTimeoutView = nullptr;
+            }
+
+            if (p_AivoiceListeningView != nullptr)
+            {
+                delete p_AivoiceListeningView;
+                p_AivoiceListeningView = nullptr;
+            }
         }
     }
 
@@ -73,7 +117,7 @@ namespace OHOS
         return Image;
     }
 
-    UIButton *AiVoiceView::AiVoiceViewLabelButtonInit(ButtonConfig &buttonconfig)
+    UIButton *AiVoiceView::AiVoiceViewButtonInit(ButtonConfig &buttonconfig)
     {
         UIButton *button = new UIButton();
         if (button == nullptr)
@@ -84,7 +128,7 @@ namespace OHOS
         button->SetViewId(buttonconfig.ViewId);
         button->SetStyle(STYLE_BACKGROUND_COLOR, 0xff4fc34c);
         button->SetStyle(STYLE_BACKGROUND_OPA, 0xff);
-        button->SetStyleForState(STYLE_BACKGROUND_COLOR, 0xff191919, UIButton::PRESSED);
+        button->SetStyleForState(STYLE_BACKGROUND_COLOR, 0xff383838, UIButton::PRESSED);
         button->SetOnClickListener(presenter_);
 
         return button;
@@ -92,6 +136,7 @@ namespace OHOS
 
     bool AiVoiceView::CreateAiVoiceViewLabel(void)
     {
+        WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "AiVoiceView::CreateAiVoiceViewLabel");
         LabelConfig labelConfig = {
             .left = 83,
             .top = 52,
@@ -131,6 +176,7 @@ namespace OHOS
 
     bool AiVoiceView::CreateAiVoiceViewImageView(void)
     {
+        WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "AiVoiceView::CreateAiVoiceViewImageView");
         ImageConfig imagecinfig = {
             .x = 207,
             .y = 182,
@@ -152,6 +198,7 @@ namespace OHOS
 
     bool AiVoiceView::CreateAiVoiceViewButton(void)
     {
+        WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "AiVoiceView::CreateAiVoiceViewButton");
         ButtonConfig buttonconfig = {
             .x = 93,
             .y = 340,
@@ -159,7 +206,7 @@ namespace OHOS
             .h = 90,
             .ViewId = START_CHAT_BUTTON_VIEW_ID,
         };
-        startChatButton = AiVoiceViewLabelButtonInit(buttonconfig);
+        startChatButton = AiVoiceViewButtonInit(buttonconfig);
         if (startChatButton == nullptr)
         {
             WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "startChatButton new fail!");
@@ -169,18 +216,37 @@ namespace OHOS
         return true;
     }
 
+    bool AiVoiceView::CreateAiVoiceScrollView(void)
+    {
+        WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "AiVoiceView::CreateAiVoiceScrollView");
+        AiVoiceScrollView[AIVOICE_STARTCHAT_VIEWID] = new UIScrollView();
+        if (AiVoiceScrollView[AIVOICE_STARTCHAT_VIEWID] == nullptr)
+        {
+            WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "AiVoiceView::CreateAiVoiceScrollView[AIVOICE_STARTCHAT_VIEWID] new fail!");
+            return false;
+        }
+        AiVoiceScrollView[AIVOICE_STARTCHAT_VIEWID]->SetPosition(0, 0, 466, 466);
+        AiVoiceScrollView[AIVOICE_STARTCHAT_VIEWID]->SetTouchable(true);
+        AiVoiceScrollView[AIVOICE_STARTCHAT_VIEWID]->SetDraggable(true);
+        AiVoiceScrollView[AIVOICE_STARTCHAT_VIEWID]->SetOnDragListener(presenter_);
+        container_->Add(AiVoiceScrollView[AIVOICE_STARTCHAT_VIEWID]);
+
+        return true;
+    }
+
     void AiVoiceView::CreateAiVoiceView(void)
     {
         WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "AiVoiceView::CreateAiVoiceView");
-        if (!CreateAiVoiceViewLabel() || !CreateAiVoiceViewImageView() || !CreateAiVoiceViewButton())
+        if (!CreateAiVoiceScrollView() || !CreateAiVoiceViewLabel() ||
+            !CreateAiVoiceViewImageView() || !CreateAiVoiceViewButton())
         {
             WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "AiVoiceView::CreateAiVoiceView fail!");
             return;
         }
-        container_->Add(title);
-        container_->Add(startChatImage);
-        container_->Add(startChatButton);
-        container_->Add(startChatLabel);
+        AiVoiceScrollView[AIVOICE_STARTCHAT_VIEWID]->Add(title);
+        AiVoiceScrollView[AIVOICE_STARTCHAT_VIEWID]->Add(startChatImage);
+        AiVoiceScrollView[AIVOICE_STARTCHAT_VIEWID]->Add(startChatButton);
+        AiVoiceScrollView[AIVOICE_STARTCHAT_VIEWID]->Add(startChatLabel);
     }
 
     void AiVoiceView::OnStart()
@@ -194,7 +260,6 @@ namespace OHOS
             return;
         }
         container_->SetPosition(0, 0, Screen::GetInstance().GetWidth(), Screen::GetInstance().GetHeight());
-        container_->SetOnDragListener(presenter_);
         container_->SetTouchable(true);
         container_->SetDraggable(true);
 
@@ -247,7 +312,17 @@ namespace OHOS
     bool AiVoiceView::ChangeAiVoiceBluetoothFailedStartView(int16_t thisView)
     {
         WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "AiVoiceView::ChangeAiVoiceBluetoothFailedStartView");
-
+        if (AiVoiceScrollView[thisView] == nullptr)
+        {
+            p_AiVoiceBluetoothFailedStartView = new AiVoiceBluetoothFailedStartView();
+            if (p_AiVoiceBluetoothFailedStartView == nullptr)
+            {
+                WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "new AiVoiceScrollView[AIVOICE_STARTCHAT_VIEWID][%d] fail", thisView);
+                return false;
+            }
+            AiVoiceScrollView[thisView] = p_AiVoiceBluetoothFailedStartView->CreateAiVoiceBluetoothFailedStartView();
+            container_->Add(AiVoiceScrollView[thisView]);
+        }
         return true;
     }
 
@@ -255,7 +330,17 @@ namespace OHOS
     bool AiVoiceView::ChangeAiVoiceMobileDataFailedStartView(int16_t thisView)
     {
         WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "AiVoiceView::ChangeAiVoiceMobileDataFailedStartView");
-
+        if (AiVoiceScrollView[thisView] == nullptr)
+        {
+            p_AivoiceMobileDataFailedStartView = new AivoiceMobileDataFailedStartView();
+            if (p_AivoiceMobileDataFailedStartView == nullptr)
+            {
+                WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "new AiVoiceScrollView[AIVOICE_STARTCHAT_VIEWID][%d] fail", thisView);
+                return false;
+            }
+            AiVoiceScrollView[thisView] = p_AivoiceMobileDataFailedStartView->CreateAivoiceMobileDataFailedStartView();
+            container_->Add(AiVoiceScrollView[thisView]);
+        }
         return true;
     }
 
@@ -263,6 +348,17 @@ namespace OHOS
     bool AiVoiceView::ChangeAiVoicConnectTimeoutView(int16_t thisView)
     {
         WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "AiVoiceView::ChangeAiVoicConnectTimeoutView");
+        if (AiVoiceScrollView[thisView] == nullptr)
+        {
+            p_AivoiceConnectTimeoutView = new AivoiceConnectTimeoutView();
+            if (p_AivoiceConnectTimeoutView == nullptr)
+            {
+                WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "new AiVoiceScrollView[AIVOICE_STARTCHAT_VIEWID][%d] fail", thisView);
+                return false;
+            }
+            AiVoiceScrollView[thisView] = p_AivoiceConnectTimeoutView->CreateAivoiceConnectTimeoutView();
+            container_->Add(AiVoiceScrollView[thisView]);
+        }
 
         return true;
     }
@@ -271,7 +367,17 @@ namespace OHOS
     bool AiVoiceView::ChangeAiVoicListeningView(int16_t thisView)
     {
         WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "AiVoiceView::ChangeAiVoicListeningView");
-
+        if (AiVoiceScrollView[thisView] == nullptr)
+        {
+            p_AivoiceListeningView = new AivoiceListeningView();
+            if (p_AivoiceListeningView == nullptr)
+            {
+                WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "new AiVoiceScrollView[AIVOICE_STARTCHAT_VIEWID][%d] fail", thisView);
+                return false;
+            }
+            AiVoiceScrollView[thisView] = p_AivoiceListeningView->CreateAivoiceListeningView();
+            container_->Add(AiVoiceScrollView[thisView]);
+        }
         return true;
     }
 
@@ -339,4 +445,18 @@ namespace OHOS
         AiVoiceScrollView[showView]->SetVisible(true);
         Draw();
     }
+
+    UIScrollView *AiVoiceView::GetAiVoiceScrollView(int16_t index)
+    {
+        WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "AiVoiceView::GetAiVoiceScrollView");
+        if (AIVOICE_STARTCHAT_VIEWID <= index < MAX_AIVOICE_VIEWID)
+        {
+            return AiVoiceScrollView[index];
+        }
+        else
+        {
+            WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "Overstep ones bounds");
+            return nullptr;
+        }
+    }
 }
\ No newline at end of file
diff --git a/code/sdk/application/wearable/fd230app/nativeui/aivoice/src/AivoiceConnectTimeoutView.cpp b/code/sdk/application/wearable/fd230app/nativeui/aivoice/src/AivoiceConnectTimeoutView.cpp
new file mode 100644 (file)
index 0000000..5ed58f9
--- /dev/null
@@ -0,0 +1,264 @@
+/*
+ * @Author: luozheng 1732036298@qq.com
+ * @Date: 2024-05-07 11:25:58
+ * @LastEditors: luozheng 1732036298@qq.com
+ * @LastEditTime: 2024-06-22 16:49:46
+ * @FilePath: /FD230/code/sdk/application/wearable/fd230app/nativeui/AiVoice/src/AivoiceConnectTimeoutView.cpp
+ */
+#include "aivoice/include/AiVoicePresenter.h"
+#include "aivoice/include/AivoiceConnectTimeoutView.h"
+#include "wearable_log.h"
+#include "language/font/ui_resource_string.h"
+#include <UiConfig.h>
+namespace OHOS
+{
+
+    static AivoiceConnectTimeoutView *g_pAivoiceConnectTimeoutView{nullptr};
+
+    AivoiceConnectTimeoutView::AivoiceConnectTimeoutView()
+    {
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "AivoiceConnectTimeoutView::AivoiceConnectTimeoutView");
+        g_pAivoiceConnectTimeoutView = this;
+    }
+
+    AivoiceConnectTimeoutView::~AivoiceConnectTimeoutView()
+    {
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "AivoiceConnectTimeoutView::~AivoiceConnectTimeoutView");
+        g_pAivoiceConnectTimeoutView = nullptr;
+    }
+
+    AivoiceConnectTimeoutView *AivoiceConnectTimeoutView::GetInstance()
+    {
+        return g_pAivoiceConnectTimeoutView;
+    }
+
+    void AivoiceConnectTimeoutView::ClearAll(void)
+    {
+        WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "AivoiceConnectTimeoutView::ClearAll");
+        if (scrollView != nullptr)
+        {
+            scrollView->RemoveAll();
+
+            if (title != nullptr)
+            {
+                delete title;
+                title = nullptr;
+            }
+
+            if (attentionImage != nullptr)
+            {
+                delete attentionImage;
+                attentionImage = nullptr;
+            }
+
+            for (int i = 0; i < 2; i++)
+            {
+                if (label[i] != nullptr)
+                {
+                    delete label[i];
+                    label[i];
+                }
+            }
+
+            if (ensure != nullptr)
+            {
+                delete ensure;
+                ensure = nullptr;
+            }
+
+            if (ensureButton != nullptr)
+            {
+                delete ensureButton;
+                ensureButton = nullptr;
+            }
+
+            delete scrollView;
+            scrollView = nullptr;
+        }
+    }
+
+    UILabelExt *AivoiceConnectTimeoutView::AivoiceConnectTimeoutLabelInit(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->SetFont(DEFAULT_VECTOR_FONT_FILENAME, labelconfig.fontSize);
+        return label;
+    }
+
+    UIButton *AivoiceConnectTimeoutView::AivoiceConnectTimeoutButtonInit(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, 0xff191919);
+        button->SetStyle(STYLE_BACKGROUND_OPA, 0xff);
+        button->SetStyleForState(STYLE_BACKGROUND_COLOR, 0xff383838, UIButton::PRESSED);
+
+        return button;
+    }
+
+    UIImageView *AivoiceConnectTimeoutView::AivoiceConnectTimeoutImageInit(ImageConfig &imageconfig)
+    {
+        UIImageView *Image = new UIImageView();
+        if (Image == nullptr)
+        {
+            return nullptr;
+        }
+        Image->SetPosition(imageconfig.x, imageconfig.y, imageconfig.w, imageconfig.h);
+        return Image;
+    }
+
+    bool AivoiceConnectTimeoutView::CreateAivoiceConnectTimeoutScrollView(void)
+    {
+        WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "AivoiceConnectTimeoutView::CreateAivoiceConnectTimeoutScrollView");
+        scrollView = new UIScrollView();
+        if (scrollView == nullptr)
+        {
+            WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "AivoiceConnectTimeoutView::scrollView new fail!");
+            return false;
+        }
+        scrollView->SetPosition(0, 0, 466, 466);
+        scrollView->SetTouchable(true);
+        scrollView->SetDraggable(true);
+
+        return true;
+    }
+
+    bool AivoiceConnectTimeoutView::CreateAivoiceConnectTimeoutLabel(void)
+    {
+        WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "AivoiceConnectTimeoutView::CreateAivoiceConnectTimeoutLabel");
+        LabelConfig labelconfig = {
+            .left = 83,
+            .top = 52,
+            .width = 300,
+            .height = 35,
+            .fontSize = 30,
+            .lineHeigh = 35,
+            .textId = STR_AI_INTELLIGENT_ASSISTANT,
+            .lineBreakMode = UILabel::LINE_BREAK_MARQUEE,
+        };
+        title = AivoiceConnectTimeoutLabelInit(labelconfig);
+        if (title == nullptr)
+        {
+            WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "AivoiceConnectTimeoutView::title is nullptr!");
+            return false;
+        }
+        /* -------------------------------------------------------------------------- */
+        labelconfig.left = 53;
+        labelconfig.width = 360;
+        int textId[] = {STR_CONNECT_TIMEOUT, STR_PLEASE_RESTART_CHAT};
+        for (int i = 0; i < sizeof(textId) / sizeof(textId[0]); i++)
+        {
+            labelconfig.top = 222 + i * labelconfig.height;
+            labelconfig.textId = textId[i];
+            label[i] = AivoiceConnectTimeoutLabelInit(labelconfig);
+            if (label[i] == nullptr)
+            {
+                WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "AivoiceConnectTimeoutView::label[%d] is nullptr!", i);
+                return false;
+            }
+        }
+        /* -------------------------------------------------------------------------- */
+        labelconfig = {
+            .left = 133,
+            .top = 368,
+            .width = 200,
+            .height = 35,
+            .fontSize = 30,
+            .lineHeigh = 35,
+            .textId = STR_OK,
+            .lineBreakMode = UILabel::LINE_BREAK_MARQUEE,
+        };
+        ensure = AivoiceConnectTimeoutLabelInit(labelconfig);
+        if (ensure == nullptr)
+        {
+            WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "AivoiceConnectTimeoutView::ensure is nullptr!");
+            return false;
+        }
+
+        return true;
+    }
+
+    bool AivoiceConnectTimeoutView::CreateAivoiceConnectTimeoutButton(void)
+    {
+        WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "AivoiceConnectTimeoutView::CreateAivoiceConnectTimeoutButton");
+        ButtonConfig buttonconfig = {
+            .x = 93,
+            .y = 340,
+            .w = 280,
+            .h = 90,
+            .ViewId = AIVOICECONNECTTIMEOUT_ENSURE_BUTTON_VIEW_ID,
+        };
+        ensureButton = AivoiceConnectTimeoutButtonInit(buttonconfig);
+        if (ensureButton == nullptr)
+        {
+            WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "ensureButton new fail!");
+            return false;
+        }
+        UIView::OnClickListener *clickListener = static_cast<UIView::OnClickListener *>(AiVoicePresenter::GetInstance());
+        if (clickListener == nullptr)
+        {
+            WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "AivoiceConnectTimeoutView::draglistener can not be nullptr!");
+            return false;
+        }
+        ensureButton->SetOnClickListener(clickListener);
+
+        return true;
+    }
+
+    bool AivoiceConnectTimeoutView::CreateAivoiceConnectTimeoutImage(void)
+    {
+        WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "AivoiceConnectTimeoutView::CreateAivoiceConnectTimeoutImage");
+        ImageConfig imageconfig = {
+            .x = 193,
+            .y = 120,
+            .w = 80,
+            .h = 80,
+        };
+        attentionImage = AivoiceConnectTimeoutImageInit(imageconfig);
+        if (attentionImage == nullptr)
+        {
+            WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "attentionImage new fail!");
+            return false;
+        }
+        attentionImage->SetStyle(STYLE_BORDER_RADIUS, 100);
+        attentionImage->SetSrc(PNG_ATTENTION_IMAGE);
+
+        return true;
+    }
+
+    UIScrollView *AivoiceConnectTimeoutView::CreateAivoiceConnectTimeoutView(void)
+    {
+        WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "AivoiceConnectTimeoutView::CreateAivoiceConnectTimeoutView");
+        if (scrollView == nullptr)
+        {
+            if (!CreateAivoiceConnectTimeoutScrollView() || !CreateAivoiceConnectTimeoutLabel() ||
+                !CreateAivoiceConnectTimeoutButton() || !CreateAivoiceConnectTimeoutImage())
+            {
+                WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "AivoiceConnectTimeoutView::CreateAivoiceConnectTimeoutView fail!!");
+                return nullptr;
+            }
+            scrollView->Add(title);
+            scrollView->Add(attentionImage);
+            scrollView->Add(label[0]);
+            scrollView->Add(label[1]);
+            scrollView->Add(ensureButton);
+            scrollView->Add(ensure);
+        }
+        return scrollView;
+    }
+
+}
\ No newline at end of file
diff --git a/code/sdk/application/wearable/fd230app/nativeui/aivoice/src/AivoiceListeningView.cpp b/code/sdk/application/wearable/fd230app/nativeui/aivoice/src/AivoiceListeningView.cpp
new file mode 100644 (file)
index 0000000..0472c57
--- /dev/null
@@ -0,0 +1,245 @@
+/*
+ * @Author: luozheng 1732036298@qq.com
+ * @Date: 2024-05-07 11:25:58
+ * @LastEditors: luozheng 1732036298@qq.com
+ * @LastEditTime: 2024-06-22 17:47:58
+ * @FilePath: /FD230/code/sdk/application/wearable/fd230app/nativeui/AiVoice/src/AivoiceListeningView.cpp
+ */
+#include "aivoice/include/AiVoicePresenter.h"
+#include "aivoice/include/AivoiceListeningView.h"
+#include "wearable_log.h"
+#include "language/font/ui_resource_string.h"
+#include <UiConfig.h>
+namespace OHOS
+{
+
+    static AivoiceListeningView *g_pAivoiceListeningView{nullptr};
+
+    AivoiceListeningView::AivoiceListeningView()
+    {
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "AivoiceListeningView::AivoiceListeningView");
+        g_pAivoiceListeningView = this;
+    }
+
+    AivoiceListeningView::~AivoiceListeningView()
+    {
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "AivoiceListeningView::~AivoiceListeningView");
+        g_pAivoiceListeningView = nullptr;
+    }
+
+    AivoiceListeningView *AivoiceListeningView::GetInstance()
+    {
+        return g_pAivoiceListeningView;
+    }
+
+    void AivoiceListeningView::ClearAll(void)
+    {
+        WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "AivoiceListeningView::ClearAll");
+        if (scrollView != nullptr)
+        {
+            scrollView->RemoveAll();
+
+            if (title != nullptr)
+            {
+                delete title;
+                title = nullptr;
+            }
+
+            if (attentionImage != nullptr)
+            {
+                delete attentionImage;
+                attentionImage = nullptr;
+            }
+
+            if (finishSpeak != nullptr)
+            {
+                delete finishSpeak;
+                finishSpeak = nullptr;
+            }
+
+            if (finishSpeakButton != nullptr)
+            {
+                delete finishSpeakButton;
+                finishSpeakButton = nullptr;
+            }
+
+            delete scrollView;
+            scrollView = nullptr;
+        }
+    }
+
+    UILabelExt *AivoiceListeningView::AivoiceListeningLabelInit(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->SetFont(DEFAULT_VECTOR_FONT_FILENAME, labelconfig.fontSize);
+        return label;
+    }
+
+    UIButton *AivoiceListeningView::AivoiceListeningButtonInit(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, 0xff191919);
+        button->SetStyle(STYLE_BACKGROUND_OPA, 0xff);
+        button->SetStyleForState(STYLE_BACKGROUND_COLOR, 0xff383838, UIButton::PRESSED);
+
+        return button;
+    }
+
+    UIImageView *AivoiceListeningView::AivoiceListeningImageInit(ImageConfig &imageconfig)
+    {
+        UIImageView *Image = new UIImageView();
+        if (Image == nullptr)
+        {
+            return nullptr;
+        }
+        Image->SetPosition(imageconfig.x, imageconfig.y, imageconfig.w, imageconfig.h);
+        return Image;
+    }
+
+    bool AivoiceListeningView::CreateAivoiceListeningScrollView(void)
+    {
+        WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "AivoiceListeningView::CreateAivoiceListeningScrollView");
+        scrollView = new UIScrollView();
+        if (scrollView == nullptr)
+        {
+            WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "AivoiceListeningView::scrollView new fail!");
+            return false;
+        }
+        scrollView->SetPosition(0, 0, 466, 466);
+        UIView::OnDragListener *dragListener = static_cast<UIView::OnDragListener *>(AiVoicePresenter::GetInstance());
+        if (dragListener == nullptr)
+        {
+            WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "AivoiceListeningView::dragListener new fail!");
+            return false;
+        }
+        scrollView->SetOnDragListener(dragListener);
+        scrollView->SetTouchable(true);
+        scrollView->SetDraggable(true);
+
+        return true;
+    }
+
+    bool AivoiceListeningView::CreateAivoiceListeningLabel(void)
+    {
+        WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "AivoiceListeningView::CreateAivoiceListeningLabel");
+        LabelConfig labelconfig = {
+            .left = 83,
+            .top = 52,
+            .width = 300,
+            .height = 35,
+            .fontSize = 30,
+            .lineHeigh = 35,
+            .textId = STR_LISTENING,
+            .lineBreakMode = UILabel::LINE_BREAK_MARQUEE,
+        };
+        title = AivoiceListeningLabelInit(labelconfig);
+        if (title == nullptr)
+        {
+            WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "AivoiceListeningView::title is nullptr!");
+            return false;
+        }
+        /* -------------------------------------------------------------------------- */
+        labelconfig = {
+            .left = 133,
+            .top = 368,
+            .width = 200,
+            .height = 35,
+            .fontSize = 30,
+            .lineHeigh = 35,
+            .textId = STR_FINISH_SPEAKING,
+            .lineBreakMode = UILabel::LINE_BREAK_MARQUEE,
+        };
+        finishSpeak = AivoiceListeningLabelInit(labelconfig);
+        if (finishSpeak == nullptr)
+        {
+            WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "AivoiceListeningView::finishSpeak is nullptr!");
+            return false;
+        }
+
+        return true;
+    }
+
+    bool AivoiceListeningView::CreateAivoiceListeningButton(void)
+    {
+        WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "AivoiceListeningView::CreateAivoiceListeningButton");
+        ButtonConfig buttonconfig = {
+            .x = 93,
+            .y = 340,
+            .w = 280,
+            .h = 90,
+            .ViewId = FINISH_SPEAKING_BUTTON_VIEW_ID,
+        };
+        finishSpeakButton = AivoiceListeningButtonInit(buttonconfig);
+        if (finishSpeakButton == nullptr)
+        {
+            WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "finishSpeakButton new fail!");
+            return false;
+        }
+        UIView::OnClickListener *clickListener = static_cast<UIView::OnClickListener *>(AiVoicePresenter::GetInstance());
+        if (clickListener == nullptr)
+        {
+            WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "AivoiceListeningView::draglistener can not be nullptr!");
+            return false;
+        }
+        finishSpeakButton->SetOnClickListener(clickListener);
+
+        return true;
+    }
+
+    bool AivoiceListeningView::CreateAivoiceListeningImage(void)
+    {
+        WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "AivoiceListeningView::CreateAivoiceListeningImage");
+        ImageConfig imageconfig = {
+            .x = 193,
+            .y = 120,
+            .w = 80,
+            .h = 80,
+        };
+        attentionImage = AivoiceListeningImageInit(imageconfig);
+        if (attentionImage == nullptr)
+        {
+            WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "attentionImage new fail!");
+            return false;
+        }
+        attentionImage->SetStyle(STYLE_BORDER_RADIUS, 100);
+        attentionImage->SetSrc(PNG_ATTENTION_IMAGE);
+
+        return true;
+    }
+
+    UIScrollView *AivoiceListeningView::CreateAivoiceListeningView(void)
+    {
+        WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "AivoiceListeningView::CreateAivoiceListeningView");
+        if (scrollView == nullptr)
+        {
+            if (!CreateAivoiceListeningScrollView() || !CreateAivoiceListeningLabel() ||
+                !CreateAivoiceListeningButton() || !CreateAivoiceListeningImage())
+            {
+                WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "AivoiceListeningView::CreateAivoiceListeningView fail!!");
+                return nullptr;
+            }
+            scrollView->Add(title);
+            scrollView->Add(attentionImage);
+            scrollView->Add(finishSpeakButton);
+            scrollView->Add(finishSpeak);
+        }
+        return scrollView;
+    }
+
+}
\ No newline at end of file
diff --git a/code/sdk/application/wearable/fd230app/nativeui/aivoice/src/AivoiceMobileDataFailedStartView.cpp b/code/sdk/application/wearable/fd230app/nativeui/aivoice/src/AivoiceMobileDataFailedStartView.cpp
new file mode 100644 (file)
index 0000000..02f8719
--- /dev/null
@@ -0,0 +1,264 @@
+/*
+ * @Author: luozheng 1732036298@qq.com
+ * @Date: 2024-05-07 11:25:58
+ * @LastEditors: luozheng 1732036298@qq.com
+ * @LastEditTime: 2024-06-22 15:38:12
+ * @FilePath: /FD230/code/sdk/application/wearable/fd230app/nativeui/AiVoice/src/AivoiceMobileDataFailedStartView.cpp
+ */
+#include "aivoice/include/AiVoicePresenter.h"
+#include "aivoice/include/AivoiceMobileDataFailedStartView.h"
+#include "wearable_log.h"
+#include "language/font/ui_resource_string.h"
+#include <UiConfig.h>
+namespace OHOS
+{
+
+    static AivoiceMobileDataFailedStartView *g_pAivoiceMobileDataFailedStartView{nullptr};
+
+    AivoiceMobileDataFailedStartView::AivoiceMobileDataFailedStartView()
+    {
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "AivoiceMobileDataFailedStartView::AivoiceMobileDataFailedStartView");
+        g_pAivoiceMobileDataFailedStartView = this;
+    }
+
+    AivoiceMobileDataFailedStartView::~AivoiceMobileDataFailedStartView()
+    {
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "AivoiceMobileDataFailedStartView::~AivoiceMobileDataFailedStartView");
+        g_pAivoiceMobileDataFailedStartView = nullptr;
+    }
+
+    AivoiceMobileDataFailedStartView *AivoiceMobileDataFailedStartView::GetInstance()
+    {
+        return g_pAivoiceMobileDataFailedStartView;
+    }
+
+    void AivoiceMobileDataFailedStartView::ClearAll(void)
+    {
+        WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "AivoiceMobileDataFailedStartView::ClearAll");
+        if (scrollView != nullptr)
+        {
+            scrollView->RemoveAll();
+
+            if (title != nullptr)
+            {
+                delete title;
+                title = nullptr;
+            }
+
+            if (attentionImage != nullptr)
+            {
+                delete attentionImage;
+                attentionImage = nullptr;
+            }
+
+            for (int i = 0; i < 2; i++)
+            {
+                if (label[i] != nullptr)
+                {
+                    delete label[i];
+                    label[i];
+                }
+            }
+
+            if (ensure != nullptr)
+            {
+                delete ensure;
+                ensure = nullptr;
+            }
+
+            if (ensureButton != nullptr)
+            {
+                delete ensureButton;
+                ensureButton = nullptr;
+            }
+
+            delete scrollView;
+            scrollView = nullptr;
+        }
+    }
+
+    UILabelExt *AivoiceMobileDataFailedStartView::AivoiceMobileDataFailedStartLabelInit(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->SetFont(DEFAULT_VECTOR_FONT_FILENAME, labelconfig.fontSize);
+        return label;
+    }
+
+    UIButton *AivoiceMobileDataFailedStartView::AivoiceMobileDataFailedStartButtonInit(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, 0xff191919);
+        button->SetStyle(STYLE_BACKGROUND_OPA, 0xff);
+        button->SetStyleForState(STYLE_BACKGROUND_COLOR, 0xff383838, UIButton::PRESSED);
+
+        return button;
+    }
+
+    UIImageView *AivoiceMobileDataFailedStartView::AivoiceMobileDataFailedStartImageInit(ImageConfig &imageconfig)
+    {
+        UIImageView *Image = new UIImageView();
+        if (Image == nullptr)
+        {
+            return nullptr;
+        }
+        Image->SetPosition(imageconfig.x, imageconfig.y, imageconfig.w, imageconfig.h);
+        return Image;
+    }
+
+    bool AivoiceMobileDataFailedStartView::CreateAivoiceMobileDataFailedStartScrollView(void)
+    {
+        WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "AivoiceMobileDataFailedStartView::CreateAivoiceMobileDataFailedStartScrollView");
+        scrollView = new UIScrollView();
+        if (scrollView == nullptr)
+        {
+            WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "AivoiceMobileDataFailedStartView::scrollView new fail!");
+            return false;
+        }
+        scrollView->SetPosition(0, 0, 466, 466);
+        scrollView->SetTouchable(true);
+        scrollView->SetDraggable(true);
+
+        return true;
+    }
+
+    bool AivoiceMobileDataFailedStartView::CreateAivoiceMobileDataFailedStartLabel(void)
+    {
+        WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "AivoiceMobileDataFailedStartView::CreateAivoiceMobileDataFailedStartLabel");
+        LabelConfig labelconfig = {
+            .left = 83,
+            .top = 52,
+            .width = 300,
+            .height = 35,
+            .fontSize = 30,
+            .lineHeigh = 35,
+            .textId = STR_AI_INTELLIGENT_ASSISTANT,
+            .lineBreakMode = UILabel::LINE_BREAK_MARQUEE,
+        };
+        title = AivoiceMobileDataFailedStartLabelInit(labelconfig);
+        if (title == nullptr)
+        {
+            WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "AivoiceMobileDataFailedStartView::title is nullptr!");
+            return false;
+        }
+        /* -------------------------------------------------------------------------- */
+        labelconfig.left = 53;
+        labelconfig.width = 360;
+        int textId[] = {STR_BOOT_FAILED, STR_ENABLE_MOBILE_DATA_FIRST};
+        for (int i = 0; i < sizeof(textId) / sizeof(textId[0]); i++)
+        {
+            labelconfig.top = 222 + i * labelconfig.height;
+            labelconfig.textId = textId[i];
+            label[i] = AivoiceMobileDataFailedStartLabelInit(labelconfig);
+            if (label[i] == nullptr)
+            {
+                WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "AivoiceMobileDataFailedStartView::label[%d] is nullptr!", i);
+                return false;
+            }
+        }
+        /* -------------------------------------------------------------------------- */
+        labelconfig = {
+            .left = 133,
+            .top = 368,
+            .width = 200,
+            .height = 35,
+            .fontSize = 30,
+            .lineHeigh = 35,
+            .textId = STR_OK,
+            .lineBreakMode = UILabel::LINE_BREAK_MARQUEE,
+        };
+        ensure = AivoiceMobileDataFailedStartLabelInit(labelconfig);
+        if (ensure == nullptr)
+        {
+            WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "AivoiceMobileDataFailedStartView::ensure is nullptr!");
+            return false;
+        }
+
+        return true;
+    }
+
+    bool AivoiceMobileDataFailedStartView::CreateAivoiceMobileDataFailedStartButton(void)
+    {
+        WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "AivoiceMobileDataFailedStartView::CreateAivoiceMobileDataFailedStartButton");
+        ButtonConfig buttonconfig = {
+            .x = 93,
+            .y = 340,
+            .w = 280,
+            .h = 90,
+            .ViewId = MOBILEDATAFAILEDSTART_ENSURE_BUTTON_VIEW_ID,
+        };
+        ensureButton = AivoiceMobileDataFailedStartButtonInit(buttonconfig);
+        if (ensureButton == nullptr)
+        {
+            WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "ensureButton new fail!");
+            return false;
+        }
+        UIView::OnClickListener *clickListener = static_cast<UIView::OnClickListener *>(AiVoicePresenter::GetInstance());
+        if (clickListener == nullptr)
+        {
+            WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "AivoiceMobileDataFailedStartView::draglistener can not be nullptr!");
+            return false;
+        }
+        ensureButton->SetOnClickListener(clickListener);
+
+        return true;
+    }
+
+    bool AivoiceMobileDataFailedStartView::CreateAivoiceMobileDataFailedStartImage(void)
+    {
+        WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "AivoiceMobileDataFailedStartView::CreateAivoiceMobileDataFailedStartImage");
+        ImageConfig imageconfig = {
+            .x = 193,
+            .y = 120,
+            .w = 80,
+            .h = 80,
+        };
+        attentionImage = AivoiceMobileDataFailedStartImageInit(imageconfig);
+        if (attentionImage == nullptr)
+        {
+            WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "attentionImage new fail!");
+            return false;
+        }
+        attentionImage->SetStyle(STYLE_BORDER_RADIUS, 100);
+        attentionImage->SetSrc(PNG_ATTENTION_IMAGE);
+
+        return true;
+    }
+
+    UIScrollView *AivoiceMobileDataFailedStartView::CreateAivoiceMobileDataFailedStartView(void)
+    {
+        WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "AivoiceMobileDataFailedStartView::CreateAivoiceMobileDataFailedStartView");
+        if (scrollView == nullptr)
+        {
+            if (!CreateAivoiceMobileDataFailedStartScrollView() || !CreateAivoiceMobileDataFailedStartLabel() ||
+                !CreateAivoiceMobileDataFailedStartButton() || !CreateAivoiceMobileDataFailedStartImage())
+            {
+                WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "AivoiceMobileDataFailedStartView::CreateAivoiceMobileDataFailedStartView fail!!");
+                return nullptr;
+            }
+            scrollView->Add(title);
+            scrollView->Add(attentionImage);
+            scrollView->Add(label[0]);
+            scrollView->Add(label[1]);
+            scrollView->Add(ensureButton);
+            scrollView->Add(ensure);
+        }
+        return scrollView;
+    }
+
+}
\ No newline at end of file