优化按键操作
authorxue <2144439972@qq.com>
Tue, 18 Nov 2025 03:34:15 +0000 (11:34 +0800)
committerxue <2144439972@qq.com>
Tue, 18 Nov 2025 03:34:15 +0000 (11:34 +0800)
code/sdk/application/wearable/ln/nativeapp/nativeui/thunderbird/src/ThunderBirdPresenter.cpp
code/sdk/middleware/chips/brandy/exception/chip_system_time.c

index 04bb03e..ea2e408 100644 (file)
@@ -35,6 +35,7 @@
 #endif
 
 #include "input_app.h"
+#include "cat1_server.h"
 #ifdef __cplusplus
     }
 #endif
@@ -125,6 +126,7 @@ namespace OHOS
         int16_t currentView = ThunderBirdMainView::GetInstance()->GetCurrentView();
         int16_t currentSubView = ThunderBirdMainView::GetInstance()->GetCurrentSubView();
         int screenState = uapi_get_screen_state();
+        int originalScreenState = screenState; // 保存原始屏幕状态,用于HandlePowerKey判断
         
         // 按键事件日志
         WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "OnKeyAct: keyID=%d, keyState=%d, screenState=%d", keyID, keyState, screenState);
@@ -132,23 +134,42 @@ namespace OHOS
         // 刷新息屏计时:任意按键按下时重置屏幕熄灭倒计时
         if (keyState == InputDevice::STATE_PRESS) {
             uapi_set_screen_on_api();
+            // 修复:在调用uapi_set_screen_on_api()后重新获取屏幕状态,确保使用最新的状态
+            screenState = uapi_get_screen_state();
+            WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "OnKeyAct: After uapi_set_screen_on_api(), screenState=%d (original=%d)", screenState, originalScreenState);
         }
 
         // 分发按键事件到对应的处理函数
         switch (keyID) {
             case static_cast<uint16_t>(ZliteKeyCode::ZLITE_KEY_POWER):
                 WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "HandlePowerKey: KEY_TYPE_POWER");
-                return HandlePowerKey(keyState, currentView, currentSubView, screenState);
+                // 修复:对于电源键,传递原始屏幕状态,以便正确判断是否从息屏状态亮屏
+                return HandlePowerKey(keyState, currentView, currentSubView, originalScreenState);
                 
             case static_cast<uint16_t>(ZliteKeyCode::ZLITE_KEY_FUNC):
+                // 非电源键需要亮屏才能处理
+                if (screenState != 0) {
+                    WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "HandleFuncKey: screen is off, ignore");
+                    return true;
+                }
                 WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "HandleFuncKey: KEY_TYPE_FUNC");
                 return HandleFuncKey(keyState, currentView, currentSubView, screenState);
                 
             case static_cast<uint16_t>(ZliteKeyCode::ZLITE_KEY_VENDOR_UP):
+                // 非电源键需要亮屏才能处理
+                if (screenState != 0) {
+                    WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "HandleVendorUpKey: screen is off, ignore");
+                    return true;
+                }
                 WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "HandleVendorUpKey: KEY_TYPE_VENDOR_UP");
                 return HandleVendorUpKey(keyState, currentView, currentSubView, screenState);
                 
             case static_cast<uint16_t>(ZliteKeyCode::ZLITE_KEY_VENDOR_DOWN):
+                // 非电源键需要亮屏才能处理
+                if (screenState != 0) {
+                    WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "HandleVendorDownKey: screen is off, ignore");
+                    return true;
+                }
                 WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "HandleVendorDownKey: KEY_TYPE_VENDOR_DOWN");
                 return HandleVendorDownKey(keyState, currentView, currentSubView, screenState);
                 
@@ -230,7 +251,14 @@ namespace OHOS
             
             if (screenState == 1) {
                 // 息屏状态下按下:亮屏(由系统自动处理)
+                // 亮屏时触发时间同步
+                restart_time_sync();
+                screenOnFromOff = true; // 标记是从息屏状态亮屏的
+                WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "HandlePowerKey: Screen on from off, trigger time sync");
                 return true;
+            } else {
+                // 亮屏状态下按下,清除标志位
+                screenOnFromOff = false;
             }
         }
         
@@ -243,6 +271,13 @@ namespace OHOS
             
             powerKeyPressed = false; // 重置标志位
             
+            // 修复:如果是从息屏状态亮屏的,松开时不应该立即息屏
+            if (screenOnFromOff) {
+                screenOnFromOff = false; // 清除标志位
+                WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "HandlePowerKey: Release after screen on from off, keep screen on");
+                return true;
+            }
+            
             if (screenState == 0 && isDialogueing == false) {//对话模式下无效
                 // 亮屏状态下松开:息屏
                 const power_display_svr_api_t *display_api = power_display_svr_get_api();
index e3ce9be..0b8100c 100644 (file)
@@ -126,7 +126,10 @@ uint32_t sync_time_utc(uint32_t timestamp, uint32_t timezone_quarters)
     uapi_set_timezone(timezone_quarters);
     struct timeval tv = {0};
     struct timezone tzone = {0};
-    tv.tv_sec = seconds;
+    // 修复:将UTC时间戳转换为本地时间戳
+    // settimeofday的tv.tv_sec应该是本地时间(UTC时间 + 时区偏移)
+    // 参考 cat1_porting.c 和 ppp_api.c 的实现
+    tv.tv_sec = seconds + timezone_quarters * MINUTES_PER_QUARTER * SECONDS_PER_MINUTE;
     tv.tv_usec = 0;
     tzone.tz_dsttime = 0;
     tzone.tz_minuteswest = timezone_quarters * MINUTES_PER_QUARTER;