From 7f39c3bee2f247a167be4bffd920a3da4f0fa74b Mon Sep 17 00:00:00 2001 From: xue <2144439972@qq.com> Date: Thu, 18 Sep 2025 15:09:31 +0800 Subject: [PATCH] =?utf8?q?=E5=A2=9E=E5=8A=A0OTA=EF=BC=8C=E6=81=A2=E5=A4=8D?= =?utf8?q?=E5=87=BA=E5=8E=82=E9=80=BB=E8=BE=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=utf8 Content-Transfer-Encoding: 8bit --- .../thunderbird/include/ThunderBirdModel.h | 21 +- .../include/ThunderBirdPresenter.h | 9 - .../thunderbird/src/ThunderBirdMainView.cpp | 13 +- .../thunderbird/src/ThunderBirdModel.cpp | 39 ++- .../thunderbird/src/ThunderBirdPresenter.cpp | 265 +++--------------- .../files/leiniao/fs/user/music/PowerOn.mp3 | Bin 0 -> 5328 bytes 6 files changed, 89 insertions(+), 258 deletions(-) create mode 100644 code/sdk/files/leiniao/fs/user/music/PowerOn.mp3 diff --git a/code/sdk/application/wearable/ln/nativeapp/nativeui/thunderbird/include/ThunderBirdModel.h b/code/sdk/application/wearable/ln/nativeapp/nativeui/thunderbird/include/ThunderBirdModel.h index 149cd9020..7f9e91699 100644 --- a/code/sdk/application/wearable/ln/nativeapp/nativeui/thunderbird/include/ThunderBirdModel.h +++ b/code/sdk/application/wearable/ln/nativeapp/nativeui/thunderbird/include/ThunderBirdModel.h @@ -31,15 +31,18 @@ namespace OHOS // 开机操作函数 int StartBootOperation(); - - // 新手引导相关函数 - enum class BindingStatus { - BOUND = 0, // 已绑定 - NOT_BOUND = 1, // 未绑定 - AUTH_FAILURE = 2, // 认证失败 - NO_NETWORK = 3 // 没有网络 - - }; + int ota_update_boot(); + // 恢复出厂设置相关函数 + void restore_factory_settings(); + + // 新手引导相关函数 + enum class BindingStatus { + BOUND = 0, // 已绑定 + NOT_BOUND = 1, // 未绑定 + AUTH_FAILURE = 2, // 认证失败 + NO_NETWORK = 3, // 没有网络 + + }; BindingStatus CheckBindingStatus(); // 对话相关函数 diff --git a/code/sdk/application/wearable/ln/nativeapp/nativeui/thunderbird/include/ThunderBirdPresenter.h b/code/sdk/application/wearable/ln/nativeapp/nativeui/thunderbird/include/ThunderBirdPresenter.h index ccc29a97c..440ea2a9a 100644 --- a/code/sdk/application/wearable/ln/nativeapp/nativeui/thunderbird/include/ThunderBirdPresenter.h +++ b/code/sdk/application/wearable/ln/nativeapp/nativeui/thunderbird/include/ThunderBirdPresenter.h @@ -32,15 +32,6 @@ namespace OHOS // 发布事件函数 void PublishEvent(uint16_t topic, uint8_t *data = nullptr, uint32_t size = 0); - // 按键注册方法 - // bool RegisterKeyEvents(void); - // bool RegisterPowerKeyLongPressEvent(void); - // bool RegisterPowerKeyPressEvent(void); - // bool RegisterFuncKeyPressEvent(void); - // bool RegisterFuncKeyLongPressEvent(void); - // bool RegisterVendorUpKeyPressEvent(void); - // bool RegisterVendorDownKeyPressEvent(void); - private: bool OnKeyAct(UIView &view, const KeyEvent &event) override; // 增加按键事件 bool X_DRAG_FLAG{false}; diff --git a/code/sdk/application/wearable/ln/nativeapp/nativeui/thunderbird/src/ThunderBirdMainView.cpp b/code/sdk/application/wearable/ln/nativeapp/nativeui/thunderbird/src/ThunderBirdMainView.cpp index 978871fa1..73352de43 100644 --- a/code/sdk/application/wearable/ln/nativeapp/nativeui/thunderbird/src/ThunderBirdMainView.cpp +++ b/code/sdk/application/wearable/ln/nativeapp/nativeui/thunderbird/src/ThunderBirdMainView.cpp @@ -280,7 +280,18 @@ namespace OHOS } else if(ThunderBirdModel::GetInstance()->StartBootOperation() == 1) { - ChangeView(MAXVIEW, THUNDERBIRD_DIALOGUEVIEW, ThunderBirdDialogueView::THUNDERBIRD_DIALOGUEVIEW_SPEAKING); + if(ThunderBirdModel::GetInstance()->ota_update_boot() == 1)//强制OTA升级 + { + ChangeView(MAXVIEW, THUNDERBIRD_OTAVIEW, ThunderBirdOtaView::THUNDERBIRD_OTAVIEW_UPDATE_NOW); + } + else if(ThunderBirdModel::GetInstance()->ota_update_boot() == 0)//可选OTA升级 + { + ChangeView(MAXVIEW, THUNDERBIRD_OTAVIEW, ThunderBirdOtaView::THUNDERBIRD_OTAVIEW_NORMAL); + } + else//其他 + { + ChangeView(MAXVIEW, THUNDERBIRD_DIALOGUEVIEW, ThunderBirdDialogueView::THUNDERBIRD_DIALOGUEVIEW_SPEAKING); + } } ScrollView_->Add(InitBaseData()); // 最上面状态栏 diff --git a/code/sdk/application/wearable/ln/nativeapp/nativeui/thunderbird/src/ThunderBirdModel.cpp b/code/sdk/application/wearable/ln/nativeapp/nativeui/thunderbird/src/ThunderBirdModel.cpp index 3de10715f..92ab53e7a 100644 --- a/code/sdk/application/wearable/ln/nativeapp/nativeui/thunderbird/src/ThunderBirdModel.cpp +++ b/code/sdk/application/wearable/ln/nativeapp/nativeui/thunderbird/src/ThunderBirdModel.cpp @@ -256,6 +256,7 @@ } g_otaCountdownValue = 0; //自动跳转到开始OTA界面 + do_ln_http_server_send_data(LN_HTTP_SERVICE_CMD_OTA_DOWNLOAD, NULL, 0);//升级开始 ThunderBirdMainView::GetInstance()->ChangeView(THUNDERBIRD_OTAVIEW, THUNDERBIRD_OTAVIEW, ThunderBirdOtaView::THUNDERBIRD_OTAVIEW_UPDATING); return; @@ -418,23 +419,31 @@ /*************************更新角色配置*************************/ //do_ln_http_server_send_data(LN_HTTP_SERVICE_CMD_GET_CHARACTER, nullptr, 0);//获取角色配置 + return -1; + } - + int ThunderBirdModel::ota_update_boot() + { /*************************OTA升级*************************/ - // do_ln_http_server_send_data(LN_HTTP_SERVICE_CMD_OTA_GET_TASK, nullptr, 0);//获取是否需要OTA升级 - // if(uapi_ln_ota_get_update_type() == 1)//强制OTA升级 - // { - // ThunderBirdMainView::GetInstance()->ChangeView(MAXVIEW, THUNDERBIRD_OTAVIEW, ThunderBirdOtaView::THUNDERBIRD_OTAVIEW_UPDATE_NOW); - // return 3; - // } - // if(uapi_ln_ota_get_update_type() == 0)//可选OTA升级 - // { - // ThunderBirdMainView::GetInstance()->ChangeView(MAXVIEW, THUNDERBIRD_OTAVIEW, ThunderBirdOtaView::THUNDERBIRD_OTAVIEW_NORMAL); - // //do_ln_http_server_send_data(LN_HTTP_SERVICE_CMD_OTA_DOWNLOAD, NULL, 0); - // return 5; - // } + do_ln_http_server_send_data(LN_HTTP_SERVICE_CMD_OTA_GET_TASK, nullptr, 0);//获取是否需要OTA升级 + if(uapi_ln_ota_get_update_type() == 1)//强制OTA升级 + { + ThunderBirdMainView::GetInstance()->ChangeView(MAXVIEW, THUNDERBIRD_OTAVIEW, ThunderBirdOtaView::THUNDERBIRD_OTAVIEW_UPDATE_NOW); + return 1; + } + else if(uapi_ln_ota_get_update_type() == 0)//可选OTA升级 + { + ThunderBirdMainView::GetInstance()->ChangeView(MAXVIEW, THUNDERBIRD_OTAVIEW, ThunderBirdOtaView::THUNDERBIRD_OTAVIEW_NORMAL); + return 0; + } return -1; } + + // ==================== 恢复出厂设置相关函数 ==================== + void ThunderBirdModel::restore_factory_settings() + { + uapi_delete_folder("/user/userdata"); + } // ==================== 新手引导相关函数 ==================== ThunderBirdModel::BindingStatus ThunderBirdModel::CheckBindingStatus() @@ -479,8 +488,8 @@ // 这里可以添加目录创建逻辑 const char *defaultArgs[6] = {"01", "mp3", "16000", "1", "16", audioPath.c_str()}; - WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "ThunderBirdModel::StartRecording: 开始录音,路径: %s", audioPath.c_str()); - WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "ThunderBirdModel::StartRecording: 参数 - 格式: %s, 采样率: %s, 声道: %s, 位宽: %s", + WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "ThunderBirdModel::StartRecording: 开始录音,路径: %s", audioPath.c_str()); + WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "ThunderBirdModel::StartRecording: 参数 - 格式: %s, 采样率: %s, 声道: %s, 位宽: %s", defaultArgs[1], defaultArgs[2], defaultArgs[3], defaultArgs[4]); int32_t ret = AudioCaptureSample(6, defaultArgs); diff --git a/code/sdk/application/wearable/ln/nativeapp/nativeui/thunderbird/src/ThunderBirdPresenter.cpp b/code/sdk/application/wearable/ln/nativeapp/nativeui/thunderbird/src/ThunderBirdPresenter.cpp index 7a446e7f5..5eb9df644 100644 --- a/code/sdk/application/wearable/ln/nativeapp/nativeui/thunderbird/src/ThunderBirdPresenter.cpp +++ b/code/sdk/application/wearable/ln/nativeapp/nativeui/thunderbird/src/ThunderBirdPresenter.cpp @@ -12,6 +12,7 @@ #include "thunderbird/include/ThunderBirdDialogueView.h" #include "thunderbird/include/ThunderBirdReminderView.h" #include "thunderbird/include/ThunderBirdAdjustView.h" +#include "thunderbird/include/ThunderBirdShutdownView.h" #include "AppViewIDs.h" #include "NativeAbility.h" #include "common/key_code.h" @@ -24,6 +25,7 @@ #include "service_id_define.h" #include "dock/input_device.h" #include "custom_runtime.h" + #include "ln_api.h" namespace OHOS { static int i=0;//版本临时变量 @@ -73,58 +75,11 @@ namespace OHOS int16_t currentSubView = ThunderBirdMainView::GetInstance()->GetCurrentSubView(); int screenState = uapi_get_screen_state(); - // 详细的按键事件跟踪日志 - WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "=== OnKeyAct Event Start ==="); - WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "keyID: %d (0=POWER, 1=FUNC, 2=VENDOR_UP, 3=VENDOR_DOWN)", keyID); - WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "keyState: %d (0=RELEASE, 1=PRESS, 2=LONG_PRESS)", keyState); - WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "screenState: %d (0=OFF, 1=ON)", screenState); - WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "currentView: %d", currentView); - WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "currentSubView: %d", currentSubView); + // 按键事件日志 + WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "OnKeyAct: keyID=%d, keyState=%d, screenState=%d", keyID, keyState, screenState); - // 按键名称映射 - const char* keyName = "UNKNOWN"; - switch(keyID) { - case static_cast(ZliteKeyCode::ZLITE_KEY_POWER): - keyName = "POWER"; - break; - case static_cast(ZliteKeyCode::ZLITE_KEY_FUNC): - keyName = "FUNC"; - break; - case static_cast(ZliteKeyCode::ZLITE_KEY_VENDOR_UP): - keyName = "VENDOR_UP"; - break; - case static_cast(ZliteKeyCode::ZLITE_KEY_VENDOR_DOWN): - keyName = "VENDOR_DOWN"; - break; - } - - // 按键状态名称映射 - const char* stateName = "UNKNOWN"; - switch(keyState) { - case InputDevice::STATE_RELEASE: - stateName = "RELEASE"; - break; - case InputDevice::STATE_PRESS: - stateName = "PRESS"; - break; - case InputDevice::STATE_LONG_PRESS: - stateName = "LONG_PRESS"; - break; - } - - WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "Key: %s, State: %s", keyName, stateName); - - /* 检查是否绑定 - 1、未绑定: - 2、如果不在THUNDERBIRD_GUIDEVIEW_3(二维码界面), - 3、除了电源键,点击其他按键都跳转到THUNDERBIRD_GUIDEVIEW_3(二维码界面) - */ - - - // 刷新息屏计时:任意按键按下时重置屏幕熄灭倒计时 if (keyState == InputDevice::STATE_PRESS) { - WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "Refreshing screen-off timer"); uapi_set_screen_on_api(); } @@ -132,9 +87,7 @@ namespace OHOS if (keyID == static_cast(ZliteKeyCode::ZLITE_KEY_POWER) && keyState == InputDevice::STATE_LONG_PRESS) { - WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "POWER LONG_PRESS: Switching to reboot slice"); NativeAbility::GetInstance().SwitchSlice(VIEW_REBOOT); - WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "=== OnKeyAct Event End (POWER LONG_PRESS) ==="); return true; } @@ -143,125 +96,65 @@ namespace OHOS keyState == InputDevice::STATE_LONG_PRESS && uapi_get_screen_state() == 0) { - WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "FUNC LONG_PRESS: Switching to LCD test slice"); NativeAbility::GetInstance().SwitchSlice(VIEW_LCD_TEST); - WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "=== OnKeyAct Event End (FUNC LONG_PRESS) ==="); return true; } /*************************power键*************************/ if (keyID == static_cast(ZliteKeyCode::ZLITE_KEY_POWER) && keyState == 1 && uapi_get_screen_state() == 0) { - WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "POWER PRESS: Screen is off, currentView = %d, currentSubView = %d", currentView, currentSubView); - // i++; - // if(i == 1) - // { - // ThunderBirdMainView::GetInstance()->SwitchHair("/user/res/hair/Classic/blue.bin"); - // } - // else if(i == 2) - // { - // ThunderBirdMainView::GetInstance()->SwitchHair("/user/res/hair/Classic/curly_hair.bin"); - // } - // else if(i == 3) - // { - // ThunderBirdMainView::GetInstance()->SwitchHair("/user/res/hair/SidePartingShort/purple.bin"); - // } - // else if(i == 4) - // { - // ThunderBirdMainView::GetInstance()->SwitchHair("/user/res/hair/Bangs/gold.bin"); - // } - WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "=== OnKeyAct Event End (POWER PRESS) ==="); - return true; - + return true; } /*************************语音键*************************/ - if(keyID == static_cast(ZliteKeyCode::ZLITE_KEY_FUNC) && keyState == 1 && uapi_get_screen_state() == 0) + if(keyID == static_cast(ZliteKeyCode::ZLITE_KEY_FUNC) && keyState == 0 && uapi_get_screen_state() == 0) { - WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "FUNC PRESS: Screen is off, checking binding status"); - if(ThunderBirdModel::GetInstance()->CheckBindingStatus() == ThunderBirdModel::BindingStatus::NOT_BOUND) { - WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "FUNC PRESS: Device not bound, checking current subview"); if(ThunderBirdMainView::GetInstance()->GetCurrentSubView() != ThunderBirdGuideView::THUNDERBIRD_GUIDEVIEW_3) { - WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "FUNC PRESS: Redirecting to QR code view"); ThunderBirdMainView::GetInstance()->ChangeView(currentView, THUNDERBIRD_GUIDEVIEW, ThunderBirdGuideView::THUNDERBIRD_GUIDEVIEW_3); - WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "=== OnKeyAct Event End (FUNC PRESS - Redirect) ==="); return true; } } if(currentView == THUNDERBIRD_DIALOGUEVIEW && currentSubView == ThunderBirdDialogueView::THUNDERBIRD_DIALOGUEVIEW_LISTENING) { - WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "FUNC PRESS: 从聆听界面跳转到说话界面"); ThunderBirdModel::GetInstance()->StopRecording(); - ThunderBirdMainView::GetInstance()->ChangeView(currentView, THUNDERBIRD_DIALOGUEVIEW, ThunderBirdDialogueView::THUNDERBIRD_DIALOGUEVIEW_SPEAKING); + ThunderBirdMainView::GetInstance()->ChangeView(currentView, THUNDERBIRD_DIALOGUEVIEW, ThunderBirdDialogueView::THUNDERBIRD_DIALOGUEVIEW_SPEAKING); ThunderBirdModel::GetInstance()->SendRecording(); } else { - WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "FUNC PRESS: 从当前界面跳转到聆听界面"); ThunderBirdMainView::GetInstance()->ChangeView(currentView, THUNDERBIRD_DIALOGUEVIEW, ThunderBirdDialogueView::THUNDERBIRD_DIALOGUEVIEW_LISTENING); ThunderBirdModel::GetInstance()->StartRecording(); } - WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "=== OnKeyAct Event End (FUNC PRESS) ==="); return true; } /*************************VENDOR_UP键*************************/ - if (keyID == static_cast(ZliteKeyCode::ZLITE_KEY_VENDOR_UP) && keyState == 1 && uapi_get_screen_state() == 0) + if (keyID == static_cast(ZliteKeyCode::ZLITE_KEY_VENDOR_UP) && keyState == 0 && uapi_get_screen_state() == 0) { - WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "VENDOR_UP: Screen is off, checking binding status"); - if(ThunderBirdModel::GetInstance()->CheckBindingStatus() == ThunderBirdModel::BindingStatus::NOT_BOUND) { - WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "VENDOR_UP: Device not bound, checking current subview"); if(ThunderBirdMainView::GetInstance()->GetCurrentSubView() != ThunderBirdGuideView::THUNDERBIRD_GUIDEVIEW_3) { - WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "VENDOR_UP: Redirecting to QR code view"); ThunderBirdMainView::GetInstance()->ChangeView(currentView, THUNDERBIRD_GUIDEVIEW, ThunderBirdGuideView::THUNDERBIRD_GUIDEVIEW_3); - WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "=== OnKeyAct Event End (VENDOR_UP - Redirect) ==="); return true; } } - - static bool s_vendorUpPressed = false; - WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "VENDOR_UP: State machine - s_vendorUpPressed=%d, keyState=%d", s_vendorUpPressed, keyState); - - if (keyState == InputDevice::STATE_PRESS) { - if (s_vendorUpPressed) { - WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "VENDOR_UP PRESS: Already pressed, ignoring"); - WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "=== OnKeyAct Event End (VENDOR_UP PRESS - Ignored) ==="); - return true; - } - s_vendorUpPressed = true; - WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "VENDOR_UP PRESS: First press, processing business logic"); - } else if (keyState == InputDevice::STATE_RELEASE) { - s_vendorUpPressed = false; - WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "VENDOR_UP RELEASE: Resetting pressed state"); - WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "=== OnKeyAct Event End (VENDOR_UP RELEASE) ==="); - return true; - } else { - WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "VENDOR_UP: Other state, ignoring"); - WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "=== OnKeyAct Event End (VENDOR_UP - Other) ==="); - return true; - } - // 音量界面:FUNC 键 -10 + // 音量界面:FUNC 键 +10 if (currentView == THUNDERBIRD_DIALOGUEVIEW || (currentView == THUNDERBIRD_LULLABYVIEW && (currentSubView == ThunderBirdLullabyView::THUNDERBIRD_LULLABYVIEW_1 || currentSubView == ThunderBirdLullabyView::THUNDERBIRD_LULLABYVIEW_4))) //只有在对话界面还有哄睡界面才触发 { - WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "VENDOR_UP: Volume adjustment in dialogue/lullaby view"); ThunderBirdMainView::GetInstance()->ChangeThunderBirdReminderView(THUNDERBIRD_REMINDERVIEW);//不走ChangeView if (ThunderBirdReminderView::GetInstance()) { ThunderBirdModel::GetInstance()->StartReminderHideTimer(1000); ThunderBirdReminderView::GetInstance()->Show(ThunderBirdReminderView::THUNDERBIRD_REMINDERVIEW_VOLUME); ThunderBirdReminderView::GetInstance()->AdjustRemindProgress(10); - } - WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "=== OnKeyAct Event End (VENDOR_UP - Volume) ==="); return true; } // 引导界面导航 @@ -269,12 +162,10 @@ namespace OHOS { if(currentSubView == ThunderBirdGuideView::THUNDERBIRD_GUIDEVIEW_1) { - WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "VENDOR_UP: 从引导界面1跳转到引导界面2"); ThunderBirdMainView::GetInstance()->ChangeView(currentView, THUNDERBIRD_GUIDEVIEW, ThunderBirdGuideView::THUNDERBIRD_GUIDEVIEW_2); } else if(currentSubView == ThunderBirdGuideView::THUNDERBIRD_GUIDEVIEW_2) { - WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "VENDOR_UP: 从引导界面2跳转到OTA界面"); ThunderBirdMainView::GetInstance()->ChangeView(currentView, THUNDERBIRD_OTAVIEW, ThunderBirdOtaView::THUNDERBIRD_OTAVIEW_NORMAL); } // else if(currentSubView == ThunderBirdGuideView::THUNDERBIRD_GUIDEVIEW_3) @@ -288,17 +179,14 @@ namespace OHOS { if(currentSubView == ThunderBirdDialogueView::THUNDERBIRD_DIALOGUEVIEW_SPEAKING) // 说话中 { - WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "VENDOR_UP: 从说话界面跳转到聆听界面"); ThunderBirdMainView::GetInstance()->ChangeView(currentView, THUNDERBIRD_DIALOGUEVIEW, ThunderBirdDialogueView::THUNDERBIRD_DIALOGUEVIEW_LISTENING); } else if(currentSubView == ThunderBirdDialogueView::THUNDERBIRD_DIALOGUEVIEW_LISTENING) // 聆听中 { - WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "VENDOR_UP: 从聆听界面跳转到状态展示界面"); ThunderBirdMainView::GetInstance()->ChangeView(currentView, THUNDERBIRD_DIALOGUEVIEW, ThunderBirdDialogueView::THUNDERBIRD_DIALOGUEVIEW_STATUS_SHOW); } else if(currentSubView == ThunderBirdDialogueView::THUNDERBIRD_DIALOGUEVIEW_STATUS_SHOW) // 状态展示 { - WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "VENDOR_UP: 从状态展示界面跳转到音量调节界面"); ThunderBirdMainView::GetInstance()->ChangeView(currentView, THUNDERBIRD_REMINDERVIEW, ThunderBirdReminderView::THUNDERBIRD_REMINDERVIEW_VOLUME); } return true; @@ -306,74 +194,37 @@ namespace OHOS // OTA界面导航 else if(currentView == THUNDERBIRD_OTAVIEW) { - if(currentSubView == ThunderBirdOtaView::THUNDERBIRD_OTAVIEW_NORMAL) // 有新功能 - { - WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "VENDOR_UP: 从OTA普通界面跳转到OTA明显界面"); - ThunderBirdMainView::GetInstance()->ChangeView(currentView, THUNDERBIRD_OTAVIEW, ThunderBirdOtaView::THUNDERBIRD_OTAVIEW_OBVIOUS); - } - else if(currentSubView == ThunderBirdOtaView::THUNDERBIRD_OTAVIEW_OBVIOUS) // 需要立即更新 - { - WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "VENDOR_UP: 从OTA明显界面跳转到立即更新界面"); - ThunderBirdMainView::GetInstance()->ChangeView(currentView, THUNDERBIRD_OTAVIEW, ThunderBirdOtaView::THUNDERBIRD_OTAVIEW_UPDATE_NOW); - } - else if(currentSubView == ThunderBirdOtaView::THUNDERBIRD_OTAVIEW_UPDATE_NOW) // 设置夜间更新 + if(currentSubView == ThunderBirdOtaView::THUNDERBIRD_OTAVIEW_UPDATE_NOW) // 设置夜间更新 { - WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "VENDOR_UP: 从立即更新界面跳转到夜间更新成功界面"); ThunderBirdMainView::GetInstance()->ChangeView(currentView, THUNDERBIRD_OTAVIEW, ThunderBirdOtaView::THUNDERBIRD_OTAVIEW_NIGHT_UPDATE_SUCCESS); } - else if(currentSubView == ThunderBirdOtaView::THUNDERBIRD_OTAVIEW_NIGHT_UPDATE) // 设置夜间更新 + else if(currentSubView == ThunderBirdOtaView::THUNDERBIRD_OTAVIEW_NORMAL + || ThunderBirdOtaView::THUNDERBIRD_OTAVIEW_OBVIOUS + || ThunderBirdOtaView::THUNDERBIRD_OTAVIEW_UPDATE_NOW) // 确认升级,先判断电量、网络、内存 { - // if(uapi_get_battery_level() > 50)//获取电量 - // { - // ThunderBirdMainView::GetInstance()->ChangeView(currentView, THUNDERBIRD_OTAVIEW, ThunderBirdOtaView::THUNDERBIRD_OTAVIEW_NIGHT_UPDATE_SUCCESS); - // } - // else - // { - // ThunderBirdMainView::GetInstance()->ChangeView(currentView, THUNDERBIRD_OTAVIEW, ThunderBirdOtaView::THUNDERBIRD_OTAVIEW_LOW_BATTERY); - // } - // if(uapi_get_network_state() == 1)//获取网络状态 - // { - // ThunderBirdMainView::GetInstance()->ChangeView(currentView, THUNDERBIRD_OTAVIEW, ThunderBirdOtaView::THUNDERBIRD_OTAVIEW_NIGHT_UPDATE_SUCCESS); - // } - // else - // { - // ThunderBirdMainView::GetInstance()->ChangeView(currentView, THUNDERBIRD_OTAVIEW, ThunderBirdOtaView::THUNDERBIRD_OTAVIEW_NETWORK_ERROR); - // } - // if(uapi_get_memory_state() == 1)//获取内存状态 - // { - // ThunderBirdMainView::GetInstance()->ChangeView(currentView, THUNDERBIRD_OTAVIEW, ThunderBirdOtaView::THUNDERBIRD_OTAVIEW_NIGHT_UPDATE_SUCCESS); - // } - // else - // { - // ThunderBirdMainView::GetInstance()->ChangeView(currentView, THUNDERBIRD_OTAVIEW, ThunderBirdOtaView::THUNDERBIRD_OTAVIEW_UPDATE_SUCCESS); - // } - - } - else if(currentSubView == ThunderBirdOtaView::THUNDERBIRD_OTAVIEW_NIGHT_UPDATE_SUCCESS) // 更新倒计时 - { - WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "VENDOR_UP: 从夜间更新成功界面跳转到更新倒计时界面"); - ThunderBirdMainView::GetInstance()->ChangeView(currentView, THUNDERBIRD_OTAVIEW, ThunderBirdOtaView::THUNDERBIRD_OTAVIEW_COUNTDOWN); + if(0)//获取电量 + { + ThunderBirdMainView::GetInstance()->ChangeView(currentView, THUNDERBIRD_OTAVIEW, ThunderBirdOtaView::THUNDERBIRD_OTAVIEW_LOW_BATTERY); + } + else if(0)//获取网络状态 + { + ThunderBirdMainView::GetInstance()->ChangeView(currentView, THUNDERBIRD_OTAVIEW, ThunderBirdOtaView::THUNDERBIRD_OTAVIEW_NETWORK_ERROR); + } + else if(0)//获取内存状态 + { + ThunderBirdMainView::GetInstance()->ChangeView(currentView, THUNDERBIRD_OTAVIEW, ThunderBirdOtaView::THUNDERBIRD_OTAVIEW_MEMORY_ERROR); + } + else + { + ThunderBirdMainView::GetInstance()->ChangeView(currentView, THUNDERBIRD_OTAVIEW, ThunderBirdOtaView::THUNDERBIRD_OTAVIEW_COUNTDOWN); + } + } - else if(currentSubView == ThunderBirdOtaView::THUNDERBIRD_OTAVIEW_COUNTDOWN) // 更新倒计时 + else if(currentSubView == ThunderBirdOtaView::THUNDERBIRD_OTAVIEW_COUNTDOWN) // 更新倒计时进入更新中 { - WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "VENDOR_UP: 从更新倒计时界面跳转到更新中界面"); ThunderBirdMainView::GetInstance()->ChangeView(currentView, THUNDERBIRD_OTAVIEW, ThunderBirdOtaView::THUNDERBIRD_OTAVIEW_UPDATING); - } - else if(currentSubView == ThunderBirdOtaView::THUNDERBIRD_OTAVIEW_UPDATING) // 更新中 - { - WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "VENDOR_UP: 从更新中界面跳转到更新成功界面"); - ThunderBirdMainView::GetInstance()->ChangeView(currentView, THUNDERBIRD_OTAVIEW, ThunderBirdOtaView::THUNDERBIRD_OTAVIEW_UPDATE_SUCCESS); - } - else if(currentSubView == ThunderBirdOtaView::THUNDERBIRD_OTAVIEW_UPDATE_SUCCESS) // 更新成功 - { - WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "VENDOR_UP: 从更新成功界面跳转到更新失败界面"); - ThunderBirdMainView::GetInstance()->ChangeView(currentView, THUNDERBIRD_OTAVIEW, ThunderBirdOtaView::THUNDERBIRD_OTAVIEW_UPDATE_FAILED); - } - else if(currentSubView == ThunderBirdOtaView::THUNDERBIRD_OTAVIEW_UPDATE_FAILED) // 更新失败 - { - WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "VENDOR_UP: 从更新失败界面跳转到哄睡界面1"); - ThunderBirdMainView::GetInstance()->ChangeView(currentView, THUNDERBIRD_LULLABYVIEW, ThunderBirdLullabyView::THUNDERBIRD_LULLABYVIEW_1); + do_ln_http_server_send_data(LN_HTTP_SERVICE_CMD_OTA_DOWNLOAD, NULL, 0);//开始升级 } return true; } @@ -382,27 +233,22 @@ namespace OHOS { if(currentSubView == ThunderBirdLullabyView::THUNDERBIRD_LULLABYVIEW_1) { - WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "VENDOR_UP: 从哄睡界面1跳转到哄睡界面2"); ThunderBirdMainView::GetInstance()->ChangeView(currentView, THUNDERBIRD_LULLABYVIEW, ThunderBirdLullabyView::THUNDERBIRD_LULLABYVIEW_2); } else if(currentSubView == ThunderBirdLullabyView::THUNDERBIRD_LULLABYVIEW_2) { - WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "VENDOR_UP: 从哄睡界面2跳转到哄睡界面3"); ThunderBirdMainView::GetInstance()->ChangeView(currentView, THUNDERBIRD_LULLABYVIEW, ThunderBirdLullabyView::THUNDERBIRD_LULLABYVIEW_3); } else if(currentSubView == ThunderBirdLullabyView::THUNDERBIRD_LULLABYVIEW_3) { - WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "VENDOR_UP: 从哄睡界面3跳转到哄睡界面4"); ThunderBirdMainView::GetInstance()->ChangeView(currentView, THUNDERBIRD_LULLABYVIEW, ThunderBirdLullabyView::THUNDERBIRD_LULLABYVIEW_4); } else if(currentSubView == ThunderBirdLullabyView::THUNDERBIRD_LULLABYVIEW_4) { - WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "VENDOR_UP: 从哄睡界面4跳转到哄睡界面5"); ThunderBirdMainView::GetInstance()->ChangeView(currentView, THUNDERBIRD_LULLABYVIEW, ThunderBirdLullabyView::THUNDERBIRD_LULLABYVIEW_5); } else if(currentSubView == ThunderBirdLullabyView::THUNDERBIRD_LULLABYVIEW_5) { - WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "VENDOR_UP: 从哄睡界面5跳转到说话界面"); // 返回主界面 ThunderBirdMainView::GetInstance()->ChangeView(currentView, THUNDERBIRD_DIALOGUEVIEW, ThunderBirdDialogueView::THUNDERBIRD_DIALOGUEVIEW_SPEAKING); } @@ -413,7 +259,6 @@ namespace OHOS { if(currentSubView == ThunderBirdReminderView::THUNDERBIRD_REMINDERVIEW_VOLUME) // 音量调节 { - WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "VENDOR_UP: 从音量调节界面跳转到事项提醒界面"); ThunderBirdMainView::GetInstance()->ChangeView(currentView, THUNDERBIRD_REMINDERVIEW, ThunderBirdReminderView::THUNDERBIRD_REMINDERVIEW_TASK_REMINDER); } else if(currentSubView == ThunderBirdReminderView::THUNDERBIRD_REMINDERVIEW_TASK_REMINDER) // 事项提醒 @@ -462,16 +307,11 @@ namespace OHOS /*************************VENDOR_DOWN键*************************/ if(keyID == static_cast(ZliteKeyCode::ZLITE_KEY_VENDOR_DOWN) && keyState == 1 && uapi_get_screen_state() == 0) { - WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "VENDOR_DOWN PRESS: Screen is off, checking binding status"); - if(ThunderBirdModel::GetInstance()->CheckBindingStatus() == ThunderBirdModel::BindingStatus::NOT_BOUND) { - WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "VENDOR_DOWN PRESS: Device not bound, checking current subview"); if(ThunderBirdMainView::GetInstance()->GetCurrentSubView() != ThunderBirdGuideView::THUNDERBIRD_GUIDEVIEW_3) { - WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "VENDOR_DOWN PRESS: Redirecting to QR code view"); ThunderBirdMainView::GetInstance()->ChangeView(currentView, THUNDERBIRD_GUIDEVIEW, ThunderBirdGuideView::THUNDERBIRD_GUIDEVIEW_3); - WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "=== OnKeyAct Event End (VENDOR_DOWN PRESS - Redirect) ==="); return true; } } @@ -481,57 +321,34 @@ namespace OHOS (currentSubView == ThunderBirdLullabyView::THUNDERBIRD_LULLABYVIEW_1 || currentSubView == ThunderBirdLullabyView::THUNDERBIRD_LULLABYVIEW_4))) //只有在对话界面还有哄睡界面才触发 { - WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "VENDOR_DOWN: Volume adjustment in dialogue/lullaby view"); ThunderBirdMainView::GetInstance()->ChangeThunderBirdReminderView(THUNDERBIRD_REMINDERVIEW);//不走ChangeView if (ThunderBirdReminderView::GetInstance()) { ThunderBirdModel::GetInstance()->StartReminderHideTimer(1000); ThunderBirdReminderView::GetInstance()->Show(ThunderBirdReminderView::THUNDERBIRD_REMINDERVIEW_VOLUME); ThunderBirdReminderView::GetInstance()->AdjustRemindProgress(-10); - } - WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "=== OnKeyAct Event End (VENDOR_DOWN - Volume) ==="); return true; } if(currentView == THUNDERBIRD_OTAVIEW) { - if(currentSubView == ThunderBirdOtaView::THUNDERBIRD_OTAVIEW_NORMAL || currentSubView == ThunderBirdOtaView::THUNDERBIRD_OTAVIEW_OBVIOUS - ) // 可选升级退出进入是否设置夜间更新 + if(currentSubView == ThunderBirdOtaView::THUNDERBIRD_OTAVIEW_NORMAL + || currentSubView == ThunderBirdOtaView::THUNDERBIRD_OTAVIEW_OBVIOUS ) // 可选升级退出进入是否设置夜间更新,强制更新退出(直接关机) { ThunderBirdMainView::GetInstance()->ChangeView(currentView, THUNDERBIRD_OTAVIEW, ThunderBirdOtaView::THUNDERBIRD_OTAVIEW_NIGHT_UPDATE); } - else if(currentSubView == ThunderBirdOtaView::THUNDERBIRD_OTAVIEW_NIGHT_UPDATE) // 夜间更新退出返回原任务 - { - ThunderBirdMainView::GetInstance()->ChangeView(currentView, THUNDERBIRD_OTAVIEW, ThunderBirdOtaView::THUNDERBIRD_OTAVIEW_UPDATE_NOW); - } - else if(currentSubView == ThunderBirdOtaView::THUNDERBIRD_OTAVIEW_NIGHT_UPDATE) // 设置夜间更新成功 - { - ThunderBirdMainView::GetInstance()->ChangeView(currentView, THUNDERBIRD_OTAVIEW, ThunderBirdOtaView::THUNDERBIRD_OTAVIEW_NIGHT_UPDATE_SUCCESS); - } - else if(currentSubView == ThunderBirdOtaView::THUNDERBIRD_OTAVIEW_NIGHT_UPDATE_SUCCESS) // 更新倒计时 - { - ThunderBirdMainView::GetInstance()->ChangeView(currentView, THUNDERBIRD_OTAVIEW, ThunderBirdOtaView::THUNDERBIRD_OTAVIEW_COUNTDOWN); - } - else if(currentSubView == ThunderBirdOtaView::THUNDERBIRD_OTAVIEW_COUNTDOWN) // 电量不足 - { - ThunderBirdMainView::GetInstance()->ChangeView(currentView, THUNDERBIRD_OTAVIEW, ThunderBirdOtaView::THUNDERBIRD_OTAVIEW_LOW_BATTERY); - } - else if(currentSubView == ThunderBirdOtaView::THUNDERBIRD_OTAVIEW_UPDATE_SUCCESS) // 更新成功 - { - ThunderBirdMainView::GetInstance()->ChangeView(currentView, THUNDERBIRD_OTAVIEW, ThunderBirdOtaView::THUNDERBIRD_OTAVIEW_UPDATE_FAILED); - } - else if(currentSubView == ThunderBirdOtaView::THUNDERBIRD_OTAVIEW_UPDATE_FAILED) // 更新失败 - { - ThunderBirdMainView::GetInstance()->ChangeView(currentView, THUNDERBIRD_LULLABYVIEW, ThunderBirdLullabyView::THUNDERBIRD_LULLABYVIEW_1); - } - else if(currentSubView == ThunderBirdOtaView::THUNDERBIRD_OTAVIEW_UPDATING) // 更新中 + else if(currentSubView == ThunderBirdOtaView::THUNDERBIRD_OTAVIEW_NIGHT_UPDATE + || currentSubView == ThunderBirdOtaView::THUNDERBIRD_OTAVIEW_COUNTDOWN + || currentSubView == ThunderBirdOtaView::THUNDERBIRD_OTAVIEW_UPDATE_FAILED + || currentSubView == ThunderBirdOtaView::THUNDERBIRD_OTAVIEW_LOW_BATTERY + || currentSubView == ThunderBirdOtaView::THUNDERBIRD_OTAVIEW_NETWORK_ERROR + || currentSubView == ThunderBirdOtaView::THUNDERBIRD_OTAVIEW_MEMORY_ERROR) // 夜间更新退出返回原任务,强制更新退出(直接关机),倒计时界面退出返回原任务,更新失败退出返回原任务,电量不足退出返回原任务,网络异常退出返回原任务,内存不足退出返回原任务 { - ThunderBirdMainView::GetInstance()->ChangeView(currentView, THUNDERBIRD_OTAVIEW, ThunderBirdOtaView::THUNDERBIRD_OTAVIEW_UPDATE_SUCCESS); + ThunderBirdMainView::GetInstance()->ChangeView(currentView, THUNDERBIRD_DIALOGUEVIEW, ThunderBirdDialogueView::THUNDERBIRD_DIALOGUEVIEW_SPEAKING); } } } - WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "=== OnKeyAct Event End (No specific handler) ==="); return true; } diff --git a/code/sdk/files/leiniao/fs/user/music/PowerOn.mp3 b/code/sdk/files/leiniao/fs/user/music/PowerOn.mp3 new file mode 100644 index 0000000000000000000000000000000000000000..b1488e205156d46e2db758c2a07b8d0a4aeb1eb9 GIT binary patch literal 5328 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 Kzp(#-;lBX