From 3fa8bb355d1087ff238f49815d041cc2ce3a11aa Mon Sep 17 00:00:00 2001 From: luozheng <1732036298@qq.com> Date: Thu, 26 Sep 2024 20:41:55 +0800 Subject: [PATCH] =?utf8?q?1.=E4=BF=AE=E6=94=B9UILabel=E7=9A=84WRAP?= =?utf8?q?=E8=87=AA=E5=8A=A8=E6=8D=A2=E8=A1=8CMAX=E6=95=B0=E9=87=8F?= =?utf8?q?=E4=BB=8E50->120=EF=BC=8C=E4=BF=AE=E6=94=B9=E6=96=87=E4=BB=B6?= =?utf8?q?=E4=B8=BAtext.h,=E8=A1=8C=E6=95=B0355=202.AI=E8=81=86=E5=90=AC?= =?utf8?q?=E7=95=8C=E9=9D=A2=E6=B7=BB=E5=8A=A015=E7=A7=92=E5=BD=95?= =?utf8?q?=E9=9F=B3=E9=99=90=E5=88=B6(=E5=90=8C=E6=97=B6=E5=9C=A8=E5=85=B6?= =?utf8?q?=E7=95=8C=E9=9D=A2=E4=B8=8A=E6=98=BE=E7=A4=BA)=EF=BC=8C=E8=B6=85?= =?utf8?q?=E8=BF=87=E6=97=B6=E9=97=B4=E5=8F=91=E9=80=81=E5=BD=95=E9=9F=B3?= =?utf8?q?=E5=87=86=E5=A4=87=E5=B0=B1=E7=BB=AA=E6=8C=87=E4=BB=A4=EF=BC=8C?= =?utf8?q?=E8=87=AA=E5=8A=A8=E8=B7=B3=E8=BD=AC=EF=BC=8C=E6=80=9D=E8=80=83?= =?utf8?q?=E4=B8=AD=E7=95=8C=E9=9D=A2=E3=80=82=203.AI=E7=AD=94=E6=A1=88?= =?utf8?q?=E7=95=8C=E9=9D=A2=E4=B8=AD=EF=BC=8Citemview=E6=B7=BB=E5=8A=A0?= =?utf8?q?=E9=99=90=E5=88=B6=EF=BC=8C=E8=A7=A3=E5=86=B3=EF=BC=9A543?= =?utf8?q?=E6=89=8B=E8=A1=A8=EF=BC=8CAI=E5=85=A8=E5=AE=B6=E6=A1=B6?= =?utf8?q?=E8=BE=93=E5=87=BA=E7=9A=84=E5=9B=9E=E7=AD=94=EF=BC=8C=E5=AF=B9?= =?utf8?q?=E8=AF=9D=E6=A1=86=E5=BA=95=E9=83=A8=E7=A9=BA=E7=99=BD=E5=A4=9Ab?= =?utf8?q?ug(=E6=B3=A8=E6=84=8F=E5=AD=97=E6=95=B0=E8=BF=87=E5=A4=9A?= =?utf8?q?=E7=8E=B0=E5=9C=A8=E4=BC=9A=E8=A2=AB=E7=9C=81=E7=95=A5=E5=8F=B7?= =?utf8?q?=E6=9B=BF=E4=BB=A3)?= MIME-Version: 1.0 Content-Type: text/plain; charset=utf8 Content-Transfer-Encoding: 8bit --- .../nativeui/aivoice/include/AiVoiceModel.h | 6 +- .../include/AivoiceChatContentListItemView.h | 4 +- .../aivoice/include/AivoiceListeningView.h | 6 +- .../nativeui/aivoice/src/AiVoiceModel.cpp | 131 +++++++++++++++--- .../nativeui/aivoice/src/AiVoicePresenter.cpp | 7 +- .../nativeui/aivoice/src/AiVoiceView.cpp | 4 +- .../src/AivoiceChatContentListItemView.cpp | 17 ++- .../aivoice/src/AivoiceListeningView.cpp | 75 +++++++++- .../nativeui/uiservice/src/ui_service.cpp | 2 +- .../uikit/ui/interfaces/kits/common/text.h | 2 +- 10 files changed, 216 insertions(+), 38 deletions(-) diff --git a/code/sdk/application/wearable/fd230app/nativeui/aivoice/include/AiVoiceModel.h b/code/sdk/application/wearable/fd230app/nativeui/aivoice/include/AiVoiceModel.h index d5110ac2f..d5b8ddec9 100644 --- a/code/sdk/application/wearable/fd230app/nativeui/aivoice/include/AiVoiceModel.h +++ b/code/sdk/application/wearable/fd230app/nativeui/aivoice/include/AiVoiceModel.h @@ -2,7 +2,7 @@ * @Author: luozheng 1732036298@qq.com * @Date: 2024-06-20 15:14:43 * @LastEditors: luozheng 1732036298@qq.com - * @LastEditTime: 2024-09-21 11:07:14 + * @LastEditTime: 2024-09-26 16:45:56 * @FilePath: /FD230/code/sdk/application/wearable/fd230app/nativeui/aivoice/include/AiVoiceModel.h */ #ifndef AI_VOICE_MODEL_H @@ -54,6 +54,7 @@ namespace OHOS void CancelCurAIChat(void); int GetAIResponseType(void); std::string GetErrnote(void); + void SetErrnote(std::string str); void SetCurView(int16_t viewNum); int GetCurView(void); @@ -97,6 +98,9 @@ namespace OHOS void ai_stop_screen60s_timer(void); void reset_ai_screen60s_timer_time(); + void start_listening_timer(uint32_t interval = 1000); + void stop_listening_timer(void); + void SetSelectAiModel(int index); int GetSelectAiModel(void); diff --git a/code/sdk/application/wearable/fd230app/nativeui/aivoice/include/AivoiceChatContentListItemView.h b/code/sdk/application/wearable/fd230app/nativeui/aivoice/include/AivoiceChatContentListItemView.h index 080df6c4a..0897ec9b0 100644 --- a/code/sdk/application/wearable/fd230app/nativeui/aivoice/include/AivoiceChatContentListItemView.h +++ b/code/sdk/application/wearable/fd230app/nativeui/aivoice/include/AivoiceChatContentListItemView.h @@ -2,7 +2,7 @@ * @Author: luozheng 1732036298@qq.com * @Date: 2024-06-29 17:26:19 * @LastEditors: luozheng 1732036298@qq.com - * @LastEditTime: 2024-07-16 10:14:28 + * @LastEditTime: 2024-09-26 15:21:21 * @FilePath: /FD230/code/sdk/application/wearable/fd230app/nativeui/aivoice/include/AivoiceChatContentListItemView.h */ @@ -28,7 +28,7 @@ namespace OHOS void ResetItemView(int viewHeight, bool isAiAnswerFlag); private: - UILabelExt chatContentLabel; + UILabel chatContentLabel; UIImageView chatContentImage; UIScrollView chatContentScrollView; int m_viewHeight; diff --git a/code/sdk/application/wearable/fd230app/nativeui/aivoice/include/AivoiceListeningView.h b/code/sdk/application/wearable/fd230app/nativeui/aivoice/include/AivoiceListeningView.h index 00ba891e1..d6819659b 100644 --- a/code/sdk/application/wearable/fd230app/nativeui/aivoice/include/AivoiceListeningView.h +++ b/code/sdk/application/wearable/fd230app/nativeui/aivoice/include/AivoiceListeningView.h @@ -8,7 +8,7 @@ * @Author: luozheng 1732036298@qq.com * @Date: 2024-06-22 16:46:26 * @LastEditors: luozheng 1732036298@qq.com - * @LastEditTime: 2024-09-06 17:37:55 + * @LastEditTime: 2024-09-25 20:34:17 * @FilePath: /FD230/code/sdk/application/wearable/fd230app/nativeui/aivoice/include/AivoiceListeningView.h */ @@ -29,7 +29,7 @@ namespace OHOS static constexpr int16_t AIVOICE_LISTENING_IMAGE_ANIMATOR_VIEW_W = 240; static constexpr int16_t AIVOICE_LISTENING_IMAGE_ANIMATOR_VIEW_H = 60; static constexpr int16_t AIVOICE_LISTENING_IMAGE_ANIMATOR_VIEW_NUM_FRAMES = 40; // 图片帧数 - static constexpr int16_t AIVOICE_LISTENING_IMAGE_ANIMATOR_DELAY = 70; // 图片更新间隔 + static constexpr int16_t AIVOICE_LISTENING_IMAGE_ANIMATOR_DELAY = 70; // 图片更新间隔 static constexpr char *AIVoiceListeningImagePaths = "/user/res/AIVoice/AIVoiceListening/"; class AivoiceListeningView { @@ -70,6 +70,7 @@ namespace OHOS ~AivoiceListeningView(); static AivoiceListeningView *GetInstance(void); UIScrollView *CreateAivoiceListeningView(void); + UILabelExt *GetShowtimeoutLabel(void); private: void ClearAll(void); @@ -87,6 +88,7 @@ namespace OHOS UIImageAnimatorView *AiVoiceListeningImageAnimatorView{nullptr}; ImageAnimatorInfo AiVoiceListeningImageInfo[AIVOICE_LISTENING_IMAGE_ANIMATOR_VIEW_NUM_FRAMES]; const ImageInfo **AiVoiceListeningPathsArray{nullptr}; + UILabelExt *showtimeout{nullptr}; }; } #endif diff --git a/code/sdk/application/wearable/fd230app/nativeui/aivoice/src/AiVoiceModel.cpp b/code/sdk/application/wearable/fd230app/nativeui/aivoice/src/AiVoiceModel.cpp index d2ce77f7c..1492bac73 100644 --- a/code/sdk/application/wearable/fd230app/nativeui/aivoice/src/AiVoiceModel.cpp +++ b/code/sdk/application/wearable/fd230app/nativeui/aivoice/src/AiVoiceModel.cpp @@ -2,7 +2,7 @@ * @Author: luozheng 1732036298@qq.com * @Date: 2024-06-20 15:14:50 * @LastEditors: luozheng 1732036298@qq.com - * @LastEditTime: 2024-09-21 11:13:21 + * @LastEditTime: 2024-09-26 17:54:07 * @FilePath: /FD230/code/sdk/application/wearable/fd230app/nativeui/aivoice/src/AiVoiceModel.cpp */ #include "aivoice/include/AiVoiceModel.h" @@ -34,7 +34,7 @@ namespace OHOS static int Time = THIRTY_TIME; static int AiModelConnectTimeout = 5; - AiVoiceModel::AiVoiceModel() + AiVoiceModel::AiVoiceModel() { CreateDirectory("/user/userdata/AiRecording/"); } @@ -47,15 +47,19 @@ namespace OHOS return instance; } - bool AiVoiceModel::CreateDirectory(const char* path) + bool AiVoiceModel::CreateDirectory(const char *path) { - if (access(path, F_OK) == -1) { // 如果路径不存在 + if (access(path, F_OK) == -1) + { // 如果路径不存在 WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "Directory %s not exist, creating directory\n", path); - if (mkdir(path, 0777)!= 0) { // 尝试创建目录,如果创建失败 + if (mkdir(path, 0777) != 0) + { // 尝试创建目录,如果创建失败 WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "Create directory %s failed\n", path); return false; } - } else { // 如果路径存在 + } + else + { // 如果路径存在 WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "Directory %s already exists\n", path); } return true; @@ -76,6 +80,7 @@ namespace OHOS return true; } + /*跳转到AI聆听界面界面*/ bool AiVoiceModel::ChangeToAIVoiceListeningView(bool value) { WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "AiVoiceModel::ChangeToReturnResultTextView"); @@ -217,6 +222,11 @@ namespace OHOS return errnote; } + void AiVoiceModel::SetErrnote(std::string str) + { + errnote = str; + } + /*设置当前哪个子视图是可见的*/ void AiVoiceModel::SetCurView(int16_t viewNum) { @@ -511,7 +521,8 @@ namespace OHOS { AIResponseType = type; errnote = str; - WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "AIResponseType = %d,errnote = %s\n", AIResponseType, errnote.c_str()); + WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "AIResponseType = %d,errnote = %s\n", AIResponseType, errnote.c_str()); + //如果是:AI录音解析错误或AI 回应错误 ->跳转AI回应错误界面 if (AIResponseType == AiVoiceModel::AI_RECORDING_PARSING_ERROR || AIResponseType == AiVoiceModel::AI_RESPONSE_ERROR) { SendMsgToUIService(UI_AI_JUMP_TO_RESPONDERR_VIEW, 0, (void *)errnote.c_str(), errnote.length()); @@ -684,26 +695,19 @@ namespace OHOS { WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "AIVoice_TimerCallbackProc,Time = %d", Time); Time -= 1; - if (Time == 30) + if (Time == 30) //等待一秒,确保录音停止,发送录音准备就绪指令 { AiVoiceModel::GetInstance().CheckFileAndSendAIIsReady(); - AiVoiceModel::GetInstance().AIVoice_StopTimer(); - return; + // AiVoiceModel::GetInstance().AIVoice_StopTimer(); + // return; } if (Time < 0) // 如果思考时间超时30s,进入连接超时界面 { AiVoiceModel::GetInstance().AIVoice_StopTimer(); - - AiVoiceView *view_ = AiVoiceView::GetInstance(); - AiVoicePresenter *p_AiVoicePresenter = AiVoicePresenter::GetInstance(); - if (view_ != nullptr && p_AiVoicePresenter != nullptr) - { - if ((view_->GetAiVoiceScrollView(AIVOICE_THINKING_VIEWID) != nullptr) && - (view_->GetAiVoiceScrollView(AIVOICE_THINKING_VIEWID)->IsVisible())) - { - p_AiVoicePresenter->ChangeViewAndLogicOperator(AIVOICE_THINKING_VIEWID, AIVOICE_CONNECT_TIMEOUT_VIEWID); - } - } + AiVoiceModel::GetInstance().SetErrnote("The connection timed out. Please restart the conversation"); + std::string str = AiVoiceModel::GetInstance().GetErrnote(); + SendMsgToUIService(UI_AI_JUMP_TO_RESPONDERR_VIEW, 0, (void *)str.c_str(), str.length()); + ScreenTurnOn(5 * 1000); // 有消息来就亮屏5秒 } } return; @@ -862,6 +866,91 @@ namespace OHOS } } + static osTimerId_t g_listeningEndHandle = nullptr; + static uint8_t LISTENING_TIMEOUT = 15; // 15s钟无操作关闭该视图 + static void AIListeningCallbackProc(int data) + { + WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "AIListeningCallbackProc %d", LISTENING_TIMEOUT); + if (LISTENING_TIMEOUT <= 0) + { + AiVoiceModel::GetInstance().StopListenAndRecordingUserQuestion(); //停止聆听用户问题 + AiVoiceModel::GetInstance().stop_listening_timer(); //停止聆听定时器 + if (AiVoiceView::GetInstance() && AivoiceListeningView::GetInstance() ) + { + AivoiceListeningView::GetInstance()->GetShowtimeoutLabel()->SetText(""); + AivoiceListeningView::GetInstance()->GetShowtimeoutLabel()->Invalidate(); + AiVoiceView::GetInstance()->ChangeView(AIVOICE_LISTENING_VIEWID, AIVOICE_THINKING_VIEWID); // 切换到思考中界面 + + AiVoiceModel::GetInstance().AIVoice_StartTimer(); + } + } + else + { + if (AivoiceListeningView::GetInstance()) + { + AivoiceListeningView::GetInstance()->GetShowtimeoutLabel()->SetText(std::to_string(LISTENING_TIMEOUT).c_str()); + AivoiceListeningView::GetInstance()->GetShowtimeoutLabel()->Invalidate(); + } + } + LISTENING_TIMEOUT--; + } + static void AIListeningCallback(int data) + { + GraphicService::GetInstance()->PostGraphicEvent(std::bind(AIListeningCallbackProc, data)); + } + // 开启一个AI录音的定时器 + void AiVoiceModel::start_listening_timer(uint32_t interval) + { + WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "AiVoiceModel::start_listening_timer"); + /* -------------------------- 1.检查定时器是否已经存在,如果存在则返回 ------------------------- */ + if (g_listeningEndHandle != nullptr) + { + WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "Timer already exists!!"); + return; + } + /* --------------------------------- 2.创建定时器 -------------------------------- */ + g_listeningEndHandle = osTimerNew((osTimerFunc_t)AIListeningCallback, osTimerPeriodic, nullptr, nullptr); + // 检查定时器创建是否成功 + if (g_listeningEndHandle == nullptr) + { + WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "Timer create failed!!"); + return; + } + /* ----------------------------- 3.将毫秒转换为系统时钟节拍数 ---------------------------- */ + int tick = osMs2Tick(interval); + /* --------------------------------- 4.启动定时器 -------------------------------- */ + osStatus_t ret = osTimerStart(g_listeningEndHandle, tick); + /* -------------------- 5.检查定时器启动是否成功,如果启动失败,删除定时器并置为 nullptr -------------------- */ + if (ret != osOK) + { + WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "osTimerDelete failed, ret = %lx!!", ret); + if (g_listeningEndHandle != nullptr) + { + ret = osTimerDelete(g_listeningEndHandle); + } + g_listeningEndHandle = nullptr; + return; + } + } + + // 停止一个AI录音的定时器 + void AiVoiceModel::stop_listening_timer(void) + { + // 检查定时器是否存在 + if (g_listeningEndHandle != nullptr) + { + WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "AiVoiceModel::stop_listening_timer"); + osTimerStop(g_listeningEndHandle); + // 删除定时器并置为 nullptr + osStatus_t ret = osTimerDelete(g_listeningEndHandle); + if (ret != osOK) + { + WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "osTimerDelete failed, ret = %lx!!", ret); + } + g_listeningEndHandle = nullptr; + LISTENING_TIMEOUT = 15; + } + } // 设置选择的ai模型 void AiVoiceModel::SetSelectAiModel(int index) { diff --git a/code/sdk/application/wearable/fd230app/nativeui/aivoice/src/AiVoicePresenter.cpp b/code/sdk/application/wearable/fd230app/nativeui/aivoice/src/AiVoicePresenter.cpp index aa377a509..4fd9b9162 100644 --- a/code/sdk/application/wearable/fd230app/nativeui/aivoice/src/AiVoicePresenter.cpp +++ b/code/sdk/application/wearable/fd230app/nativeui/aivoice/src/AiVoicePresenter.cpp @@ -2,7 +2,7 @@ * @Author: luozheng 1732036298@qq.com * @Date: 2024-06-20 15:11:17 * @LastEditors: luozheng 1732036298@qq.com - * @LastEditTime: 2024-09-07 12:30:56 + * @LastEditTime: 2024-09-26 16:16:49 * @FilePath: /FD230/code/sdk/application/wearable/fd230app/nativeui/aivoice/src/AiVoicePresenter.cpp */ #include "AppViewIDs.h" @@ -86,6 +86,7 @@ namespace OHOS ScreenAlwaysOnCtr(CANCEL_SCREEN_ALWAYS_ON); model->StatusResume(); model->ai_stop_screen60s_timer(); + model->stop_listening_timer(); } /*调转到返回结果界面*/ @@ -94,7 +95,6 @@ namespace OHOS WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "AiVoicePresenter::JumpToReturnResultTextView"); if (view_->GetAiVoiceScrollView(AIVOICE_THINKING_VIEWID) != nullptr && view_->GetAiVoiceScrollView(AIVOICE_THINKING_VIEWID)->IsVisible()) { - // view_->ChangeView(AIVOICE_THINKING_VIEWID, AIVOICE_RETURN_RESULT_TEXT_VIEWID); // 思考中界面->返回结果 ChangeViewAndLogicOperator(AIVOICE_THINKING_VIEWID, AIVOICE_RETURN_RESULT_TEXT_VIEWID); } else @@ -135,7 +135,7 @@ namespace OHOS if ((view_->GetAiVoiceScrollView(AIVOICE_THINKING_VIEWID) != nullptr) && (view_->GetAiVoiceScrollView(AIVOICE_THINKING_VIEWID)->IsVisible())) { - ChangeViewAndLogicOperator(AiVoiceModel::GetInstance().GetCurView(), AIVOICE_CONNECT_TIMEOUT_VIEWID); + ChangeViewAndLogicOperator(AIVOICE_THINKING_VIEWID, AIVOICE_CONNECT_TIMEOUT_VIEWID); AivoiceConnectTimeoutView *p_AivoiceConnectTimeoutView = AivoiceConnectTimeoutView::GetInstance(); if (p_AivoiceConnectTimeoutView) { @@ -222,6 +222,7 @@ namespace OHOS case AIVOICE_LISTENING_VIEWID: model->StopListenAndRecordingUserQuestion(); + model->stop_listening_timer(); if (showView == AIVOICE_THINKING_VIEWID) // 聆听中->思考中界面 { // osal_msleep(500); diff --git a/code/sdk/application/wearable/fd230app/nativeui/aivoice/src/AiVoiceView.cpp b/code/sdk/application/wearable/fd230app/nativeui/aivoice/src/AiVoiceView.cpp index c2ef25578..c88853d3c 100644 --- a/code/sdk/application/wearable/fd230app/nativeui/aivoice/src/AiVoiceView.cpp +++ b/code/sdk/application/wearable/fd230app/nativeui/aivoice/src/AiVoiceView.cpp @@ -2,7 +2,7 @@ * @Author: luozheng 1732036298@qq.com * @Date: 2024-05-07 11:25:58 * @LastEditors: luozheng 1732036298@qq.com - * @LastEditTime: 2024-09-07 12:12:53 + * @LastEditTime: 2024-09-26 15:37:15 * @FilePath: /FD230/code/sdk/application/wearable/fd230app/nativeui/AiVoice/src/AiVoiceView.cpp */ #include "aivoice/include/AiVoicePresenter.h" @@ -468,6 +468,7 @@ namespace OHOS container_->SetPosition(0, 0, Screen::GetInstance().GetWidth(), Screen::GetInstance().GetHeight()); container_->SetTouchable(true); container_->SetDraggable(true); + container_->SetOnClickListener(presenter_); if (!viewInitStatus) { @@ -587,6 +588,7 @@ namespace OHOS AiVoiceScrollView[thisView] = p_AivoiceListeningView->CreateAivoiceListeningView(); container_->Add(AiVoiceScrollView[thisView]); } + AiVoiceModel::GetInstance().start_listening_timer(); return true; } diff --git a/code/sdk/application/wearable/fd230app/nativeui/aivoice/src/AivoiceChatContentListItemView.cpp b/code/sdk/application/wearable/fd230app/nativeui/aivoice/src/AivoiceChatContentListItemView.cpp index f0cbc2e8c..5b470045a 100644 --- a/code/sdk/application/wearable/fd230app/nativeui/aivoice/src/AivoiceChatContentListItemView.cpp +++ b/code/sdk/application/wearable/fd230app/nativeui/aivoice/src/AivoiceChatContentListItemView.cpp @@ -2,7 +2,7 @@ * @Author: luozheng 1732036298@qq.com * @Date: 2024-06-29 17:27:25 * @LastEditors: luozheng 1732036298@qq.com - * @LastEditTime: 2024-07-16 11:19:28 + * @LastEditTime: 2024-09-26 18:16:34 * @FilePath: /FD230/code/sdk/application/wearable/fd230app/nativeui/aivoice/src/AivoiceChatContentListItemView.cpp */ @@ -70,16 +70,25 @@ namespace OHOS void AivoiceChatContentListItemView::ResetItemView(int viewHeight, bool isAiAnswerFlag) { - Resize(ITEM_VIEW_W, viewHeight + ITEM_VIEW_H); + if (viewHeight < 120 * CHATCONTENTLABEL_LINE_HEIGHT + 30) // itemView最高为120 * label行高 + Resize(ITEM_VIEW_W, viewHeight + ITEM_VIEW_H); chatContentImage.SetPosition(isAiAnswerFlag ? QUESTION_CHATCONTENTIMAGE_X : ANSWER_CHATCONTENTIMAGE_X, 0, 70, 30); chatContentImage.SetSrc(isAiAnswerFlag ? ANSWER_ITEM_IMAGE_SRC : QUESTION_ITEM_IMAGE_SRC); chatContentScrollView.SetPosition(isAiAnswerFlag ? QUESTION_CHATCONTENTSCROLLVIEW_X : ANSWER_CHATCONTENTSCROLLVIEW_X, 0); - chatContentScrollView.Resize(isAiAnswerFlag ? QUESTION_CHATCONTENTSCROLLVIEW_W : ANSWER_CHATCONTENTSCROLLVIEW_W, GetHeight() - 30); + if (viewHeight < 120 * CHATCONTENTLABEL_LINE_HEIGHT + 30) // scrollviewView最高为120 * label行高 + chatContentScrollView.Resize(isAiAnswerFlag ? QUESTION_CHATCONTENTSCROLLVIEW_W : ANSWER_CHATCONTENTSCROLLVIEW_W, GetHeight() - 30); chatContentScrollView.SetStyle(STYLE_BACKGROUND_COLOR, isAiAnswerFlag ? ANSWER_ITEM_VIEW_COLOR : QUESTION_ITEM_VIEW_COLOR); - chatContentLabel.Resize(isAiAnswerFlag ? QUESTION_CHATCONTENTLABEL_W : ANSWER_CHATCONTENTLABEL_W, viewHeight); + if (viewHeight < 120 * CHATCONTENTLABEL_LINE_HEIGHT) // label最高为120 * label行高 + { + chatContentLabel.Resize(isAiAnswerFlag ? QUESTION_CHATCONTENTLABEL_W : ANSWER_CHATCONTENTLABEL_W, viewHeight); + } + else + { + chatContentLabel.SetLineBreakMode(isAiAnswerFlag ? UILabel::LINE_BREAK_ELLIPSIS : UILabel::LINE_BREAK_WRAP);//超过高度在末尾用省略号替换 + } } void AivoiceChatContentListItemView::SetUpChild() diff --git a/code/sdk/application/wearable/fd230app/nativeui/aivoice/src/AivoiceListeningView.cpp b/code/sdk/application/wearable/fd230app/nativeui/aivoice/src/AivoiceListeningView.cpp index f5fe097ee..ae2a198ea 100644 --- a/code/sdk/application/wearable/fd230app/nativeui/aivoice/src/AivoiceListeningView.cpp +++ b/code/sdk/application/wearable/fd230app/nativeui/aivoice/src/AivoiceListeningView.cpp @@ -2,7 +2,7 @@ * @Author: luozheng 1732036298@qq.com * @Date: 2024-05-07 11:25:58 * @LastEditors: luozheng 1732036298@qq.com - * @LastEditTime: 2024-09-06 17:17:03 + * @LastEditTime: 2024-09-26 15:39:03 * @FilePath: /FD230/code/sdk/application/wearable/fd230app/nativeui/AiVoice/src/AivoiceListeningView.cpp */ #include "aivoice/include/AiVoicePresenter.h" @@ -57,6 +57,12 @@ namespace OHOS FreeImageInfoArray(AiVoiceListeningPathsArray, AIVoiceListeningImagePaths, AIVOICE_LISTENING_IMAGE_ANIMATOR_VIEW_NUM_FRAMES); } + if (showtimeout != nullptr) + { + delete showtimeout; + showtimeout = nullptr; + } + if (finishSpeak != nullptr) { delete finishSpeak; @@ -199,6 +205,19 @@ namespace OHOS WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "AivoiceListeningView::finishSpeak is nullptr!"); return false; } + /* -------------------------------------------------------------------------- */ + showtimeout = new UILabelExt(); + if (showtimeout == nullptr) + { + WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "AivoiceListeningView::showtimeout is nullptr!"); + return false; + } + showtimeout->SetPosition(60, 258, 240, 60); + showtimeout->SetStyle(STYLE_TEXT_FONT, 50); + showtimeout->SetStyle(STYLE_LINE_HEIGHT, 60); + showtimeout->SetLineBreakMode(UILabel::LINE_BREAK_ELLIPSIS); + showtimeout->SetAlign(TEXT_ALIGNMENT_CENTER, TEXT_ALIGNMENT_CENTER); + showtimeout->SetFont(DEFAULT_VECTOR_FONT_FILENAME, 50); return true; } @@ -263,6 +282,7 @@ namespace OHOS UIScrollView *AivoiceListeningView::CreateAivoiceListeningView(void) { WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "AivoiceListeningView::CreateAivoiceListeningView"); +#if 0 if (scrollView == nullptr) { if (!CreateAivoiceListeningScrollView() || !CreateAivoiceListeningLabel() || @@ -276,6 +296,57 @@ namespace OHOS scrollView->Add(finishSpeakButton); scrollView->Add(finishSpeak); } - return scrollView; +#else + if (!CreateAivoiceListeningScrollView()) + { + WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "AivoiceListeningView::CreateAivoiceListeningScrollView fail!!"); + } + if (!CreateAivoiceListeningLabel()) + { + WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "AivoiceListeningView::CreateAivoiceListeningLabel fail!!"); + } + if (!CreateAivoiceListeningButton()) + { + WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "AivoiceListeningView::CreateAivoiceListeningButton fail!!"); + } + if (!CreateAivoiceListeningImageAnimator()) + { + WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "AivoiceListeningView::CreateAivoiceListeningImageAnimator fail!!"); + } + if (scrollView == nullptr) + { + return nullptr; + } + else + { + if (title) + { + scrollView->Add(title); + } + if (AiVoiceListeningImageAnimatorView) + { + scrollView->Add(AiVoiceListeningImageAnimatorView); + } + if (showtimeout) + { + showtimeout->SetX((scrollView->GetWidth() - showtimeout->GetWidth()) / 2); + scrollView->Add(showtimeout); + } + if (finishSpeakButton) + { + scrollView->Add(finishSpeakButton); + } + if (finishSpeak) + { + scrollView->Add(finishSpeak); + } + return scrollView; + } +#endif + } + + UILabelExt *AivoiceListeningView::GetShowtimeoutLabel(void) + { + return showtimeout; } } \ No newline at end of file diff --git a/code/sdk/application/wearable/fd230app/nativeui/uiservice/src/ui_service.cpp b/code/sdk/application/wearable/fd230app/nativeui/uiservice/src/ui_service.cpp index 0fa8049d5..af8badfff 100644 --- a/code/sdk/application/wearable/fd230app/nativeui/uiservice/src/ui_service.cpp +++ b/code/sdk/application/wearable/fd230app/nativeui/uiservice/src/ui_service.cpp @@ -625,7 +625,7 @@ extern "C" std::bind(&OHOS::AiVoiceModel::ChangeToAIVoiceListeningView, &OHOS::AiVoiceModel::GetInstance(), state)); } - // 处理更新查询AI模型是否连接成功的状态 + // 处理跳转AI回应错误界面 void HandleAiJumpToRespondErrMessage(Request *request) { WEARABLE_LOGI(WEARABLE_LOG_MODULE_UI_SERVICE, "HandleAiJumpToRespondErrMessage"); diff --git a/code/sdk/middleware/services/gui/uikit/ui/interfaces/kits/common/text.h b/code/sdk/middleware/services/gui/uikit/ui/interfaces/kits/common/text.h index d63e79ca0..9d1af106e 100755 --- a/code/sdk/middleware/services/gui/uikit/ui/interfaces/kits/common/text.h +++ b/code/sdk/middleware/services/gui/uikit/ui/interfaces/kits/common/text.h @@ -352,7 +352,7 @@ protected: }; /** Maximum number of lines */ - static constexpr uint16_t MAX_LINE_COUNT = 50; + static constexpr uint16_t MAX_LINE_COUNT = 120;//原50行,现修改为120行 static TextLine textLine_[MAX_LINE_COUNT]; static constexpr int16_t TEXT_ELLIPSIS_DOT_NUM = 3; -- 2.17.1